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