• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/debug.h"
34 #include "src/disasm.h"
35 #include "src/disassembler.h"
36 #include "src/macro-assembler.h"
37 #include "test/cctest/cctest.h"
38 
39 using namespace v8::internal;
40 
41 bool prev_instr_compact_branch = false;
42 
DisassembleAndCompare(byte * pc,const char * compare_string)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   if (prev_instr_compact_branch) {
49     disasm.InstructionDecode(disasm_buffer, pc);
50     pc += 4;
51   }
52 
53   disasm.InstructionDecode(disasm_buffer, pc);
54 
55   if (strcmp(compare_string, disasm_buffer.start()) != 0) {
56     fprintf(stderr,
57             "expected: \n"
58             "%s\n"
59             "disassembled: \n"
60             "%s\n\n",
61             compare_string, disasm_buffer.start());
62     return false;
63   }
64   return true;
65 }
66 
67 
68 // Set up V8 to a state where we can at least run the assembler and
69 // disassembler. Declare the variables and allocate the data structures used
70 // in the rest of the macros.
71 #define SET_UP()                                          \
72   CcTest::InitializeVM();                                 \
73   Isolate* isolate = CcTest::i_isolate();                  \
74   HandleScope scope(isolate);                             \
75   byte *buffer = reinterpret_cast<byte*>(malloc(4*1024)); \
76   Assembler assm(isolate, buffer, 4*1024);                \
77   bool failure = false;
78 
79 
80 // This macro assembles one instruction using the preallocated assembler and
81 // disassembles the generated instruction, comparing the output to the expected
82 // value. If the comparison fails an error message is printed, but the test
83 // continues to run until the end.
84 #define COMPARE(asm_, compare_string) \
85   { \
86     int pc_offset = assm.pc_offset(); \
87     byte *progcounter = &buffer[pc_offset]; \
88     assm.asm_; \
89     if (!DisassembleAndCompare(progcounter, compare_string)) failure = true; \
90   }
91 
92 
93 // Verify that all invocations of the COMPARE macro passed successfully.
94 // Exit with a failure if at least one of the tests failed.
95 #define VERIFY_RUN() \
96 if (failure) { \
97     V8_Fatal(__FILE__, __LINE__, "MIPS Disassembler tests failed.\n"); \
98   }
99 
100 
101 #define COMPARE_PC_REL_COMPACT(asm_, compare_string, offset)                   \
102   {                                                                            \
103     int pc_offset = assm.pc_offset();                                          \
104     byte *progcounter = &buffer[pc_offset];                                    \
105     char str_with_address[100];                                                \
106     prev_instr_compact_branch = assm.IsPrevInstrCompactBranch();               \
107     if (prev_instr_compact_branch) {                                           \
108       snprintf(str_with_address, sizeof(str_with_address), "%s -> %p",         \
109                compare_string, progcounter + 8 + (offset * 4));                \
110     } else {                                                                   \
111       snprintf(str_with_address, sizeof(str_with_address), "%s -> %p",         \
112                compare_string, progcounter + 4 + (offset * 4));                \
113     }                                                                          \
114     assm.asm_;                                                                 \
115     if (!DisassembleAndCompare(progcounter, str_with_address)) failure = true; \
116   }
117 
118 
119 #define COMPARE_PC_REL(asm_, compare_string, offset)                           \
120   {                                                                            \
121     int pc_offset = assm.pc_offset();                                          \
122     byte *progcounter = &buffer[pc_offset];                                    \
123     char str_with_address[100];                                                \
124     snprintf(str_with_address, sizeof(str_with_address), "%s -> %p",           \
125              compare_string, progcounter + (offset * 4));                      \
126     assm.asm_;                                                                 \
127     if (!DisassembleAndCompare(progcounter, str_with_address)) failure = true; \
128   }
129 
130 
131 #define COMPARE_PC_JUMP(asm_, compare_string, target)                          \
132   {                                                                            \
133     int pc_offset = assm.pc_offset();                                          \
134     byte *progcounter = &buffer[pc_offset];                                    \
135     char str_with_address[100];                                                \
136     int instr_index = (target >> 2) & kImm26Mask;                              \
137     snprintf(                                                                  \
138         str_with_address, sizeof(str_with_address), "%s %p -> %p",             \
139         compare_string, reinterpret_cast<byte *>(target),                      \
140         reinterpret_cast<byte *>(((uint64_t)(progcounter + 1) & ~0xfffffff) |  \
141                                  (instr_index << 2)));                         \
142     assm.asm_;                                                                 \
143     if (!DisassembleAndCompare(progcounter, str_with_address)) failure = true; \
144   }
145 
146 
147 #define GET_PC_REGION(pc_region)                                         \
148   {                                                                      \
149     int pc_offset = assm.pc_offset();                                    \
150     byte *progcounter = &buffer[pc_offset];                              \
151     pc_region = reinterpret_cast<int64_t>(progcounter + 4) & ~0xfffffff; \
152   }
153 
154 
TEST(Type0)155 TEST(Type0) {
156   SET_UP();
157 
158   COMPARE(addu(a0, a1, a2),
159           "00a62021       addu    a0, a1, a2");
160   COMPARE(daddu(a0, a1, a2),
161           "00a6202d       daddu   a0, a1, a2");
162   COMPARE(addu(a6, a7, t0),
163           "016c5021       addu    a6, a7, t0");
164   COMPARE(daddu(a6, a7, t0),
165           "016c502d       daddu   a6, a7, t0");
166   COMPARE(addu(v0, v1, s0),
167           "00701021       addu    v0, v1, s0");
168   COMPARE(daddu(v0, v1, s0),
169           "0070102d       daddu   v0, v1, s0");
170 
171   COMPARE(subu(a0, a1, a2),
172           "00a62023       subu    a0, a1, a2");
173   COMPARE(dsubu(a0, a1, a2),
174           "00a6202f       dsubu   a0, a1, a2");
175   COMPARE(subu(a6, a7, t0),
176           "016c5023       subu    a6, a7, t0");
177   COMPARE(dsubu(a6, a7, t0),
178           "016c502f       dsubu   a6, a7, t0");
179   COMPARE(subu(v0, v1, s0),
180           "00701023       subu    v0, v1, s0");
181   COMPARE(dsubu(v0, v1, s0),
182           "0070102f       dsubu   v0, v1, s0");
183 
184   if (kArchVariant != kMips64r6) {
185     COMPARE(mult(a0, a1),
186             "00850018       mult    a0, a1");
187     COMPARE(dmult(a0, a1),
188             "0085001c       dmult   a0, a1");
189     COMPARE(mult(a6, a7),
190             "014b0018       mult    a6, a7");
191     COMPARE(dmult(a6, a7),
192             "014b001c       dmult   a6, a7");
193     COMPARE(mult(v0, v1),
194             "00430018       mult    v0, v1");
195     COMPARE(dmult(v0, v1),
196             "0043001c       dmult   v0, v1");
197 
198     COMPARE(multu(a0, a1),
199             "00850019       multu   a0, a1");
200     COMPARE(dmultu(a0, a1),
201             "0085001d       dmultu  a0, a1");
202     COMPARE(multu(a6, a7),
203             "014b0019       multu   a6, a7");
204     COMPARE(dmultu(a6, a7),
205             "014b001d       dmultu  a6, a7");
206     COMPARE(multu(v0, v1),
207             "00430019       multu   v0, v1");
208     COMPARE(dmultu(v0, v1),
209             "0043001d       dmultu  v0, v1");
210 
211     COMPARE(div(a0, a1),
212             "0085001a       div     a0, a1");
213     COMPARE(div(a6, a7),
214             "014b001a       div     a6, a7");
215     COMPARE(div(v0, v1),
216             "0043001a       div     v0, v1");
217     COMPARE(ddiv(a0, a1),
218             "0085001e       ddiv    a0, a1");
219     COMPARE(ddiv(a6, a7),
220             "014b001e       ddiv    a6, a7");
221     COMPARE(ddiv(v0, v1),
222             "0043001e       ddiv    v0, v1");
223 
224     COMPARE(divu(a0, a1),
225             "0085001b       divu    a0, a1");
226     COMPARE(divu(a6, a7),
227             "014b001b       divu    a6, a7");
228     COMPARE(divu(v0, v1),
229             "0043001b       divu    v0, v1");
230     COMPARE(ddivu(a0, a1),
231             "0085001f       ddivu   a0, a1");
232     COMPARE(ddivu(a6, a7),
233             "014b001f       ddivu   a6, a7");
234     COMPARE(ddivu(v0, v1),
235             "0043001f       ddivu   v0, v1");
236     COMPARE(mul(a0, a1, a2),
237             "70a62002       mul     a0, a1, a2");
238     COMPARE(mul(a6, a7, t0),
239             "716c5002       mul     a6, a7, t0");
240     COMPARE(mul(v0, v1, s0),
241             "70701002       mul     v0, v1, s0");
242   } else {  // MIPS64r6.
243     COMPARE(mul(a0, a1, a2),
244             "00a62098       mul    a0, a1, a2");
245     COMPARE(muh(a0, a1, a2),
246             "00a620d8       muh    a0, a1, a2");
247     COMPARE(dmul(a0, a1, a2),
248             "00a6209c       dmul   a0, a1, a2");
249     COMPARE(dmuh(a0, a1, a2),
250             "00a620dc       dmuh   a0, a1, a2");
251     COMPARE(mul(a5, a6, a7),
252             "014b4898       mul    a5, a6, a7");
253     COMPARE(muh(a5, a6, a7),
254             "014b48d8       muh    a5, a6, a7");
255     COMPARE(dmul(a5, a6, a7),
256             "014b489c       dmul   a5, a6, a7");
257     COMPARE(dmuh(a5, a6, a7),
258             "014b48dc       dmuh   a5, a6, a7");
259     COMPARE(mul(v0, v1, a0),
260             "00641098       mul    v0, v1, a0");
261     COMPARE(muh(v0, v1, a0),
262             "006410d8       muh    v0, v1, a0");
263     COMPARE(dmul(v0, v1, a0),
264             "0064109c       dmul   v0, v1, a0");
265     COMPARE(dmuh(v0, v1, a0),
266             "006410dc       dmuh   v0, v1, a0");
267 
268     COMPARE(mulu(a0, a1, a2),
269             "00a62099       mulu   a0, a1, a2");
270     COMPARE(muhu(a0, a1, a2),
271             "00a620d9       muhu   a0, a1, a2");
272     COMPARE(dmulu(a0, a1, a2),
273             "00a6209d       dmulu  a0, a1, a2");
274     COMPARE(dmuhu(a0, a1, a2),
275             "00a620dd       dmuhu  a0, a1, a2");
276     COMPARE(mulu(a5, a6, a7),
277             "014b4899       mulu   a5, a6, a7");
278     COMPARE(muhu(a5, a6, a7),
279             "014b48d9       muhu   a5, a6, a7");
280     COMPARE(dmulu(a5, a6, a7),
281             "014b489d       dmulu  a5, a6, a7");
282     COMPARE(dmuhu(a5, a6, a7),
283             "014b48dd       dmuhu  a5, a6, a7");
284     COMPARE(mulu(v0, v1, a0),
285             "00641099       mulu   v0, v1, a0");
286     COMPARE(muhu(v0, v1, a0),
287             "006410d9       muhu   v0, v1, a0");
288     COMPARE(dmulu(v0, v1, a0),
289             "0064109d       dmulu  v0, v1, a0");
290     COMPARE(dmuhu(v0, v1, a0),
291             "006410dd       dmuhu  v0, v1, a0");
292 
293     COMPARE(div(a0, a1, a2),
294             "00a6209a       div    a0, a1, a2");
295     COMPARE(mod(a0, a1, a2),
296             "00a620da       mod    a0, a1, a2");
297     COMPARE(ddiv(a0, a1, a2),
298             "00a6209e       ddiv   a0, a1, a2");
299     COMPARE(dmod(a0, a1, a2),
300             "00a620de       dmod   a0, a1, a2");
301     COMPARE(div(a5, a6, a7),
302             "014b489a       div    a5, a6, a7");
303     COMPARE(mod(a5, a6, a7),
304             "014b48da       mod    a5, a6, a7");
305     COMPARE(ddiv(a5, a6, a7),
306             "014b489e       ddiv   a5, a6, a7");
307     COMPARE(dmod(a5, a6, a7),
308             "014b48de       dmod   a5, a6, a7");
309     COMPARE(div(v0, v1, a0),
310             "0064109a       div    v0, v1, a0");
311     COMPARE(mod(v0, v1, a0),
312             "006410da       mod    v0, v1, a0");
313     COMPARE(ddiv(v0, v1, a0),
314             "0064109e       ddiv   v0, v1, a0");
315     COMPARE(dmod(v0, v1, a0),
316             "006410de       dmod   v0, v1, a0");
317 
318     COMPARE(divu(a0, a1, a2),
319             "00a6209b       divu   a0, a1, a2");
320     COMPARE(modu(a0, a1, a2),
321             "00a620db       modu   a0, a1, a2");
322     COMPARE(ddivu(a0, a1, a2),
323             "00a6209f       ddivu  a0, a1, a2");
324     COMPARE(dmodu(a0, a1, a2),
325             "00a620df       dmodu  a0, a1, a2");
326     COMPARE(divu(a5, a6, a7),
327             "014b489b       divu   a5, a6, a7");
328     COMPARE(modu(a5, a6, a7),
329             "014b48db       modu   a5, a6, a7");
330     COMPARE(ddivu(a5, a6, a7),
331             "014b489f       ddivu  a5, a6, a7");
332     COMPARE(dmodu(a5, a6, a7),
333             "014b48df       dmodu  a5, a6, a7");
334     COMPARE(divu(v0, v1, a0),
335             "0064109b       divu   v0, v1, a0");
336     COMPARE(modu(v0, v1, a0),
337             "006410db       modu   v0, v1, a0");
338     COMPARE(ddivu(v0, v1, a0),
339             "0064109f       ddivu  v0, v1, a0");
340     COMPARE(dmodu(v0, v1, a0),
341             "006410df       dmodu  v0, v1, a0");
342   }
343 
344   COMPARE(addiu(a0, a1, 0x0),
345           "24a40000       addiu   a0, a1, 0");
346   COMPARE(addiu(s0, s1, 32767),
347           "26307fff       addiu   s0, s1, 32767");
348   COMPARE(addiu(a6, a7, -32768),
349           "256a8000       addiu   a6, a7, -32768");
350   COMPARE(addiu(v0, v1, -1),
351           "2462ffff       addiu   v0, v1, -1");
352   COMPARE(daddiu(a0, a1, 0x0),
353           "64a40000       daddiu  a0, a1, 0");
354   COMPARE(daddiu(s0, s1, 32767),
355           "66307fff       daddiu  s0, s1, 32767");
356   COMPARE(daddiu(a6, a7, -32768),
357           "656a8000       daddiu  a6, a7, -32768");
358   COMPARE(daddiu(v0, v1, -1),
359           "6462ffff       daddiu  v0, v1, -1");
360 
361   COMPARE(and_(a0, a1, a2),
362           "00a62024       and     a0, a1, a2");
363   COMPARE(and_(s0, s1, s2),
364           "02328024       and     s0, s1, s2");
365   COMPARE(and_(a6, a7, t0),
366           "016c5024       and     a6, a7, t0");
367   COMPARE(and_(v0, v1, a2),
368           "00661024       and     v0, v1, a2");
369 
370   COMPARE(or_(a0, a1, a2),
371           "00a62025       or      a0, a1, a2");
372   COMPARE(or_(s0, s1, s2),
373           "02328025       or      s0, s1, s2");
374   COMPARE(or_(a6, a7, t0),
375           "016c5025       or      a6, a7, t0");
376   COMPARE(or_(v0, v1, a2),
377           "00661025       or      v0, v1, a2");
378 
379   COMPARE(xor_(a0, a1, a2),
380           "00a62026       xor     a0, a1, a2");
381   COMPARE(xor_(s0, s1, s2),
382           "02328026       xor     s0, s1, s2");
383   COMPARE(xor_(a6, a7, t0),
384           "016c5026       xor     a6, a7, t0");
385   COMPARE(xor_(v0, v1, a2),
386           "00661026       xor     v0, v1, a2");
387 
388   COMPARE(nor(a0, a1, a2),
389           "00a62027       nor     a0, a1, a2");
390   COMPARE(nor(s0, s1, s2),
391           "02328027       nor     s0, s1, s2");
392   COMPARE(nor(a6, a7, t0),
393           "016c5027       nor     a6, a7, t0");
394   COMPARE(nor(v0, v1, a2),
395           "00661027       nor     v0, v1, a2");
396 
397   COMPARE(andi(a0, a1, 0x1),
398           "30a40001       andi    a0, a1, 0x1");
399   COMPARE(andi(v0, v1, 0xffff),
400           "3062ffff       andi    v0, v1, 0xffff");
401 
402   COMPARE(ori(a0, a1, 0x1),
403           "34a40001       ori     a0, a1, 0x1");
404   COMPARE(ori(v0, v1, 0xffff),
405           "3462ffff       ori     v0, v1, 0xffff");
406 
407   COMPARE(xori(a0, a1, 0x1),
408           "38a40001       xori    a0, a1, 0x1");
409   COMPARE(xori(v0, v1, 0xffff),
410           "3862ffff       xori    v0, v1, 0xffff");
411 
412   COMPARE(lui(a0, 0x1),
413           "3c040001       lui     a0, 0x1");
414   COMPARE(lui(v0, 0xffff),
415           "3c02ffff       lui     v0, 0xffff");
416 
417   if (kArchVariant == (kMips64r6)) {
418     COMPARE(aui(a0, a1, 0x1), "3ca40001       aui     a0, a1, 0x1");
419     COMPARE(aui(v0, v1, 0xffff), "3c62ffff       aui     v0, v1, 0xffff");
420 
421     COMPARE(daui(a0, a1, 0x1), "74a40001       daui    a0, a1, 0x1");
422     COMPARE(daui(v0, v1, 0xffff), "7462ffff       daui    v0, v1, 0xffff");
423 
424     COMPARE(dahi(a0, 0x1), "04860001       dahi    a0, 0x1");
425     COMPARE(dahi(v0, 0xffff), "0446ffff       dahi    v0, 0xffff");
426 
427     COMPARE(dati(a0, 0x1), "049e0001       dati    a0, 0x1");
428     COMPARE(dati(v0, 0xffff), "045effff       dati    v0, 0xffff");
429   }
430 
431   COMPARE(sll(a0, a1, 0),
432           "00052000       sll     a0, a1, 0");
433   COMPARE(sll(s0, s1, 8),
434           "00118200       sll     s0, s1, 8");
435   COMPARE(sll(a6, a7, 24),
436           "000b5600       sll     a6, a7, 24");
437   COMPARE(sll(v0, v1, 31),
438           "000317c0       sll     v0, v1, 31");
439   COMPARE(dsll(a0, a1, 0),
440           "00052038       dsll    a0, a1, 0");
441   COMPARE(dsll(s0, s1, 8),
442           "00118238       dsll    s0, s1, 8");
443   COMPARE(dsll(a6, a7, 24),
444           "000b5638       dsll    a6, a7, 24");
445   COMPARE(dsll(v0, v1, 31),
446           "000317f8       dsll    v0, v1, 31");
447 
448   COMPARE(sllv(a0, a1, a2),
449           "00c52004       sllv    a0, a1, a2");
450   COMPARE(sllv(s0, s1, s2),
451           "02518004       sllv    s0, s1, s2");
452   COMPARE(sllv(a6, a7, t0),
453           "018b5004       sllv    a6, a7, t0");
454   COMPARE(sllv(v0, v1, fp),
455           "03c31004       sllv    v0, v1, fp");
456   COMPARE(dsllv(a0, a1, a2),
457           "00c52014       dsllv   a0, a1, a2");
458   COMPARE(dsllv(s0, s1, s2),
459           "02518014       dsllv   s0, s1, s2");
460   COMPARE(dsllv(a6, a7, t0),
461           "018b5014       dsllv   a6, a7, t0");
462   COMPARE(dsllv(v0, v1, fp),
463           "03c31014       dsllv   v0, v1, fp");
464 
465   COMPARE(srl(a0, a1, 0),
466           "00052002       srl     a0, a1, 0");
467   COMPARE(srl(s0, s1, 8),
468           "00118202       srl     s0, s1, 8");
469   COMPARE(srl(a6, a7, 24),
470           "000b5602       srl     a6, a7, 24");
471   COMPARE(srl(v0, v1, 31),
472           "000317c2       srl     v0, v1, 31");
473   COMPARE(dsrl(a0, a1, 0),
474           "0005203a       dsrl    a0, a1, 0");
475   COMPARE(dsrl(s0, s1, 8),
476           "0011823a       dsrl    s0, s1, 8");
477   COMPARE(dsrl(a6, a7, 24),
478           "000b563a       dsrl    a6, a7, 24");
479   COMPARE(dsrl(v0, v1, 31),
480           "000317fa       dsrl    v0, v1, 31");
481 
482   COMPARE(srlv(a0, a1, a2),
483           "00c52006       srlv    a0, a1, a2");
484   COMPARE(srlv(s0, s1, s2),
485           "02518006       srlv    s0, s1, s2");
486   COMPARE(srlv(a6, a7, t0),
487           "018b5006       srlv    a6, a7, t0");
488   COMPARE(srlv(v0, v1, fp),
489           "03c31006       srlv    v0, v1, fp");
490   COMPARE(dsrlv(a0, a1, a2),
491           "00c52016       dsrlv   a0, a1, a2");
492   COMPARE(dsrlv(s0, s1, s2),
493           "02518016       dsrlv   s0, s1, s2");
494   COMPARE(dsrlv(a6, a7, t0),
495           "018b5016       dsrlv   a6, a7, t0");
496   COMPARE(dsrlv(v0, v1, fp),
497           "03c31016       dsrlv   v0, v1, fp");
498 
499   COMPARE(sra(a0, a1, 0),
500           "00052003       sra     a0, a1, 0");
501   COMPARE(sra(s0, s1, 8),
502           "00118203       sra     s0, s1, 8");
503   COMPARE(sra(a6, a7, 24),
504           "000b5603       sra     a6, a7, 24");
505   COMPARE(sra(v0, v1, 31),
506           "000317c3       sra     v0, v1, 31");
507   COMPARE(dsra(a0, a1, 0),
508           "0005203b       dsra    a0, a1, 0");
509   COMPARE(dsra(s0, s1, 8),
510           "0011823b       dsra    s0, s1, 8");
511   COMPARE(dsra(a6, a7, 24),
512           "000b563b       dsra    a6, a7, 24");
513   COMPARE(dsra(v0, v1, 31),
514           "000317fb       dsra    v0, v1, 31");
515 
516   COMPARE(srav(a0, a1, a2),
517           "00c52007       srav    a0, a1, a2");
518   COMPARE(srav(s0, s1, s2),
519           "02518007       srav    s0, s1, s2");
520   COMPARE(srav(a6, a7, t0),
521           "018b5007       srav    a6, a7, t0");
522   COMPARE(srav(v0, v1, fp),
523           "03c31007       srav    v0, v1, fp");
524   COMPARE(dsrav(a0, a1, a2),
525           "00c52017       dsrav   a0, a1, a2");
526   COMPARE(dsrav(s0, s1, s2),
527           "02518017       dsrav   s0, s1, s2");
528   COMPARE(dsrav(a6, a7, t0),
529           "018b5017       dsrav   a6, a7, t0");
530   COMPARE(dsrav(v0, v1, fp),
531           "03c31017       dsrav   v0, v1, fp");
532 
533   if (kArchVariant == kMips64r2) {
534     COMPARE(rotr(a0, a1, 0),
535             "00252002       rotr    a0, a1, 0");
536     COMPARE(rotr(s0, s1, 8),
537             "00318202       rotr    s0, s1, 8");
538     COMPARE(rotr(a6, a7, 24),
539             "002b5602       rotr    a6, a7, 24");
540     COMPARE(rotr(v0, v1, 31),
541             "002317c2       rotr    v0, v1, 31");
542     COMPARE(drotr(a0, a1, 0),
543             "0025203a       drotr   a0, a1, 0");
544     COMPARE(drotr(s0, s1, 8),
545             "0031823a       drotr   s0, s1, 8");
546     COMPARE(drotr(a6, a7, 24),
547             "002b563a       drotr   a6, a7, 24");
548     COMPARE(drotr(v0, v1, 31),
549             "002317fa       drotr   v0, v1, 31");
550 
551     COMPARE(rotrv(a0, a1, a2),
552             "00c52046       rotrv   a0, a1, a2");
553     COMPARE(rotrv(s0, s1, s2),
554             "02518046       rotrv   s0, s1, s2");
555     COMPARE(rotrv(a6, a7, t0),
556             "018b5046       rotrv   a6, a7, t0");
557     COMPARE(rotrv(v0, v1, fp),
558             "03c31046       rotrv   v0, v1, fp");
559     COMPARE(drotrv(a0, a1, a2),
560             "00c52056       drotrv  a0, a1, a2");
561     COMPARE(drotrv(s0, s1, s2),
562             "02518056       drotrv  s0, s1, s2");
563     COMPARE(drotrv(a6, a7, t0),
564             "018b5056       drotrv  a6, a7, t0");
565     COMPARE(drotrv(v0, v1, fp),
566             "03c31056       drotrv  v0, v1, fp");
567   }
568 
569   COMPARE(break_(0),
570           "0000000d       break, code: 0x00000 (0)");
571   COMPARE(break_(261120),
572           "00ff000d       break, code: 0x3fc00 (261120)");
573   COMPARE(break_(1047552),
574           "03ff000d       break, code: 0xffc00 (1047552)");
575 
576   COMPARE(tge(a0, a1, 0),
577           "00850030       tge     a0, a1, code: 0x000");
578   COMPARE(tge(s0, s1, 1023),
579           "0211fff0       tge     s0, s1, code: 0x3ff");
580   COMPARE(tgeu(a0, a1, 0),
581           "00850031       tgeu    a0, a1, code: 0x000");
582   COMPARE(tgeu(s0, s1, 1023),
583           "0211fff1       tgeu    s0, s1, code: 0x3ff");
584   COMPARE(tlt(a0, a1, 0),
585           "00850032       tlt     a0, a1, code: 0x000");
586   COMPARE(tlt(s0, s1, 1023),
587           "0211fff2       tlt     s0, s1, code: 0x3ff");
588   COMPARE(tltu(a0, a1, 0),
589           "00850033       tltu    a0, a1, code: 0x000");
590   COMPARE(tltu(s0, s1, 1023),
591           "0211fff3       tltu    s0, s1, code: 0x3ff");
592   COMPARE(teq(a0, a1, 0),
593           "00850034       teq     a0, a1, code: 0x000");
594   COMPARE(teq(s0, s1, 1023),
595           "0211fff4       teq     s0, s1, code: 0x3ff");
596   COMPARE(tne(a0, a1, 0),
597           "00850036       tne     a0, a1, code: 0x000");
598   COMPARE(tne(s0, s1, 1023),
599           "0211fff6       tne     s0, s1, code: 0x3ff");
600 
601   COMPARE(mfhi(a0),
602           "00002010       mfhi    a0");
603   COMPARE(mfhi(s2),
604           "00009010       mfhi    s2");
605   COMPARE(mfhi(t0),
606           "00006010       mfhi    t0");
607   COMPARE(mfhi(v1),
608           "00001810       mfhi    v1");
609   COMPARE(mflo(a0),
610           "00002012       mflo    a0");
611   COMPARE(mflo(s2),
612           "00009012       mflo    s2");
613   COMPARE(mflo(t0),
614           "00006012       mflo    t0");
615   COMPARE(mflo(v1),
616           "00001812       mflo    v1");
617 
618   COMPARE(slt(a0, a1, a2),
619           "00a6202a       slt     a0, a1, a2");
620   COMPARE(slt(s0, s1, s2),
621           "0232802a       slt     s0, s1, s2");
622   COMPARE(slt(a6, a7, t0),
623           "016c502a       slt     a6, a7, t0");
624   COMPARE(slt(v0, v1, a2),
625           "0066102a       slt     v0, v1, a2");
626   COMPARE(sltu(a0, a1, a2),
627           "00a6202b       sltu    a0, a1, a2");
628   COMPARE(sltu(s0, s1, s2),
629           "0232802b       sltu    s0, s1, s2");
630   COMPARE(sltu(a6, a7, t0),
631           "016c502b       sltu    a6, a7, t0");
632   COMPARE(sltu(v0, v1, a2),
633           "0066102b       sltu    v0, v1, a2");
634 
635   COMPARE(slti(a0, a1, 0),
636           "28a40000       slti    a0, a1, 0");
637   COMPARE(slti(s0, s1, 32767),
638           "2a307fff       slti    s0, s1, 32767");
639   COMPARE(slti(a6, a7, -32768),
640           "296a8000       slti    a6, a7, -32768");
641   COMPARE(slti(v0, v1, -1),
642           "2862ffff       slti    v0, v1, -1");
643   COMPARE(sltiu(a0, a1, 0),
644           "2ca40000       sltiu   a0, a1, 0");
645   COMPARE(sltiu(s0, s1, 32767),
646           "2e307fff       sltiu   s0, s1, 32767");
647   COMPARE(sltiu(a6, a7, -32768),
648           "2d6a8000       sltiu   a6, a7, -32768");
649   COMPARE(sltiu(v0, v1, -1),
650           "2c62ffff       sltiu   v0, v1, -1");
651   COMPARE(movz(a0, a1, a2),
652           "00a6200a       movz    a0, a1, a2");
653   COMPARE(movz(s0, s1, s2),
654           "0232800a       movz    s0, s1, s2");
655   COMPARE(movz(a6, a7, t0),
656           "016c500a       movz    a6, a7, t0");
657   COMPARE(movz(v0, v1, a2),
658           "0066100a       movz    v0, v1, a2");
659   COMPARE(movn(a0, a1, a2),
660           "00a6200b       movn    a0, a1, a2");
661   COMPARE(movn(s0, s1, s2),
662           "0232800b       movn    s0, s1, s2");
663   COMPARE(movn(a6, a7, t0),
664           "016c500b       movn    a6, a7, t0");
665   COMPARE(movn(v0, v1, a2),
666           "0066100b       movn    v0, v1, a2");
667 
668   COMPARE(movt(a0, a1, 1),
669           "00a52001       movt    a0, a1, 1");
670   COMPARE(movt(s0, s1, 2),
671           "02298001       movt    s0, s1, 2");
672   COMPARE(movt(a6, a7, 3),
673           "016d5001       movt    a6, a7, 3");
674   COMPARE(movt(v0, v1, 7),
675           "007d1001       movt    v0, v1, 7");
676   COMPARE(movf(a0, a1, 0),
677           "00a02001       movf    a0, a1, 0");
678   COMPARE(movf(s0, s1, 4),
679           "02308001       movf    s0, s1, 4");
680   COMPARE(movf(a6, a7, 5),
681           "01745001       movf    a6, a7, 5");
682   COMPARE(movf(v0, v1, 6),
683           "00781001       movf    v0, v1, 6");
684 
685   if (kArchVariant == kMips64r6) {
686     COMPARE(clz(a0, a1),
687             "00a02050       clz     a0, a1");
688     COMPARE(clz(s6, s7),
689             "02e0b050       clz     s6, s7");
690     COMPARE(clz(v0, v1),
691             "00601050       clz     v0, v1");
692   } else {
693     COMPARE(clz(a0, a1),
694             "70a42020       clz     a0, a1");
695     COMPARE(clz(s6, s7),
696             "72f6b020       clz     s6, s7");
697     COMPARE(clz(v0, v1),
698             "70621020       clz     v0, v1");
699   }
700 
701   COMPARE(ins_(a0, a1, 31, 1),
702           "7ca4ffc4       ins     a0, a1, 31, 1");
703   COMPARE(ins_(s6, s7, 30, 2),
704           "7ef6ff84       ins     s6, s7, 30, 2");
705   COMPARE(ins_(v0, v1, 0, 32),
706           "7c62f804       ins     v0, v1, 0, 32");
707   COMPARE(ext_(a0, a1, 31, 1),
708           "7ca407c0       ext     a0, a1, 31, 1");
709   COMPARE(ext_(s6, s7, 30, 2),
710           "7ef60f80       ext     s6, s7, 30, 2");
711   COMPARE(ext_(v0, v1, 0, 32),
712           "7c62f800       ext     v0, v1, 0, 32");
713 
714   COMPARE(add_s(f4, f6, f8), "46083100       add.s   f4, f6, f8");
715   COMPARE(add_d(f12, f14, f16), "46307300       add.d   f12, f14, f16");
716 
717   if (kArchVariant == kMips64r6) {
718     COMPARE(bitswap(a0, a1), "7c052020       bitswap a0, a1");
719     COMPARE(bitswap(t8, s0), "7c10c020       bitswap t8, s0");
720     COMPARE(dbitswap(a0, a1), "7c052024       dbitswap a0, a1");
721     COMPARE(dbitswap(t8, s0), "7c10c024       dbitswap t8, s0");
722   }
723 
724   COMPARE(abs_s(f6, f8), "46004185       abs.s   f6, f8");
725   COMPARE(abs_d(f10, f12), "46206285       abs.d   f10, f12");
726 
727   COMPARE(div_s(f2, f4, f6), "46062083       div.s   f2, f4, f6");
728   COMPARE(div_d(f2, f4, f6), "46262083       div.d   f2, f4, f6");
729 
730   if (kArchVariant == kMips64r6) {
731     COMPARE(align(v0, a0, a1, 0), "7c851220       align  v0, a0, a1, 0");
732     COMPARE(align(v0, a0, a1, 1), "7c851260       align  v0, a0, a1, 1");
733     COMPARE(align(v0, a0, a1, 2), "7c8512a0       align  v0, a0, a1, 2");
734     COMPARE(align(v0, a0, a1, 3), "7c8512e0       align  v0, a0, a1, 3");
735   }
736 
737   if (kArchVariant == kMips64r6) {
738     COMPARE(dalign(v0, a0, a1, 0), "7c851224       dalign  v0, a0, a1, 0");
739     COMPARE(dalign(v0, a0, a1, 1), "7c851264       dalign  v0, a0, a1, 1");
740     COMPARE(dalign(v0, a0, a1, 2), "7c8512a4       dalign  v0, a0, a1, 2");
741     COMPARE(dalign(v0, a0, a1, 3), "7c8512e4       dalign  v0, a0, a1, 3");
742     COMPARE(dalign(v0, a0, a1, 4), "7c851324       dalign  v0, a0, a1, 4");
743     COMPARE(dalign(v0, a0, a1, 5), "7c851364       dalign  v0, a0, a1, 5");
744     COMPARE(dalign(v0, a0, a1, 6), "7c8513a4       dalign  v0, a0, a1, 6");
745     COMPARE(dalign(v0, a0, a1, 7), "7c8513e4       dalign  v0, a0, a1, 7");
746   }
747 
748   if (kArchVariant == kMips64r6) {
749     COMPARE(aluipc(v0, 0), "ec5f0000       aluipc  v0, 0");
750     COMPARE(aluipc(v0, 1), "ec5f0001       aluipc  v0, 1");
751     COMPARE(aluipc(v0, 32767), "ec5f7fff       aluipc  v0, 32767");
752     COMPARE(aluipc(v0, -32768), "ec5f8000       aluipc  v0, -32768");
753     COMPARE(aluipc(v0, -1), "ec5fffff       aluipc  v0, -1");
754   }
755 
756   if (kArchVariant == kMips64r6) {
757     COMPARE(auipc(t8, 0), "ef1e0000       auipc   t8, 0");
758     COMPARE(auipc(t8, 1), "ef1e0001       auipc   t8, 1");
759     COMPARE(auipc(t8, 32767), "ef1e7fff       auipc   t8, 32767");
760     COMPARE(auipc(t8, -32768), "ef1e8000       auipc   t8, -32768");
761     COMPARE(auipc(t8, -1), "ef1effff       auipc   t8, -1");
762   }
763 
764   if (kArchVariant == kMips64r6) {
765     COMPARE(lwpc(a5, 0), "ed280000       lwpc    a5, 0");
766     COMPARE(lwpc(a5, 4), "ed280004       lwpc    a5, 4");
767     COMPARE(lwpc(a5, -4), "ed2ffffc       lwpc    a5, -4");
768   }
769 
770   if (kArchVariant == kMips64r6) {
771     COMPARE(lwupc(a0, -262144), "ec940000       lwupc   a0, -262144");
772     COMPARE(lwupc(a0, -1), "ec97ffff       lwupc   a0, -1");
773     COMPARE(lwupc(a0, 0), "ec900000       lwupc   a0, 0");
774     COMPARE(lwupc(a0, 1), "ec900001       lwupc   a0, 1");
775     COMPARE(lwupc(a0, 262143), "ec93ffff       lwupc   a0, 262143");
776   }
777 
778   if (kArchVariant == kMips64r6) {
779     COMPARE(jic(t0, 16), "d80c0010       jic     t0, 16");
780     COMPARE(jic(t0, 4), "d80c0004       jic     t0, 4");
781     COMPARE(jic(t0, -32), "d80cffe0       jic     t0, -32");
782   }
783 
784   if (kArchVariant == kMips64r6) {
785     COMPARE(ldpc(v0, 256), "ec580100       ldpc    v0, 256");
786     COMPARE(ldpc(a0, -1), "ec9bffff       ldpc    a0, -1");
787     COMPARE(ldpc(a1, 0), "ecb80000       ldpc    a1, 0");
788   }
789 
790   if (kArchVariant == kMips64r6) {
791     COMPARE(addiupc(a0, 262143), "ec83ffff       addiupc a0, 262143");
792     COMPARE(addiupc(a0, -1), "ec87ffff       addiupc a0, -1");
793     COMPARE(addiupc(v0, 0), "ec400000       addiupc v0, 0");
794     COMPARE(addiupc(s1, 1), "ee200001       addiupc s1, 1");
795     COMPARE(addiupc(a0, -262144), "ec840000       addiupc a0, -262144");
796   }
797 
798   if (kArchVariant == kMips64r6) {
799     COMPARE(jialc(a0, -32768), "f8048000       jialc   a0, -32768");
800     COMPARE(jialc(a0, -1), "f804ffff       jialc   a0, -1");
801     COMPARE(jialc(v0, 0), "f8020000       jialc   v0, 0");
802     COMPARE(jialc(s1, 1), "f8110001       jialc   s1, 1");
803     COMPARE(jialc(a0, 32767), "f8047fff       jialc   a0, 32767");
804   }
805 
806   VERIFY_RUN();
807 }
808 
809 
TEST(Type1)810 TEST(Type1) {
811   SET_UP();
812   if (kArchVariant == kMips64r6) {
813     COMPARE(seleqz(a0, a1, a2), "00a62035       seleqz    a0, a1, a2");
814     COMPARE(selnez(a0, a1, a2), "00a62037       selnez    a0, a1, a2");
815 
816 
817     COMPARE(seleqz(D, f3, f4, f5), "462520d4       seleqz.d    f3, f4, f5");
818     COMPARE(selnez(D, f3, f4, f5), "462520d7       selnez.d    f3, f4, f5");
819     COMPARE(seleqz(S, f3, f4, f5), "460520d4       seleqz.s    f3, f4, f5");
820     COMPARE(selnez(S, f3, f4, f5), "460520d7       selnez.s    f3, f4, f5");
821 
822     COMPARE(min_d(f3, f4, f5), "462520dc       min.d    f3, f4, f5");
823     COMPARE(max_d(f3, f4, f5), "462520de       max.d    f3, f4, f5");
824 
825     COMPARE(sel(S, f3, f4, f5), "460520d0       sel.s      f3, f4, f5");
826     COMPARE(sel(D, f3, f4, f5), "462520d0       sel.d      f3, f4, f5");
827 
828     COMPARE(rint_d(f8, f6), "4620321a       rint.d    f8, f6");
829 
830     COMPARE(min_s(f3, f4, f5), "460520dc       min.s    f3, f4, f5");
831     COMPARE(max_s(f3, f4, f5), "460520de       max.s    f3, f4, f5");
832 
833     COMPARE(rint(S, f8, f6), "4600321a       rint.s    f8, f6");
834 
835     COMPARE(mina_d(f3, f4, f5), "462520dd       mina.d   f3, f4, f5");
836     COMPARE(mina_s(f3, f4, f5), "460520dd       mina.s   f3, f4, f5");
837 
838     COMPARE(maxa_d(f3, f4, f5), "462520df       maxa.d   f3, f4, f5");
839     COMPARE(maxa_s(f3, f4, f5), "460520df       maxa.s   f3, f4, f5");
840   }
841   COMPARE(trunc_w_d(f8, f6), "4620320d       trunc.w.d f8, f6");
842   COMPARE(trunc_w_s(f8, f6), "4600320d       trunc.w.s f8, f6");
843 
844   COMPARE(round_w_s(f8, f6), "4600320c       round.w.s f8, f6");
845   COMPARE(round_w_d(f8, f6), "4620320c       round.w.d f8, f6");
846 
847   COMPARE(round_l_s(f8, f6), "46003208       round.l.s f8, f6");
848   COMPARE(round_l_d(f8, f6), "46203208       round.l.d f8, f6");
849 
850   COMPARE(floor_w_s(f8, f6), "4600320f       floor.w.s f8, f6");
851   COMPARE(floor_w_d(f8, f6), "4620320f       floor.w.d f8, f6");
852 
853   COMPARE(floor_l_s(f8, f6), "4600320b       floor.l.s f8, f6");
854   COMPARE(floor_l_d(f8, f6), "4620320b       floor.l.d f8, f6");
855 
856   COMPARE(ceil_w_s(f8, f6), "4600320e       ceil.w.s f8, f6");
857   COMPARE(ceil_w_d(f8, f6), "4620320e       ceil.w.d f8, f6");
858 
859   COMPARE(ceil_l_s(f8, f6), "4600320a       ceil.l.s f8, f6");
860   COMPARE(ceil_l_d(f8, f6), "4620320a       ceil.l.d f8, f6");
861 
862   COMPARE(sub_s(f10, f8, f6), "46064281       sub.s   f10, f8, f6");
863   COMPARE(sub_d(f10, f8, f6), "46264281       sub.d   f10, f8, f6");
864 
865   COMPARE(sqrt_s(f8, f6), "46003204       sqrt.s  f8, f6");
866   COMPARE(sqrt_d(f8, f6), "46203204       sqrt.d  f8, f6");
867 
868   COMPARE(neg_s(f8, f6), "46003207       neg.s   f8, f6");
869   COMPARE(neg_d(f8, f6), "46203207       neg.d   f8, f6");
870 
871   COMPARE(mul_s(f8, f6, f4), "46043202       mul.s   f8, f6, f4");
872   COMPARE(mul_d(f8, f6, f4), "46243202       mul.d   f8, f6, f4");
873 
874   COMPARE(rsqrt_s(f8, f6), "46003216       rsqrt.s  f8, f6");
875   COMPARE(rsqrt_d(f8, f6), "46203216       rsqrt.d  f8, f6");
876 
877   COMPARE(recip_s(f8, f6), "46003215       recip.s  f8, f6");
878   COMPARE(recip_d(f8, f6), "46203215       recip.d  f8, f6");
879 
880   COMPARE(mov_s(f6, f4), "46002186       mov.s   f6, f4");
881   COMPARE(mov_d(f6, f4), "46202186       mov.d   f6, f4");
882   if (kArchVariant == kMips64r2) {
883     COMPARE(trunc_l_d(f8, f6), "46203209       trunc.l.d f8, f6");
884     COMPARE(trunc_l_s(f8, f6), "46003209       trunc.l.s f8, f6");
885 
886     COMPARE(movz_s(f6, f4, t0), "460c2192       movz.s    f6, f4, t0");
887     COMPARE(movz_d(f6, f4, t0), "462c2192       movz.d    f6, f4, t0");
888 
889     COMPARE(movt_s(f6, f4, 4), "46112191       movt.s    f6, f4, cc(1)");
890     COMPARE(movt_d(f6, f4, 4), "46312191       movt.d    f6, f4, cc(1)");
891 
892     COMPARE(movf_s(f6, f4, 4), "46102191       movf.s    f6, f4, cc(1)");
893     COMPARE(movf_d(f6, f4, 4), "46302191       movf.d    f6, f4, cc(1)");
894 
895     COMPARE(movn_s(f6, f4, t0), "460c2193       movn.s    f6, f4, t0");
896     COMPARE(movn_d(f6, f4, t0), "462c2193       movn.d    f6, f4, t0");
897   }
898   VERIFY_RUN();
899 }
900 
901 
TEST(Type2)902 TEST(Type2) {
903   if (kArchVariant == kMips64r6) {
904     SET_UP();
905 
906     COMPARE(class_s(f3, f4), "460020db       class.s f3, f4");
907     COMPARE(class_d(f2, f3), "4620189b       class.d f2, f3");
908 
909     VERIFY_RUN();
910   }
911 }
912 
913 
TEST(Type3)914 TEST(Type3) {
915   SET_UP();
916 
917   if (kArchVariant == kMips64r6) {
918     COMPARE_PC_REL_COMPACT(bovc(a0, a0, static_cast<int16_t>(0)),
919                            "20840000       bovc  a0, a0, 0", 0);
920     COMPARE_PC_REL_COMPACT(bovc(a1, a0, static_cast<int16_t>(0)),
921                            "20a40000       bovc  a1, a0, 0", 0);
922     COMPARE_PC_REL_COMPACT(bovc(a1, a0, 32767),
923                            "20a47fff       bovc  a1, a0, 32767", 32767);
924     COMPARE_PC_REL_COMPACT(bovc(a1, a0, -32768),
925                            "20a48000       bovc  a1, a0, -32768", -32768);
926 
927     COMPARE_PC_REL_COMPACT(bnvc(a0, a0, static_cast<int16_t>(0)),
928                            "60840000       bnvc  a0, a0, 0", 0);
929     COMPARE_PC_REL_COMPACT(bnvc(a1, a0, static_cast<int16_t>(0)),
930                            "60a40000       bnvc  a1, a0, 0", 0);
931     COMPARE_PC_REL_COMPACT(bnvc(a1, a0, 32767),
932                            "60a47fff       bnvc  a1, a0, 32767", 32767);
933     COMPARE_PC_REL_COMPACT(bnvc(a1, a0, -32768),
934                            "60a48000       bnvc  a1, a0, -32768", -32768);
935 
936     COMPARE_PC_REL_COMPACT(beqzc(a0, 0), "d8800000       beqzc   a0, 0", 0);
937     COMPARE_PC_REL_COMPACT(beqzc(a0, 1048575),  // 0x0fffff ==  1048575.
938                            "d88fffff       beqzc   a0, 1048575", 1048575);
939     COMPARE_PC_REL_COMPACT(beqzc(a0, -1048576),  // 0x100000 == -1048576.
940                            "d8900000       beqzc   a0, -1048576", -1048576);
941 
942     COMPARE_PC_REL_COMPACT(bnezc(a0, 0), "f8800000       bnezc   a0, 0", 0);
943     COMPARE_PC_REL_COMPACT(bnezc(a0, 1048575),  // int21 maximal value.
944                            "f88fffff       bnezc   a0, 1048575", 1048575);
945     COMPARE_PC_REL_COMPACT(bnezc(a0, -1048576),  // int21 minimal value.
946                            "f8900000       bnezc   a0, -1048576", -1048576);
947 
948     COMPARE_PC_REL_COMPACT(bc(-33554432), "ca000000       bc      -33554432",
949                            -33554432);
950     COMPARE_PC_REL_COMPACT(bc(-1), "cbffffff       bc      -1", -1);
951     COMPARE_PC_REL_COMPACT(bc(0), "c8000000       bc      0", 0);
952     COMPARE_PC_REL_COMPACT(bc(1), "c8000001       bc      1", 1);
953     COMPARE_PC_REL_COMPACT(bc(33554431), "c9ffffff       bc      33554431",
954                            33554431);
955 
956     COMPARE_PC_REL_COMPACT(balc(-33554432), "ea000000       balc    -33554432",
957                            -33554432);
958     COMPARE_PC_REL_COMPACT(balc(-1), "ebffffff       balc    -1", -1);
959     COMPARE_PC_REL_COMPACT(balc(0), "e8000000       balc    0", 0);
960     COMPARE_PC_REL_COMPACT(balc(1), "e8000001       balc    1", 1);
961     COMPARE_PC_REL_COMPACT(balc(33554431), "e9ffffff       balc    33554431",
962                            33554431);
963 
964     COMPARE_PC_REL_COMPACT(bgeuc(a0, a1, -32768),
965                            "18858000       bgeuc   a0, a1, -32768", -32768);
966     COMPARE_PC_REL_COMPACT(bgeuc(a0, a1, -1),
967                            "1885ffff       bgeuc   a0, a1, -1", -1);
968     COMPARE_PC_REL_COMPACT(bgeuc(a0, a1, 1), "18850001       bgeuc   a0, a1, 1",
969                            1);
970     COMPARE_PC_REL_COMPACT(bgeuc(a0, a1, 32767),
971                            "18857fff       bgeuc   a0, a1, 32767", 32767);
972 
973     COMPARE_PC_REL_COMPACT(bgezalc(a0, -32768),
974                            "18848000       bgezalc a0, -32768", -32768);
975     COMPARE_PC_REL_COMPACT(bgezalc(a0, -1), "1884ffff       bgezalc a0, -1",
976                            -1);
977     COMPARE_PC_REL_COMPACT(bgezalc(a0, 1), "18840001       bgezalc a0, 1", 1);
978     COMPARE_PC_REL_COMPACT(bgezalc(a0, 32767),
979                            "18847fff       bgezalc a0, 32767", 32767);
980 
981     COMPARE_PC_REL_COMPACT(blezalc(a0, -32768),
982                            "18048000       blezalc a0, -32768", -32768);
983     COMPARE_PC_REL_COMPACT(blezalc(a0, -1), "1804ffff       blezalc a0, -1",
984                            -1);
985     COMPARE_PC_REL_COMPACT(blezalc(a0, 1), "18040001       blezalc a0, 1", 1);
986     COMPARE_PC_REL_COMPACT(blezalc(a0, 32767),
987                            "18047fff       blezalc a0, 32767", 32767);
988 
989     COMPARE_PC_REL_COMPACT(bltuc(a0, a1, -32768),
990                            "1c858000       bltuc   a0, a1, -32768", -32768);
991     COMPARE_PC_REL_COMPACT(bltuc(a0, a1, -1),
992                            "1c85ffff       bltuc   a0, a1, -1", -1);
993     COMPARE_PC_REL_COMPACT(bltuc(a0, a1, 1), "1c850001       bltuc   a0, a1, 1",
994                            1);
995     COMPARE_PC_REL_COMPACT(bltuc(a0, a1, 32767),
996                            "1c857fff       bltuc   a0, a1, 32767", 32767);
997 
998     COMPARE_PC_REL_COMPACT(bltzalc(a0, -32768),
999                            "1c848000       bltzalc a0, -32768", -32768);
1000     COMPARE_PC_REL_COMPACT(bltzalc(a0, -1), "1c84ffff       bltzalc a0, -1",
1001                            -1);
1002     COMPARE_PC_REL_COMPACT(bltzalc(a0, 1), "1c840001       bltzalc a0, 1", 1);
1003     COMPARE_PC_REL_COMPACT(bltzalc(a0, 32767),
1004                            "1c847fff       bltzalc a0, 32767", 32767);
1005 
1006     COMPARE_PC_REL_COMPACT(bgtzalc(a0, -32768),
1007                            "1c048000       bgtzalc a0, -32768", -32768);
1008     COMPARE_PC_REL_COMPACT(bgtzalc(a0, -1), "1c04ffff       bgtzalc a0, -1",
1009                            -1);
1010     COMPARE_PC_REL_COMPACT(bgtzalc(a0, 1), "1c040001       bgtzalc a0, 1", 1);
1011     COMPARE_PC_REL_COMPACT(bgtzalc(a0, 32767),
1012                            "1c047fff       bgtzalc a0, 32767", 32767);
1013 
1014     COMPARE_PC_REL_COMPACT(bgezc(a0, -32768),
1015                            "58848000       bgezc    a0, -32768", -32768);
1016     COMPARE_PC_REL_COMPACT(bgezc(a0, -1), "5884ffff       bgezc    a0, -1", -1);
1017     COMPARE_PC_REL_COMPACT(bgezc(a0, 1), "58840001       bgezc    a0, 1", 1);
1018     COMPARE_PC_REL_COMPACT(bgezc(a0, 32767),
1019                            "58847fff       bgezc    a0, 32767", 32767);
1020 
1021     COMPARE_PC_REL_COMPACT(bgec(a0, a1, -32768),
1022                            "58858000       bgec     a0, a1, -32768", -32768);
1023     COMPARE_PC_REL_COMPACT(bgec(a0, a1, -1),
1024                            "5885ffff       bgec     a0, a1, -1", -1);
1025     COMPARE_PC_REL_COMPACT(bgec(a0, a1, 1), "58850001       bgec     a0, a1, 1",
1026                            1);
1027     COMPARE_PC_REL_COMPACT(bgec(a0, a1, 32767),
1028                            "58857fff       bgec     a0, a1, 32767", 32767);
1029 
1030     COMPARE_PC_REL_COMPACT(blezc(a0, -32768),
1031                            "58048000       blezc    a0, -32768", -32768);
1032     COMPARE_PC_REL_COMPACT(blezc(a0, -1), "5804ffff       blezc    a0, -1", -1);
1033     COMPARE_PC_REL_COMPACT(blezc(a0, 1), "58040001       blezc    a0, 1", 1);
1034     COMPARE_PC_REL_COMPACT(blezc(a0, 32767),
1035                            "58047fff       blezc    a0, 32767", 32767);
1036 
1037     COMPARE_PC_REL_COMPACT(bltzc(a0, -32768),
1038                            "5c848000       bltzc    a0, -32768", -32768);
1039     COMPARE_PC_REL_COMPACT(bltzc(a0, -1), "5c84ffff       bltzc    a0, -1", -1);
1040     COMPARE_PC_REL_COMPACT(bltzc(a0, 1), "5c840001       bltzc    a0, 1", 1);
1041     COMPARE_PC_REL_COMPACT(bltzc(a0, 32767),
1042                            "5c847fff       bltzc    a0, 32767", 32767);
1043 
1044     COMPARE_PC_REL_COMPACT(bltc(a0, a1, -32768),
1045                            "5c858000       bltc    a0, a1, -32768", -32768);
1046     COMPARE_PC_REL_COMPACT(bltc(a0, a1, -1),
1047                            "5c85ffff       bltc    a0, a1, -1", -1);
1048     COMPARE_PC_REL_COMPACT(bltc(a0, a1, 1), "5c850001       bltc    a0, a1, 1",
1049                            1);
1050     COMPARE_PC_REL_COMPACT(bltc(a0, a1, 32767),
1051                            "5c857fff       bltc    a0, a1, 32767", 32767);
1052 
1053     COMPARE_PC_REL_COMPACT(bgtzc(a0, -32768),
1054                            "5c048000       bgtzc    a0, -32768", -32768);
1055     COMPARE_PC_REL_COMPACT(bgtzc(a0, -1), "5c04ffff       bgtzc    a0, -1", -1);
1056     COMPARE_PC_REL_COMPACT(bgtzc(a0, 1), "5c040001       bgtzc    a0, 1", 1);
1057     COMPARE_PC_REL_COMPACT(bgtzc(a0, 32767),
1058                            "5c047fff       bgtzc    a0, 32767", 32767);
1059 
1060     COMPARE_PC_REL_COMPACT(bc1eqz(-32768, f1),
1061                            "45218000       bc1eqz    f1, -32768", -32768);
1062     COMPARE_PC_REL_COMPACT(bc1eqz(-1, f1), "4521ffff       bc1eqz    f1, -1",
1063                            -1);
1064     COMPARE_PC_REL_COMPACT(bc1eqz(1, f1), "45210001       bc1eqz    f1, 1", 1);
1065     COMPARE_PC_REL_COMPACT(bc1eqz(32767, f1),
1066                            "45217fff       bc1eqz    f1, 32767", 32767);
1067 
1068     COMPARE_PC_REL_COMPACT(bc1nez(-32768, f1),
1069                            "45a18000       bc1nez    f1, -32768", -32768);
1070     COMPARE_PC_REL_COMPACT(bc1nez(-1, f1), "45a1ffff       bc1nez    f1, -1",
1071                            -1);
1072     COMPARE_PC_REL_COMPACT(bc1nez(1, f1), "45a10001       bc1nez    f1, 1", 1);
1073     COMPARE_PC_REL_COMPACT(bc1nez(32767, f1),
1074                            "45a17fff       bc1nez    f1, 32767", 32767);
1075 
1076     COMPARE_PC_REL_COMPACT(bovc(a1, a0, -1), "20a4ffff       bovc  a1, a0, -1",
1077                            -1);
1078     COMPARE_PC_REL_COMPACT(bovc(a0, a0, 1), "20840001       bovc  a0, a0, 1",
1079                            1);
1080 
1081     COMPARE_PC_REL_COMPACT(beqc(a0, a1, -32768),
1082                            "20858000       beqc    a0, a1, -32768", -32768);
1083     COMPARE_PC_REL_COMPACT(beqc(a0, a1, -1),
1084                            "2085ffff       beqc    a0, a1, -1", -1);
1085     COMPARE_PC_REL_COMPACT(beqc(a0, a1, 1), "20850001       beqc    a0, a1, 1",
1086                            1);
1087     COMPARE_PC_REL_COMPACT(beqc(a0, a1, 32767),
1088                            "20857fff       beqc    a0, a1, 32767", 32767);
1089 
1090     COMPARE_PC_REL_COMPACT(bnec(a0, a1, -32768),
1091                            "60858000       bnec  a0, a1, -32768", -32768);
1092     COMPARE_PC_REL_COMPACT(bnec(a0, a1, -1), "6085ffff       bnec  a0, a1, -1",
1093                            -1);
1094     COMPARE_PC_REL_COMPACT(bnec(a0, a1, 1), "60850001       bnec  a0, a1, 1",
1095                            1);
1096     COMPARE_PC_REL_COMPACT(bnec(a0, a1, 32767),
1097                            "60857fff       bnec  a0, a1, 32767", 32767);
1098   }
1099 
1100   COMPARE_PC_REL_COMPACT(bne(a0, a1, -32768),
1101                          "14858000       bne     a0, a1, -32768", -32768);
1102   COMPARE_PC_REL_COMPACT(bne(a0, a1, -1), "1485ffff       bne     a0, a1, -1",
1103                          -1);
1104   COMPARE_PC_REL_COMPACT(bne(a0, a1, 1), "14850001       bne     a0, a1, 1", 1);
1105   COMPARE_PC_REL_COMPACT(bne(a0, a1, 32767),
1106                          "14857fff       bne     a0, a1, 32767", 32767);
1107 
1108   COMPARE_PC_REL_COMPACT(beq(a0, a1, -32768),
1109                          "10858000       beq     a0, a1, -32768", -32768);
1110   COMPARE_PC_REL_COMPACT(beq(a0, a1, -1), "1085ffff       beq     a0, a1, -1",
1111                          -1);
1112   COMPARE_PC_REL_COMPACT(beq(a0, a1, 1), "10850001       beq     a0, a1, 1", 1);
1113   COMPARE_PC_REL_COMPACT(beq(a0, a1, 32767),
1114                          "10857fff       beq     a0, a1, 32767", 32767);
1115 
1116   COMPARE_PC_REL_COMPACT(bltz(a0, -32768), "04808000       bltz    a0, -32768",
1117                          -32768);
1118   COMPARE_PC_REL_COMPACT(bltz(a0, -1), "0480ffff       bltz    a0, -1", -1);
1119   COMPARE_PC_REL_COMPACT(bltz(a0, 1), "04800001       bltz    a0, 1", 1);
1120   COMPARE_PC_REL_COMPACT(bltz(a0, 32767), "04807fff       bltz    a0, 32767",
1121                          32767);
1122 
1123   COMPARE_PC_REL_COMPACT(bgez(a0, -32768), "04818000       bgez    a0, -32768",
1124                          -32768);
1125   COMPARE_PC_REL_COMPACT(bgez(a0, -1), "0481ffff       bgez    a0, -1", -1);
1126   COMPARE_PC_REL_COMPACT(bgez(a0, 1), "04810001       bgez    a0, 1", 1);
1127   COMPARE_PC_REL_COMPACT(bgez(a0, 32767), "04817fff       bgez    a0, 32767",
1128                          32767);
1129 
1130   COMPARE_PC_REL_COMPACT(blez(a0, -32768), "18808000       blez    a0, -32768",
1131                          -32768);
1132   COMPARE_PC_REL_COMPACT(blez(a0, -1), "1880ffff       blez    a0, -1", -1);
1133   COMPARE_PC_REL_COMPACT(blez(a0, 1), "18800001       blez    a0, 1", 1);
1134   COMPARE_PC_REL_COMPACT(blez(a0, 32767), "18807fff       blez    a0, 32767",
1135                          32767);
1136 
1137   COMPARE_PC_REL_COMPACT(bgtz(a0, -32768), "1c808000       bgtz    a0, -32768",
1138                          -32768);
1139   COMPARE_PC_REL_COMPACT(bgtz(a0, -1), "1c80ffff       bgtz    a0, -1", -1);
1140   COMPARE_PC_REL_COMPACT(bgtz(a0, 1), "1c800001       bgtz    a0, 1", 1);
1141   COMPARE_PC_REL_COMPACT(bgtz(a0, 32767), "1c807fff       bgtz    a0, 32767",
1142                          32767);
1143 
1144   int64_t pc_region;
1145   GET_PC_REGION(pc_region);
1146 
1147   int64_t target = pc_region | 0x4;
1148   COMPARE_PC_JUMP(j(target), "08000001       j      ", target);
1149   target = pc_region | 0xffffffc;
1150   COMPARE_PC_JUMP(j(target), "0bffffff       j      ", target);
1151 
1152   target = pc_region | 0x4;
1153   COMPARE_PC_JUMP(jal(target), "0c000001       jal    ", target);
1154   target = pc_region | 0xffffffc;
1155   COMPARE_PC_JUMP(jal(target), "0fffffff       jal    ", target);
1156 
1157   VERIFY_RUN();
1158 }
1159 
1160 
TEST(C_FMT_DISASM)1161 TEST(C_FMT_DISASM) {
1162   if (kArchVariant == kMips64r2) {
1163     SET_UP();
1164 
1165     COMPARE(c_s(F, f8, f10, 0), "460a4030       c.f.s   f8, f10, cc(0)");
1166     COMPARE(c_d(F, f8, f10, 0), "462a4030       c.f.d   f8, f10, cc(0)");
1167 
1168     COMPARE(c_s(UN, f8, f10, 2), "460a4231       c.un.s  f8, f10, cc(2)");
1169     COMPARE(c_d(UN, f8, f10, 2), "462a4231       c.un.d  f8, f10, cc(2)");
1170 
1171     COMPARE(c_s(EQ, f8, f10, 4), "460a4432       c.eq.s  f8, f10, cc(4)");
1172     COMPARE(c_d(EQ, f8, f10, 4), "462a4432       c.eq.d  f8, f10, cc(4)");
1173 
1174     COMPARE(c_s(UEQ, f8, f10, 6), "460a4633       c.ueq.s f8, f10, cc(6)");
1175     COMPARE(c_d(UEQ, f8, f10, 6), "462a4633       c.ueq.d f8, f10, cc(6)");
1176 
1177     COMPARE(c_s(OLT, f8, f10, 0), "460a4034       c.olt.s f8, f10, cc(0)");
1178     COMPARE(c_d(OLT, f8, f10, 0), "462a4034       c.olt.d f8, f10, cc(0)");
1179 
1180     COMPARE(c_s(ULT, f8, f10, 2), "460a4235       c.ult.s f8, f10, cc(2)");
1181     COMPARE(c_d(ULT, f8, f10, 2), "462a4235       c.ult.d f8, f10, cc(2)");
1182 
1183     COMPARE(c_s(OLE, f8, f10, 4), "460a4436       c.ole.s f8, f10, cc(4)");
1184     COMPARE(c_d(OLE, f8, f10, 4), "462a4436       c.ole.d f8, f10, cc(4)");
1185 
1186     COMPARE(c_s(ULE, f8, f10, 6), "460a4637       c.ule.s f8, f10, cc(6)");
1187     COMPARE(c_d(ULE, f8, f10, 6), "462a4637       c.ule.d f8, f10, cc(6)");
1188 
1189     VERIFY_RUN();
1190   }
1191 }
1192 
1193 
TEST(COND_FMT_DISASM)1194 TEST(COND_FMT_DISASM) {
1195   if (kArchVariant == kMips64r6) {
1196     SET_UP();
1197 
1198     COMPARE(cmp_s(F, f6, f8, f10), "468a4180       cmp.af.s    f6, f8, f10");
1199     COMPARE(cmp_d(F, f6, f8, f10), "46aa4180       cmp.af.d  f6,  f8, f10");
1200 
1201     COMPARE(cmp_s(UN, f6, f8, f10), "468a4181       cmp.un.s    f6, f8, f10");
1202     COMPARE(cmp_d(UN, f6, f8, f10), "46aa4181       cmp.un.d  f6,  f8, f10");
1203 
1204     COMPARE(cmp_s(EQ, f6, f8, f10), "468a4182       cmp.eq.s    f6, f8, f10");
1205     COMPARE(cmp_d(EQ, f6, f8, f10), "46aa4182       cmp.eq.d  f6,  f8, f10");
1206 
1207     COMPARE(cmp_s(UEQ, f6, f8, f10), "468a4183       cmp.ueq.s   f6, f8, f10");
1208     COMPARE(cmp_d(UEQ, f6, f8, f10), "46aa4183       cmp.ueq.d  f6,  f8, f10");
1209 
1210     COMPARE(cmp_s(LT, f6, f8, f10), "468a4184       cmp.lt.s    f6, f8, f10");
1211     COMPARE(cmp_d(LT, f6, f8, f10), "46aa4184       cmp.lt.d  f6,  f8, f10");
1212 
1213     COMPARE(cmp_s(ULT, f6, f8, f10), "468a4185       cmp.ult.s   f6, f8, f10");
1214     COMPARE(cmp_d(ULT, f6, f8, f10), "46aa4185       cmp.ult.d  f6,  f8, f10");
1215 
1216     COMPARE(cmp_s(LE, f6, f8, f10), "468a4186       cmp.le.s    f6, f8, f10");
1217     COMPARE(cmp_d(LE, f6, f8, f10), "46aa4186       cmp.le.d  f6,  f8, f10");
1218 
1219     COMPARE(cmp_s(ULE, f6, f8, f10), "468a4187       cmp.ule.s   f6, f8, f10");
1220     COMPARE(cmp_d(ULE, f6, f8, f10), "46aa4187       cmp.ule.d  f6,  f8, f10");
1221 
1222     COMPARE(cmp_s(ORD, f6, f8, f10), "468a4191       cmp.or.s    f6, f8, f10");
1223     COMPARE(cmp_d(ORD, f6, f8, f10), "46aa4191       cmp.or.d  f6,  f8, f10");
1224 
1225     COMPARE(cmp_s(UNE, f6, f8, f10), "468a4192       cmp.une.s   f6, f8, f10");
1226     COMPARE(cmp_d(UNE, f6, f8, f10), "46aa4192       cmp.une.d  f6,  f8, f10");
1227 
1228     COMPARE(cmp_s(NE, f6, f8, f10), "468a4193       cmp.ne.s    f6, f8, f10");
1229     COMPARE(cmp_d(NE, f6, f8, f10), "46aa4193       cmp.ne.d  f6,  f8, f10");
1230 
1231     VERIFY_RUN();
1232   }
1233 }
1234 
1235 
TEST(CVT_DISSASM)1236 TEST(CVT_DISSASM) {
1237   SET_UP();
1238   COMPARE(cvt_d_s(f22, f24), "4600c5a1       cvt.d.s f22, f24");
1239   COMPARE(cvt_d_w(f22, f24), "4680c5a1       cvt.d.w f22, f24");
1240   if (kArchVariant == kMips64r6 || kArchVariant == kMips64r2) {
1241     COMPARE(cvt_d_l(f22, f24), "46a0c5a1       cvt.d.l f22, f24");
1242   }
1243 
1244   if (kArchVariant == kMips64r6 || kArchVariant == kMips64r2) {
1245     COMPARE(cvt_l_s(f22, f24), "4600c5a5       cvt.l.s f22, f24");
1246     COMPARE(cvt_l_d(f22, f24), "4620c5a5       cvt.l.d f22, f24");
1247   }
1248 
1249   COMPARE(cvt_s_d(f22, f24), "4620c5a0       cvt.s.d f22, f24");
1250   COMPARE(cvt_s_w(f22, f24), "4680c5a0       cvt.s.w f22, f24");
1251   if (kArchVariant == kMips64r6 || kArchVariant == kMips64r2) {
1252     COMPARE(cvt_s_l(f22, f24), "46a0c5a0       cvt.s.l f22, f24");
1253   }
1254 
1255   COMPARE(cvt_s_d(f22, f24), "4620c5a0       cvt.s.d f22, f24");
1256   COMPARE(cvt_s_w(f22, f24), "4680c5a0       cvt.s.w f22, f24");
1257 
1258   VERIFY_RUN();
1259 }
1260 
1261 
TEST(ctc1_cfc1_disasm)1262 TEST(ctc1_cfc1_disasm) {
1263   SET_UP();
1264   COMPARE(abs_d(f10, f31), "4620fa85       abs.d   f10, f31");
1265   COMPARE(ceil_w_s(f8, f31), "4600fa0e       ceil.w.s f8, f31");
1266   COMPARE(ctc1(a0, FCSR), "44c4f800       ctc1    a0, FCSR");
1267   COMPARE(cfc1(a0, FCSR), "4444f800       cfc1    a0, FCSR");
1268   VERIFY_RUN();
1269 }
1270