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