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