1 110010,26.OFFSET:POOL32X:32::BC 2 "bc <OFFSET>" 3 *mips32r6: 4 *mips64r6: 5 { 6 NIA = CIA + (EXTEND26 (OFFSET) << 2) + 4; 7 } 8 9 111010,26.OFFSET:POOL32X:32::BALC 10 "balc <OFFSET>" 11 *mips32r6: 12 *mips64r6: 13 { 14 RA = CIA + 4; 15 NIA = CIA + (EXTEND26 (OFFSET) << 2) + 4; 16 } 17 18 110110,5.RS!0,21.OFFSET:POOL32X:32::BEQZC 19 "beqzc r<RS>, <OFFSET>" 20 *mips32r6: 21 *mips64r6: 22 { 23 if (GPR[RS] == 0) 24 NIA = CIA + (EXTEND21 (OFFSET) << 2) + 4; 25 else 26 FORBIDDEN_SLOT (); 27 } 28 29 110110,00000,5.RT,16.OFFSET:POOL32X:32::JIC 30 "jic r<RT>, <OFFSET>" 31 *mips32r6: 32 *mips64r6: 33 { 34 NIA = GPR[RT] + (EXTEND16(OFFSET) << 2); 35 } 36 37 111110,5.RS!0,21.OFFSET:POOL32X:32::BNEZC 38 "bnezc r<RS>, <OFFSET>" 39 *mips32r6: 40 *mips64r6: 41 { 42 if (GPR[RS] != 0) 43 NIA = CIA + (EXTEND21 (OFFSET) << 2) + 4; 44 else 45 FORBIDDEN_SLOT (); 46 } 47 48 111110,00000,5.RT,16.OFFSET:POOL32X:32::JIALC 49 "jialc r<RT>, <OFFSET>" 50 *mips32r6: 51 *mips64r6: 52 { 53 RA = CIA + 4; 54 NIA = GPR[RT] + EXTEND16(OFFSET); 55 } 56 57 010110,5.RS,5.RT,16.OFFSET:POOL32X:32::B1xxC 58 "blezc r<RT>, <OFFSET>": RS==0&&RT!=0 59 "bgezc r<RT>, <OFFSET>":RS!=0&&RS==RT 60 "bgec r<RS>, r<RT>, <OFFSET>" 61 *mips32r6: 62 *mips64r6: 63 { 64 if (RS == 0 && RT != 0) 65 { 66 //BLEZC 67 if ((signed_word)GPR[RT] <= 0) 68 NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; 69 else 70 FORBIDDEN_SLOT (); 71 } 72 else if (RS != 0 && RS == RT) 73 { 74 //BGEZC 75 if ((signed_word)GPR[RT] >= 0) 76 NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; 77 else 78 FORBIDDEN_SLOT (); 79 } 80 else 81 { 82 //BGEC 83 if ((signed_word) GPR[RS] >= (signed_word) GPR[RT]) 84 NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; 85 else 86 FORBIDDEN_SLOT (); 87 } 88 } 89 90 010111,5.RS,5.RT,16.OFFSET:POOL32X:32::B2xxC 91 "bgtzc r<RT>, <OFFSET>":RS==0&&RT!=0 92 "bltzc r<RT>, <OFFSET>":RS!=0&&RS==RT 93 "bltc r<RS>, r<RT>, <OFFSET>" 94 *mips32r6: 95 *mips64r6: 96 { 97 if (RS == 0 && RT != 0) 98 { 99 //BGTZC 100 if ((signed_word)GPR[RT] > 0) 101 NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; 102 else 103 FORBIDDEN_SLOT (); 104 } 105 else if (RS != 0 && RS == RT) 106 { 107 //BLTZC 108 if ((signed_word)GPR[RT] < 0) 109 NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; 110 else 111 FORBIDDEN_SLOT (); 112 } 113 else 114 { 115 //BLTC 116 if ((signed_word) GPR[RS] < (signed_word) GPR[RT]) 117 NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; 118 else 119 FORBIDDEN_SLOT (); 120 } 121 } 122 123 000110,5.RS,5.RT!0,16.OFFSET:POOL32X:32::B3xxC 124 "blezalc r<RT>, <OFFSET>":RS==0 125 "bgezalc r<RT>, <OFFSET>":RS!=0&&RS==RT 126 "bgeuc r<RS>, r<RT>, <OFFSET>" 127 *mips32r6: 128 *mips64r6: 129 { 130 if (RS == 0 && RT != 0) 131 { 132 //BLEZALC 133 RA = CIA + 4; 134 if ((signed_word)GPR[RT] <= 0) 135 NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; 136 else 137 FORBIDDEN_SLOT (); 138 } 139 else if (RS != 0 && RS == RT) 140 { 141 //BGEZALC 142 RA = CIA + 4; 143 if ((signed_word)GPR[RT] >= 0) 144 NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; 145 else 146 FORBIDDEN_SLOT (); 147 } 148 else 149 { 150 //BGEUC 151 if (GPR[RS] >= GPR[RT]) 152 NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; 153 else 154 FORBIDDEN_SLOT (); 155 } 156 } 157 158 000111,5.RS,5.RT!0,16.OFFSET:POOL32X:32::B4xxC 159 "bgtzalc r<RT>, <OFFSET>":RS==0 160 "bltzalc r<RT>, <OFFSET>":RS!=0&&RS==RT 161 "bltuc r<RS>, r<RT>, <OFFSET>" 162 *mips32r6: 163 *mips64r6: 164 { 165 if (RS == 0 && RT != 0) 166 { 167 //BGTZALC 168 RA = CIA + 4; 169 if ((signed_word)GPR[RT] > 0) 170 NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; 171 else 172 FORBIDDEN_SLOT (); 173 } 174 else if (RS != 0 && RS == RT) 175 { 176 //BLTZALC 177 RA = CIA + 4; 178 if ((signed_word)GPR[RT] < 0) 179 NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; 180 else 181 FORBIDDEN_SLOT (); 182 } 183 else 184 { 185 //BLTUC 186 if (GPR[RS] < GPR[RT]) 187 NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; 188 else 189 FORBIDDEN_SLOT (); 190 } 191 } 192 193 001000,5.RS,5.RT,16.OFFSET:POOL32X:32::BxxxC 194 "bovc r<RS>, r<RT>, <OFFSET>":RS>=RT 195 "beqzalc r<RT>, <OFFSET>":RS==0&&RT>RS 196 "beqc r<RS>, r<RT>, <OFFSET>" 197 *mips32r6: 198 *mips64r6: 199 { 200 if (RS >= RT) 201 { 202 //BOVC 203 ALU32_BEGIN (GPR[RS] & 0x0ffffffff); 204 ALU32_ADD (GPR[RT] & 0x0ffffffff); 205 206 if (ALU32_HAD_OVERFLOW) 207 NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; 208 else 209 FORBIDDEN_SLOT (); 210 } 211 else if (RS == 0) 212 { 213 RA = CIA + 4; 214 //BEQZALC 215 if (GPR[RT] == 0) 216 NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; 217 else 218 FORBIDDEN_SLOT (); 219 } 220 else 221 { 222 //BEQC 223 if (GPR[RS] == GPR[RT]) 224 NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; 225 else 226 FORBIDDEN_SLOT (); 227 } 228 } 229 230 011000,5.RS,5.RT,16.OFFSET:POOL32X:32::BNxxxC 231 "bnvc r<RS>, r<RT>, <OFFSET>":RS>=RT 232 "bnezalc r<RT>, <OFFSET>":RS==0&&RT>RS 233 "bnec r<RS>, r<RT>, <OFFSET>" 234 *mips32r6: 235 *mips64r6: 236 { 237 if (RS >= RT) 238 { 239 //BNVC 240 ALU32_BEGIN (GPR[RS] & 0x0ffffffff); 241 ALU32_ADD (GPR[RT] & 0x0ffffffff); 242 243 if (!ALU32_HAD_OVERFLOW) 244 NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; 245 else 246 FORBIDDEN_SLOT (); 247 } 248 else if (RS == 0 && RT > RS) 249 { 250 //BNEZALC 251 RA = CIA + 4; 252 if (GPR[RT] != 0) 253 NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; 254 else 255 FORBIDDEN_SLOT (); 256 } 257 else 258 { 259 //BNEC 260 if (GPR[RT] != GPR[RS]) 261 NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; 262 else 263 FORBIDDEN_SLOT (); 264 } 265 } 266 267 :%s::::R6COND:int r6cond 268 { 269 switch (r6cond) 270 { 271 case FP_R6CMP_SAF: 272 return "SAF"; 273 case FP_R6CMP_SUN: 274 return "SUN"; 275 case FP_R6CMP_SOR: 276 return "SOR"; 277 case FP_R6CMP_SEQ: 278 return "SEQ"; 279 case FP_R6CMP_SUNE: 280 return "SUNE"; 281 case FP_R6CMP_SUEQ: 282 return "SUEQ"; 283 case FP_R6CMP_SNE: 284 return "SNE"; 285 case FP_R6CMP_SLT: 286 return "SLT"; 287 case FP_R6CMP_SULT: 288 return "SULT"; 289 case FP_R6CMP_SLE: 290 return "SLE"; 291 case FP_R6CMP_SULE: 292 return "SULE"; 293 case FP_R6CMP_AF: 294 return "AF"; 295 case FP_R6CMP_UN: 296 return "UN"; 297 case FP_R6CMP_OR: 298 return "OR"; 299 case FP_R6CMP_EQ: 300 return "EQ"; 301 case FP_R6CMP_UNE: 302 return "UNE"; 303 case FP_R6CMP_UEQ: 304 return "UEQ"; 305 case FP_R6CMP_NE: 306 return "NE"; 307 case FP_R6CMP_LT: 308 return "LT"; 309 case FP_R6CMP_ULT: 310 return "ULT"; 311 case FP_R6CMP_LE: 312 return "LE"; 313 case FP_R6CMP_ULE: 314 return "ULE"; 315 default: 316 abort (); 317 } 318 } 319 320 010001,1010,1.FMT,5.FT,5.FS,5.FD,0,5.R6COND:POOL32X:32,f::CMP.cond.fmt 321 "cmp.%s<R6COND>.%s<FMT> f<FD>, f<FS>, f<FT>" 322 *mips32r6: 323 *mips64r6: 324 { 325 uint64_t result; 326 check_fpu (SD_); 327 TRACE_ALU_INPUT2 (ValueFPR (FS, FMT), ValueFPR (FT, FMT)); 328 329 result = R6Compare (ValueFPR (FS, FMT), ValueFPR (FT, FMT), FMT, R6COND); 330 StoreFPR (FD, FMT, result); 331 TRACE_ALU_RESULT (result); 332 } 333 334 010001,01001,5.FT,16.OFFSET:POOL32X:32,f::BC1EQZ 335 "bc1eqz f<FT>, <OFFSET>" 336 *mips32r6: 337 *mips64r6: 338 { 339 address_word offset = EXTEND16 (OFFSET) << 2; 340 check_fpu (SD_); 341 TRACE_ALU_INPUT1 (FGR[FT]); 342 if ((FGR[FT] & 0x01) == 0) 343 DELAY_SLOT (NIA + offset); 344 } 345 346 010001,01101,5.FT,16.OFFSET:POOL32X:32,f::BC1NEZ 347 "bc1nez f<FT>, <OFFSET>" 348 *mips32r6: 349 *mips64r6: 350 { 351 address_word offset = EXTEND16 (OFFSET) << 2; 352 check_fpu (SD_); 353 TRACE_ALU_INPUT1 (FGR[FT]); 354 if ((FGR[FT] & 0x01) != 0) 355 DELAY_SLOT (NIA + offset); 356 } 357 010001,1000,1.FMT,5.FT,5.FS,5.FD,011000:POOLX:32,f::MADDF.fmt 358 "maddf.%s<FMT> f<FD>, f<FS>, f<FT>" 359 *mips32r6: 360 *mips64r6: 361 { 362 int fmt = FMT; 363 check_fpu (SD_); 364 check_u64 (SD_, instruction_0); 365 check_fmt_p (SD_, fmt, instruction_0); 366 TRACE_ALU_INPUT3 (FGR[FD], FGR[FS], FGR[FT]); 367 StoreFPR (FD, fmt, FusedMultiplyAdd (ValueFPR (FS, fmt), 368 ValueFPR (FT, fmt), 369 ValueFPR (FD, fmt), fmt)); 370 TRACE_ALU_RESULT (FGR[FD]); 371 } 372 373 010001,1000,1.FMT,5.FT,5.FS,5.FD,011001:POOLX:32,f::MSUBF.fmt 374 "msubf.%s<FMT> f<FD>, f<FS>, f<FT>" 375 *mips32r6: 376 *mips64r6: 377 { 378 int fmt = FMT; 379 check_fpu (SD_); 380 check_u64 (SD_, instruction_0); 381 check_fmt_p (SD_, fmt, instruction_0); 382 TRACE_ALU_INPUT3 (FGR[FD], FGR[FS], FGR[FT]); 383 StoreFPR (FD, fmt, FusedMultiplySub (ValueFPR (FS, fmt), 384 ValueFPR (FT, fmt), 385 ValueFPR (FD, fmt), fmt)); 386 TRACE_ALU_RESULT (FGR[FD]); 387 } 388 389 000000,5.RS,5.RT,5.RD,000,2.IMM,000101:SPECIAL:32::LSA 390 "lsa r<RD>, r<RS>, r<RT>, <IMM + 1>" 391 *mips32r6: 392 *mips64r6: 393 { 394 uint32_t t = GPR[RS] << (IMM + 1); 395 GPR[RD] = EXTEND32(GPR[RT] + t); 396 TRACE_ALU_RESULT (GPR[RD]); 397 } 398 399 000000,5.RS,5.RT,5.RD,000,2.IMM,010101:SPECIAL:64::DLSA 400 "dlsa r<RD>, r<RS>, r<RT>, <IMM + 1>" 401 *mips64r6: 402 { 403 uint64_t t = GPR[RS] << (IMM + 1); 404 GPR[RD] = GPR[RT] + t; 405 TRACE_ALU_RESULT (GPR[RD]); 406 } 407 408 001111,5.RS!0,5.RT,16.IMMEDIATE:POOL32X:32::AUI 409 "aui r<RS>, r<RT>, <IMMEDIATE>" 410 *mips32r6: 411 *mips64r6: 412 { 413 TRACE_ALU_INPUT2 (GPR[RS], IMMEDIATE); 414 GPR[RT] = EXTEND32 (GPR[RS] + (EXTEND16 (IMMEDIATE) << 16)); 415 TRACE_ALU_RESULT (GPR[RT]); 416 } 417 418 011101,5.RS!0,5.RT,16.IMMEDIATE:POOL32X:64::DAUI 419 "daui r<RS>, r<RT>, <IMMEDIATE>" 420 *mips64r6: 421 { 422 TRACE_ALU_INPUT2 (GPR[RS], IMMEDIATE); 423 GPR[RT] = GPR[RS] + (EXTEND16 (IMMEDIATE) << 16); 424 TRACE_ALU_RESULT (GPR[RT]); 425 } 426 427 000001,5.RS,00110,16.IMMEDIATE:POOL32X:64::DAHI 428 "dahi r<RS>, <IMMEDIATE>" 429 *mips64r6: 430 { 431 TRACE_ALU_INPUT2 (GPR[RS], IMMEDIATE); 432 GPR[RS] = GPR[RS] + (EXTEND16 (IMMEDIATE) << 32); 433 TRACE_ALU_RESULT (GPR[RS]); 434 } 435 436 000001,5.RS,11110,16.IMMEDIATE:POOL32X:64::DATI 437 "dati r<RS>, <IMMEDIATE>" 438 *mips64r6: 439 { 440 TRACE_ALU_INPUT2 (GPR[RS], IMMEDIATE); 441 GPR[RS] = GPR[RS] + (EXTEND16 (IMMEDIATE) << 48); 442 TRACE_ALU_RESULT (GPR[RS]); 443 } 444 445 011111,5.RS,5.RT,5.RD,010,2.IMMEDIATE,100000:POOL32X:32::ALIGN 446 "align r<RD>, r<RS>, r<RT>, <IMMEDIATE>" 447 *mips32r6: 448 *mips64r6: 449 { 450 uint32_t rs = GPR[RS]; 451 uint32_t rt = GPR[RT]; 452 TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]); 453 GPR[RD] = EXTEND32 (rs >> 8 * (4 - IMMEDIATE) | rt << 8 * IMMEDIATE); 454 TRACE_ALU_RESULT (GPR[RD]); 455 } 456 457 011111,5.RS,5.RT,5.RD,01,3.IMMEDIATE,100100:POOL32X:64::DALIGN 458 "dalign r<RD>, r<RS>, r<RT>, <IMMEDIATE>" 459 *mips64r6: 460 { 461 uint64_t rs = GPR[RS]; 462 uint64_t rt = GPR[RT]; 463 TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]); 464 GPR[RD] = rs >> 8 * (8 - IMMEDIATE) | rt << 8 * IMMEDIATE; 465 TRACE_ALU_RESULT (GPR[RD]); 466 } 467 468 011111,00000,5.RT,5.RD,00000,100000:POOL32X:32::BITSWAP 469 "bitswap r<RD>, r<RT>" 470 *mips32r6: 471 *mips64r6: 472 { 473 /* Taken from: http://graphics.stanford.edu/~seander/bithacks.html */ 474 uint32_t v = GPR[RT]; 475 476 TRACE_ALU_INPUT1 (v); 477 v = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1); 478 v = ((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2); 479 v = ((v >> 4) & 0x0F0F0F0F) | ((v & 0x0F0F0F0F) << 4); 480 GPR[RD] = EXTEND32 (v); 481 TRACE_ALU_RESULT(GPR[RD]); 482 } 483 484 011111,00000,5.RT,5.RD,00000,100100:POOL32X:64::DBITSWAP 485 "dbitswap r<RD>, r<RT>" 486 *mips64r6: 487 { 488 /* Taken from: http://graphics.stanford.edu/~seander/bithacks.html */ 489 uint64_t v = GPR[RT]; 490 491 TRACE_ALU_INPUT1 (v); 492 v = ((v >> 1) & 0x5555555555555555) | ((v & 0x5555555555555555) << 1); 493 v = ((v >> 2) & 0x3333333333333333) | ((v & 0x3333333333333333) << 2); 494 v = ((v >> 4) & 0x0F0F0F0F0F0F0F0F) | ((v & 0x0F0F0F0F0F0F0F0F) << 4); 495 TRACE_ALU_RESULT(v); 496 GPR[RD] = v; 497 } 498 499 111011,5.RS,00,19.IMMEDIATE:POOL32X:32::ADDIUPC 500 "addiupc r<RS>, <IMMEDIATE>" 501 *mips32r6: 502 *mips64r6: 503 { 504 TRACE_ALU_INPUT1 (IMMEDIATE); 505 GPR[RS] = loadstore_ea (SD_, CIA, EXTEND19 (IMMEDIATE) << 2); 506 TRACE_ALU_RESULT (GPR[RS]); 507 } 508 509 111011,5.RS,11110,16.IMMEDIATE:POOL32X:32::AUIPC 510 "auipc r<RS>, <IMMEDIATE>" 511 *mips32r6: 512 *mips64r6: 513 { 514 TRACE_ALU_INPUT1 (IMMEDIATE); 515 GPR[RS] = loadstore_ea (SD_, CIA, EXTEND32 (IMMEDIATE << 16)); 516 TRACE_ALU_RESULT (GPR[RS]); 517 } 518 519 111011,5.RS,11111,16.IMMEDIATE:POOL32X:32::ALUIPC 520 "aluipc r<RS>, <IMMEDIATE>" 521 *mips32r6: 522 *mips64r6: 523 { 524 TRACE_ALU_INPUT1 (IMMEDIATE); 525 GPR[RS] = ~0x0FFFF & loadstore_ea (SD_, CIA, EXTEND32 (IMMEDIATE << 16)); 526 TRACE_ALU_RESULT (GPR[RS]); 527 } 528 529 111011,5.RS,01,19.IMMEDIATE:POOL32X:32::LWPC 530 "lwpc r<RS>, <IMMEDIATE>" 531 *mips32r6: 532 *mips64r6: 533 { 534 uint32_t offset = EXTEND19 (IMMEDIATE) << 2; 535 TRACE_ALU_INPUT1 (IMMEDIATE); 536 GPR[RS] = EXTEND32 (do_load (SD_, AccessLength_WORD, CIA, offset)); 537 TRACE_ALU_RESULT (GPR[RS]); 538 } 539 540 111011,5.RS,10,19.IMMEDIATE:POOL32X:64::LWUPC 541 "lwupc r<RS>, <IMMEDIATE>" 542 *mips64r6: 543 { 544 uint32_t offset = EXTEND19 (IMMEDIATE) << 2; 545 TRACE_ALU_INPUT1 (CIA + offset); 546 GPR[RS] = do_load (SD_, AccessLength_WORD, CIA, offset); 547 TRACE_ALU_RESULT (GPR[RS]); 548 } 549 550 111011,5.RS,110,18.IMMEDIATE:POOL32X:64::LDPC 551 "ldpc r<RS>, <IMMEDIATE>" 552 *mips64r6: 553 { 554 uint32_t offset = EXTEND18 (IMMEDIATE) << 3; 555 TRACE_ALU_INPUT1 (IMMEDIATE); 556 GPR[RS] = do_load (SD_, AccessLength_DOUBLEWORD, CIA, offset); 557 TRACE_ALU_RESULT (GPR[RS]); 558 } 559 010001,1000,1.FMT,00000,5.FS,5.FD,011010::32,64,f::RINT.fmt 560 "rint.%s<FMT> f<FD>, f<FS>" 561 *mips32r6: 562 *mips64r6: 563 { 564 uint64_t result; 565 int fmt = FMT; 566 check_fpu (SD_); 567 check_u64 (SD_, instruction_0); 568 check_fmt_p (SD_, fmt, instruction_0); 569 TRACE_ALU_INPUT1 (FGR[FS]); 570 RoundToIntegralExact (ValueFPR (FS, fmt), &result, fmt); 571 StoreFPR (FD, fmt, result); 572 TRACE_ALU_RESULT (FGR[FD]); 573 } 574 575 010001,1000,1.FMT,00000,5.FS,5.FD,011011::32,64,f::CLASS.fmt 576 "class.%s<FMT> f<FD>, f<FS>" 577 *mips32r6: 578 *mips64r6: 579 { 580 int fmt = FMT; 581 check_fpu (SD_); 582 check_u64 (SD_, instruction_0); 583 check_fmt_p (SD_, fmt, instruction_0); 584 StoreFPR (FD, fmt, Classify (ValueFPR (FS, fmt), fmt)); 585 } 586 587 010001,1000,1.FMT,5.FT,5.FS,5.FD,011100::32,64,f::MIN.fmt 588 "min.%s<FMT> f<FD>, f<FS>, f<FT>" 589 *mips32r6: 590 *mips64r6: 591 { 592 int fmt = FMT; 593 check_fpu (SD_); 594 check_u64 (SD_, instruction_0); 595 check_fmt_p (SD_, fmt, instruction_0); 596 TRACE_ALU_INPUT2 (FGR[FS], FGR[FT]); 597 StoreFPR (FD, fmt, Min (ValueFPR (FS, fmt), ValueFPR (FT, fmt), fmt)); 598 TRACE_ALU_RESULT (FGR[FD]); 599 } 600 601 010001,1000,1.FMT,5.FT,5.FS,5.FD,011110::32,64,f::MAX.fmt 602 "max.%s<FMT> f<FD>, f<FS>, f<FT>" 603 *mips32r6: 604 *mips64r6: 605 { 606 int fmt = FMT; 607 check_fpu (SD_); 608 check_u64 (SD_, instruction_0); 609 check_fmt_p (SD_, fmt, instruction_0); 610 TRACE_ALU_INPUT2 (FGR[FS], FGR[FT]); 611 StoreFPR (FD, fmt, Max (ValueFPR (FS, fmt), ValueFPR (FT, fmt), fmt)); 612 TRACE_ALU_RESULT (FGR[FD]); 613 } 614 615 010001,1000,1.FMT,5.FT,5.FS,5.FD,011101::32,64,f::MINA.fmt 616 "mina.%s<FMT> f<FD>, f<FS>, f<FT>" 617 *mips32r6: 618 *mips64r6: 619 { 620 int fmt = FMT; 621 check_fpu (SD_); 622 check_u64 (SD_, instruction_0); 623 check_fmt_p (SD_, fmt, instruction_0); 624 TRACE_ALU_INPUT2 (FGR[FS], FGR[FT]); 625 StoreFPR (FD, fmt, MinA (ValueFPR (FS, fmt), ValueFPR (FT, fmt), fmt)); 626 TRACE_ALU_RESULT (FGR[FD]); 627 } 628 629 010001,1000,1.FMT,5.FT,5.FS,5.FD,011111::32,64,f::MAXA.fmt 630 "maxa.%s<FMT> f<FD>, f<FS>, f<FT>" 631 *mips32r6: 632 *mips64r6: 633 { 634 int fmt = FMT; 635 check_fpu (SD_); 636 check_u64 (SD_, instruction_0); 637 check_fmt_p (SD_, fmt, instruction_0); 638 TRACE_ALU_INPUT2 (FGR[FS], FGR[FT]); 639 StoreFPR (FD, fmt, MaxA (ValueFPR (FS, fmt), ValueFPR (FT, fmt), fmt)); 640 TRACE_ALU_RESULT (FGR[FD]); 641 } 642 000000,5.RS,5.RT,5.RD,00010,011000:POOL32X:32::MUL 643 "mul r<RD>, r<RS>, r<RT>" 644 *mips32r6: 645 *mips64r6: 646 { 647 int64_t prod; 648 if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT])) 649 Unpredictable (); 650 TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]); 651 prod = ((int64_t)(int32_t) GPR[RS]) 652 * ((int64_t)(int32_t) GPR[RT]); 653 GPR[RD] = EXTEND32 (VL4_8 (prod)); 654 TRACE_ALU_RESULT (GPR[RD]); 655 } 656 657 000000,5.RS,5.RT,5.RD,00011,011000:POOL32X:32::MUH 658 "muh r<RD>, r<RS>, r<RT>" 659 *mips32r6: 660 *mips64r6: 661 { 662 int64_t prod; 663 if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT])) 664 Unpredictable (); 665 TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]); 666 prod = ((int64_t)(int32_t) GPR[RS]) 667 * ((int64_t)(int32_t) GPR[RT]); 668 GPR[RD] = EXTEND32 (VH4_8 (prod)); 669 TRACE_ALU_RESULT (GPR[RD]); 670 } 671 672 000000,5.RS,5.RT,5.RD,00010,011001:POOL32X:32::MULU 673 "mulu r<RD>, r<RS>, r<RT>" 674 *mips32r6: 675 *mips64r6: 676 { 677 uint64_t prod; 678 if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT])) 679 Unpredictable (); 680 TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]); 681 prod = ((uint64_t)(uint32_t) GPR[RS]) 682 * ((uint64_t)(uint32_t) GPR[RT]); 683 GPR[RD] = EXTEND32 (VL4_8 (prod)); 684 TRACE_ALU_RESULT (GPR[RD]); 685 } 686 687 000000,5.RS,5.RT,5.RD,00011,011001:POOL32X:32::MUHU 688 "muhu r<RD>, r<RS>, r<RT>" 689 *mips32r6: 690 *mips64r6: 691 { 692 uint64_t prod; 693 if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT])) 694 Unpredictable (); 695 TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]); 696 prod = ((uint64_t)(uint32_t) GPR[RS]) 697 * ((uint64_t)(uint32_t) GPR[RT]); 698 GPR[RD] = EXTEND32 (VH4_8 (prod)); 699 TRACE_ALU_RESULT (GPR[RD]); 700 } 701 702 000000,5.RS,5.RT,5.RD,00010,011010:POOL32X:32::DIV 703 "div r<RD>, r<RS>, r<RT>" 704 *mips32r6: 705 *mips64r6: 706 { 707 int32_t n = GPR[RS]; 708 int32_t d = GPR[RT]; 709 TRACE_ALU_INPUT2 (n,d); 710 if (d == 0) 711 GPR[RD] = EXTEND32 (0x80000000); 712 else if (n == SIGNED32 (0x80000000) && d == -1) 713 GPR[RD] = EXTEND32 (0x80000000); 714 else 715 GPR[RD] = EXTEND32 (n / d); 716 717 TRACE_ALU_RESULT (GPR[RD]); 718 } 719 720 000000,5.RS,5.RT,5.RD,00011,011010:POOL32X:32::MOD 721 "mod r<RD>, r<RS>, r<RT>" 722 *mips32r6: 723 *mips64r6: 724 { 725 int32_t n = GPR[RS]; 726 int32_t d = GPR[RT]; 727 TRACE_ALU_INPUT2 (n,d); 728 if (d == 0 || (n == SIGNED32 (0x80000000) && d == -1)) 729 GPR[RD] = EXTEND32 (0); 730 else 731 GPR[RD] = EXTEND32 (n % d); 732 733 TRACE_ALU_RESULT (GPR[RD]); 734 } 735 736 000000,5.RS,5.RT,5.RD,00010,011011:POOL32X:32::DIVU 737 "divu r<RD>, r<RS>, r<RT>" 738 *mips32r6: 739 *mips64r6: 740 { 741 uint32_t n = GPR[RS]; 742 uint32_t d = GPR[RT]; 743 TRACE_ALU_INPUT2 (n,d); 744 if (d == 0) 745 GPR[RD] = EXTEND32 (0x80000000); 746 else 747 GPR[RD] = EXTEND32 (n / d); 748 749 TRACE_ALU_RESULT (GPR[RD]); 750 } 751 752 000000,5.RS,5.RT,5.RD,00011,011011:POOL32X:32::MODU 753 "modu r<RD>, r<RS>, r<RT>" 754 *mips32r6: 755 *mips64r6: 756 { 757 uint32_t n = GPR[RS]; 758 uint32_t d = GPR[RT]; 759 TRACE_ALU_INPUT2 (n,d); 760 if (d == 0) 761 GPR[RD] = EXTEND32 (0); 762 else 763 GPR[RD] = EXTEND32 (n % d); 764 765 TRACE_ALU_RESULT (GPR[RD]); 766 } 767 768 000000,5.RS,5.RT,5.RD,00010,011100:POOL32X:64::DMUL 769 "dmul r<RD>, r<RS>, r<RT>" 770 *mips64r6: 771 { 772 uint64_t lo; 773 uint64_t m00; 774 uint64_t m01; 775 uint64_t m10; 776 uint64_t mid; 777 int sign; 778 uint64_t op1 = GPR[RS]; 779 uint64_t op2 = GPR[RT]; 780 781 check_u64 (SD_, instruction_0); 782 TRACE_ALU_INPUT2 (op1, op2); 783 /* make signed multiply unsigned */ 784 sign = 0; 785 if ((int64_t) op1 < 0) 786 { 787 op1 = - op1; 788 ++sign; 789 } 790 if ((int64_t) op2 < 0) 791 { 792 op2 = - op2; 793 ++sign; 794 } 795 /* multiply out the sub products */ 796 m00 = ((uint64_t) VL4_8 (op1) * (uint64_t) VL4_8 (op2)); 797 m10 = ((uint64_t) VH4_8 (op1) * (uint64_t) VL4_8 (op2)); 798 m01 = ((uint64_t) VL4_8 (op1) * (uint64_t) VH4_8 (op2)); 799 /* add the products */ 800 mid = ((uint64_t) VH4_8 (m00) 801 + (uint64_t) VL4_8 (m10) 802 + (uint64_t) VL4_8 (m01)); 803 lo = U8_4 (mid, m00); 804 /* fix the sign */ 805 if (sign & 1) 806 lo = -lo; 807 808 GPR[RD] = lo; 809 TRACE_ALU_RESULT (GPR[RD]); 810 } 811 812 000000,5.RS,5.RT,5.RD,00011,011100:POOL32X:64::DMUH 813 "dmuh r<RD>, r<RS>, r<RT>" 814 *mips64r6: 815 { 816 uint64_t lo; 817 uint64_t hi; 818 uint64_t m00; 819 uint64_t m01; 820 uint64_t m10; 821 uint64_t m11; 822 uint64_t mid; 823 int sign; 824 uint64_t op1 = GPR[RS]; 825 uint64_t op2 = GPR[RT]; 826 827 check_u64 (SD_, instruction_0); 828 TRACE_ALU_INPUT2 (op1, op2); 829 /* make signed multiply unsigned */ 830 sign = 0; 831 if ((int64_t) op1 < 0) 832 { 833 op1 = - op1; 834 ++sign; 835 } 836 if ((int64_t) op2 < 0) 837 { 838 op2 = - op2; 839 ++sign; 840 } 841 /* multiply out the 4 sub products */ 842 m00 = ((uint64_t) VL4_8 (op1) * (uint64_t) VL4_8 (op2)); 843 m10 = ((uint64_t) VH4_8 (op1) * (uint64_t) VL4_8 (op2)); 844 m01 = ((uint64_t) VL4_8 (op1) * (uint64_t) VH4_8 (op2)); 845 m11 = ((uint64_t) VH4_8 (op1) * (uint64_t) VH4_8 (op2)); 846 /* add the products */ 847 mid = ((uint64_t) VH4_8 (m00) 848 + (uint64_t) VL4_8 (m10) 849 + (uint64_t) VL4_8 (m01)); 850 lo = U8_4 (mid, m00); 851 hi = (m11 852 + (uint64_t) VH4_8 (mid) 853 + (uint64_t) VH4_8 (m01) 854 + (uint64_t) VH4_8 (m10)); 855 /* fix the sign */ 856 if (sign & 1) 857 { 858 lo = -lo; 859 if (lo == 0) 860 hi = -hi; 861 else 862 hi = -hi - 1; 863 } 864 865 GPR[RD] = hi; 866 TRACE_ALU_RESULT (GPR[RD]); 867 } 868 869 000000,5.RS,5.RT,5.RD,00010,011101:POOL32X:64::DMULU 870 "dmulu r<RD>, r<RS>, r<RT>" 871 *mips64r6: 872 { 873 uint64_t lo; 874 uint64_t m00; 875 uint64_t m01; 876 uint64_t m10; 877 uint64_t mid; 878 uint64_t op1 = GPR[RS]; 879 uint64_t op2 = GPR[RT]; 880 881 check_u64 (SD_, instruction_0); 882 TRACE_ALU_INPUT2 (op1, op2); 883 /* multiply out the sub products */ 884 m00 = ((uint64_t) VL4_8 (op1) * (uint64_t) VL4_8 (op2)); 885 m10 = ((uint64_t) VH4_8 (op1) * (uint64_t) VL4_8 (op2)); 886 m01 = ((uint64_t) VL4_8 (op1) * (uint64_t) VH4_8 (op2)); 887 /* add the products */ 888 mid = ((uint64_t) VH4_8 (m00) 889 + (uint64_t) VL4_8 (m10) 890 + (uint64_t) VL4_8 (m01)); 891 lo = U8_4 (mid, m00); 892 893 GPR[RD] = lo; 894 TRACE_ALU_RESULT (GPR[RD]); 895 } 896 897 000000,5.RS,5.RT,5.RD,00011,011101:POOL32X:64::DMUHU 898 "dmuhu r<RD>, r<RS>, r<RT>" 899 *mips64r6: 900 { 901 uint64_t lo; 902 uint64_t hi; 903 uint64_t m00; 904 uint64_t m01; 905 uint64_t m10; 906 uint64_t m11; 907 uint64_t mid; 908 uint64_t op1 = GPR[RS]; 909 uint64_t op2 = GPR[RT]; 910 911 check_u64 (SD_, instruction_0); 912 TRACE_ALU_INPUT2 (op1, op2); 913 /* multiply out the 4 sub products */ 914 m00 = ((uint64_t) VL4_8 (op1) * (uint64_t) VL4_8 (op2)); 915 m10 = ((uint64_t) VH4_8 (op1) * (uint64_t) VL4_8 (op2)); 916 m01 = ((uint64_t) VL4_8 (op1) * (uint64_t) VH4_8 (op2)); 917 m11 = ((uint64_t) VH4_8 (op1) * (uint64_t) VH4_8 (op2)); 918 /* add the products */ 919 mid = ((uint64_t) VH4_8 (m00) 920 + (uint64_t) VL4_8 (m10) 921 + (uint64_t) VL4_8 (m01)); 922 lo = U8_4 (mid, m00); 923 hi = (m11 924 + (uint64_t) VH4_8 (mid) 925 + (uint64_t) VH4_8 (m01) 926 + (uint64_t) VH4_8 (m10)); 927 928 GPR[RD] = hi; 929 TRACE_ALU_RESULT (GPR[RD]); 930 } 931 932 000000,5.RS,5.RT,5.RD,00010,011110:POOL32X:64::DDIV 933 "ddiv r<RD>, r<RS>, r<RT>" 934 *mips64r6: 935 { 936 int64_t n = GPR[RS]; 937 int64_t d = GPR[RT]; 938 939 check_u64 (SD_, instruction_0); 940 TRACE_ALU_INPUT2 (n, d); 941 if (d == 0) 942 GPR[RD] = SIGNED64 (0x8000000000000000); 943 else if (d == -1 && n == SIGNED64 (0x8000000000000000)) 944 GPR[RD] = SIGNED64 (0x8000000000000000); 945 else 946 GPR[RD] = (n / d); 947 948 TRACE_ALU_RESULT (GPR[RD]); 949 } 950 951 000000,5.RS,5.RT,5.RD,00011,011110:POOL32X:64::DMOD 952 "dmod r<RD>, r<RS>, r<RT>" 953 *mips64r6: 954 { 955 int64_t n = GPR[RS]; 956 int64_t d = GPR[RT]; 957 958 check_u64 (SD_, instruction_0); 959 TRACE_ALU_INPUT2 (n, d); 960 if (d == 0 || (d == -1 && n == SIGNED64 (0x8000000000000000))) 961 GPR[RD] = SIGNED64 (0); 962 else 963 GPR[RD] = (n % d); 964 965 TRACE_ALU_RESULT (GPR[RD]); 966 } 967 968 000000,5.RS,5.RT,5.RD,00010,011111:POOL32X:64::DDIVU 969 "ddivu r<RD>, r<RS>, r<RT>" 970 *mips64r6: 971 { 972 uint64_t n = GPR[RS]; 973 uint64_t d = GPR[RT]; 974 975 check_u64 (SD_, instruction_0); 976 TRACE_ALU_INPUT2 (n, d); 977 if (d == 0) 978 GPR[RD] = UNSIGNED64 (0x8000000000000000); 979 else 980 GPR[RD] = (n / d); 981 982 TRACE_ALU_RESULT (GPR[RD]); 983 } 984 985 000000,5.RS,5.RT,5.RD,00011,011111:POOL32X:64::DMODU 986 "dmodu r<RD>, r<RS>, r<RT>" 987 *mips64r6: 988 { 989 uint64_t n = GPR[RS]; 990 uint64_t d = GPR[RT]; 991 992 check_u64 (SD_, instruction_0); 993 TRACE_ALU_INPUT2 (n, d); 994 if (d == 0) 995 GPR[RD] = UNSIGNED64 (0); 996 else 997 GPR[RD] = (n % d); 998 999 TRACE_ALU_RESULT (GPR[RD]); 1000 } 1001 1002 011111,5.BASE,5.RT,9.OFFSET,0,110110:SPECIAL3:32::LL 1003 "ll r<RT>, <OFFSET>(r<BASE>)" 1004 *mips32r6: 1005 *mips64r6: 1006 { 1007 do_ll (SD_, RT, EXTEND9 (OFFSET), BASE); 1008 } 1009 1010 011111,5.BASE,5.RT,5.RD,0000,1,110110:SPECIAL3:32::LLWP 1011 "llwp r<RT>, r<RD>, (r<BASE>)" 1012 *mips32r6: 1013 *mips64r6: 1014 { 1015 int first, second; 1016 int offset; 1017 1018 if (RT == BASE) 1019 { 1020 first = RD; 1021 second = RT; 1022 offset = BigEndianCPU ? 0 : 4; 1023 } 1024 else 1025 { 1026 first = RT; 1027 second = RD; 1028 offset = BigEndianCPU ? 4 : 0; 1029 } 1030 1031 do_ll (SD_, first, offset, BASE); 1032 do_ll (SD_, second, offset ^ 4, BASE); 1033 } 1034 1035 1036 011111,5.BASE,5.RT,9.OFFSET,0,100110:SPECIAL3:32::SC 1037 "sc r<RT>, <OFFSET>(r<BASE>)" 1038 *mips32r6: 1039 *mips64r6: 1040 { 1041 do_sc (SD_, RT, EXTEND9 (OFFSET), BASE, instruction_0, 1); 1042 } 1043 1044 011111,5.BASE,5.RT,9.OFFSET,0,110111:SPECIAL3:64::LLD 1045 "lld r<RT>, <OFFSET>(r<BASE>)" 1046 *mips64r6: 1047 { 1048 check_u64 (SD_, instruction_0); 1049 do_lld (SD_, RT, EXTEND9 (OFFSET), BASE); 1050 } 1051 1052 1053 011111,5.BASE,5.RT,5.RD,0000,1,100110:SPECIAL3:32::SCWP 1054 "scwp r<RT>, r<RD>, (r<BASE>)" 1055 *mips32r6: 1056 *mips64r6: 1057 { 1058 int offset = BigEndianCPU ? 0 : 4; 1059 1060 do_sc (SD_, RD, offset, BASE, instruction_0, 0); 1061 do_sc (SD_, RT, offset ^ 4, BASE, instruction_0, 1); 1062 } 1063 1064 011111,5.BASE,5.RT,5.RD,0000,1,110111:SPECIAL3:64::LLDP 1065 "lldp r<RT>, r<RD>, (r<BASE>)" 1066 *mips64r6: 1067 { 1068 int first, second; 1069 int offset; 1070 1071 check_u64 (SD_, instruction_0); 1072 1073 if (RT == BASE) 1074 { 1075 first = RD; 1076 second = RT; 1077 offset = BigEndianCPU ? 0 : 8; 1078 } 1079 else 1080 { 1081 first = RT; 1082 second = RD; 1083 offset = BigEndianCPU ? 8 : 0; 1084 } 1085 1086 do_lld (SD_, first, offset, BASE); 1087 do_lld (SD_, second, offset ^ 8, BASE); 1088 } 1089 1090 011111,5.BASE,5.RT,9.OFFSET,0,100111:SPECIAL3:64::SCD 1091 "scd r<RT>, <OFFSET>(r<BASE>)" 1092 *mips64r6: 1093 { 1094 check_u64 (SD_, instruction_0); 1095 do_scd (SD_, RT, EXTEND9 (OFFSET), BASE, 1); 1096 } 1097 1098 011111,5.BASE,5.RT,5.RD,0000,1,100111:SPECIAL3:64::SCDP 1099 "scdp r<RT>, r<RD>, (r<BASE>)" 1100 *mips64r6: 1101 { 1102 int offset = BigEndianCPU ? 0 : 8; 1103 check_u64 (SD_, instruction_0); 1104 1105 do_scd (SD_, RD, offset, BASE, 0); 1106 do_scd (SD_, RT, offset ^ 8, BASE, 1); 1107 } 1108 1109 011111,5.BASE,5.HINT,9.OFFSET,0,110101:SPECIAL3:32::PREF 1110 "pref <HINT>, <OFFSET>(r<BASE>)" 1111 *mips32r6: 1112 *mips64r6: 1113 { 1114 do_pref (SD_, HINT, EXTEND9 (OFFSET), BASE); 1115 } 1116 1117 011111,5.BASE,5.HINT,9.OFFSET,0,100101:SPECIAL3:32::CACHE 1118 "cache <HINT>, <OFFSET>(r<BASE>)" 1119 *mips32r6: 1120 *mips64r6: 1121 { 1122 do_cache (SD_, HINT, BASE, EXTEND9 (OFFSET), instruction_0); 1123 } 1124 1125 1126 000000,5.RS,00000,5.RD,00001,010000:POOL32X:32::CLZ 1127 "clz r<RD>, r<RS>" 1128 *mips32r6: 1129 *mips64r6: 1130 { 1131 do_clz (SD_, RD, RS); 1132 } 1133 1134 000000,5.RS,00000,5.RD,00001,010001:POOL32X:32::CLO 1135 "clo r<RD>, r<RS>" 1136 *mips32r6: 1137 *mips64r6: 1138 { 1139 do_clo (SD_, RD, RS); 1140 } 1141 1142 000000,5.RS,00000,5.RD,00001,010010:POOL32X:64::DCLZ 1143 "dclz r<RD>, r<RS>" 1144 *mips64r6: 1145 { 1146 check_u64 (SD_, instruction_0); 1147 do_dclz (SD_, RD, RS); 1148 } 1149 1150 000000,5.RS,00000,5.RD,00001,010011:POOL32X:64::DCLO 1151 "dclo r<RD>, r<RS>" 1152 *mips64r6: 1153 { 1154 check_u64 (SD_, instruction_0); 1155 do_dclo (SD_, RD, RS); 1156 } 1157 010001,1000,1.FMT,5.FT,5.FS,5.FD,010000:POOL32X:32,f::SEL.fmt 1158 "sel.%s<FMT> f<FD>, f<FS>, f<FT>" 1159 *mips32r6: 1160 *mips64r6: 1161 { 1162 check_fpu (SD_); 1163 check_fmt_p (SD_, FMT, instruction_0); 1164 TRACE_ALU_INPUT3 (FGR[FD], ValueFPR(FS, FMT), ValueFPR(FT, FMT)); 1165 if ((FGR[FD] & 0x01) != 0) 1166 StoreFPR (FD, FMT, ValueFPR (FT, FMT)); 1167 else 1168 StoreFPR (FD, FMT, ValueFPR (FS, FMT)); 1169 TRACE_ALU_RESULT (ValueFPR(FD, FMT)); 1170 } 1171 1172 010001,1000,1.FMT,5.FT,5.FS,5.FD,010100:POOL32X:32,f::SELEQZ.fmt 1173 "seleqz.%s<FMT> f<FD>, f<FS>, f<FT>" 1174 *mips32r6: 1175 *mips64r6: 1176 { 1177 check_fpu (SD_); 1178 check_fmt_p (SD_, FMT, instruction_0); 1179 TRACE_ALU_INPUT2 (ValueFPR(FS, FMT), FGR[FT]); 1180 if ((FGR[FT] & 0x01) == 0) 1181 StoreFPR (FD, FMT, ValueFPR (FS, FMT)); 1182 else 1183 StoreFPR (FD, FMT, 0); 1184 TRACE_ALU_RESULT (ValueFPR(FD, FMT)); 1185 } 1186 1187 010001,1000,1.FMT,5.FT,5.FS,5.FD,010111:POOL32X:32,f::SELNEZ.fmt 1188 "selnez.%s<FMT> f<FD>, f<FS>, f<FT>" 1189 *mips32r6: 1190 *mips64r6: 1191 { 1192 check_fpu (SD_); 1193 check_fmt_p (SD_, FMT, instruction_0); 1194 TRACE_ALU_INPUT2 (ValueFPR(FS, FMT), FGR[FT]); 1195 if ((FGR[FT] & 0x01) == 0) 1196 StoreFPR (FD, FMT, 0); 1197 else 1198 StoreFPR (FD, FMT, ValueFPR (FS, FMT)); 1199 TRACE_ALU_RESULT (ValueFPR(FD, FMT)); 1200 } 1201 1202 000000,5.RS,5.RT,5.RD,00000,110101:POOL32X:32::SELEQZ 1203 "seleqz r<RD>, r<RS>, r<RT>" 1204 *mips32r6: 1205 *mips64r6: 1206 { 1207 TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]); 1208 if (GPR[RT] != 0) 1209 GPR[RD] = 0; 1210 else 1211 GPR[RD] = GPR[RS]; 1212 TRACE_ALU_RESULT (GPR[RD]); 1213 } 1214 1215 000000,5.RS,5.RT,5.RD,00000,110111:POOL32X:32::SELNEZ 1216 "selnez r<RD>, r<RS>, r<RT>" 1217 *mips32r6: 1218 *mips64r6: 1219 { 1220 TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]); 1221 if (GPR[RT] != 0) 1222 GPR[RD] = GPR[RS]; 1223 else 1224 GPR[RD] = 0; 1225 TRACE_ALU_RESULT (GPR[RD]); 1226 } 1227