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