Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / v8 / test / cctest / test-disasm-mips64.cc
1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are
4 // met:
5 //
6 //     * Redistributions of source code must retain the above copyright
7 //       notice, this list of conditions and the following disclaimer.
8 //     * Redistributions in binary form must reproduce the above
9 //       copyright notice, this list of conditions and the following
10 //       disclaimer in the documentation and/or other materials provided
11 //       with the distribution.
12 //     * Neither the name of Google Inc. nor the names of its
13 //       contributors may be used to endorse or promote products derived
14 //       from this software without specific prior written permission.
15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 //
28
29 #include <stdlib.h>
30
31 #include "src/v8.h"
32
33 #include "src/debug.h"
34 #include "src/disasm.h"
35 #include "src/disassembler.h"
36 #include "src/macro-assembler.h"
37 #include "src/serialize.h"
38 #include "test/cctest/cctest.h"
39
40 using namespace v8::internal;
41
42
43 bool DisassembleAndCompare(byte* pc, const char* compare_string) {
44   disasm::NameConverter converter;
45   disasm::Disassembler disasm(converter);
46   EmbeddedVector<char, 128> disasm_buffer;
47
48   disasm.InstructionDecode(disasm_buffer, pc);
49
50   if (strcmp(compare_string, disasm_buffer.start()) != 0) {
51     fprintf(stderr,
52             "expected: \n"
53             "%s\n"
54             "disassembled: \n"
55             "%s\n\n",
56             compare_string, disasm_buffer.start());
57     return false;
58   }
59   return true;
60 }
61
62
63 // Set up V8 to a state where we can at least run the assembler and
64 // disassembler. Declare the variables and allocate the data structures used
65 // in the rest of the macros.
66 #define SET_UP()                                          \
67   CcTest::InitializeVM();                                 \
68   Isolate* isolate = CcTest::i_isolate();                  \
69   HandleScope scope(isolate);                             \
70   byte *buffer = reinterpret_cast<byte*>(malloc(4*1024)); \
71   Assembler assm(isolate, buffer, 4*1024);                \
72   bool failure = false;
73
74
75 // This macro assembles one instruction using the preallocated assembler and
76 // disassembles the generated instruction, comparing the output to the expected
77 // value. If the comparison fails an error message is printed, but the test
78 // continues to run until the end.
79 #define COMPARE(asm_, compare_string) \
80   { \
81     int pc_offset = assm.pc_offset(); \
82     byte *progcounter = &buffer[pc_offset]; \
83     assm.asm_; \
84     if (!DisassembleAndCompare(progcounter, compare_string)) failure = true; \
85   }
86
87
88 // Verify that all invocations of the COMPARE macro passed successfully.
89 // Exit with a failure if at least one of the tests failed.
90 #define VERIFY_RUN() \
91 if (failure) { \
92     V8_Fatal(__FILE__, __LINE__, "MIPS Disassembler tests failed.\n"); \
93   }
94
95
96 TEST(Type0) {
97   SET_UP();
98
99   COMPARE(addu(a0, a1, a2),
100           "00a62021       addu    a0, a1, a2");
101   COMPARE(daddu(a0, a1, a2),
102           "00a6202d       daddu   a0, a1, a2");
103   COMPARE(addu(a6, a7, t0),
104           "016c5021       addu    a6, a7, t0");
105   COMPARE(daddu(a6, a7, t0),
106           "016c502d       daddu   a6, a7, t0");
107   COMPARE(addu(v0, v1, s0),
108           "00701021       addu    v0, v1, s0");
109   COMPARE(daddu(v0, v1, s0),
110           "0070102d       daddu   v0, v1, s0");
111
112   COMPARE(subu(a0, a1, a2),
113           "00a62023       subu    a0, a1, a2");
114   COMPARE(dsubu(a0, a1, a2),
115           "00a6202f       dsubu   a0, a1, a2");
116   COMPARE(subu(a6, a7, t0),
117           "016c5023       subu    a6, a7, t0");
118   COMPARE(dsubu(a6, a7, t0),
119           "016c502f       dsubu   a6, a7, t0");
120   COMPARE(subu(v0, v1, s0),
121           "00701023       subu    v0, v1, s0");
122   COMPARE(dsubu(v0, v1, s0),
123           "0070102f       dsubu   v0, v1, s0");
124
125   if (kArchVariant != kMips64r6) {
126     COMPARE(mult(a0, a1),
127             "00850018       mult    a0, a1");
128     COMPARE(dmult(a0, a1),
129             "0085001c       dmult   a0, a1");
130     COMPARE(mult(a6, a7),
131             "014b0018       mult    a6, a7");
132     COMPARE(dmult(a6, a7),
133             "014b001c       dmult   a6, a7");
134     COMPARE(mult(v0, v1),
135             "00430018       mult    v0, v1");
136     COMPARE(dmult(v0, v1),
137             "0043001c       dmult   v0, v1");
138
139     COMPARE(multu(a0, a1),
140             "00850019       multu   a0, a1");
141     COMPARE(dmultu(a0, a1),
142             "0085001d       dmultu  a0, a1");
143     COMPARE(multu(a6, a7),
144             "014b0019       multu   a6, a7");
145     COMPARE(dmultu(a6, a7),
146             "014b001d       dmultu  a6, a7");
147     COMPARE(multu(v0, v1),
148             "00430019       multu   v0, v1");
149     COMPARE(dmultu(v0, v1),
150             "0043001d       dmultu  v0, v1");
151
152     COMPARE(div(a0, a1),
153             "0085001a       div     a0, a1");
154     COMPARE(div(a6, a7),
155             "014b001a       div     a6, a7");
156     COMPARE(div(v0, v1),
157             "0043001a       div     v0, v1");
158     COMPARE(ddiv(a0, a1),
159             "0085001e       ddiv    a0, a1");
160     COMPARE(ddiv(a6, a7),
161             "014b001e       ddiv    a6, a7");
162     COMPARE(ddiv(v0, v1),
163             "0043001e       ddiv    v0, v1");
164
165     COMPARE(divu(a0, a1),
166             "0085001b       divu    a0, a1");
167     COMPARE(divu(a6, a7),
168             "014b001b       divu    a6, a7");
169     COMPARE(divu(v0, v1),
170             "0043001b       divu    v0, v1");
171     COMPARE(ddivu(a0, a1),
172             "0085001f       ddivu   a0, a1");
173     COMPARE(ddivu(a6, a7),
174             "014b001f       ddivu   a6, a7");
175     COMPARE(ddivu(v0, v1),
176             "0043001f       ddivu   v0, v1");
177     COMPARE(mul(a0, a1, a2),
178             "70a62002       mul     a0, a1, a2");
179     COMPARE(mul(a6, a7, t0),
180             "716c5002       mul     a6, a7, t0");
181     COMPARE(mul(v0, v1, s0),
182             "70701002       mul     v0, v1, s0");
183   } else {  // MIPS64r6.
184     COMPARE(mul(a0, a1, a2),
185             "00a62098       mul    a0, a1, a2");
186     COMPARE(muh(a0, a1, a2),
187             "00a620d8       muh    a0, a1, a2");
188     COMPARE(dmul(a0, a1, a2),
189             "00a6209c       dmul   a0, a1, a2");
190     COMPARE(dmuh(a0, a1, a2),
191             "00a620dc       dmuh   a0, a1, a2");
192     COMPARE(mul(a5, a6, a7),
193             "014b4898       mul    a5, a6, a7");
194     COMPARE(muh(a5, a6, a7),
195             "014b48d8       muh    a5, a6, a7");
196     COMPARE(dmul(a5, a6, a7),
197             "014b489c       dmul   a5, a6, a7");
198     COMPARE(dmuh(a5, a6, a7),
199             "014b48dc       dmuh   a5, a6, a7");
200     COMPARE(mul(v0, v1, a0),
201             "00641098       mul    v0, v1, a0");
202     COMPARE(muh(v0, v1, a0),
203             "006410d8       muh    v0, v1, a0");
204     COMPARE(dmul(v0, v1, a0),
205             "0064109c       dmul   v0, v1, a0");
206     COMPARE(dmuh(v0, v1, a0),
207             "006410dc       dmuh   v0, v1, a0");
208
209     COMPARE(mulu(a0, a1, a2),
210             "00a62099       mulu   a0, a1, a2");
211     COMPARE(muhu(a0, a1, a2),
212             "00a620d9       muhu   a0, a1, a2");
213     COMPARE(dmulu(a0, a1, a2),
214             "00a6209d       dmulu  a0, a1, a2");
215     COMPARE(dmuhu(a0, a1, a2),
216             "00a620dd       dmuhu  a0, a1, a2");
217     COMPARE(mulu(a5, a6, a7),
218             "014b4899       mulu   a5, a6, a7");
219     COMPARE(muhu(a5, a6, a7),
220             "014b48d9       muhu   a5, a6, a7");
221     COMPARE(dmulu(a5, a6, a7),
222             "014b489d       dmulu  a5, a6, a7");
223     COMPARE(dmuhu(a5, a6, a7),
224             "014b48dd       dmuhu  a5, a6, a7");
225     COMPARE(mulu(v0, v1, a0),
226             "00641099       mulu   v0, v1, a0");
227     COMPARE(muhu(v0, v1, a0),
228             "006410d9       muhu   v0, v1, a0");
229     COMPARE(dmulu(v0, v1, a0),
230             "0064109d       dmulu  v0, v1, a0");
231     COMPARE(dmuhu(v0, v1, a0),
232             "006410dd       dmuhu  v0, v1, a0");
233
234     COMPARE(div(a0, a1, a2),
235             "00a6209a       div    a0, a1, a2");
236     COMPARE(mod(a0, a1, a2),
237             "00a620da       mod    a0, a1, a2");
238     COMPARE(ddiv(a0, a1, a2),
239             "00a6209e       ddiv   a0, a1, a2");
240     COMPARE(dmod(a0, a1, a2),
241             "00a620de       dmod   a0, a1, a2");
242     COMPARE(div(a5, a6, a7),
243             "014b489a       div    a5, a6, a7");
244     COMPARE(mod(a5, a6, a7),
245             "014b48da       mod    a5, a6, a7");
246     COMPARE(ddiv(a5, a6, a7),
247             "014b489e       ddiv   a5, a6, a7");
248     COMPARE(dmod(a5, a6, a7),
249             "014b48de       dmod   a5, a6, a7");
250     COMPARE(div(v0, v1, a0),
251             "0064109a       div    v0, v1, a0");
252     COMPARE(mod(v0, v1, a0),
253             "006410da       mod    v0, v1, a0");
254     COMPARE(ddiv(v0, v1, a0),
255             "0064109e       ddiv   v0, v1, a0");
256     COMPARE(dmod(v0, v1, a0),
257             "006410de       dmod   v0, v1, a0");
258
259     COMPARE(divu(a0, a1, a2),
260             "00a6209b       divu   a0, a1, a2");
261     COMPARE(modu(a0, a1, a2),
262             "00a620db       modu   a0, a1, a2");
263     COMPARE(ddivu(a0, a1, a2),
264             "00a6209f       ddivu  a0, a1, a2");
265     COMPARE(dmodu(a0, a1, a2),
266             "00a620df       dmodu  a0, a1, a2");
267     COMPARE(divu(a5, a6, a7),
268             "014b489b       divu   a5, a6, a7");
269     COMPARE(modu(a5, a6, a7),
270             "014b48db       modu   a5, a6, a7");
271     COMPARE(ddivu(a5, a6, a7),
272             "014b489f       ddivu  a5, a6, a7");
273     COMPARE(dmodu(a5, a6, a7),
274             "014b48df       dmodu  a5, a6, a7");
275     COMPARE(divu(v0, v1, a0),
276             "0064109b       divu   v0, v1, a0");
277     COMPARE(modu(v0, v1, a0),
278             "006410db       modu   v0, v1, a0");
279     COMPARE(ddivu(v0, v1, a0),
280             "0064109f       ddivu  v0, v1, a0");
281     COMPARE(dmodu(v0, v1, a0),
282             "006410df       dmodu  v0, v1, a0");
283
284     COMPARE(bovc(a0, a0, static_cast<int16_t>(0)),
285             "20840000       bovc  a0, a0, 0");
286     COMPARE(bovc(a1, a0, static_cast<int16_t>(0)),
287             "20a40000       bovc  a1, a0, 0");
288     COMPARE(bovc(a1, a0, 32767),
289             "20a47fff       bovc  a1, a0, 32767");
290     COMPARE(bovc(a1, a0, -32768),
291             "20a48000       bovc  a1, a0, -32768");
292
293     COMPARE(bnvc(a0, a0, static_cast<int16_t>(0)),
294             "60840000       bnvc  a0, a0, 0");
295     COMPARE(bnvc(a1, a0, static_cast<int16_t>(0)),
296             "60a40000       bnvc  a1, a0, 0");
297     COMPARE(bnvc(a1, a0, 32767),
298             "60a47fff       bnvc  a1, a0, 32767");
299     COMPARE(bnvc(a1, a0, -32768),
300             "60a48000       bnvc  a1, a0, -32768");
301
302     COMPARE(beqzc(a0, 0),
303             "d8800000       beqzc   a0, 0x0");
304     COMPARE(beqzc(a0, 0xfffff),                   // 0x0fffff ==  1048575.
305             "d88fffff       beqzc   a0, 0xfffff");
306     COMPARE(beqzc(a0, 0x100000),                  // 0x100000 == -1048576.
307             "d8900000       beqzc   a0, 0x100000");
308
309     COMPARE(bnezc(a0, 0),
310             "f8800000       bnezc   a0, 0x0");
311     COMPARE(bnezc(a0, 0xfffff),                   // 0x0fffff ==  1048575.
312             "f88fffff       bnezc   a0, 0xfffff");
313     COMPARE(bnezc(a0, 0x100000),                  // 0x100000 == -1048576.
314             "f8900000       bnezc   a0, 0x100000");
315   }
316
317   COMPARE(addiu(a0, a1, 0x0),
318           "24a40000       addiu   a0, a1, 0");
319   COMPARE(addiu(s0, s1, 32767),
320           "26307fff       addiu   s0, s1, 32767");
321   COMPARE(addiu(a6, a7, -32768),
322           "256a8000       addiu   a6, a7, -32768");
323   COMPARE(addiu(v0, v1, -1),
324           "2462ffff       addiu   v0, v1, -1");
325   COMPARE(daddiu(a0, a1, 0x0),
326           "64a40000       daddiu  a0, a1, 0");
327   COMPARE(daddiu(s0, s1, 32767),
328           "66307fff       daddiu  s0, s1, 32767");
329   COMPARE(daddiu(a6, a7, -32768),
330           "656a8000       daddiu  a6, a7, -32768");
331   COMPARE(daddiu(v0, v1, -1),
332           "6462ffff       daddiu  v0, v1, -1");
333
334   COMPARE(and_(a0, a1, a2),
335           "00a62024       and     a0, a1, a2");
336   COMPARE(and_(s0, s1, s2),
337           "02328024       and     s0, s1, s2");
338   COMPARE(and_(a6, a7, t0),
339           "016c5024       and     a6, a7, t0");
340   COMPARE(and_(v0, v1, a2),
341           "00661024       and     v0, v1, a2");
342
343   COMPARE(or_(a0, a1, a2),
344           "00a62025       or      a0, a1, a2");
345   COMPARE(or_(s0, s1, s2),
346           "02328025       or      s0, s1, s2");
347   COMPARE(or_(a6, a7, t0),
348           "016c5025       or      a6, a7, t0");
349   COMPARE(or_(v0, v1, a2),
350           "00661025       or      v0, v1, a2");
351
352   COMPARE(xor_(a0, a1, a2),
353           "00a62026       xor     a0, a1, a2");
354   COMPARE(xor_(s0, s1, s2),
355           "02328026       xor     s0, s1, s2");
356   COMPARE(xor_(a6, a7, t0),
357           "016c5026       xor     a6, a7, t0");
358   COMPARE(xor_(v0, v1, a2),
359           "00661026       xor     v0, v1, a2");
360
361   COMPARE(nor(a0, a1, a2),
362           "00a62027       nor     a0, a1, a2");
363   COMPARE(nor(s0, s1, s2),
364           "02328027       nor     s0, s1, s2");
365   COMPARE(nor(a6, a7, t0),
366           "016c5027       nor     a6, a7, t0");
367   COMPARE(nor(v0, v1, a2),
368           "00661027       nor     v0, v1, a2");
369
370   COMPARE(andi(a0, a1, 0x1),
371           "30a40001       andi    a0, a1, 0x1");
372   COMPARE(andi(v0, v1, 0xffff),
373           "3062ffff       andi    v0, v1, 0xffff");
374
375   COMPARE(ori(a0, a1, 0x1),
376           "34a40001       ori     a0, a1, 0x1");
377   COMPARE(ori(v0, v1, 0xffff),
378           "3462ffff       ori     v0, v1, 0xffff");
379
380   COMPARE(xori(a0, a1, 0x1),
381           "38a40001       xori    a0, a1, 0x1");
382   COMPARE(xori(v0, v1, 0xffff),
383           "3862ffff       xori    v0, v1, 0xffff");
384
385   COMPARE(lui(a0, 0x1),
386           "3c040001       lui     a0, 0x1");
387   COMPARE(lui(v0, 0xffff),
388           "3c02ffff       lui     v0, 0xffff");
389
390   COMPARE(sll(a0, a1, 0),
391           "00052000       sll     a0, a1, 0");
392   COMPARE(sll(s0, s1, 8),
393           "00118200       sll     s0, s1, 8");
394   COMPARE(sll(a6, a7, 24),
395           "000b5600       sll     a6, a7, 24");
396   COMPARE(sll(v0, v1, 31),
397           "000317c0       sll     v0, v1, 31");
398   COMPARE(dsll(a0, a1, 0),
399           "00052038       dsll    a0, a1, 0");
400   COMPARE(dsll(s0, s1, 8),
401           "00118238       dsll    s0, s1, 8");
402   COMPARE(dsll(a6, a7, 24),
403           "000b5638       dsll    a6, a7, 24");
404   COMPARE(dsll(v0, v1, 31),
405           "000317f8       dsll    v0, v1, 31");
406
407   COMPARE(sllv(a0, a1, a2),
408           "00c52004       sllv    a0, a1, a2");
409   COMPARE(sllv(s0, s1, s2),
410           "02518004       sllv    s0, s1, s2");
411   COMPARE(sllv(a6, a7, t0),
412           "018b5004       sllv    a6, a7, t0");
413   COMPARE(sllv(v0, v1, fp),
414           "03c31004       sllv    v0, v1, fp");
415   COMPARE(dsllv(a0, a1, a2),
416           "00c52014       dsllv   a0, a1, a2");
417   COMPARE(dsllv(s0, s1, s2),
418           "02518014       dsllv   s0, s1, s2");
419   COMPARE(dsllv(a6, a7, t0),
420           "018b5014       dsllv   a6, a7, t0");
421   COMPARE(dsllv(v0, v1, fp),
422           "03c31014       dsllv   v0, v1, fp");
423
424   COMPARE(srl(a0, a1, 0),
425           "00052002       srl     a0, a1, 0");
426   COMPARE(srl(s0, s1, 8),
427           "00118202       srl     s0, s1, 8");
428   COMPARE(srl(a6, a7, 24),
429           "000b5602       srl     a6, a7, 24");
430   COMPARE(srl(v0, v1, 31),
431           "000317c2       srl     v0, v1, 31");
432   COMPARE(dsrl(a0, a1, 0),
433           "0005203a       dsrl    a0, a1, 0");
434   COMPARE(dsrl(s0, s1, 8),
435           "0011823a       dsrl    s0, s1, 8");
436   COMPARE(dsrl(a6, a7, 24),
437           "000b563a       dsrl    a6, a7, 24");
438   COMPARE(dsrl(v0, v1, 31),
439           "000317fa       dsrl    v0, v1, 31");
440
441   COMPARE(srlv(a0, a1, a2),
442           "00c52006       srlv    a0, a1, a2");
443   COMPARE(srlv(s0, s1, s2),
444           "02518006       srlv    s0, s1, s2");
445   COMPARE(srlv(a6, a7, t0),
446           "018b5006       srlv    a6, a7, t0");
447   COMPARE(srlv(v0, v1, fp),
448           "03c31006       srlv    v0, v1, fp");
449   COMPARE(dsrlv(a0, a1, a2),
450           "00c52016       dsrlv   a0, a1, a2");
451   COMPARE(dsrlv(s0, s1, s2),
452           "02518016       dsrlv   s0, s1, s2");
453   COMPARE(dsrlv(a6, a7, t0),
454           "018b5016       dsrlv   a6, a7, t0");
455   COMPARE(dsrlv(v0, v1, fp),
456           "03c31016       dsrlv   v0, v1, fp");
457
458   COMPARE(sra(a0, a1, 0),
459           "00052003       sra     a0, a1, 0");
460   COMPARE(sra(s0, s1, 8),
461           "00118203       sra     s0, s1, 8");
462   COMPARE(sra(a6, a7, 24),
463           "000b5603       sra     a6, a7, 24");
464   COMPARE(sra(v0, v1, 31),
465           "000317c3       sra     v0, v1, 31");
466   COMPARE(dsra(a0, a1, 0),
467           "0005203b       dsra    a0, a1, 0");
468   COMPARE(dsra(s0, s1, 8),
469           "0011823b       dsra    s0, s1, 8");
470   COMPARE(dsra(a6, a7, 24),
471           "000b563b       dsra    a6, a7, 24");
472   COMPARE(dsra(v0, v1, 31),
473           "000317fb       dsra    v0, v1, 31");
474
475   COMPARE(srav(a0, a1, a2),
476           "00c52007       srav    a0, a1, a2");
477   COMPARE(srav(s0, s1, s2),
478           "02518007       srav    s0, s1, s2");
479   COMPARE(srav(a6, a7, t0),
480           "018b5007       srav    a6, a7, t0");
481   COMPARE(srav(v0, v1, fp),
482           "03c31007       srav    v0, v1, fp");
483   COMPARE(dsrav(a0, a1, a2),
484           "00c52017       dsrav   a0, a1, a2");
485   COMPARE(dsrav(s0, s1, s2),
486           "02518017       dsrav   s0, s1, s2");
487   COMPARE(dsrav(a6, a7, t0),
488           "018b5017       dsrav   a6, a7, t0");
489   COMPARE(dsrav(v0, v1, fp),
490           "03c31017       dsrav   v0, v1, fp");
491
492   if (kArchVariant == kMips64r2) {
493     COMPARE(rotr(a0, a1, 0),
494             "00252002       rotr    a0, a1, 0");
495     COMPARE(rotr(s0, s1, 8),
496             "00318202       rotr    s0, s1, 8");
497     COMPARE(rotr(a6, a7, 24),
498             "002b5602       rotr    a6, a7, 24");
499     COMPARE(rotr(v0, v1, 31),
500             "002317c2       rotr    v0, v1, 31");
501     COMPARE(drotr(a0, a1, 0),
502             "0025203a       drotr   a0, a1, 0");
503     COMPARE(drotr(s0, s1, 8),
504             "0031823a       drotr   s0, s1, 8");
505     COMPARE(drotr(a6, a7, 24),
506             "002b563a       drotr   a6, a7, 24");
507     COMPARE(drotr(v0, v1, 31),
508             "002317fa       drotr   v0, v1, 31");
509
510     COMPARE(rotrv(a0, a1, a2),
511             "00c52046       rotrv   a0, a1, a2");
512     COMPARE(rotrv(s0, s1, s2),
513             "02518046       rotrv   s0, s1, s2");
514     COMPARE(rotrv(a6, a7, t0),
515             "018b5046       rotrv   a6, a7, t0");
516     COMPARE(rotrv(v0, v1, fp),
517             "03c31046       rotrv   v0, v1, fp");
518     COMPARE(drotrv(a0, a1, a2),
519             "00c52056       drotrv  a0, a1, a2");
520     COMPARE(drotrv(s0, s1, s2),
521             "02518056       drotrv  s0, s1, s2");
522     COMPARE(drotrv(a6, a7, t0),
523             "018b5056       drotrv  a6, a7, t0");
524     COMPARE(drotrv(v0, v1, fp),
525             "03c31056       drotrv  v0, v1, fp");
526   }
527
528   COMPARE(break_(0),
529           "0000000d       break, code: 0x00000 (0)");
530   COMPARE(break_(261120),
531           "00ff000d       break, code: 0x3fc00 (261120)");
532   COMPARE(break_(1047552),
533           "03ff000d       break, code: 0xffc00 (1047552)");
534
535   COMPARE(tge(a0, a1, 0),
536           "00850030       tge     a0, a1, code: 0x000");
537   COMPARE(tge(s0, s1, 1023),
538           "0211fff0       tge     s0, s1, code: 0x3ff");
539   COMPARE(tgeu(a0, a1, 0),
540           "00850031       tgeu    a0, a1, code: 0x000");
541   COMPARE(tgeu(s0, s1, 1023),
542           "0211fff1       tgeu    s0, s1, code: 0x3ff");
543   COMPARE(tlt(a0, a1, 0),
544           "00850032       tlt     a0, a1, code: 0x000");
545   COMPARE(tlt(s0, s1, 1023),
546           "0211fff2       tlt     s0, s1, code: 0x3ff");
547   COMPARE(tltu(a0, a1, 0),
548           "00850033       tltu    a0, a1, code: 0x000");
549   COMPARE(tltu(s0, s1, 1023),
550           "0211fff3       tltu    s0, s1, code: 0x3ff");
551   COMPARE(teq(a0, a1, 0),
552           "00850034       teq     a0, a1, code: 0x000");
553   COMPARE(teq(s0, s1, 1023),
554           "0211fff4       teq     s0, s1, code: 0x3ff");
555   COMPARE(tne(a0, a1, 0),
556           "00850036       tne     a0, a1, code: 0x000");
557   COMPARE(tne(s0, s1, 1023),
558           "0211fff6       tne     s0, s1, code: 0x3ff");
559
560   COMPARE(mfhi(a0),
561           "00002010       mfhi    a0");
562   COMPARE(mfhi(s2),
563           "00009010       mfhi    s2");
564   COMPARE(mfhi(t0),
565           "00006010       mfhi    t0");
566   COMPARE(mfhi(v1),
567           "00001810       mfhi    v1");
568   COMPARE(mflo(a0),
569           "00002012       mflo    a0");
570   COMPARE(mflo(s2),
571           "00009012       mflo    s2");
572   COMPARE(mflo(t0),
573           "00006012       mflo    t0");
574   COMPARE(mflo(v1),
575           "00001812       mflo    v1");
576
577   COMPARE(slt(a0, a1, a2),
578           "00a6202a       slt     a0, a1, a2");
579   COMPARE(slt(s0, s1, s2),
580           "0232802a       slt     s0, s1, s2");
581   COMPARE(slt(a6, a7, t0),
582           "016c502a       slt     a6, a7, t0");
583   COMPARE(slt(v0, v1, a2),
584           "0066102a       slt     v0, v1, a2");
585   COMPARE(sltu(a0, a1, a2),
586           "00a6202b       sltu    a0, a1, a2");
587   COMPARE(sltu(s0, s1, s2),
588           "0232802b       sltu    s0, s1, s2");
589   COMPARE(sltu(a6, a7, t0),
590           "016c502b       sltu    a6, a7, t0");
591   COMPARE(sltu(v0, v1, a2),
592           "0066102b       sltu    v0, v1, a2");
593
594   COMPARE(slti(a0, a1, 0),
595           "28a40000       slti    a0, a1, 0");
596   COMPARE(slti(s0, s1, 32767),
597           "2a307fff       slti    s0, s1, 32767");
598   COMPARE(slti(a6, a7, -32768),
599           "296a8000       slti    a6, a7, -32768");
600   COMPARE(slti(v0, v1, -1),
601           "2862ffff       slti    v0, v1, -1");
602   COMPARE(sltiu(a0, a1, 0),
603           "2ca40000       sltiu   a0, a1, 0");
604   COMPARE(sltiu(s0, s1, 32767),
605           "2e307fff       sltiu   s0, s1, 32767");
606   COMPARE(sltiu(a6, a7, -32768),
607           "2d6a8000       sltiu   a6, a7, -32768");
608   COMPARE(sltiu(v0, v1, -1),
609           "2c62ffff       sltiu   v0, v1, -1");
610   COMPARE(movz(a0, a1, a2),
611           "00a6200a       movz    a0, a1, a2");
612   COMPARE(movz(s0, s1, s2),
613           "0232800a       movz    s0, s1, s2");
614   COMPARE(movz(a6, a7, t0),
615           "016c500a       movz    a6, a7, t0");
616   COMPARE(movz(v0, v1, a2),
617           "0066100a       movz    v0, v1, a2");
618   COMPARE(movn(a0, a1, a2),
619           "00a6200b       movn    a0, a1, a2");
620   COMPARE(movn(s0, s1, s2),
621           "0232800b       movn    s0, s1, s2");
622   COMPARE(movn(a6, a7, t0),
623           "016c500b       movn    a6, a7, t0");
624   COMPARE(movn(v0, v1, a2),
625           "0066100b       movn    v0, v1, a2");
626
627   COMPARE(movt(a0, a1, 1),
628           "00a52001       movt    a0, a1, 1");
629   COMPARE(movt(s0, s1, 2),
630           "02298001       movt    s0, s1, 2");
631   COMPARE(movt(a6, a7, 3),
632           "016d5001       movt    a6, a7, 3");
633   COMPARE(movt(v0, v1, 7),
634           "007d1001       movt    v0, v1, 7");
635   COMPARE(movf(a0, a1, 0),
636           "00a02001       movf    a0, a1, 0");
637   COMPARE(movf(s0, s1, 4),
638           "02308001       movf    s0, s1, 4");
639   COMPARE(movf(a6, a7, 5),
640           "01745001       movf    a6, a7, 5");
641   COMPARE(movf(v0, v1, 6),
642           "00781001       movf    v0, v1, 6");
643
644   if (kArchVariant == kMips64r6) {
645     COMPARE(clz(a0, a1),
646             "00a02050       clz     a0, a1");
647     COMPARE(clz(s6, s7),
648             "02e0b050       clz     s6, s7");
649     COMPARE(clz(v0, v1),
650             "00601050       clz     v0, v1");
651   } else {
652     COMPARE(clz(a0, a1),
653             "70a42020       clz     a0, a1");
654     COMPARE(clz(s6, s7),
655             "72f6b020       clz     s6, s7");
656     COMPARE(clz(v0, v1),
657             "70621020       clz     v0, v1");
658   }
659
660   COMPARE(ins_(a0, a1, 31, 1),
661           "7ca4ffc4       ins     a0, a1, 31, 1");
662   COMPARE(ins_(s6, s7, 30, 2),
663           "7ef6ff84       ins     s6, s7, 30, 2");
664   COMPARE(ins_(v0, v1, 0, 32),
665           "7c62f804       ins     v0, v1, 0, 32");
666   COMPARE(ext_(a0, a1, 31, 1),
667           "7ca407c0       ext     a0, a1, 31, 1");
668   COMPARE(ext_(s6, s7, 30, 2),
669           "7ef60f80       ext     s6, s7, 30, 2");
670   COMPARE(ext_(v0, v1, 0, 32),
671           "7c62f800       ext     v0, v1, 0, 32");
672
673   VERIFY_RUN();
674 }