Home | History | Annotate | Line # | Download | only in mips
      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