• 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 *>(((uint32_t)(progcounter + 4) & ~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<int32_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(addu(t2, t3, t4),
161           "016c5021       addu    t2, t3, t4");
162   COMPARE(addu(v0, v1, s0),
163           "00701021       addu    v0, v1, s0");
164 
165   COMPARE(subu(a0, a1, a2),
166           "00a62023       subu    a0, a1, a2");
167   COMPARE(subu(t2, t3, t4),
168           "016c5023       subu    t2, t3, t4");
169   COMPARE(subu(v0, v1, s0),
170           "00701023       subu    v0, v1, s0");
171 
172   if (!IsMipsArchVariant(kMips32r6)) {
173     COMPARE(mult(a0, a1),
174             "00850018       mult    a0, a1");
175     COMPARE(mult(t2, t3),
176             "014b0018       mult    t2, t3");
177     COMPARE(mult(v0, v1),
178             "00430018       mult    v0, v1");
179 
180     COMPARE(multu(a0, a1),
181             "00850019       multu   a0, a1");
182     COMPARE(multu(t2, t3),
183             "014b0019       multu   t2, t3");
184     COMPARE(multu(v0, v1),
185             "00430019       multu   v0, v1");
186 
187     COMPARE(div(a0, a1),
188             "0085001a       div     a0, a1");
189     COMPARE(div(t2, t3),
190             "014b001a       div     t2, t3");
191     COMPARE(div(v0, v1),
192             "0043001a       div     v0, v1");
193 
194     COMPARE(divu(a0, a1),
195             "0085001b       divu    a0, a1");
196     COMPARE(divu(t2, t3),
197             "014b001b       divu    t2, t3");
198     COMPARE(divu(v0, v1),
199             "0043001b       divu    v0, v1");
200 
201     if (!IsMipsArchVariant(kLoongson)) {
202       COMPARE(mul(a0, a1, a2),
203               "70a62002       mul     a0, a1, a2");
204       COMPARE(mul(t2, t3, t4),
205               "716c5002       mul     t2, t3, t4");
206       COMPARE(mul(v0, v1, s0),
207               "70701002       mul     v0, v1, s0");
208     }
209   } else {  // MIPS32r6.
210     COMPARE(mul(a0, a1, a2),
211             "00a62098       mul    a0, a1, a2");
212     COMPARE(muh(a0, a1, a2),
213             "00a620d8       muh    a0, a1, a2");
214     COMPARE(mul(t1, t2, t3),
215             "014b4898       mul    t1, t2, t3");
216     COMPARE(muh(t1, t2, t3),
217             "014b48d8       muh    t1, t2, t3");
218     COMPARE(mul(v0, v1, a0),
219             "00641098       mul    v0, v1, a0");
220     COMPARE(muh(v0, v1, a0),
221             "006410d8       muh    v0, v1, a0");
222 
223     COMPARE(mulu(a0, a1, a2),
224             "00a62099       mulu   a0, a1, a2");
225     COMPARE(muhu(a0, a1, a2),
226             "00a620d9       muhu   a0, a1, a2");
227     COMPARE(mulu(t1, t2, t3),
228             "014b4899       mulu   t1, t2, t3");
229     COMPARE(muhu(t1, t2, t3),
230             "014b48d9       muhu   t1, t2, t3");
231     COMPARE(mulu(v0, v1, a0),
232             "00641099       mulu   v0, v1, a0");
233     COMPARE(muhu(v0, v1, a0),
234             "006410d9       muhu   v0, v1, a0");
235 
236     COMPARE(div(a0, a1, a2),
237             "00a6209a       div    a0, a1, a2");
238     COMPARE(mod(a0, a1, a2),
239             "00a620da       mod    a0, a1, a2");
240     COMPARE(div(t1, t2, t3),
241             "014b489a       div    t1, t2, t3");
242     COMPARE(mod(t1, t2, t3),
243             "014b48da       mod    t1, t2, t3");
244     COMPARE(div(v0, v1, a0),
245             "0064109a       div    v0, v1, a0");
246     COMPARE(mod(v0, v1, a0),
247             "006410da       mod    v0, v1, a0");
248 
249     COMPARE(divu(a0, a1, a2),
250             "00a6209b       divu   a0, a1, a2");
251     COMPARE(modu(a0, a1, a2),
252             "00a620db       modu   a0, a1, a2");
253     COMPARE(divu(t1, t2, t3),
254             "014b489b       divu   t1, t2, t3");
255     COMPARE(modu(t1, t2, t3),
256             "014b48db       modu   t1, t2, t3");
257     COMPARE(divu(v0, v1, a0),
258             "0064109b       divu   v0, v1, a0");
259     COMPARE(modu(v0, v1, a0),
260             "006410db       modu   v0, v1, a0");
261 
262     COMPARE_PC_REL_COMPACT(bovc(a0, a0, static_cast<int16_t>(0)),
263                            "20840000       bovc  a0, a0, 0", 0);
264     COMPARE_PC_REL_COMPACT(bovc(a1, a0, static_cast<int16_t>(0)),
265                            "20a40000       bovc  a1, a0, 0", 0);
266     COMPARE_PC_REL_COMPACT(bovc(a1, a0, 32767),
267                            "20a47fff       bovc  a1, a0, 32767", 32767);
268     COMPARE_PC_REL_COMPACT(bovc(a1, a0, -32768),
269                            "20a48000       bovc  a1, a0, -32768", -32768);
270 
271     COMPARE_PC_REL_COMPACT(bnvc(a0, a0, static_cast<int16_t>(0)),
272                            "60840000       bnvc  a0, a0, 0", 0);
273     COMPARE_PC_REL_COMPACT(bnvc(a1, a0, static_cast<int16_t>(0)),
274                            "60a40000       bnvc  a1, a0, 0", 0);
275     COMPARE_PC_REL_COMPACT(bnvc(a1, a0, 32767),
276                            "60a47fff       bnvc  a1, a0, 32767", 32767);
277     COMPARE_PC_REL_COMPACT(bnvc(a1, a0, -32768),
278                            "60a48000       bnvc  a1, a0, -32768", -32768);
279 
280     COMPARE_PC_REL_COMPACT(beqzc(a0, -1048576),
281                            "d8900000       beqzc   a0, -1048576", -1048576);
282     COMPARE_PC_REL_COMPACT(beqzc(a0, -1), "d89fffff       beqzc   a0, -1", -1);
283     COMPARE_PC_REL_COMPACT(beqzc(a0, 0), "d8800000       beqzc   a0, 0", 0);
284     COMPARE_PC_REL_COMPACT(beqzc(a0, 1), "d8800001       beqzc   a0, 1", 1);
285     COMPARE_PC_REL_COMPACT(beqzc(a0, 1048575),
286                            "d88fffff       beqzc   a0, 1048575", 1048575);
287 
288     COMPARE_PC_REL_COMPACT(bnezc(a0, 0), "f8800000       bnezc   a0, 0", 0);
289     COMPARE_PC_REL_COMPACT(bnezc(a0, 1048575),  // int21 maximal value.
290                            "f88fffff       bnezc   a0, 1048575", 1048575);
291     COMPARE_PC_REL_COMPACT(bnezc(a0, -1048576),  // int21 minimal value.
292                            "f8900000       bnezc   a0, -1048576", -1048576);
293 
294     COMPARE_PC_REL_COMPACT(bc(-33554432), "ca000000       bc      -33554432",
295                            -33554432);
296     COMPARE_PC_REL_COMPACT(bc(-1), "cbffffff       bc      -1", -1);
297     COMPARE_PC_REL_COMPACT(bc(0), "c8000000       bc      0", 0);
298     COMPARE_PC_REL_COMPACT(bc(1), "c8000001       bc      1", 1);
299     COMPARE_PC_REL_COMPACT(bc(33554431), "c9ffffff       bc      33554431",
300                            33554431);
301 
302     COMPARE_PC_REL_COMPACT(balc(-33554432), "ea000000       balc    -33554432",
303                            -33554432);
304     COMPARE_PC_REL_COMPACT(balc(-1), "ebffffff       balc    -1", -1);
305     COMPARE_PC_REL_COMPACT(balc(0), "e8000000       balc    0", 0);
306     COMPARE_PC_REL_COMPACT(balc(1), "e8000001       balc    1", 1);
307     COMPARE_PC_REL_COMPACT(balc(33554431), "e9ffffff       balc    33554431",
308                            33554431);
309 
310     COMPARE_PC_REL_COMPACT(bgeuc(a0, a1, -32768),
311                            "18858000       bgeuc   a0, a1, -32768", -32768);
312     COMPARE_PC_REL_COMPACT(bgeuc(a0, a1, -1),
313                            "1885ffff       bgeuc   a0, a1, -1", -1);
314     COMPARE_PC_REL_COMPACT(bgeuc(a0, a1, 1), "18850001       bgeuc   a0, a1, 1",
315                            1);
316     COMPARE_PC_REL_COMPACT(bgeuc(a0, a1, 32767),
317                            "18857fff       bgeuc   a0, a1, 32767", 32767);
318 
319     COMPARE_PC_REL_COMPACT(bgezalc(a0, -32768),
320                            "18848000       bgezalc a0, -32768", -32768);
321     COMPARE_PC_REL_COMPACT(bgezalc(a0, -1), "1884ffff       bgezalc a0, -1",
322                            -1);
323     COMPARE_PC_REL_COMPACT(bgezalc(a0, 1), "18840001       bgezalc a0, 1", 1);
324     COMPARE_PC_REL_COMPACT(bgezalc(a0, 32767),
325                            "18847fff       bgezalc a0, 32767", 32767);
326 
327     COMPARE_PC_REL_COMPACT(blezalc(a0, -32768),
328                            "18048000       blezalc a0, -32768", -32768);
329     COMPARE_PC_REL_COMPACT(blezalc(a0, -1), "1804ffff       blezalc a0, -1",
330                            -1);
331     COMPARE_PC_REL_COMPACT(blezalc(a0, 1), "18040001       blezalc a0, 1", 1);
332     COMPARE_PC_REL_COMPACT(blezalc(a0, 32767),
333                            "18047fff       blezalc a0, 32767", 32767);
334 
335     COMPARE_PC_REL_COMPACT(bltuc(a0, a1, -32768),
336                            "1c858000       bltuc   a0, a1, -32768", -32768);
337     COMPARE_PC_REL_COMPACT(bltuc(a0, a1, -1),
338                            "1c85ffff       bltuc   a0, a1, -1", -1);
339     COMPARE_PC_REL_COMPACT(bltuc(a0, a1, 1), "1c850001       bltuc   a0, a1, 1",
340                            1);
341     COMPARE_PC_REL_COMPACT(bltuc(a0, a1, 32767),
342                            "1c857fff       bltuc   a0, a1, 32767", 32767);
343 
344     COMPARE_PC_REL_COMPACT(bltzalc(a0, -32768),
345                            "1c848000       bltzalc a0, -32768", -32768);
346     COMPARE_PC_REL_COMPACT(bltzalc(a0, -1), "1c84ffff       bltzalc a0, -1",
347                            -1);
348     COMPARE_PC_REL_COMPACT(bltzalc(a0, 1), "1c840001       bltzalc a0, 1", 1);
349     COMPARE_PC_REL_COMPACT(bltzalc(a0, 32767),
350                            "1c847fff       bltzalc a0, 32767", 32767);
351 
352     COMPARE_PC_REL_COMPACT(bgtzalc(a0, -32768),
353                            "1c048000       bgtzalc a0, -32768", -32768);
354     COMPARE_PC_REL_COMPACT(bgtzalc(a0, -1), "1c04ffff       bgtzalc a0, -1",
355                            -1);
356     COMPARE_PC_REL_COMPACT(bgtzalc(a0, 1), "1c040001       bgtzalc a0, 1", 1);
357     COMPARE_PC_REL_COMPACT(bgtzalc(a0, 32767),
358                            "1c047fff       bgtzalc a0, 32767", 32767);
359 
360     COMPARE_PC_REL_COMPACT(bgezc(a0, -32768),
361                            "58848000       bgezc    a0, -32768", -32768);
362     COMPARE_PC_REL_COMPACT(bgezc(a0, -1), "5884ffff       bgezc    a0, -1", -1);
363     COMPARE_PC_REL_COMPACT(bgezc(a0, 1), "58840001       bgezc    a0, 1", 1);
364     COMPARE_PC_REL_COMPACT(bgezc(a0, 32767),
365                            "58847fff       bgezc    a0, 32767", 32767);
366 
367     COMPARE_PC_REL_COMPACT(bgec(a0, a1, -32768),
368                            "58858000       bgec     a0, a1, -32768", -32768);
369     COMPARE_PC_REL_COMPACT(bgec(a0, a1, -1),
370                            "5885ffff       bgec     a0, a1, -1", -1);
371     COMPARE_PC_REL_COMPACT(bgec(a0, a1, 1), "58850001       bgec     a0, a1, 1",
372                            1);
373     COMPARE_PC_REL_COMPACT(bgec(a0, a1, 32767),
374                            "58857fff       bgec     a0, a1, 32767", 32767);
375 
376     COMPARE_PC_REL_COMPACT(blezc(a0, -32768),
377                            "58048000       blezc    a0, -32768", -32768);
378     COMPARE_PC_REL_COMPACT(blezc(a0, -1), "5804ffff       blezc    a0, -1", -1);
379     COMPARE_PC_REL_COMPACT(blezc(a0, 1), "58040001       blezc    a0, 1", 1);
380     COMPARE_PC_REL_COMPACT(blezc(a0, 32767),
381                            "58047fff       blezc    a0, 32767", 32767);
382 
383     COMPARE_PC_REL_COMPACT(bltzc(a0, -32768),
384                            "5c848000       bltzc    a0, -32768", -32768);
385     COMPARE_PC_REL_COMPACT(bltzc(a0, -1), "5c84ffff       bltzc    a0, -1", -1);
386     COMPARE_PC_REL_COMPACT(bltzc(a0, 1), "5c840001       bltzc    a0, 1", 1);
387     COMPARE_PC_REL_COMPACT(bltzc(a0, 32767),
388                            "5c847fff       bltzc    a0, 32767", 32767);
389 
390     COMPARE_PC_REL_COMPACT(bltc(a0, a1, -32768),
391                            "5c858000       bltc    a0, a1, -32768", -32768);
392     COMPARE_PC_REL_COMPACT(bltc(a0, a1, -1),
393                            "5c85ffff       bltc    a0, a1, -1", -1);
394     COMPARE_PC_REL_COMPACT(bltc(a0, a1, 1), "5c850001       bltc    a0, a1, 1",
395                            1);
396     COMPARE_PC_REL_COMPACT(bltc(a0, a1, 32767),
397                            "5c857fff       bltc    a0, a1, 32767", 32767);
398 
399     COMPARE_PC_REL_COMPACT(bgtzc(a0, -32768),
400                            "5c048000       bgtzc    a0, -32768", -32768);
401     COMPARE_PC_REL_COMPACT(bgtzc(a0, -1), "5c04ffff       bgtzc    a0, -1", -1);
402     COMPARE_PC_REL_COMPACT(bgtzc(a0, 1), "5c040001       bgtzc    a0, 1", 1);
403     COMPARE_PC_REL_COMPACT(bgtzc(a0, 32767),
404                            "5c047fff       bgtzc    a0, 32767", 32767);
405 
406     COMPARE_PC_REL_COMPACT(bc1eqz(-32768, f1),
407                            "45218000       bc1eqz    f1, -32768", -32768);
408     COMPARE_PC_REL_COMPACT(bc1eqz(-1, f1), "4521ffff       bc1eqz    f1, -1",
409                            -1);
410     COMPARE_PC_REL_COMPACT(bc1eqz(1, f1), "45210001       bc1eqz    f1, 1", 1);
411     COMPARE_PC_REL_COMPACT(bc1eqz(32767, f1),
412                            "45217fff       bc1eqz    f1, 32767", 32767);
413 
414     COMPARE_PC_REL_COMPACT(bc1nez(-32768, f1),
415                            "45a18000       bc1nez    f1, -32768", -32768);
416     COMPARE_PC_REL_COMPACT(bc1nez(-1, f1), "45a1ffff       bc1nez    f1, -1",
417                            -1);
418     COMPARE_PC_REL_COMPACT(bc1nez(1, f1), "45a10001       bc1nez    f1, 1", 1);
419     COMPARE_PC_REL_COMPACT(bc1nez(32767, f1),
420                            "45a17fff       bc1nez    f1, 32767", 32767);
421 
422     COMPARE_PC_REL_COMPACT(bovc(a1, a0, -1), "20a4ffff       bovc  a1, a0, -1",
423                            -1);
424     COMPARE_PC_REL_COMPACT(bovc(a0, a0, 1), "20840001       bovc  a0, a0, 1",
425                            1);
426 
427     COMPARE_PC_REL_COMPACT(beqc(a0, a1, -32768),
428                            "20858000       beqc    a0, a1, -32768", -32768);
429     COMPARE_PC_REL_COMPACT(beqc(a0, a1, -1),
430                            "2085ffff       beqc    a0, a1, -1", -1);
431     COMPARE_PC_REL_COMPACT(beqc(a0, a1, 1), "20850001       beqc    a0, a1, 1",
432                            1);
433     COMPARE_PC_REL_COMPACT(beqc(a0, a1, 32767),
434                            "20857fff       beqc    a0, a1, 32767", 32767);
435 
436     COMPARE_PC_REL_COMPACT(bnec(a0, a1, -32768),
437                            "60858000       bnec  a0, a1, -32768", -32768);
438     COMPARE_PC_REL_COMPACT(bnec(a0, a1, -1), "6085ffff       bnec  a0, a1, -1",
439                            -1);
440     COMPARE_PC_REL_COMPACT(bnec(a0, a1, 1), "60850001       bnec  a0, a1, 1",
441                            1);
442     COMPARE_PC_REL_COMPACT(bnec(a0, a1, 32767),
443                            "60857fff       bnec  a0, a1, 32767", 32767);
444   }
445 
446   COMPARE_PC_REL_COMPACT(bne(a0, a1, -32768),
447                          "14858000       bne     a0, a1, -32768", -32768);
448   COMPARE_PC_REL_COMPACT(bne(a0, a1, -1), "1485ffff       bne     a0, a1, -1",
449                          -1);
450   COMPARE_PC_REL_COMPACT(bne(a0, a1, 1), "14850001       bne     a0, a1, 1", 1);
451   COMPARE_PC_REL_COMPACT(bne(a0, a1, 32767),
452                          "14857fff       bne     a0, a1, 32767", 32767);
453 
454   COMPARE_PC_REL_COMPACT(beq(a0, a1, -32768),
455                          "10858000       beq     a0, a1, -32768", -32768);
456   COMPARE_PC_REL_COMPACT(beq(a0, a1, -1), "1085ffff       beq     a0, a1, -1",
457                          -1);
458   COMPARE_PC_REL_COMPACT(beq(a0, a1, 1), "10850001       beq     a0, a1, 1", 1);
459   COMPARE_PC_REL_COMPACT(beq(a0, a1, 32767),
460                          "10857fff       beq     a0, a1, 32767", 32767);
461 
462   COMPARE_PC_REL_COMPACT(bltz(a0, -32768), "04808000       bltz    a0, -32768",
463                          -32768);
464   COMPARE_PC_REL_COMPACT(bltz(a0, -1), "0480ffff       bltz    a0, -1", -1);
465   COMPARE_PC_REL_COMPACT(bltz(a0, 1), "04800001       bltz    a0, 1", 1);
466   COMPARE_PC_REL_COMPACT(bltz(a0, 32767), "04807fff       bltz    a0, 32767",
467                          32767);
468 
469   COMPARE_PC_REL_COMPACT(bgez(a0, -32768), "04818000       bgez    a0, -32768",
470                          -32768);
471   COMPARE_PC_REL_COMPACT(bgez(a0, -1), "0481ffff       bgez    a0, -1", -1);
472   COMPARE_PC_REL_COMPACT(bgez(a0, 1), "04810001       bgez    a0, 1", 1);
473   COMPARE_PC_REL_COMPACT(bgez(a0, 32767), "04817fff       bgez    a0, 32767",
474                          32767);
475 
476   COMPARE_PC_REL_COMPACT(blez(a0, -32768), "18808000       blez    a0, -32768",
477                          -32768);
478   COMPARE_PC_REL_COMPACT(blez(a0, -1), "1880ffff       blez    a0, -1", -1);
479   COMPARE_PC_REL_COMPACT(blez(a0, 1), "18800001       blez    a0, 1", 1);
480   COMPARE_PC_REL_COMPACT(blez(a0, 32767), "18807fff       blez    a0, 32767",
481                          32767);
482 
483   COMPARE_PC_REL_COMPACT(bgtz(a0, -32768), "1c808000       bgtz    a0, -32768",
484                          -32768);
485   COMPARE_PC_REL_COMPACT(bgtz(a0, -1), "1c80ffff       bgtz    a0, -1", -1);
486   COMPARE_PC_REL_COMPACT(bgtz(a0, 1), "1c800001       bgtz    a0, 1", 1);
487   COMPARE_PC_REL_COMPACT(bgtz(a0, 32767), "1c807fff       bgtz    a0, 32767",
488                          32767);
489 
490   int32_t pc_region;
491   GET_PC_REGION(pc_region);
492 
493   int32_t target = pc_region | 0x4;
494   COMPARE_PC_JUMP(j(target), "08000001       j      ", target);
495   target = pc_region | 0xffffffc;
496   COMPARE_PC_JUMP(j(target), "0bffffff       j      ", target);
497 
498   target = pc_region | 0x4;
499   COMPARE_PC_JUMP(jal(target), "0c000001       jal    ", target);
500   target = pc_region | 0xffffffc;
501   COMPARE_PC_JUMP(jal(target), "0fffffff       jal    ", target);
502 
503   COMPARE(addiu(a0, a1, 0x0),
504           "24a40000       addiu   a0, a1, 0");
505   COMPARE(addiu(s0, s1, 32767),
506           "26307fff       addiu   s0, s1, 32767");
507   COMPARE(addiu(t2, t3, -32768),
508           "256a8000       addiu   t2, t3, -32768");
509   COMPARE(addiu(v0, v1, -1),
510           "2462ffff       addiu   v0, v1, -1");
511 
512   COMPARE(and_(a0, a1, a2),
513           "00a62024       and     a0, a1, a2");
514   COMPARE(and_(s0, s1, s2),
515           "02328024       and     s0, s1, s2");
516   COMPARE(and_(t2, t3, t4),
517           "016c5024       and     t2, t3, t4");
518   COMPARE(and_(v0, v1, a2),
519           "00661024       and     v0, v1, a2");
520 
521   COMPARE(or_(a0, a1, a2),
522           "00a62025       or      a0, a1, a2");
523   COMPARE(or_(s0, s1, s2),
524           "02328025       or      s0, s1, s2");
525   COMPARE(or_(t2, t3, t4),
526           "016c5025       or      t2, t3, t4");
527   COMPARE(or_(v0, v1, a2),
528           "00661025       or      v0, v1, a2");
529 
530   COMPARE(xor_(a0, a1, a2),
531           "00a62026       xor     a0, a1, a2");
532   COMPARE(xor_(s0, s1, s2),
533           "02328026       xor     s0, s1, s2");
534   COMPARE(xor_(t2, t3, t4),
535           "016c5026       xor     t2, t3, t4");
536   COMPARE(xor_(v0, v1, a2),
537           "00661026       xor     v0, v1, a2");
538 
539   COMPARE(nor(a0, a1, a2),
540           "00a62027       nor     a0, a1, a2");
541   COMPARE(nor(s0, s1, s2),
542           "02328027       nor     s0, s1, s2");
543   COMPARE(nor(t2, t3, t4),
544           "016c5027       nor     t2, t3, t4");
545   COMPARE(nor(v0, v1, a2),
546           "00661027       nor     v0, v1, a2");
547 
548   COMPARE(andi(a0, a1, 0x1),
549           "30a40001       andi    a0, a1, 0x1");
550   COMPARE(andi(v0, v1, 0xffff),
551           "3062ffff       andi    v0, v1, 0xffff");
552 
553   COMPARE(ori(a0, a1, 0x1),
554           "34a40001       ori     a0, a1, 0x1");
555   COMPARE(ori(v0, v1, 0xffff),
556           "3462ffff       ori     v0, v1, 0xffff");
557 
558   COMPARE(xori(a0, a1, 0x1),
559           "38a40001       xori    a0, a1, 0x1");
560   COMPARE(xori(v0, v1, 0xffff),
561           "3862ffff       xori    v0, v1, 0xffff");
562 
563   COMPARE(lui(a0, 0x1),
564           "3c040001       lui     a0, 0x1");
565   COMPARE(lui(v0, 0xffff),
566           "3c02ffff       lui     v0, 0xffff");
567 
568   if (IsMipsArchVariant(kMips32r6)) {
569     COMPARE(aui(a0, a1, 0x1), "3ca40001       aui     a0, a1, 0x1");
570     COMPARE(aui(v0, v1, 0xffff), "3c62ffff       aui     v0, v1, 0xffff");
571   }
572 
573   COMPARE(sll(a0, a1, 0),
574           "00052000       sll     a0, a1, 0");
575   COMPARE(sll(s0, s1, 8),
576           "00118200       sll     s0, s1, 8");
577   COMPARE(sll(t2, t3, 24),
578           "000b5600       sll     t2, t3, 24");
579   COMPARE(sll(v0, v1, 31),
580           "000317c0       sll     v0, v1, 31");
581 
582   COMPARE(sllv(a0, a1, a2),
583           "00c52004       sllv    a0, a1, a2");
584   COMPARE(sllv(s0, s1, s2),
585           "02518004       sllv    s0, s1, s2");
586   COMPARE(sllv(t2, t3, t4),
587           "018b5004       sllv    t2, t3, t4");
588   COMPARE(sllv(v0, v1, fp),
589           "03c31004       sllv    v0, v1, fp");
590 
591   COMPARE(srl(a0, a1, 0),
592           "00052002       srl     a0, a1, 0");
593   COMPARE(srl(s0, s1, 8),
594           "00118202       srl     s0, s1, 8");
595   COMPARE(srl(t2, t3, 24),
596           "000b5602       srl     t2, t3, 24");
597   COMPARE(srl(v0, v1, 31),
598           "000317c2       srl     v0, v1, 31");
599 
600   COMPARE(srlv(a0, a1, a2),
601           "00c52006       srlv    a0, a1, a2");
602   COMPARE(srlv(s0, s1, s2),
603           "02518006       srlv    s0, s1, s2");
604   COMPARE(srlv(t2, t3, t4),
605           "018b5006       srlv    t2, t3, t4");
606   COMPARE(srlv(v0, v1, fp),
607           "03c31006       srlv    v0, v1, fp");
608 
609   COMPARE(sra(a0, a1, 0),
610           "00052003       sra     a0, a1, 0");
611   COMPARE(sra(s0, s1, 8),
612           "00118203       sra     s0, s1, 8");
613   COMPARE(sra(t2, t3, 24),
614           "000b5603       sra     t2, t3, 24");
615   COMPARE(sra(v0, v1, 31),
616           "000317c3       sra     v0, v1, 31");
617 
618   COMPARE(srav(a0, a1, a2),
619           "00c52007       srav    a0, a1, a2");
620   COMPARE(srav(s0, s1, s2),
621           "02518007       srav    s0, s1, s2");
622   COMPARE(srav(t2, t3, t4),
623           "018b5007       srav    t2, t3, t4");
624   COMPARE(srav(v0, v1, fp),
625           "03c31007       srav    v0, v1, fp");
626 
627   if (IsMipsArchVariant(kMips32r2)) {
628     COMPARE(rotr(a0, a1, 0),
629             "00252002       rotr    a0, a1, 0");
630     COMPARE(rotr(s0, s1, 8),
631             "00318202       rotr    s0, s1, 8");
632     COMPARE(rotr(t2, t3, 24),
633             "002b5602       rotr    t2, t3, 24");
634     COMPARE(rotr(v0, v1, 31),
635             "002317c2       rotr    v0, v1, 31");
636 
637     COMPARE(rotrv(a0, a1, a2),
638             "00c52046       rotrv   a0, a1, a2");
639     COMPARE(rotrv(s0, s1, s2),
640             "02518046       rotrv   s0, s1, s2");
641     COMPARE(rotrv(t2, t3, t4),
642             "018b5046       rotrv   t2, t3, t4");
643     COMPARE(rotrv(v0, v1, fp),
644             "03c31046       rotrv   v0, v1, fp");
645   }
646 
647   COMPARE(break_(0),
648           "0000000d       break, code: 0x00000 (0)");
649   COMPARE(break_(261120),
650           "00ff000d       break, code: 0x3fc00 (261120)");
651   COMPARE(break_(1047552),
652           "03ff000d       break, code: 0xffc00 (1047552)");
653 
654   COMPARE(tge(a0, a1, 0),
655           "00850030       tge     a0, a1, code: 0x000");
656   COMPARE(tge(s0, s1, 1023),
657           "0211fff0       tge     s0, s1, code: 0x3ff");
658   COMPARE(tgeu(a0, a1, 0),
659           "00850031       tgeu    a0, a1, code: 0x000");
660   COMPARE(tgeu(s0, s1, 1023),
661           "0211fff1       tgeu    s0, s1, code: 0x3ff");
662   COMPARE(tlt(a0, a1, 0),
663           "00850032       tlt     a0, a1, code: 0x000");
664   COMPARE(tlt(s0, s1, 1023),
665           "0211fff2       tlt     s0, s1, code: 0x3ff");
666   COMPARE(tltu(a0, a1, 0),
667           "00850033       tltu    a0, a1, code: 0x000");
668   COMPARE(tltu(s0, s1, 1023),
669           "0211fff3       tltu    s0, s1, code: 0x3ff");
670   COMPARE(teq(a0, a1, 0),
671           "00850034       teq     a0, a1, code: 0x000");
672   COMPARE(teq(s0, s1, 1023),
673           "0211fff4       teq     s0, s1, code: 0x3ff");
674   COMPARE(tne(a0, a1, 0),
675           "00850036       tne     a0, a1, code: 0x000");
676   COMPARE(tne(s0, s1, 1023),
677           "0211fff6       tne     s0, s1, code: 0x3ff");
678 
679   COMPARE(mfhi(a0),
680           "00002010       mfhi    a0");
681   COMPARE(mfhi(s2),
682           "00009010       mfhi    s2");
683   COMPARE(mfhi(t4),
684           "00006010       mfhi    t4");
685   COMPARE(mfhi(v1),
686           "00001810       mfhi    v1");
687   COMPARE(mflo(a0),
688           "00002012       mflo    a0");
689   COMPARE(mflo(s2),
690           "00009012       mflo    s2");
691   COMPARE(mflo(t4),
692           "00006012       mflo    t4");
693   COMPARE(mflo(v1),
694           "00001812       mflo    v1");
695 
696   COMPARE(slt(a0, a1, a2),
697           "00a6202a       slt     a0, a1, a2");
698   COMPARE(slt(s0, s1, s2),
699           "0232802a       slt     s0, s1, s2");
700   COMPARE(slt(t2, t3, t4),
701           "016c502a       slt     t2, t3, t4");
702   COMPARE(slt(v0, v1, a2),
703           "0066102a       slt     v0, v1, a2");
704   COMPARE(sltu(a0, a1, a2),
705           "00a6202b       sltu    a0, a1, a2");
706   COMPARE(sltu(s0, s1, s2),
707           "0232802b       sltu    s0, s1, s2");
708   COMPARE(sltu(t2, t3, t4),
709           "016c502b       sltu    t2, t3, t4");
710   COMPARE(sltu(v0, v1, a2),
711           "0066102b       sltu    v0, v1, a2");
712 
713   COMPARE(slti(a0, a1, 0),
714           "28a40000       slti    a0, a1, 0");
715   COMPARE(slti(s0, s1, 32767),
716           "2a307fff       slti    s0, s1, 32767");
717   COMPARE(slti(t2, t3, -32768),
718           "296a8000       slti    t2, t3, -32768");
719   COMPARE(slti(v0, v1, -1),
720           "2862ffff       slti    v0, v1, -1");
721   COMPARE(sltiu(a0, a1, 0),
722           "2ca40000       sltiu   a0, a1, 0");
723   COMPARE(sltiu(s0, s1, 32767),
724           "2e307fff       sltiu   s0, s1, 32767");
725   COMPARE(sltiu(t2, t3, -32768),
726           "2d6a8000       sltiu   t2, t3, -32768");
727   COMPARE(sltiu(v0, v1, -1),
728           "2c62ffff       sltiu   v0, v1, -1");
729 
730   if (!IsMipsArchVariant(kLoongson)) {
731     COMPARE(movz(a0, a1, a2),
732             "00a6200a       movz    a0, a1, a2");
733     COMPARE(movz(s0, s1, s2),
734             "0232800a       movz    s0, s1, s2");
735     COMPARE(movz(t2, t3, t4),
736             "016c500a       movz    t2, t3, t4");
737     COMPARE(movz(v0, v1, a2),
738             "0066100a       movz    v0, v1, a2");
739     COMPARE(movn(a0, a1, a2),
740             "00a6200b       movn    a0, a1, a2");
741     COMPARE(movn(s0, s1, s2),
742             "0232800b       movn    s0, s1, s2");
743     COMPARE(movn(t2, t3, t4),
744             "016c500b       movn    t2, t3, t4");
745     COMPARE(movn(v0, v1, a2),
746             "0066100b       movn    v0, v1, a2");
747 
748     COMPARE(movt(a0, a1, 1),
749             "00a52001       movt    a0, a1, 1");
750     COMPARE(movt(s0, s1, 2),
751             "02298001       movt    s0, s1, 2");
752     COMPARE(movt(t2, t3, 3),
753             "016d5001       movt    t2, t3, 3");
754     COMPARE(movt(v0, v1, 7),
755             "007d1001       movt    v0, v1, 7");
756     COMPARE(movf(a0, a1, 0),
757             "00a02001       movf    a0, a1, 0");
758     COMPARE(movf(s0, s1, 4),
759             "02308001       movf    s0, s1, 4");
760     COMPARE(movf(t2, t3, 5),
761             "01745001       movf    t2, t3, 5");
762     COMPARE(movf(v0, v1, 6),
763             "00781001       movf    v0, v1, 6");
764 
765     if (IsMipsArchVariant(kMips32r6)) {
766       COMPARE(clz(a0, a1),
767               "00a02050       clz     a0, a1");
768       COMPARE(clz(s6, s7),
769               "02e0b050       clz     s6, s7");
770       COMPARE(clz(v0, v1),
771               "00601050       clz     v0, v1");
772     } else {
773       COMPARE(clz(a0, a1),
774               "70a42020       clz     a0, a1");
775       COMPARE(clz(s6, s7),
776               "72f6b020       clz     s6, s7");
777       COMPARE(clz(v0, v1),
778               "70621020       clz     v0, v1");
779     }
780   }
781 
782   if (IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) {
783     COMPARE(ins_(a0, a1, 31, 1),
784             "7ca4ffc4       ins     a0, a1, 31, 1");
785     COMPARE(ins_(s6, s7, 30, 2),
786             "7ef6ff84       ins     s6, s7, 30, 2");
787     COMPARE(ins_(v0, v1, 0, 32),
788             "7c62f804       ins     v0, v1, 0, 32");
789     COMPARE(ext_(a0, a1, 31, 1),
790             "7ca407c0       ext     a0, a1, 31, 1");
791     COMPARE(ext_(s6, s7, 30, 2),
792             "7ef60f80       ext     s6, s7, 30, 2");
793     COMPARE(ext_(v0, v1, 0, 32),
794             "7c62f800       ext     v0, v1, 0, 32");
795   }
796   COMPARE(add_s(f4, f6, f8), "46083100       add.s   f4, f6, f8");
797   COMPARE(add_d(f12, f14, f16), "46307300       add.d   f12, f14, f16");
798 
799   if (IsMipsArchVariant(kMips32r6)) {
800     COMPARE(bitswap(a0, a1), "7c052020       bitswap a0, a1");
801     COMPARE(bitswap(t8, s0), "7c10c020       bitswap t8, s0");
802   }
803 
804   COMPARE(abs_s(f6, f8), "46004185       abs.s   f6, f8");
805   COMPARE(abs_d(f10, f12), "46206285       abs.d   f10, f12");
806 
807   COMPARE(div_s(f2, f4, f6), "46062083       div.s   f2, f4, f6");
808   COMPARE(div_d(f2, f4, f6), "46262083       div.d   f2, f4, f6");
809 
810   if (IsMipsArchVariant(kMips32r6)) {
811     COMPARE(align(v0, a0, a1, 0), "7c851220       align  v0, a0, a1, 0");
812     COMPARE(align(v0, a0, a1, 1), "7c851260       align  v0, a0, a1, 1");
813     COMPARE(align(v0, a0, a1, 2), "7c8512a0       align  v0, a0, a1, 2");
814     COMPARE(align(v0, a0, a1, 3), "7c8512e0       align  v0, a0, a1, 3");
815   }
816 
817   if (IsMipsArchVariant(kMips32r6)) {
818     COMPARE(aluipc(v0, 0), "ec5f0000       aluipc  v0, 0");
819     COMPARE(aluipc(v0, 1), "ec5f0001       aluipc  v0, 1");
820     COMPARE(aluipc(v0, 32767), "ec5f7fff       aluipc  v0, 32767");
821     COMPARE(aluipc(v0, -32768), "ec5f8000       aluipc  v0, -32768");
822     COMPARE(aluipc(v0, -1), "ec5fffff       aluipc  v0, -1");
823   }
824 
825   if (IsMipsArchVariant(kMips32r6)) {
826     COMPARE(auipc(t8, 0), "ef1e0000       auipc   t8, 0");
827     COMPARE(auipc(t8, 1), "ef1e0001       auipc   t8, 1");
828     COMPARE(auipc(t8, 32767), "ef1e7fff       auipc   t8, 32767");
829     COMPARE(auipc(t8, -32768), "ef1e8000       auipc   t8, -32768");
830     COMPARE(auipc(t8, -1), "ef1effff       auipc   t8, -1");
831   }
832 
833   if (IsMipsArchVariant(kMips32r6)) {
834     COMPARE(lwpc(t1, 0), "ed280000       lwpc    t1, 0");
835     COMPARE(lwpc(t1, 4), "ed280004       lwpc    t1, 4");
836     COMPARE(lwpc(t1, -4), "ed2ffffc       lwpc    t1, -4");
837   }
838 
839   if (IsMipsArchVariant(kMips32r6)) {
840     COMPARE(jic(t0, -32768), "d8088000       jic     t0, -32768");
841     COMPARE(jic(t0, -1), "d808ffff       jic     t0, -1");
842     COMPARE(jic(t0, 0), "d8080000       jic     t0, 0");
843     COMPARE(jic(t0, 4), "d8080004       jic     t0, 4");
844     COMPARE(jic(t0, 32767), "d8087fff       jic     t0, 32767");
845   }
846 
847   if (IsMipsArchVariant(kMips32r6)) {
848     COMPARE(addiupc(a0, 262143), "ec83ffff       addiupc a0, 262143");
849     COMPARE(addiupc(a0, -1), "ec87ffff       addiupc a0, -1");
850     COMPARE(addiupc(v0, 0), "ec400000       addiupc v0, 0");
851     COMPARE(addiupc(s1, 1), "ee200001       addiupc s1, 1");
852     COMPARE(addiupc(a0, -262144), "ec840000       addiupc a0, -262144");
853   }
854 
855   if (IsMipsArchVariant(kMips32r6)) {
856     COMPARE(jialc(a0, -32768), "f8048000       jialc   a0, -32768");
857     COMPARE(jialc(a0, -1), "f804ffff       jialc   a0, -1");
858     COMPARE(jialc(v0, 0), "f8020000       jialc   v0, 0");
859     COMPARE(jialc(s1, 1), "f8110001       jialc   s1, 1");
860     COMPARE(jialc(a0, 32767), "f8047fff       jialc   a0, 32767");
861   }
862 
863   VERIFY_RUN();
864 }
865 
866 
TEST(Type1)867 TEST(Type1) {
868   SET_UP();
869   if (IsMipsArchVariant(kMips32r6)) {
870     COMPARE(seleqz(a0, a1, a2), "00a62035       seleqz    a0, a1, a2");
871     COMPARE(selnez(a0, a1, a2), "00a62037       selnez    a0, a1, a2");
872 
873 
874     COMPARE(seleqz_d(f3, f4, f5), "462520d4       seleqz.d    f3, f4, f5");
875     COMPARE(selnez_d(f3, f4, f5), "462520d7       selnez.d    f3, f4, f5");
876     COMPARE(seleqz_s(f3, f4, f5), "460520d4       seleqz.s    f3, f4, f5");
877     COMPARE(selnez_s(f3, f4, f5), "460520d7       selnez.s    f3, f4, f5");
878 
879     COMPARE(min_d(f3, f4, f5), "462520dc       min.d    f3, f4, f5");
880     COMPARE(max_d(f3, f4, f5), "462520de       max.d    f3, f4, f5");
881 
882     COMPARE(sel_s(f3, f4, f5), "460520d0       sel.s      f3, f4, f5");
883     COMPARE(sel_d(f3, f4, f5), "462520d0       sel.d      f3, f4, f5");
884 
885     COMPARE(rint_d(f8, f6), "4620321a       rint.d    f8, f6");
886     COMPARE(rint_s(f8, f6), "4600321a       rint.s    f8, f6");
887 
888     COMPARE(min_s(f3, f4, f5), "460520dc       min.s    f3, f4, f5");
889     COMPARE(max_s(f3, f4, f5), "460520de       max.s    f3, f4, f5");
890 
891     COMPARE(mina_d(f3, f4, f5), "462520dd       mina.d   f3, f4, f5");
892     COMPARE(mina_s(f3, f4, f5), "460520dd       mina.s   f3, f4, f5");
893 
894     COMPARE(maxa_d(f3, f4, f5), "462520df       maxa.d   f3, f4, f5");
895     COMPARE(maxa_s(f3, f4, f5), "460520df       maxa.s   f3, f4, f5");
896   }
897 
898   if ((IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) &&
899       IsFp64Mode()) {
900     COMPARE(trunc_l_d(f8, f6), "46203209       trunc.l.d f8, f6");
901     COMPARE(trunc_l_s(f8, f6), "46003209       trunc.l.s f8, f6");
902 
903     COMPARE(round_l_s(f8, f6), "46003208       round.l.s f8, f6");
904     COMPARE(round_l_d(f8, f6), "46203208       round.l.d f8, f6");
905 
906     COMPARE(floor_l_s(f8, f6), "4600320b       floor.l.s f8, f6");
907     COMPARE(floor_l_d(f8, f6), "4620320b       floor.l.d f8, f6");
908 
909     COMPARE(ceil_l_s(f8, f6), "4600320a       ceil.l.s f8, f6");
910     COMPARE(ceil_l_d(f8, f6), "4620320a       ceil.l.d f8, f6");
911   }
912 
913   COMPARE(trunc_w_d(f8, f6), "4620320d       trunc.w.d f8, f6");
914   COMPARE(trunc_w_s(f8, f6), "4600320d       trunc.w.s f8, f6");
915 
916   COMPARE(round_w_s(f8, f6), "4600320c       round.w.s f8, f6");
917   COMPARE(round_w_d(f8, f6), "4620320c       round.w.d f8, f6");
918 
919   COMPARE(floor_w_s(f8, f6), "4600320f       floor.w.s f8, f6");
920   COMPARE(floor_w_d(f8, f6), "4620320f       floor.w.d f8, f6");
921 
922   COMPARE(ceil_w_s(f8, f6), "4600320e       ceil.w.s f8, f6");
923   COMPARE(ceil_w_d(f8, f6), "4620320e       ceil.w.d f8, f6");
924 
925   COMPARE(sub_s(f10, f8, f6), "46064281       sub.s   f10, f8, f6");
926   COMPARE(sub_d(f10, f8, f6), "46264281       sub.d   f10, f8, f6");
927 
928   COMPARE(sqrt_s(f8, f6), "46003204       sqrt.s  f8, f6");
929   COMPARE(sqrt_d(f8, f6), "46203204       sqrt.d  f8, f6");
930 
931   COMPARE(neg_s(f8, f6), "46003207       neg.s   f8, f6");
932   COMPARE(neg_d(f8, f6), "46203207       neg.d   f8, f6");
933 
934   COMPARE(mul_s(f8, f6, f4), "46043202       mul.s   f8, f6, f4");
935   COMPARE(mul_d(f8, f6, f4), "46243202       mul.d   f8, f6, f4");
936 
937   if (IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) {
938     COMPARE(rsqrt_s(f8, f6), "46003216       rsqrt.s  f8, f6");
939     COMPARE(rsqrt_d(f8, f6), "46203216       rsqrt.d  f8, f6");
940 
941     COMPARE(recip_s(f8, f6), "46003215       recip.s  f8, f6");
942     COMPARE(recip_d(f8, f6), "46203215       recip.d  f8, f6");
943   }
944 
945   COMPARE(mov_s(f6, f4), "46002186       mov.s   f6, f4");
946   COMPARE(mov_d(f6, f4), "46202186       mov.d   f6, f4");
947 
948   if (IsMipsArchVariant(kMips32r2)) {
949     COMPARE(movz_s(f6, f4, t0), "46082192       movz.s    f6, f4, t0");
950     COMPARE(movz_d(f6, f4, t0), "46282192       movz.d    f6, f4, t0");
951 
952     COMPARE(movt_s(f6, f4, 4), "46112191       movt.s    f6, f4, cc(1)");
953     COMPARE(movt_d(f6, f4, 4), "46312191       movt.d    f6, f4, cc(1)");
954 
955     COMPARE(movf_s(f6, f4, 4), "46102191       movf.s    f6, f4, cc(1)");
956     COMPARE(movf_d(f6, f4, 4), "46302191       movf.d    f6, f4, cc(1)");
957 
958     COMPARE(movn_s(f6, f4, t0), "46082193       movn.s    f6, f4, t0");
959     COMPARE(movn_d(f6, f4, t0), "46282193       movn.d    f6, f4, t0");
960   }
961   VERIFY_RUN();
962 }
963 
964 
TEST(Type2)965 TEST(Type2) {
966   if (IsMipsArchVariant(kMips32r6)) {
967     SET_UP();
968 
969     COMPARE(class_s(f3, f4), "460020db       class.s f3, f4");
970     COMPARE(class_d(f2, f3), "4620189b       class.d f2, f3");
971 
972     VERIFY_RUN();
973   }
974 }
975 
976 
TEST(C_FMT_DISASM)977 TEST(C_FMT_DISASM) {
978   if (IsMipsArchVariant(kMips32r1) || IsMipsArchVariant(kMips32r2)) {
979     SET_UP();
980 
981     COMPARE(c_s(F, f8, f10, 0), "460a4030       c.f.s   f8, f10, cc(0)");
982     COMPARE(c_d(F, f8, f10, 0), "462a4030       c.f.d   f8, f10, cc(0)");
983 
984     COMPARE(c_s(UN, f8, f10, 2), "460a4231       c.un.s  f8, f10, cc(2)");
985     COMPARE(c_d(UN, f8, f10, 2), "462a4231       c.un.d  f8, f10, cc(2)");
986 
987     COMPARE(c_s(EQ, f8, f10, 4), "460a4432       c.eq.s  f8, f10, cc(4)");
988     COMPARE(c_d(EQ, f8, f10, 4), "462a4432       c.eq.d  f8, f10, cc(4)");
989 
990     COMPARE(c_s(UEQ, f8, f10, 6), "460a4633       c.ueq.s f8, f10, cc(6)");
991     COMPARE(c_d(UEQ, f8, f10, 6), "462a4633       c.ueq.d f8, f10, cc(6)");
992 
993     COMPARE(c_s(OLT, f8, f10, 0), "460a4034       c.olt.s f8, f10, cc(0)");
994     COMPARE(c_d(OLT, f8, f10, 0), "462a4034       c.olt.d f8, f10, cc(0)");
995 
996     COMPARE(c_s(ULT, f8, f10, 2), "460a4235       c.ult.s f8, f10, cc(2)");
997     COMPARE(c_d(ULT, f8, f10, 2), "462a4235       c.ult.d f8, f10, cc(2)");
998 
999     COMPARE(c_s(OLE, f8, f10, 4), "460a4436       c.ole.s f8, f10, cc(4)");
1000     COMPARE(c_d(OLE, f8, f10, 4), "462a4436       c.ole.d f8, f10, cc(4)");
1001 
1002     COMPARE(c_s(ULE, f8, f10, 6), "460a4637       c.ule.s f8, f10, cc(6)");
1003     COMPARE(c_d(ULE, f8, f10, 6), "462a4637       c.ule.d f8, f10, cc(6)");
1004 
1005     VERIFY_RUN();
1006   }
1007 }
1008 
1009 
TEST(COND_FMT_DISASM)1010 TEST(COND_FMT_DISASM) {
1011   if (IsMipsArchVariant(kMips32r6)) {
1012     SET_UP();
1013 
1014     COMPARE(cmp_s(F, f6, f8, f10), "468a4180       cmp.af.s    f6, f8, f10");
1015     COMPARE(cmp_d(F, f6, f8, f10), "46aa4180       cmp.af.d  f6,  f8, f10");
1016 
1017     COMPARE(cmp_s(UN, f6, f8, f10), "468a4181       cmp.un.s    f6, f8, f10");
1018     COMPARE(cmp_d(UN, f6, f8, f10), "46aa4181       cmp.un.d  f6,  f8, f10");
1019 
1020     COMPARE(cmp_s(EQ, f6, f8, f10), "468a4182       cmp.eq.s    f6, f8, f10");
1021     COMPARE(cmp_d(EQ, f6, f8, f10), "46aa4182       cmp.eq.d  f6,  f8, f10");
1022 
1023     COMPARE(cmp_s(UEQ, f6, f8, f10), "468a4183       cmp.ueq.s   f6, f8, f10");
1024     COMPARE(cmp_d(UEQ, f6, f8, f10), "46aa4183       cmp.ueq.d  f6,  f8, f10");
1025 
1026     COMPARE(cmp_s(LT, f6, f8, f10), "468a4184       cmp.lt.s    f6, f8, f10");
1027     COMPARE(cmp_d(LT, f6, f8, f10), "46aa4184       cmp.lt.d  f6,  f8, f10");
1028 
1029     COMPARE(cmp_s(ULT, f6, f8, f10), "468a4185       cmp.ult.s   f6, f8, f10");
1030     COMPARE(cmp_d(ULT, f6, f8, f10), "46aa4185       cmp.ult.d  f6,  f8, f10");
1031 
1032     COMPARE(cmp_s(LE, f6, f8, f10), "468a4186       cmp.le.s    f6, f8, f10");
1033     COMPARE(cmp_d(LE, f6, f8, f10), "46aa4186       cmp.le.d  f6,  f8, f10");
1034 
1035     COMPARE(cmp_s(ULE, f6, f8, f10), "468a4187       cmp.ule.s   f6, f8, f10");
1036     COMPARE(cmp_d(ULE, f6, f8, f10), "46aa4187       cmp.ule.d  f6,  f8, f10");
1037 
1038     COMPARE(cmp_s(ORD, f6, f8, f10), "468a4191       cmp.or.s    f6, f8, f10");
1039     COMPARE(cmp_d(ORD, f6, f8, f10), "46aa4191       cmp.or.d  f6,  f8, f10");
1040 
1041     COMPARE(cmp_s(UNE, f6, f8, f10), "468a4192       cmp.une.s   f6, f8, f10");
1042     COMPARE(cmp_d(UNE, f6, f8, f10), "46aa4192       cmp.une.d  f6,  f8, f10");
1043 
1044     COMPARE(cmp_s(NE, f6, f8, f10), "468a4193       cmp.ne.s    f6, f8, f10");
1045     COMPARE(cmp_d(NE, f6, f8, f10), "46aa4193       cmp.ne.d  f6,  f8, f10");
1046 
1047     VERIFY_RUN();
1048   }
1049 }
1050 
1051 
TEST(CVT_DISSASM)1052 TEST(CVT_DISSASM) {
1053   SET_UP();
1054   COMPARE(cvt_d_s(f22, f24), "4600c5a1       cvt.d.s f22, f24");
1055   COMPARE(cvt_d_w(f22, f24), "4680c5a1       cvt.d.w f22, f24");
1056 
1057   COMPARE(cvt_s_d(f22, f24), "4620c5a0       cvt.s.d f22, f24");
1058   COMPARE(cvt_s_w(f22, f24), "4680c5a0       cvt.s.w f22, f24");
1059 
1060   if ((IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) &&
1061       IsFp64Mode()) {
1062     COMPARE(cvt_d_l(f22, f24), "46a0c5a1       cvt.d.l f22, f24");
1063     COMPARE(cvt_l_d(f22, f24), "4620c5a5       cvt.l.d f22, f24");
1064 
1065     COMPARE(cvt_s_l(f22, f24), "46a0c5a0       cvt.s.l f22, f24");
1066     COMPARE(cvt_l_s(f22, f24), "4600c5a5       cvt.l.s f22, f24");
1067   }
1068 
1069   VERIFY_RUN();
1070 }
1071 
1072 
TEST(ctc1_cfc1_disasm)1073 TEST(ctc1_cfc1_disasm) {
1074   SET_UP();
1075   COMPARE(abs_d(f10, f31), "4620fa85       abs.d   f10, f31");
1076   COMPARE(ceil_w_s(f8, f31), "4600fa0e       ceil.w.s f8, f31");
1077   COMPARE(ctc1(a0, FCSR), "44c4f800       ctc1    a0, FCSR");
1078   COMPARE(cfc1(a0, FCSR), "4444f800       cfc1    a0, FCSR");
1079   VERIFY_RUN();
1080 }
1081