Ben Murdoch | b8a8cc1 | 2014-11-26 15:28:44 +0000 | [diff] [blame] | 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 | |
Ben Murdoch | 4a90d5f | 2016-03-22 12:00:34 +0000 | [diff] [blame] | 33 | #include "src/debug/debug.h" |
Ben Murdoch | b8a8cc1 | 2014-11-26 15:28:44 +0000 | [diff] [blame] | 34 | #include "src/disasm.h" |
| 35 | #include "src/disassembler.h" |
| 36 | #include "src/macro-assembler.h" |
Ben Murdoch | b8a8cc1 | 2014-11-26 15:28:44 +0000 | [diff] [blame] | 37 | #include "test/cctest/cctest.h" |
| 38 | |
| 39 | using namespace v8::internal; |
| 40 | |
Ben Murdoch | 4a90d5f | 2016-03-22 12:00:34 +0000 | [diff] [blame] | 41 | bool prev_instr_compact_branch = false; |
Ben Murdoch | b8a8cc1 | 2014-11-26 15:28:44 +0000 | [diff] [blame] | 42 | |
| 43 | bool DisassembleAndCompare(byte* pc, const char* compare_string) { |
| 44 | disasm::NameConverter converter; |
| 45 | disasm::Disassembler disasm(converter); |
| 46 | EmbeddedVector<char, 128> disasm_buffer; |
| 47 | |
Ben Murdoch | 4a90d5f | 2016-03-22 12:00:34 +0000 | [diff] [blame] | 48 | if (prev_instr_compact_branch) { |
| 49 | disasm.InstructionDecode(disasm_buffer, pc); |
| 50 | pc += 4; |
| 51 | } |
| 52 | |
Ben Murdoch | b8a8cc1 | 2014-11-26 15:28:44 +0000 | [diff] [blame] | 53 | disasm.InstructionDecode(disasm_buffer, pc); |
| 54 | |
| 55 | if (strcmp(compare_string, disasm_buffer.start()) != 0) { |
| 56 | fprintf(stderr, |
| 57 | "expected: \n" |
| 58 | "%s\n" |
| 59 | "disassembled: \n" |
| 60 | "%s\n\n", |
| 61 | compare_string, disasm_buffer.start()); |
| 62 | return false; |
| 63 | } |
| 64 | return true; |
| 65 | } |
| 66 | |
| 67 | |
| 68 | // Set up V8 to a state where we can at least run the assembler and |
| 69 | // disassembler. Declare the variables and allocate the data structures used |
| 70 | // in the rest of the macros. |
| 71 | #define SET_UP() \ |
| 72 | CcTest::InitializeVM(); \ |
| 73 | Isolate* isolate = CcTest::i_isolate(); \ |
| 74 | HandleScope scope(isolate); \ |
| 75 | byte *buffer = reinterpret_cast<byte*>(malloc(4*1024)); \ |
| 76 | Assembler assm(isolate, buffer, 4*1024); \ |
| 77 | bool failure = false; |
| 78 | |
| 79 | |
| 80 | // This macro assembles one instruction using the preallocated assembler and |
| 81 | // disassembles the generated instruction, comparing the output to the expected |
| 82 | // value. If the comparison fails an error message is printed, but the test |
| 83 | // continues to run until the end. |
| 84 | #define COMPARE(asm_, compare_string) \ |
| 85 | { \ |
| 86 | int pc_offset = assm.pc_offset(); \ |
| 87 | byte *progcounter = &buffer[pc_offset]; \ |
| 88 | assm.asm_; \ |
| 89 | if (!DisassembleAndCompare(progcounter, compare_string)) failure = true; \ |
| 90 | } |
| 91 | |
| 92 | |
| 93 | // Verify that all invocations of the COMPARE macro passed successfully. |
| 94 | // Exit with a failure if at least one of the tests failed. |
| 95 | #define VERIFY_RUN() \ |
| 96 | if (failure) { \ |
| 97 | V8_Fatal(__FILE__, __LINE__, "MIPS Disassembler tests failed.\n"); \ |
| 98 | } |
| 99 | |
| 100 | |
Ben Murdoch | 4a90d5f | 2016-03-22 12:00:34 +0000 | [diff] [blame] | 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 | |
Ben Murdoch | b8a8cc1 | 2014-11-26 15:28:44 +0000 | [diff] [blame] | 155 | TEST(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"); |
Ben Murdoch | b8a8cc1 | 2014-11-26 15:28:44 +0000 | [diff] [blame] | 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 | |
Ben Murdoch | 4a90d5f | 2016-03-22 12:00:34 +0000 | [diff] [blame] | 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 | |
Ben Murdoch | b8a8cc1 | 2014-11-26 15:28:44 +0000 | [diff] [blame] | 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 | |
Ben Murdoch | c561043 | 2016-08-08 18:44:38 +0100 | [diff] [blame^] | 533 | COMPARE(rotr(a0, a1, 0), "00252002 rotr a0, a1, 0"); |
| 534 | COMPARE(rotr(s0, s1, 8), "00318202 rotr s0, s1, 8"); |
| 535 | COMPARE(rotr(a6, a7, 24), "002b5602 rotr a6, a7, 24"); |
| 536 | COMPARE(rotr(v0, v1, 31), "002317c2 rotr v0, v1, 31"); |
| 537 | COMPARE(drotr(a0, a1, 0), "0025203a drotr a0, a1, 0"); |
| 538 | COMPARE(drotr(s0, s1, 8), "0031823a drotr s0, s1, 8"); |
| 539 | COMPARE(drotr(a6, a7, 24), "002b563a drotr a6, a7, 24"); |
| 540 | COMPARE(drotr(v0, v1, 31), "002317fa drotr v0, v1, 31"); |
Ben Murdoch | b8a8cc1 | 2014-11-26 15:28:44 +0000 | [diff] [blame] | 541 | |
Ben Murdoch | c561043 | 2016-08-08 18:44:38 +0100 | [diff] [blame^] | 542 | COMPARE(drotr32(a0, a1, 0), "0025203e drotr32 a0, a1, 0"); |
| 543 | COMPARE(drotr32(s0, s1, 8), "0031823e drotr32 s0, s1, 8"); |
| 544 | COMPARE(drotr32(a6, a7, 24), "002b563e drotr32 a6, a7, 24"); |
| 545 | COMPARE(drotr32(v0, v1, 31), "002317fe drotr32 v0, v1, 31"); |
| 546 | |
| 547 | COMPARE(rotrv(a0, a1, a2), "00c52046 rotrv a0, a1, a2"); |
| 548 | COMPARE(rotrv(s0, s1, s2), "02518046 rotrv s0, s1, s2"); |
| 549 | COMPARE(rotrv(a6, a7, t0), "018b5046 rotrv a6, a7, t0"); |
| 550 | COMPARE(rotrv(v0, v1, fp), "03c31046 rotrv v0, v1, fp"); |
| 551 | COMPARE(drotrv(a0, a1, a2), "00c52056 drotrv a0, a1, a2"); |
| 552 | COMPARE(drotrv(s0, s1, s2), "02518056 drotrv s0, s1, s2"); |
| 553 | COMPARE(drotrv(a6, a7, t0), "018b5056 drotrv a6, a7, t0"); |
| 554 | COMPARE(drotrv(v0, v1, fp), "03c31056 drotrv v0, v1, fp"); |
Ben Murdoch | b8a8cc1 | 2014-11-26 15:28:44 +0000 | [diff] [blame] | 555 | |
| 556 | COMPARE(break_(0), |
| 557 | "0000000d break, code: 0x00000 (0)"); |
| 558 | COMPARE(break_(261120), |
| 559 | "00ff000d break, code: 0x3fc00 (261120)"); |
| 560 | COMPARE(break_(1047552), |
| 561 | "03ff000d break, code: 0xffc00 (1047552)"); |
| 562 | |
| 563 | COMPARE(tge(a0, a1, 0), |
| 564 | "00850030 tge a0, a1, code: 0x000"); |
| 565 | COMPARE(tge(s0, s1, 1023), |
| 566 | "0211fff0 tge s0, s1, code: 0x3ff"); |
| 567 | COMPARE(tgeu(a0, a1, 0), |
| 568 | "00850031 tgeu a0, a1, code: 0x000"); |
| 569 | COMPARE(tgeu(s0, s1, 1023), |
| 570 | "0211fff1 tgeu s0, s1, code: 0x3ff"); |
| 571 | COMPARE(tlt(a0, a1, 0), |
| 572 | "00850032 tlt a0, a1, code: 0x000"); |
| 573 | COMPARE(tlt(s0, s1, 1023), |
| 574 | "0211fff2 tlt s0, s1, code: 0x3ff"); |
| 575 | COMPARE(tltu(a0, a1, 0), |
| 576 | "00850033 tltu a0, a1, code: 0x000"); |
| 577 | COMPARE(tltu(s0, s1, 1023), |
| 578 | "0211fff3 tltu s0, s1, code: 0x3ff"); |
| 579 | COMPARE(teq(a0, a1, 0), |
| 580 | "00850034 teq a0, a1, code: 0x000"); |
| 581 | COMPARE(teq(s0, s1, 1023), |
| 582 | "0211fff4 teq s0, s1, code: 0x3ff"); |
| 583 | COMPARE(tne(a0, a1, 0), |
| 584 | "00850036 tne a0, a1, code: 0x000"); |
| 585 | COMPARE(tne(s0, s1, 1023), |
| 586 | "0211fff6 tne s0, s1, code: 0x3ff"); |
| 587 | |
| 588 | COMPARE(mfhi(a0), |
| 589 | "00002010 mfhi a0"); |
| 590 | COMPARE(mfhi(s2), |
| 591 | "00009010 mfhi s2"); |
| 592 | COMPARE(mfhi(t0), |
| 593 | "00006010 mfhi t0"); |
| 594 | COMPARE(mfhi(v1), |
| 595 | "00001810 mfhi v1"); |
| 596 | COMPARE(mflo(a0), |
| 597 | "00002012 mflo a0"); |
| 598 | COMPARE(mflo(s2), |
| 599 | "00009012 mflo s2"); |
| 600 | COMPARE(mflo(t0), |
| 601 | "00006012 mflo t0"); |
| 602 | COMPARE(mflo(v1), |
| 603 | "00001812 mflo v1"); |
| 604 | |
| 605 | COMPARE(slt(a0, a1, a2), |
| 606 | "00a6202a slt a0, a1, a2"); |
| 607 | COMPARE(slt(s0, s1, s2), |
| 608 | "0232802a slt s0, s1, s2"); |
| 609 | COMPARE(slt(a6, a7, t0), |
| 610 | "016c502a slt a6, a7, t0"); |
| 611 | COMPARE(slt(v0, v1, a2), |
| 612 | "0066102a slt v0, v1, a2"); |
| 613 | COMPARE(sltu(a0, a1, a2), |
| 614 | "00a6202b sltu a0, a1, a2"); |
| 615 | COMPARE(sltu(s0, s1, s2), |
| 616 | "0232802b sltu s0, s1, s2"); |
| 617 | COMPARE(sltu(a6, a7, t0), |
| 618 | "016c502b sltu a6, a7, t0"); |
| 619 | COMPARE(sltu(v0, v1, a2), |
| 620 | "0066102b sltu v0, v1, a2"); |
| 621 | |
| 622 | COMPARE(slti(a0, a1, 0), |
| 623 | "28a40000 slti a0, a1, 0"); |
| 624 | COMPARE(slti(s0, s1, 32767), |
| 625 | "2a307fff slti s0, s1, 32767"); |
| 626 | COMPARE(slti(a6, a7, -32768), |
| 627 | "296a8000 slti a6, a7, -32768"); |
| 628 | COMPARE(slti(v0, v1, -1), |
| 629 | "2862ffff slti v0, v1, -1"); |
| 630 | COMPARE(sltiu(a0, a1, 0), |
| 631 | "2ca40000 sltiu a0, a1, 0"); |
| 632 | COMPARE(sltiu(s0, s1, 32767), |
| 633 | "2e307fff sltiu s0, s1, 32767"); |
| 634 | COMPARE(sltiu(a6, a7, -32768), |
| 635 | "2d6a8000 sltiu a6, a7, -32768"); |
| 636 | COMPARE(sltiu(v0, v1, -1), |
| 637 | "2c62ffff sltiu v0, v1, -1"); |
| 638 | COMPARE(movz(a0, a1, a2), |
| 639 | "00a6200a movz a0, a1, a2"); |
| 640 | COMPARE(movz(s0, s1, s2), |
| 641 | "0232800a movz s0, s1, s2"); |
| 642 | COMPARE(movz(a6, a7, t0), |
| 643 | "016c500a movz a6, a7, t0"); |
| 644 | COMPARE(movz(v0, v1, a2), |
| 645 | "0066100a movz v0, v1, a2"); |
| 646 | COMPARE(movn(a0, a1, a2), |
| 647 | "00a6200b movn a0, a1, a2"); |
| 648 | COMPARE(movn(s0, s1, s2), |
| 649 | "0232800b movn s0, s1, s2"); |
| 650 | COMPARE(movn(a6, a7, t0), |
| 651 | "016c500b movn a6, a7, t0"); |
| 652 | COMPARE(movn(v0, v1, a2), |
| 653 | "0066100b movn v0, v1, a2"); |
| 654 | |
| 655 | COMPARE(movt(a0, a1, 1), |
| 656 | "00a52001 movt a0, a1, 1"); |
| 657 | COMPARE(movt(s0, s1, 2), |
| 658 | "02298001 movt s0, s1, 2"); |
| 659 | COMPARE(movt(a6, a7, 3), |
| 660 | "016d5001 movt a6, a7, 3"); |
| 661 | COMPARE(movt(v0, v1, 7), |
| 662 | "007d1001 movt v0, v1, 7"); |
| 663 | COMPARE(movf(a0, a1, 0), |
| 664 | "00a02001 movf a0, a1, 0"); |
| 665 | COMPARE(movf(s0, s1, 4), |
| 666 | "02308001 movf s0, s1, 4"); |
| 667 | COMPARE(movf(a6, a7, 5), |
| 668 | "01745001 movf a6, a7, 5"); |
| 669 | COMPARE(movf(v0, v1, 6), |
| 670 | "00781001 movf v0, v1, 6"); |
| 671 | |
| 672 | if (kArchVariant == kMips64r6) { |
| 673 | COMPARE(clz(a0, a1), |
| 674 | "00a02050 clz a0, a1"); |
| 675 | COMPARE(clz(s6, s7), |
| 676 | "02e0b050 clz s6, s7"); |
| 677 | COMPARE(clz(v0, v1), |
| 678 | "00601050 clz v0, v1"); |
| 679 | } else { |
| 680 | COMPARE(clz(a0, a1), |
| 681 | "70a42020 clz a0, a1"); |
| 682 | COMPARE(clz(s6, s7), |
| 683 | "72f6b020 clz s6, s7"); |
| 684 | COMPARE(clz(v0, v1), |
| 685 | "70621020 clz v0, v1"); |
| 686 | } |
| 687 | |
| 688 | COMPARE(ins_(a0, a1, 31, 1), |
| 689 | "7ca4ffc4 ins a0, a1, 31, 1"); |
| 690 | COMPARE(ins_(s6, s7, 30, 2), |
| 691 | "7ef6ff84 ins s6, s7, 30, 2"); |
| 692 | COMPARE(ins_(v0, v1, 0, 32), |
| 693 | "7c62f804 ins v0, v1, 0, 32"); |
| 694 | COMPARE(ext_(a0, a1, 31, 1), |
| 695 | "7ca407c0 ext a0, a1, 31, 1"); |
| 696 | COMPARE(ext_(s6, s7, 30, 2), |
| 697 | "7ef60f80 ext s6, s7, 30, 2"); |
| 698 | COMPARE(ext_(v0, v1, 0, 32), |
| 699 | "7c62f800 ext v0, v1, 0, 32"); |
| 700 | |
Ben Murdoch | 4a90d5f | 2016-03-22 12:00:34 +0000 | [diff] [blame] | 701 | COMPARE(add_s(f4, f6, f8), "46083100 add.s f4, f6, f8"); |
| 702 | COMPARE(add_d(f12, f14, f16), "46307300 add.d f12, f14, f16"); |
| 703 | |
| 704 | if (kArchVariant == kMips64r6) { |
| 705 | COMPARE(bitswap(a0, a1), "7c052020 bitswap a0, a1"); |
| 706 | COMPARE(bitswap(t8, s0), "7c10c020 bitswap t8, s0"); |
| 707 | COMPARE(dbitswap(a0, a1), "7c052024 dbitswap a0, a1"); |
| 708 | COMPARE(dbitswap(t8, s0), "7c10c024 dbitswap t8, s0"); |
| 709 | } |
| 710 | |
| 711 | COMPARE(abs_s(f6, f8), "46004185 abs.s f6, f8"); |
| 712 | COMPARE(abs_d(f10, f12), "46206285 abs.d f10, f12"); |
| 713 | |
| 714 | COMPARE(div_s(f2, f4, f6), "46062083 div.s f2, f4, f6"); |
| 715 | COMPARE(div_d(f2, f4, f6), "46262083 div.d f2, f4, f6"); |
| 716 | |
| 717 | if (kArchVariant == kMips64r6) { |
| 718 | COMPARE(align(v0, a0, a1, 0), "7c851220 align v0, a0, a1, 0"); |
| 719 | COMPARE(align(v0, a0, a1, 1), "7c851260 align v0, a0, a1, 1"); |
| 720 | COMPARE(align(v0, a0, a1, 2), "7c8512a0 align v0, a0, a1, 2"); |
| 721 | COMPARE(align(v0, a0, a1, 3), "7c8512e0 align v0, a0, a1, 3"); |
| 722 | } |
| 723 | |
| 724 | if (kArchVariant == kMips64r6) { |
| 725 | COMPARE(dalign(v0, a0, a1, 0), "7c851224 dalign v0, a0, a1, 0"); |
| 726 | COMPARE(dalign(v0, a0, a1, 1), "7c851264 dalign v0, a0, a1, 1"); |
| 727 | COMPARE(dalign(v0, a0, a1, 2), "7c8512a4 dalign v0, a0, a1, 2"); |
| 728 | COMPARE(dalign(v0, a0, a1, 3), "7c8512e4 dalign v0, a0, a1, 3"); |
| 729 | COMPARE(dalign(v0, a0, a1, 4), "7c851324 dalign v0, a0, a1, 4"); |
| 730 | COMPARE(dalign(v0, a0, a1, 5), "7c851364 dalign v0, a0, a1, 5"); |
| 731 | COMPARE(dalign(v0, a0, a1, 6), "7c8513a4 dalign v0, a0, a1, 6"); |
| 732 | COMPARE(dalign(v0, a0, a1, 7), "7c8513e4 dalign v0, a0, a1, 7"); |
| 733 | } |
| 734 | |
| 735 | if (kArchVariant == kMips64r6) { |
| 736 | COMPARE(aluipc(v0, 0), "ec5f0000 aluipc v0, 0"); |
| 737 | COMPARE(aluipc(v0, 1), "ec5f0001 aluipc v0, 1"); |
| 738 | COMPARE(aluipc(v0, 32767), "ec5f7fff aluipc v0, 32767"); |
| 739 | COMPARE(aluipc(v0, -32768), "ec5f8000 aluipc v0, -32768"); |
| 740 | COMPARE(aluipc(v0, -1), "ec5fffff aluipc v0, -1"); |
| 741 | } |
| 742 | |
| 743 | if (kArchVariant == kMips64r6) { |
| 744 | COMPARE(auipc(t8, 0), "ef1e0000 auipc t8, 0"); |
| 745 | COMPARE(auipc(t8, 1), "ef1e0001 auipc t8, 1"); |
| 746 | COMPARE(auipc(t8, 32767), "ef1e7fff auipc t8, 32767"); |
| 747 | COMPARE(auipc(t8, -32768), "ef1e8000 auipc t8, -32768"); |
| 748 | COMPARE(auipc(t8, -1), "ef1effff auipc t8, -1"); |
| 749 | } |
| 750 | |
| 751 | if (kArchVariant == kMips64r6) { |
| 752 | COMPARE(lwpc(a5, 0), "ed280000 lwpc a5, 0"); |
| 753 | COMPARE(lwpc(a5, 4), "ed280004 lwpc a5, 4"); |
| 754 | COMPARE(lwpc(a5, -4), "ed2ffffc lwpc a5, -4"); |
| 755 | } |
| 756 | |
| 757 | if (kArchVariant == kMips64r6) { |
| 758 | COMPARE(lwupc(a0, -262144), "ec940000 lwupc a0, -262144"); |
| 759 | COMPARE(lwupc(a0, -1), "ec97ffff lwupc a0, -1"); |
| 760 | COMPARE(lwupc(a0, 0), "ec900000 lwupc a0, 0"); |
| 761 | COMPARE(lwupc(a0, 1), "ec900001 lwupc a0, 1"); |
| 762 | COMPARE(lwupc(a0, 262143), "ec93ffff lwupc a0, 262143"); |
| 763 | } |
| 764 | |
| 765 | if (kArchVariant == kMips64r6) { |
| 766 | COMPARE(jic(t0, 16), "d80c0010 jic t0, 16"); |
| 767 | COMPARE(jic(t0, 4), "d80c0004 jic t0, 4"); |
| 768 | COMPARE(jic(t0, -32), "d80cffe0 jic t0, -32"); |
| 769 | } |
| 770 | |
| 771 | if (kArchVariant == kMips64r6) { |
| 772 | COMPARE(ldpc(v0, 256), "ec580100 ldpc v0, 256"); |
| 773 | COMPARE(ldpc(a0, -1), "ec9bffff ldpc a0, -1"); |
| 774 | COMPARE(ldpc(a1, 0), "ecb80000 ldpc a1, 0"); |
| 775 | } |
| 776 | |
| 777 | if (kArchVariant == kMips64r6) { |
| 778 | COMPARE(addiupc(a0, 262143), "ec83ffff addiupc a0, 262143"); |
| 779 | COMPARE(addiupc(a0, -1), "ec87ffff addiupc a0, -1"); |
| 780 | COMPARE(addiupc(v0, 0), "ec400000 addiupc v0, 0"); |
| 781 | COMPARE(addiupc(s1, 1), "ee200001 addiupc s1, 1"); |
| 782 | COMPARE(addiupc(a0, -262144), "ec840000 addiupc a0, -262144"); |
| 783 | } |
| 784 | |
| 785 | if (kArchVariant == kMips64r6) { |
| 786 | COMPARE(jialc(a0, -32768), "f8048000 jialc a0, -32768"); |
| 787 | COMPARE(jialc(a0, -1), "f804ffff jialc a0, -1"); |
| 788 | COMPARE(jialc(v0, 0), "f8020000 jialc v0, 0"); |
| 789 | COMPARE(jialc(s1, 1), "f8110001 jialc s1, 1"); |
| 790 | COMPARE(jialc(a0, 32767), "f8047fff jialc a0, 32767"); |
| 791 | } |
| 792 | |
| 793 | VERIFY_RUN(); |
| 794 | } |
| 795 | |
| 796 | |
| 797 | TEST(Type1) { |
| 798 | SET_UP(); |
| 799 | if (kArchVariant == kMips64r6) { |
| 800 | COMPARE(seleqz(a0, a1, a2), "00a62035 seleqz a0, a1, a2"); |
| 801 | COMPARE(selnez(a0, a1, a2), "00a62037 selnez a0, a1, a2"); |
| 802 | |
| 803 | |
| 804 | COMPARE(seleqz(D, f3, f4, f5), "462520d4 seleqz.d f3, f4, f5"); |
| 805 | COMPARE(selnez(D, f3, f4, f5), "462520d7 selnez.d f3, f4, f5"); |
| 806 | COMPARE(seleqz(S, f3, f4, f5), "460520d4 seleqz.s f3, f4, f5"); |
| 807 | COMPARE(selnez(S, f3, f4, f5), "460520d7 selnez.s f3, f4, f5"); |
| 808 | |
| 809 | COMPARE(min_d(f3, f4, f5), "462520dc min.d f3, f4, f5"); |
| 810 | COMPARE(max_d(f3, f4, f5), "462520de max.d f3, f4, f5"); |
| 811 | |
| 812 | COMPARE(sel(S, f3, f4, f5), "460520d0 sel.s f3, f4, f5"); |
| 813 | COMPARE(sel(D, f3, f4, f5), "462520d0 sel.d f3, f4, f5"); |
| 814 | |
| 815 | COMPARE(rint_d(f8, f6), "4620321a rint.d f8, f6"); |
| 816 | |
| 817 | COMPARE(min_s(f3, f4, f5), "460520dc min.s f3, f4, f5"); |
| 818 | COMPARE(max_s(f3, f4, f5), "460520de max.s f3, f4, f5"); |
| 819 | |
| 820 | COMPARE(rint(S, f8, f6), "4600321a rint.s f8, f6"); |
| 821 | |
| 822 | COMPARE(mina_d(f3, f4, f5), "462520dd mina.d f3, f4, f5"); |
| 823 | COMPARE(mina_s(f3, f4, f5), "460520dd mina.s f3, f4, f5"); |
| 824 | |
| 825 | COMPARE(maxa_d(f3, f4, f5), "462520df maxa.d f3, f4, f5"); |
| 826 | COMPARE(maxa_s(f3, f4, f5), "460520df maxa.s f3, f4, f5"); |
| 827 | } |
| 828 | COMPARE(trunc_w_d(f8, f6), "4620320d trunc.w.d f8, f6"); |
| 829 | COMPARE(trunc_w_s(f8, f6), "4600320d trunc.w.s f8, f6"); |
| 830 | |
| 831 | COMPARE(round_w_s(f8, f6), "4600320c round.w.s f8, f6"); |
| 832 | COMPARE(round_w_d(f8, f6), "4620320c round.w.d f8, f6"); |
| 833 | |
| 834 | COMPARE(round_l_s(f8, f6), "46003208 round.l.s f8, f6"); |
| 835 | COMPARE(round_l_d(f8, f6), "46203208 round.l.d f8, f6"); |
| 836 | |
| 837 | COMPARE(floor_w_s(f8, f6), "4600320f floor.w.s f8, f6"); |
| 838 | COMPARE(floor_w_d(f8, f6), "4620320f floor.w.d f8, f6"); |
| 839 | |
| 840 | COMPARE(floor_l_s(f8, f6), "4600320b floor.l.s f8, f6"); |
| 841 | COMPARE(floor_l_d(f8, f6), "4620320b floor.l.d f8, f6"); |
| 842 | |
| 843 | COMPARE(ceil_w_s(f8, f6), "4600320e ceil.w.s f8, f6"); |
| 844 | COMPARE(ceil_w_d(f8, f6), "4620320e ceil.w.d f8, f6"); |
| 845 | |
| 846 | COMPARE(ceil_l_s(f8, f6), "4600320a ceil.l.s f8, f6"); |
| 847 | COMPARE(ceil_l_d(f8, f6), "4620320a ceil.l.d f8, f6"); |
| 848 | |
| 849 | COMPARE(sub_s(f10, f8, f6), "46064281 sub.s f10, f8, f6"); |
| 850 | COMPARE(sub_d(f10, f8, f6), "46264281 sub.d f10, f8, f6"); |
| 851 | |
| 852 | COMPARE(sqrt_s(f8, f6), "46003204 sqrt.s f8, f6"); |
| 853 | COMPARE(sqrt_d(f8, f6), "46203204 sqrt.d f8, f6"); |
| 854 | |
| 855 | COMPARE(neg_s(f8, f6), "46003207 neg.s f8, f6"); |
| 856 | COMPARE(neg_d(f8, f6), "46203207 neg.d f8, f6"); |
| 857 | |
| 858 | COMPARE(mul_s(f8, f6, f4), "46043202 mul.s f8, f6, f4"); |
| 859 | COMPARE(mul_d(f8, f6, f4), "46243202 mul.d f8, f6, f4"); |
| 860 | |
| 861 | COMPARE(rsqrt_s(f8, f6), "46003216 rsqrt.s f8, f6"); |
| 862 | COMPARE(rsqrt_d(f8, f6), "46203216 rsqrt.d f8, f6"); |
| 863 | |
| 864 | COMPARE(recip_s(f8, f6), "46003215 recip.s f8, f6"); |
| 865 | COMPARE(recip_d(f8, f6), "46203215 recip.d f8, f6"); |
| 866 | |
| 867 | COMPARE(mov_s(f6, f4), "46002186 mov.s f6, f4"); |
| 868 | COMPARE(mov_d(f6, f4), "46202186 mov.d f6, f4"); |
| 869 | if (kArchVariant == kMips64r2) { |
| 870 | COMPARE(trunc_l_d(f8, f6), "46203209 trunc.l.d f8, f6"); |
| 871 | COMPARE(trunc_l_s(f8, f6), "46003209 trunc.l.s f8, f6"); |
| 872 | |
| 873 | COMPARE(movz_s(f6, f4, t0), "460c2192 movz.s f6, f4, t0"); |
| 874 | COMPARE(movz_d(f6, f4, t0), "462c2192 movz.d f6, f4, t0"); |
| 875 | |
| 876 | COMPARE(movt_s(f6, f4, 4), "46112191 movt.s f6, f4, cc(1)"); |
| 877 | COMPARE(movt_d(f6, f4, 4), "46312191 movt.d f6, f4, cc(1)"); |
| 878 | |
| 879 | COMPARE(movf_s(f6, f4, 4), "46102191 movf.s f6, f4, cc(1)"); |
| 880 | COMPARE(movf_d(f6, f4, 4), "46302191 movf.d f6, f4, cc(1)"); |
| 881 | |
| 882 | COMPARE(movn_s(f6, f4, t0), "460c2193 movn.s f6, f4, t0"); |
| 883 | COMPARE(movn_d(f6, f4, t0), "462c2193 movn.d f6, f4, t0"); |
| 884 | } |
| 885 | VERIFY_RUN(); |
| 886 | } |
| 887 | |
| 888 | |
| 889 | TEST(Type2) { |
| 890 | if (kArchVariant == kMips64r6) { |
| 891 | SET_UP(); |
| 892 | |
| 893 | COMPARE(class_s(f3, f4), "460020db class.s f3, f4"); |
| 894 | COMPARE(class_d(f2, f3), "4620189b class.d f2, f3"); |
| 895 | |
| 896 | VERIFY_RUN(); |
| 897 | } |
| 898 | } |
| 899 | |
| 900 | |
| 901 | TEST(Type3) { |
| 902 | SET_UP(); |
| 903 | |
| 904 | if (kArchVariant == kMips64r6) { |
| 905 | COMPARE_PC_REL_COMPACT(bovc(a0, a0, static_cast<int16_t>(0)), |
| 906 | "20840000 bovc a0, a0, 0", 0); |
| 907 | COMPARE_PC_REL_COMPACT(bovc(a1, a0, static_cast<int16_t>(0)), |
| 908 | "20a40000 bovc a1, a0, 0", 0); |
| 909 | COMPARE_PC_REL_COMPACT(bovc(a1, a0, 32767), |
| 910 | "20a47fff bovc a1, a0, 32767", 32767); |
| 911 | COMPARE_PC_REL_COMPACT(bovc(a1, a0, -32768), |
| 912 | "20a48000 bovc a1, a0, -32768", -32768); |
| 913 | |
| 914 | COMPARE_PC_REL_COMPACT(bnvc(a0, a0, static_cast<int16_t>(0)), |
| 915 | "60840000 bnvc a0, a0, 0", 0); |
| 916 | COMPARE_PC_REL_COMPACT(bnvc(a1, a0, static_cast<int16_t>(0)), |
| 917 | "60a40000 bnvc a1, a0, 0", 0); |
| 918 | COMPARE_PC_REL_COMPACT(bnvc(a1, a0, 32767), |
| 919 | "60a47fff bnvc a1, a0, 32767", 32767); |
| 920 | COMPARE_PC_REL_COMPACT(bnvc(a1, a0, -32768), |
| 921 | "60a48000 bnvc a1, a0, -32768", -32768); |
| 922 | |
| 923 | COMPARE_PC_REL_COMPACT(beqzc(a0, 0), "d8800000 beqzc a0, 0", 0); |
| 924 | COMPARE_PC_REL_COMPACT(beqzc(a0, 1048575), // 0x0fffff == 1048575. |
| 925 | "d88fffff beqzc a0, 1048575", 1048575); |
| 926 | COMPARE_PC_REL_COMPACT(beqzc(a0, -1048576), // 0x100000 == -1048576. |
| 927 | "d8900000 beqzc a0, -1048576", -1048576); |
| 928 | |
| 929 | COMPARE_PC_REL_COMPACT(bnezc(a0, 0), "f8800000 bnezc a0, 0", 0); |
| 930 | COMPARE_PC_REL_COMPACT(bnezc(a0, 1048575), // int21 maximal value. |
| 931 | "f88fffff bnezc a0, 1048575", 1048575); |
| 932 | COMPARE_PC_REL_COMPACT(bnezc(a0, -1048576), // int21 minimal value. |
| 933 | "f8900000 bnezc a0, -1048576", -1048576); |
| 934 | |
| 935 | COMPARE_PC_REL_COMPACT(bc(-33554432), "ca000000 bc -33554432", |
| 936 | -33554432); |
| 937 | COMPARE_PC_REL_COMPACT(bc(-1), "cbffffff bc -1", -1); |
| 938 | COMPARE_PC_REL_COMPACT(bc(0), "c8000000 bc 0", 0); |
| 939 | COMPARE_PC_REL_COMPACT(bc(1), "c8000001 bc 1", 1); |
| 940 | COMPARE_PC_REL_COMPACT(bc(33554431), "c9ffffff bc 33554431", |
| 941 | 33554431); |
| 942 | |
| 943 | COMPARE_PC_REL_COMPACT(balc(-33554432), "ea000000 balc -33554432", |
| 944 | -33554432); |
| 945 | COMPARE_PC_REL_COMPACT(balc(-1), "ebffffff balc -1", -1); |
| 946 | COMPARE_PC_REL_COMPACT(balc(0), "e8000000 balc 0", 0); |
| 947 | COMPARE_PC_REL_COMPACT(balc(1), "e8000001 balc 1", 1); |
| 948 | COMPARE_PC_REL_COMPACT(balc(33554431), "e9ffffff balc 33554431", |
| 949 | 33554431); |
| 950 | |
| 951 | COMPARE_PC_REL_COMPACT(bgeuc(a0, a1, -32768), |
| 952 | "18858000 bgeuc a0, a1, -32768", -32768); |
| 953 | COMPARE_PC_REL_COMPACT(bgeuc(a0, a1, -1), |
| 954 | "1885ffff bgeuc a0, a1, -1", -1); |
| 955 | COMPARE_PC_REL_COMPACT(bgeuc(a0, a1, 1), "18850001 bgeuc a0, a1, 1", |
| 956 | 1); |
| 957 | COMPARE_PC_REL_COMPACT(bgeuc(a0, a1, 32767), |
| 958 | "18857fff bgeuc a0, a1, 32767", 32767); |
| 959 | |
| 960 | COMPARE_PC_REL_COMPACT(bgezalc(a0, -32768), |
| 961 | "18848000 bgezalc a0, -32768", -32768); |
| 962 | COMPARE_PC_REL_COMPACT(bgezalc(a0, -1), "1884ffff bgezalc a0, -1", |
| 963 | -1); |
| 964 | COMPARE_PC_REL_COMPACT(bgezalc(a0, 1), "18840001 bgezalc a0, 1", 1); |
| 965 | COMPARE_PC_REL_COMPACT(bgezalc(a0, 32767), |
| 966 | "18847fff bgezalc a0, 32767", 32767); |
| 967 | |
| 968 | COMPARE_PC_REL_COMPACT(blezalc(a0, -32768), |
| 969 | "18048000 blezalc a0, -32768", -32768); |
| 970 | COMPARE_PC_REL_COMPACT(blezalc(a0, -1), "1804ffff blezalc a0, -1", |
| 971 | -1); |
| 972 | COMPARE_PC_REL_COMPACT(blezalc(a0, 1), "18040001 blezalc a0, 1", 1); |
| 973 | COMPARE_PC_REL_COMPACT(blezalc(a0, 32767), |
| 974 | "18047fff blezalc a0, 32767", 32767); |
| 975 | |
| 976 | COMPARE_PC_REL_COMPACT(bltuc(a0, a1, -32768), |
| 977 | "1c858000 bltuc a0, a1, -32768", -32768); |
| 978 | COMPARE_PC_REL_COMPACT(bltuc(a0, a1, -1), |
| 979 | "1c85ffff bltuc a0, a1, -1", -1); |
| 980 | COMPARE_PC_REL_COMPACT(bltuc(a0, a1, 1), "1c850001 bltuc a0, a1, 1", |
| 981 | 1); |
| 982 | COMPARE_PC_REL_COMPACT(bltuc(a0, a1, 32767), |
| 983 | "1c857fff bltuc a0, a1, 32767", 32767); |
| 984 | |
| 985 | COMPARE_PC_REL_COMPACT(bltzalc(a0, -32768), |
| 986 | "1c848000 bltzalc a0, -32768", -32768); |
| 987 | COMPARE_PC_REL_COMPACT(bltzalc(a0, -1), "1c84ffff bltzalc a0, -1", |
| 988 | -1); |
| 989 | COMPARE_PC_REL_COMPACT(bltzalc(a0, 1), "1c840001 bltzalc a0, 1", 1); |
| 990 | COMPARE_PC_REL_COMPACT(bltzalc(a0, 32767), |
| 991 | "1c847fff bltzalc a0, 32767", 32767); |
| 992 | |
| 993 | COMPARE_PC_REL_COMPACT(bgtzalc(a0, -32768), |
| 994 | "1c048000 bgtzalc a0, -32768", -32768); |
| 995 | COMPARE_PC_REL_COMPACT(bgtzalc(a0, -1), "1c04ffff bgtzalc a0, -1", |
| 996 | -1); |
| 997 | COMPARE_PC_REL_COMPACT(bgtzalc(a0, 1), "1c040001 bgtzalc a0, 1", 1); |
| 998 | COMPARE_PC_REL_COMPACT(bgtzalc(a0, 32767), |
| 999 | "1c047fff bgtzalc a0, 32767", 32767); |
| 1000 | |
| 1001 | COMPARE_PC_REL_COMPACT(bgezc(a0, -32768), |
| 1002 | "58848000 bgezc a0, -32768", -32768); |
| 1003 | COMPARE_PC_REL_COMPACT(bgezc(a0, -1), "5884ffff bgezc a0, -1", -1); |
| 1004 | COMPARE_PC_REL_COMPACT(bgezc(a0, 1), "58840001 bgezc a0, 1", 1); |
| 1005 | COMPARE_PC_REL_COMPACT(bgezc(a0, 32767), |
| 1006 | "58847fff bgezc a0, 32767", 32767); |
| 1007 | |
| 1008 | COMPARE_PC_REL_COMPACT(bgec(a0, a1, -32768), |
| 1009 | "58858000 bgec a0, a1, -32768", -32768); |
| 1010 | COMPARE_PC_REL_COMPACT(bgec(a0, a1, -1), |
| 1011 | "5885ffff bgec a0, a1, -1", -1); |
| 1012 | COMPARE_PC_REL_COMPACT(bgec(a0, a1, 1), "58850001 bgec a0, a1, 1", |
| 1013 | 1); |
| 1014 | COMPARE_PC_REL_COMPACT(bgec(a0, a1, 32767), |
| 1015 | "58857fff bgec a0, a1, 32767", 32767); |
| 1016 | |
| 1017 | COMPARE_PC_REL_COMPACT(blezc(a0, -32768), |
| 1018 | "58048000 blezc a0, -32768", -32768); |
| 1019 | COMPARE_PC_REL_COMPACT(blezc(a0, -1), "5804ffff blezc a0, -1", -1); |
| 1020 | COMPARE_PC_REL_COMPACT(blezc(a0, 1), "58040001 blezc a0, 1", 1); |
| 1021 | COMPARE_PC_REL_COMPACT(blezc(a0, 32767), |
| 1022 | "58047fff blezc a0, 32767", 32767); |
| 1023 | |
| 1024 | COMPARE_PC_REL_COMPACT(bltzc(a0, -32768), |
| 1025 | "5c848000 bltzc a0, -32768", -32768); |
| 1026 | COMPARE_PC_REL_COMPACT(bltzc(a0, -1), "5c84ffff bltzc a0, -1", -1); |
| 1027 | COMPARE_PC_REL_COMPACT(bltzc(a0, 1), "5c840001 bltzc a0, 1", 1); |
| 1028 | COMPARE_PC_REL_COMPACT(bltzc(a0, 32767), |
| 1029 | "5c847fff bltzc a0, 32767", 32767); |
| 1030 | |
| 1031 | COMPARE_PC_REL_COMPACT(bltc(a0, a1, -32768), |
| 1032 | "5c858000 bltc a0, a1, -32768", -32768); |
| 1033 | COMPARE_PC_REL_COMPACT(bltc(a0, a1, -1), |
| 1034 | "5c85ffff bltc a0, a1, -1", -1); |
| 1035 | COMPARE_PC_REL_COMPACT(bltc(a0, a1, 1), "5c850001 bltc a0, a1, 1", |
| 1036 | 1); |
| 1037 | COMPARE_PC_REL_COMPACT(bltc(a0, a1, 32767), |
| 1038 | "5c857fff bltc a0, a1, 32767", 32767); |
| 1039 | |
| 1040 | COMPARE_PC_REL_COMPACT(bgtzc(a0, -32768), |
| 1041 | "5c048000 bgtzc a0, -32768", -32768); |
| 1042 | COMPARE_PC_REL_COMPACT(bgtzc(a0, -1), "5c04ffff bgtzc a0, -1", -1); |
| 1043 | COMPARE_PC_REL_COMPACT(bgtzc(a0, 1), "5c040001 bgtzc a0, 1", 1); |
| 1044 | COMPARE_PC_REL_COMPACT(bgtzc(a0, 32767), |
| 1045 | "5c047fff bgtzc a0, 32767", 32767); |
| 1046 | |
| 1047 | COMPARE_PC_REL_COMPACT(bc1eqz(-32768, f1), |
| 1048 | "45218000 bc1eqz f1, -32768", -32768); |
| 1049 | COMPARE_PC_REL_COMPACT(bc1eqz(-1, f1), "4521ffff bc1eqz f1, -1", |
| 1050 | -1); |
| 1051 | COMPARE_PC_REL_COMPACT(bc1eqz(1, f1), "45210001 bc1eqz f1, 1", 1); |
| 1052 | COMPARE_PC_REL_COMPACT(bc1eqz(32767, f1), |
| 1053 | "45217fff bc1eqz f1, 32767", 32767); |
| 1054 | |
| 1055 | COMPARE_PC_REL_COMPACT(bc1nez(-32768, f1), |
| 1056 | "45a18000 bc1nez f1, -32768", -32768); |
| 1057 | COMPARE_PC_REL_COMPACT(bc1nez(-1, f1), "45a1ffff bc1nez f1, -1", |
| 1058 | -1); |
| 1059 | COMPARE_PC_REL_COMPACT(bc1nez(1, f1), "45a10001 bc1nez f1, 1", 1); |
| 1060 | COMPARE_PC_REL_COMPACT(bc1nez(32767, f1), |
| 1061 | "45a17fff bc1nez f1, 32767", 32767); |
| 1062 | |
| 1063 | COMPARE_PC_REL_COMPACT(bovc(a1, a0, -1), "20a4ffff bovc a1, a0, -1", |
| 1064 | -1); |
| 1065 | COMPARE_PC_REL_COMPACT(bovc(a0, a0, 1), "20840001 bovc a0, a0, 1", |
| 1066 | 1); |
| 1067 | |
| 1068 | COMPARE_PC_REL_COMPACT(beqc(a0, a1, -32768), |
| 1069 | "20858000 beqc a0, a1, -32768", -32768); |
| 1070 | COMPARE_PC_REL_COMPACT(beqc(a0, a1, -1), |
| 1071 | "2085ffff beqc a0, a1, -1", -1); |
| 1072 | COMPARE_PC_REL_COMPACT(beqc(a0, a1, 1), "20850001 beqc a0, a1, 1", |
| 1073 | 1); |
| 1074 | COMPARE_PC_REL_COMPACT(beqc(a0, a1, 32767), |
| 1075 | "20857fff beqc a0, a1, 32767", 32767); |
| 1076 | |
| 1077 | COMPARE_PC_REL_COMPACT(bnec(a0, a1, -32768), |
| 1078 | "60858000 bnec a0, a1, -32768", -32768); |
| 1079 | COMPARE_PC_REL_COMPACT(bnec(a0, a1, -1), "6085ffff bnec a0, a1, -1", |
| 1080 | -1); |
| 1081 | COMPARE_PC_REL_COMPACT(bnec(a0, a1, 1), "60850001 bnec a0, a1, 1", |
| 1082 | 1); |
| 1083 | COMPARE_PC_REL_COMPACT(bnec(a0, a1, 32767), |
| 1084 | "60857fff bnec a0, a1, 32767", 32767); |
| 1085 | } |
| 1086 | |
| 1087 | COMPARE_PC_REL_COMPACT(bne(a0, a1, -32768), |
| 1088 | "14858000 bne a0, a1, -32768", -32768); |
| 1089 | COMPARE_PC_REL_COMPACT(bne(a0, a1, -1), "1485ffff bne a0, a1, -1", |
| 1090 | -1); |
| 1091 | COMPARE_PC_REL_COMPACT(bne(a0, a1, 1), "14850001 bne a0, a1, 1", 1); |
| 1092 | COMPARE_PC_REL_COMPACT(bne(a0, a1, 32767), |
| 1093 | "14857fff bne a0, a1, 32767", 32767); |
| 1094 | |
| 1095 | COMPARE_PC_REL_COMPACT(beq(a0, a1, -32768), |
| 1096 | "10858000 beq a0, a1, -32768", -32768); |
| 1097 | COMPARE_PC_REL_COMPACT(beq(a0, a1, -1), "1085ffff beq a0, a1, -1", |
| 1098 | -1); |
| 1099 | COMPARE_PC_REL_COMPACT(beq(a0, a1, 1), "10850001 beq a0, a1, 1", 1); |
| 1100 | COMPARE_PC_REL_COMPACT(beq(a0, a1, 32767), |
| 1101 | "10857fff beq a0, a1, 32767", 32767); |
| 1102 | |
| 1103 | COMPARE_PC_REL_COMPACT(bltz(a0, -32768), "04808000 bltz a0, -32768", |
| 1104 | -32768); |
| 1105 | COMPARE_PC_REL_COMPACT(bltz(a0, -1), "0480ffff bltz a0, -1", -1); |
| 1106 | COMPARE_PC_REL_COMPACT(bltz(a0, 1), "04800001 bltz a0, 1", 1); |
| 1107 | COMPARE_PC_REL_COMPACT(bltz(a0, 32767), "04807fff bltz a0, 32767", |
| 1108 | 32767); |
| 1109 | |
| 1110 | COMPARE_PC_REL_COMPACT(bgez(a0, -32768), "04818000 bgez a0, -32768", |
| 1111 | -32768); |
| 1112 | COMPARE_PC_REL_COMPACT(bgez(a0, -1), "0481ffff bgez a0, -1", -1); |
| 1113 | COMPARE_PC_REL_COMPACT(bgez(a0, 1), "04810001 bgez a0, 1", 1); |
| 1114 | COMPARE_PC_REL_COMPACT(bgez(a0, 32767), "04817fff bgez a0, 32767", |
| 1115 | 32767); |
| 1116 | |
| 1117 | COMPARE_PC_REL_COMPACT(blez(a0, -32768), "18808000 blez a0, -32768", |
| 1118 | -32768); |
| 1119 | COMPARE_PC_REL_COMPACT(blez(a0, -1), "1880ffff blez a0, -1", -1); |
| 1120 | COMPARE_PC_REL_COMPACT(blez(a0, 1), "18800001 blez a0, 1", 1); |
| 1121 | COMPARE_PC_REL_COMPACT(blez(a0, 32767), "18807fff blez a0, 32767", |
| 1122 | 32767); |
| 1123 | |
| 1124 | COMPARE_PC_REL_COMPACT(bgtz(a0, -32768), "1c808000 bgtz a0, -32768", |
| 1125 | -32768); |
| 1126 | COMPARE_PC_REL_COMPACT(bgtz(a0, -1), "1c80ffff bgtz a0, -1", -1); |
| 1127 | COMPARE_PC_REL_COMPACT(bgtz(a0, 1), "1c800001 bgtz a0, 1", 1); |
| 1128 | COMPARE_PC_REL_COMPACT(bgtz(a0, 32767), "1c807fff bgtz a0, 32767", |
| 1129 | 32767); |
| 1130 | |
| 1131 | int64_t pc_region; |
| 1132 | GET_PC_REGION(pc_region); |
| 1133 | |
| 1134 | int64_t target = pc_region | 0x4; |
| 1135 | COMPARE_PC_JUMP(j(target), "08000001 j ", target); |
| 1136 | target = pc_region | 0xffffffc; |
| 1137 | COMPARE_PC_JUMP(j(target), "0bffffff j ", target); |
| 1138 | |
| 1139 | target = pc_region | 0x4; |
| 1140 | COMPARE_PC_JUMP(jal(target), "0c000001 jal ", target); |
| 1141 | target = pc_region | 0xffffffc; |
| 1142 | COMPARE_PC_JUMP(jal(target), "0fffffff jal ", target); |
| 1143 | |
| 1144 | VERIFY_RUN(); |
| 1145 | } |
| 1146 | |
| 1147 | |
| 1148 | TEST(C_FMT_DISASM) { |
| 1149 | if (kArchVariant == kMips64r2) { |
| 1150 | SET_UP(); |
| 1151 | |
| 1152 | COMPARE(c_s(F, f8, f10, 0), "460a4030 c.f.s f8, f10, cc(0)"); |
| 1153 | COMPARE(c_d(F, f8, f10, 0), "462a4030 c.f.d f8, f10, cc(0)"); |
| 1154 | |
| 1155 | COMPARE(c_s(UN, f8, f10, 2), "460a4231 c.un.s f8, f10, cc(2)"); |
| 1156 | COMPARE(c_d(UN, f8, f10, 2), "462a4231 c.un.d f8, f10, cc(2)"); |
| 1157 | |
| 1158 | COMPARE(c_s(EQ, f8, f10, 4), "460a4432 c.eq.s f8, f10, cc(4)"); |
| 1159 | COMPARE(c_d(EQ, f8, f10, 4), "462a4432 c.eq.d f8, f10, cc(4)"); |
| 1160 | |
| 1161 | COMPARE(c_s(UEQ, f8, f10, 6), "460a4633 c.ueq.s f8, f10, cc(6)"); |
| 1162 | COMPARE(c_d(UEQ, f8, f10, 6), "462a4633 c.ueq.d f8, f10, cc(6)"); |
| 1163 | |
| 1164 | COMPARE(c_s(OLT, f8, f10, 0), "460a4034 c.olt.s f8, f10, cc(0)"); |
| 1165 | COMPARE(c_d(OLT, f8, f10, 0), "462a4034 c.olt.d f8, f10, cc(0)"); |
| 1166 | |
| 1167 | COMPARE(c_s(ULT, f8, f10, 2), "460a4235 c.ult.s f8, f10, cc(2)"); |
| 1168 | COMPARE(c_d(ULT, f8, f10, 2), "462a4235 c.ult.d f8, f10, cc(2)"); |
| 1169 | |
| 1170 | COMPARE(c_s(OLE, f8, f10, 4), "460a4436 c.ole.s f8, f10, cc(4)"); |
| 1171 | COMPARE(c_d(OLE, f8, f10, 4), "462a4436 c.ole.d f8, f10, cc(4)"); |
| 1172 | |
| 1173 | COMPARE(c_s(ULE, f8, f10, 6), "460a4637 c.ule.s f8, f10, cc(6)"); |
| 1174 | COMPARE(c_d(ULE, f8, f10, 6), "462a4637 c.ule.d f8, f10, cc(6)"); |
| 1175 | |
| 1176 | VERIFY_RUN(); |
| 1177 | } |
| 1178 | } |
| 1179 | |
| 1180 | |
| 1181 | TEST(COND_FMT_DISASM) { |
| 1182 | if (kArchVariant == kMips64r6) { |
| 1183 | SET_UP(); |
| 1184 | |
| 1185 | COMPARE(cmp_s(F, f6, f8, f10), "468a4180 cmp.af.s f6, f8, f10"); |
| 1186 | COMPARE(cmp_d(F, f6, f8, f10), "46aa4180 cmp.af.d f6, f8, f10"); |
| 1187 | |
| 1188 | COMPARE(cmp_s(UN, f6, f8, f10), "468a4181 cmp.un.s f6, f8, f10"); |
| 1189 | COMPARE(cmp_d(UN, f6, f8, f10), "46aa4181 cmp.un.d f6, f8, f10"); |
| 1190 | |
| 1191 | COMPARE(cmp_s(EQ, f6, f8, f10), "468a4182 cmp.eq.s f6, f8, f10"); |
| 1192 | COMPARE(cmp_d(EQ, f6, f8, f10), "46aa4182 cmp.eq.d f6, f8, f10"); |
| 1193 | |
| 1194 | COMPARE(cmp_s(UEQ, f6, f8, f10), "468a4183 cmp.ueq.s f6, f8, f10"); |
| 1195 | COMPARE(cmp_d(UEQ, f6, f8, f10), "46aa4183 cmp.ueq.d f6, f8, f10"); |
| 1196 | |
| 1197 | COMPARE(cmp_s(LT, f6, f8, f10), "468a4184 cmp.lt.s f6, f8, f10"); |
| 1198 | COMPARE(cmp_d(LT, f6, f8, f10), "46aa4184 cmp.lt.d f6, f8, f10"); |
| 1199 | |
| 1200 | COMPARE(cmp_s(ULT, f6, f8, f10), "468a4185 cmp.ult.s f6, f8, f10"); |
| 1201 | COMPARE(cmp_d(ULT, f6, f8, f10), "46aa4185 cmp.ult.d f6, f8, f10"); |
| 1202 | |
| 1203 | COMPARE(cmp_s(LE, f6, f8, f10), "468a4186 cmp.le.s f6, f8, f10"); |
| 1204 | COMPARE(cmp_d(LE, f6, f8, f10), "46aa4186 cmp.le.d f6, f8, f10"); |
| 1205 | |
| 1206 | COMPARE(cmp_s(ULE, f6, f8, f10), "468a4187 cmp.ule.s f6, f8, f10"); |
| 1207 | COMPARE(cmp_d(ULE, f6, f8, f10), "46aa4187 cmp.ule.d f6, f8, f10"); |
| 1208 | |
| 1209 | COMPARE(cmp_s(ORD, f6, f8, f10), "468a4191 cmp.or.s f6, f8, f10"); |
| 1210 | COMPARE(cmp_d(ORD, f6, f8, f10), "46aa4191 cmp.or.d f6, f8, f10"); |
| 1211 | |
| 1212 | COMPARE(cmp_s(UNE, f6, f8, f10), "468a4192 cmp.une.s f6, f8, f10"); |
| 1213 | COMPARE(cmp_d(UNE, f6, f8, f10), "46aa4192 cmp.une.d f6, f8, f10"); |
| 1214 | |
| 1215 | COMPARE(cmp_s(NE, f6, f8, f10), "468a4193 cmp.ne.s f6, f8, f10"); |
| 1216 | COMPARE(cmp_d(NE, f6, f8, f10), "46aa4193 cmp.ne.d f6, f8, f10"); |
| 1217 | |
| 1218 | VERIFY_RUN(); |
| 1219 | } |
| 1220 | } |
| 1221 | |
| 1222 | |
| 1223 | TEST(CVT_DISSASM) { |
| 1224 | SET_UP(); |
| 1225 | COMPARE(cvt_d_s(f22, f24), "4600c5a1 cvt.d.s f22, f24"); |
| 1226 | COMPARE(cvt_d_w(f22, f24), "4680c5a1 cvt.d.w f22, f24"); |
| 1227 | if (kArchVariant == kMips64r6 || kArchVariant == kMips64r2) { |
| 1228 | COMPARE(cvt_d_l(f22, f24), "46a0c5a1 cvt.d.l f22, f24"); |
| 1229 | } |
| 1230 | |
| 1231 | if (kArchVariant == kMips64r6 || kArchVariant == kMips64r2) { |
| 1232 | COMPARE(cvt_l_s(f22, f24), "4600c5a5 cvt.l.s f22, f24"); |
| 1233 | COMPARE(cvt_l_d(f22, f24), "4620c5a5 cvt.l.d f22, f24"); |
| 1234 | } |
| 1235 | |
| 1236 | COMPARE(cvt_s_d(f22, f24), "4620c5a0 cvt.s.d f22, f24"); |
| 1237 | COMPARE(cvt_s_w(f22, f24), "4680c5a0 cvt.s.w f22, f24"); |
| 1238 | if (kArchVariant == kMips64r6 || kArchVariant == kMips64r2) { |
| 1239 | COMPARE(cvt_s_l(f22, f24), "46a0c5a0 cvt.s.l f22, f24"); |
| 1240 | } |
| 1241 | |
| 1242 | COMPARE(cvt_s_d(f22, f24), "4620c5a0 cvt.s.d f22, f24"); |
| 1243 | COMPARE(cvt_s_w(f22, f24), "4680c5a0 cvt.s.w f22, f24"); |
| 1244 | |
| 1245 | VERIFY_RUN(); |
| 1246 | } |
| 1247 | |
| 1248 | |
| 1249 | TEST(ctc1_cfc1_disasm) { |
| 1250 | SET_UP(); |
| 1251 | COMPARE(abs_d(f10, f31), "4620fa85 abs.d f10, f31"); |
| 1252 | COMPARE(ceil_w_s(f8, f31), "4600fa0e ceil.w.s f8, f31"); |
| 1253 | COMPARE(ctc1(a0, FCSR), "44c4f800 ctc1 a0, FCSR"); |
| 1254 | COMPARE(cfc1(a0, FCSR), "4444f800 cfc1 a0, FCSR"); |
Ben Murdoch | b8a8cc1 | 2014-11-26 15:28:44 +0000 | [diff] [blame] | 1255 | VERIFY_RUN(); |
| 1256 | } |