qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

micromips_translate.c.inc (94715B)


      1 /*
      2  *  microMIPS translation routines
      3  *
      4  *  Copyright (c) 2004-2005 Jocelyn Mayer
      5  *  Copyright (c) 2006 Marius Groeger (FPU operations)
      6  *  Copyright (c) 2006 Thiemo Seufer (MIPS32R2 support)
      7  *  Copyright (c) 2009 CodeSourcery (MIPS16 and microMIPS support)
      8  *
      9  * SPDX-License-Identifier: LGPL-2.1-or-later
     10  */
     11 
     12 /*
     13  * microMIPS32/microMIPS64 major opcodes
     14  *
     15  * 1. MIPS Architecture for Programmers Volume II-B:
     16  *      The microMIPS32 Instruction Set (Revision 3.05)
     17  *
     18  *    Table 6.2 microMIPS32 Encoding of Major Opcode Field
     19  *
     20  * 2. MIPS Architecture For Programmers Volume II-A:
     21  *      The MIPS64 Instruction Set (Revision 3.51)
     22  */
     23 
     24 enum {
     25     POOL32A = 0x00,
     26     POOL16A = 0x01,
     27     LBU16 = 0x02,
     28     MOVE16 = 0x03,
     29     ADDI32 = 0x04,
     30     R6_LUI = 0x04,
     31     AUI = 0x04,
     32     LBU32 = 0x05,
     33     SB32 = 0x06,
     34     LB32 = 0x07,
     35 
     36     POOL32B = 0x08,
     37     POOL16B = 0x09,
     38     LHU16 = 0x0a,
     39     ANDI16 = 0x0b,
     40     ADDIU32 = 0x0c,
     41     LHU32 = 0x0d,
     42     SH32 = 0x0e,
     43     LH32 = 0x0f,
     44 
     45     POOL32I = 0x10,
     46     POOL16C = 0x11,
     47     LWSP16 = 0x12,
     48     POOL16D = 0x13,
     49     ORI32 = 0x14,
     50     POOL32F = 0x15,
     51     POOL32S = 0x16,  /* MIPS64 */
     52     DADDIU32 = 0x17, /* MIPS64 */
     53 
     54     POOL32C = 0x18,
     55     LWGP16 = 0x19,
     56     LW16 = 0x1a,
     57     POOL16E = 0x1b,
     58     XORI32 = 0x1c,
     59     JALS32 = 0x1d,
     60     BOVC = 0x1d,
     61     BEQC = 0x1d,
     62     BEQZALC = 0x1d,
     63     ADDIUPC = 0x1e,
     64     PCREL = 0x1e,
     65     BNVC = 0x1f,
     66     BNEC = 0x1f,
     67     BNEZALC = 0x1f,
     68 
     69     R6_BEQZC = 0x20,
     70     JIC = 0x20,
     71     POOL16F = 0x21,
     72     SB16 = 0x22,
     73     BEQZ16 = 0x23,
     74     BEQZC16 = 0x23,
     75     SLTI32 = 0x24,
     76     BEQ32 = 0x25,
     77     BC = 0x25,
     78     SWC132 = 0x26,
     79     LWC132 = 0x27,
     80 
     81     /* 0x29 is reserved */
     82     RES_29 = 0x29,
     83     R6_BNEZC = 0x28,
     84     JIALC = 0x28,
     85     SH16 = 0x2a,
     86     BNEZ16 = 0x2b,
     87     BNEZC16 = 0x2b,
     88     SLTIU32 = 0x2c,
     89     BNE32 = 0x2d,
     90     BALC = 0x2d,
     91     SDC132 = 0x2e,
     92     LDC132 = 0x2f,
     93 
     94     /* 0x31 is reserved */
     95     RES_31 = 0x31,
     96     BLEZALC = 0x30,
     97     BGEZALC = 0x30,
     98     BGEUC = 0x30,
     99     SWSP16 = 0x32,
    100     B16 = 0x33,
    101     BC16 = 0x33,
    102     ANDI32 = 0x34,
    103     J32 = 0x35,
    104     BGTZC = 0x35,
    105     BLTZC = 0x35,
    106     BLTC = 0x35,
    107     SD32 = 0x36, /* MIPS64 */
    108     LD32 = 0x37, /* MIPS64 */
    109 
    110     /* 0x39 is reserved */
    111     RES_39 = 0x39,
    112     BGTZALC = 0x38,
    113     BLTZALC = 0x38,
    114     BLTUC = 0x38,
    115     SW16 = 0x3a,
    116     LI16 = 0x3b,
    117     JALX32 = 0x3c,
    118     JAL32 = 0x3d,
    119     BLEZC = 0x3d,
    120     BGEZC = 0x3d,
    121     BGEC = 0x3d,
    122     SW32 = 0x3e,
    123     LW32 = 0x3f
    124 };
    125 
    126 /* PCREL Instructions perform PC-Relative address calculation. bits 20..16 */
    127 enum {
    128     ADDIUPC_00 = 0x00,
    129     ADDIUPC_01 = 0x01,
    130     ADDIUPC_02 = 0x02,
    131     ADDIUPC_03 = 0x03,
    132     ADDIUPC_04 = 0x04,
    133     ADDIUPC_05 = 0x05,
    134     ADDIUPC_06 = 0x06,
    135     ADDIUPC_07 = 0x07,
    136     AUIPC = 0x1e,
    137     ALUIPC = 0x1f,
    138     LWPC_08 = 0x08,
    139     LWPC_09 = 0x09,
    140     LWPC_0A = 0x0A,
    141     LWPC_0B = 0x0B,
    142     LWPC_0C = 0x0C,
    143     LWPC_0D = 0x0D,
    144     LWPC_0E = 0x0E,
    145     LWPC_0F = 0x0F,
    146 };
    147 
    148 /* POOL32A encoding of minor opcode field */
    149 
    150 enum {
    151     /*
    152      * These opcodes are distinguished only by bits 9..6; those bits are
    153      * what are recorded below.
    154      */
    155     SLL32 = 0x0,
    156     SRL32 = 0x1,
    157     SRA = 0x2,
    158     ROTR = 0x3,
    159     SELEQZ = 0x5,
    160     SELNEZ = 0x6,
    161     R6_RDHWR = 0x7,
    162 
    163     SLLV = 0x0,
    164     SRLV = 0x1,
    165     SRAV = 0x2,
    166     ROTRV = 0x3,
    167     ADD = 0x4,
    168     ADDU32 = 0x5,
    169     SUB = 0x6,
    170     SUBU32 = 0x7,
    171     MUL = 0x8,
    172     AND = 0x9,
    173     OR32 = 0xa,
    174     NOR = 0xb,
    175     XOR32 = 0xc,
    176     SLT = 0xd,
    177     SLTU = 0xe,
    178 
    179     MOVN = 0x0,
    180     R6_MUL  = 0x0,
    181     MOVZ = 0x1,
    182     MUH  = 0x1,
    183     MULU = 0x2,
    184     MUHU = 0x3,
    185     LWXS = 0x4,
    186     R6_DIV  = 0x4,
    187     MOD  = 0x5,
    188     R6_DIVU = 0x6,
    189     MODU = 0x7,
    190 
    191     /* The following can be distinguished by their lower 6 bits. */
    192     BREAK32 = 0x07,
    193     INS = 0x0c,
    194     LSA = 0x0f,
    195     ALIGN = 0x1f,
    196     EXT = 0x2c,
    197     POOL32AXF = 0x3c,
    198     SIGRIE = 0x3f
    199 };
    200 
    201 /* POOL32AXF encoding of minor opcode field extension */
    202 
    203 /*
    204  * 1. MIPS Architecture for Programmers Volume II-B:
    205  *      The microMIPS32 Instruction Set (Revision 3.05)
    206  *
    207  *    Table 6.5 POOL32Axf Encoding of Minor Opcode Extension Field
    208  *
    209  * 2. MIPS Architecture for Programmers VolumeIV-e:
    210  *      The MIPS DSP Application-Specific Extension
    211  *        to the microMIPS32 Architecture (Revision 2.34)
    212  *
    213  *    Table 5.5 POOL32Axf Encoding of Minor Opcode Extension Field
    214  */
    215 
    216 enum {
    217     /* bits 11..6 */
    218     TEQ = 0x00,
    219     TGE = 0x08,
    220     TGEU = 0x10,
    221     TLT = 0x20,
    222     TLTU = 0x28,
    223     TNE = 0x30,
    224 
    225     MFC0 = 0x03,
    226     MTC0 = 0x0b,
    227 
    228     /* begin of microMIPS32 DSP */
    229 
    230     /* bits 13..12 for 0x01 */
    231     MFHI_ACC = 0x0,
    232     MFLO_ACC = 0x1,
    233     MTHI_ACC = 0x2,
    234     MTLO_ACC = 0x3,
    235 
    236     /* bits 13..12 for 0x2a */
    237     MADD_ACC = 0x0,
    238     MADDU_ACC = 0x1,
    239     MSUB_ACC = 0x2,
    240     MSUBU_ACC = 0x3,
    241 
    242     /* bits 13..12 for 0x32 */
    243     MULT_ACC = 0x0,
    244     MULTU_ACC = 0x1,
    245 
    246     /* end of microMIPS32 DSP */
    247 
    248     /* bits 15..12 for 0x2c */
    249     BITSWAP = 0x0,
    250     SEB = 0x2,
    251     SEH = 0x3,
    252     CLO = 0x4,
    253     CLZ = 0x5,
    254     RDHWR = 0x6,
    255     WSBH = 0x7,
    256     MULT = 0x8,
    257     MULTU = 0x9,
    258     DIV = 0xa,
    259     DIVU = 0xb,
    260     MADD = 0xc,
    261     MADDU = 0xd,
    262     MSUB = 0xe,
    263     MSUBU = 0xf,
    264 
    265     /* bits 15..12 for 0x34 */
    266     MFC2 = 0x4,
    267     MTC2 = 0x5,
    268     MFHC2 = 0x8,
    269     MTHC2 = 0x9,
    270     CFC2 = 0xc,
    271     CTC2 = 0xd,
    272 
    273     /* bits 15..12 for 0x3c */
    274     JALR = 0x0,
    275     JR = 0x0,                   /* alias */
    276     JALRC = 0x0,
    277     JRC = 0x0,
    278     JALR_HB = 0x1,
    279     JALRC_HB = 0x1,
    280     JALRS = 0x4,
    281     JALRS_HB = 0x5,
    282 
    283     /* bits 15..12 for 0x05 */
    284     RDPGPR = 0xe,
    285     WRPGPR = 0xf,
    286 
    287     /* bits 15..12 for 0x0d */
    288     TLBP = 0x0,
    289     TLBR = 0x1,
    290     TLBWI = 0x2,
    291     TLBWR = 0x3,
    292     TLBINV = 0x4,
    293     TLBINVF = 0x5,
    294     WAIT = 0x9,
    295     IRET = 0xd,
    296     DERET = 0xe,
    297     ERET = 0xf,
    298 
    299     /* bits 15..12 for 0x15 */
    300     DMT = 0x0,
    301     DVPE = 0x1,
    302     EMT = 0x2,
    303     EVPE = 0x3,
    304 
    305     /* bits 15..12 for 0x1d */
    306     DI = 0x4,
    307     EI = 0x5,
    308 
    309     /* bits 15..12 for 0x2d */
    310     SYNC = 0x6,
    311     SYSCALL = 0x8,
    312     SDBBP = 0xd,
    313 
    314     /* bits 15..12 for 0x35 */
    315     MFHI32 = 0x0,
    316     MFLO32 = 0x1,
    317     MTHI32 = 0x2,
    318     MTLO32 = 0x3,
    319 };
    320 
    321 /* POOL32B encoding of minor opcode field (bits 15..12) */
    322 
    323 enum {
    324     LWC2 = 0x0,
    325     LWP = 0x1,
    326     LDP = 0x4,
    327     LWM32 = 0x5,
    328     CACHE = 0x6,
    329     LDM = 0x7,
    330     SWC2 = 0x8,
    331     SWP = 0x9,
    332     SDP = 0xc,
    333     SWM32 = 0xd,
    334     SDM = 0xf
    335 };
    336 
    337 /* POOL32C encoding of minor opcode field (bits 15..12) */
    338 
    339 enum {
    340     LWL = 0x0,
    341     SWL = 0x8,
    342     LWR = 0x1,
    343     SWR = 0x9,
    344     PREF = 0x2,
    345     ST_EVA = 0xa,
    346     LL = 0x3,
    347     SC = 0xb,
    348     LDL = 0x4,
    349     SDL = 0xc,
    350     LDR = 0x5,
    351     SDR = 0xd,
    352     LD_EVA = 0x6,
    353     LWU = 0xe,
    354     LLD = 0x7,
    355     SCD = 0xf
    356 };
    357 
    358 /* POOL32C LD-EVA encoding of minor opcode field (bits 11..9) */
    359 
    360 enum {
    361     LBUE = 0x0,
    362     LHUE = 0x1,
    363     LWLE = 0x2,
    364     LWRE = 0x3,
    365     LBE = 0x4,
    366     LHE = 0x5,
    367     LLE = 0x6,
    368     LWE = 0x7,
    369 };
    370 
    371 /* POOL32C ST-EVA encoding of minor opcode field (bits 11..9) */
    372 
    373 enum {
    374     SWLE = 0x0,
    375     SWRE = 0x1,
    376     PREFE = 0x2,
    377     CACHEE = 0x3,
    378     SBE = 0x4,
    379     SHE = 0x5,
    380     SCE = 0x6,
    381     SWE = 0x7,
    382 };
    383 
    384 /* POOL32F encoding of minor opcode field (bits 5..0) */
    385 
    386 enum {
    387     /* These are the bit 7..6 values */
    388     ADD_FMT = 0x0,
    389 
    390     SUB_FMT = 0x1,
    391 
    392     MUL_FMT = 0x2,
    393 
    394     DIV_FMT = 0x3,
    395 
    396     /* These are the bit 8..6 values */
    397     MOVN_FMT = 0x0,
    398     RSQRT2_FMT = 0x0,
    399     MOVF_FMT = 0x0,
    400     RINT_FMT = 0x0,
    401     SELNEZ_FMT = 0x0,
    402 
    403     MOVZ_FMT = 0x1,
    404     LWXC1 = 0x1,
    405     MOVT_FMT = 0x1,
    406     CLASS_FMT = 0x1,
    407     SELEQZ_FMT = 0x1,
    408 
    409     PLL_PS = 0x2,
    410     SWXC1 = 0x2,
    411     SEL_FMT = 0x2,
    412 
    413     PLU_PS = 0x3,
    414     LDXC1 = 0x3,
    415 
    416     MOVN_FMT_04 = 0x4,
    417     PUL_PS = 0x4,
    418     SDXC1 = 0x4,
    419     RECIP2_FMT = 0x4,
    420 
    421     MOVZ_FMT_05 = 0x05,
    422     PUU_PS = 0x5,
    423     LUXC1 = 0x5,
    424 
    425     CVT_PS_S = 0x6,
    426     SUXC1 = 0x6,
    427     ADDR_PS = 0x6,
    428     PREFX = 0x6,
    429     MADDF_FMT = 0x6,
    430 
    431     MULR_PS = 0x7,
    432     MSUBF_FMT = 0x7,
    433 
    434     MADD_S = 0x01,
    435     MADD_D = 0x09,
    436     MADD_PS = 0x11,
    437     ALNV_PS = 0x19,
    438     MSUB_S = 0x21,
    439     MSUB_D = 0x29,
    440     MSUB_PS = 0x31,
    441 
    442     NMADD_S = 0x02,
    443     NMADD_D = 0x0a,
    444     NMADD_PS = 0x12,
    445     NMSUB_S = 0x22,
    446     NMSUB_D = 0x2a,
    447     NMSUB_PS = 0x32,
    448 
    449     MIN_FMT = 0x3,
    450     MAX_FMT = 0xb,
    451     MINA_FMT = 0x23,
    452     MAXA_FMT = 0x2b,
    453     POOL32FXF = 0x3b,
    454 
    455     CABS_COND_FMT = 0x1c,              /* MIPS3D */
    456     C_COND_FMT = 0x3c,
    457 
    458     CMP_CONDN_S = 0x5,
    459     CMP_CONDN_D = 0x15
    460 };
    461 
    462 /* POOL32Fxf encoding of minor opcode extension field */
    463 
    464 enum {
    465     CVT_L = 0x04,
    466     RSQRT_FMT = 0x08,
    467     FLOOR_L = 0x0c,
    468     CVT_PW_PS = 0x1c,
    469     CVT_W = 0x24,
    470     SQRT_FMT = 0x28,
    471     FLOOR_W = 0x2c,
    472     CVT_PS_PW = 0x3c,
    473     CFC1 = 0x40,
    474     RECIP_FMT = 0x48,
    475     CEIL_L = 0x4c,
    476     CTC1 = 0x60,
    477     CEIL_W = 0x6c,
    478     MFC1 = 0x80,
    479     CVT_S_PL = 0x84,
    480     TRUNC_L = 0x8c,
    481     MTC1 = 0xa0,
    482     CVT_S_PU = 0xa4,
    483     TRUNC_W = 0xac,
    484     MFHC1 = 0xc0,
    485     ROUND_L = 0xcc,
    486     MTHC1 = 0xe0,
    487     ROUND_W = 0xec,
    488 
    489     MOV_FMT = 0x01,
    490     MOVF = 0x05,
    491     ABS_FMT = 0x0d,
    492     RSQRT1_FMT = 0x1d,
    493     MOVT = 0x25,
    494     NEG_FMT = 0x2d,
    495     CVT_D = 0x4d,
    496     RECIP1_FMT = 0x5d,
    497     CVT_S = 0x6d
    498 };
    499 
    500 /* POOL32I encoding of minor opcode field (bits 25..21) */
    501 
    502 enum {
    503     BLTZ = 0x00,
    504     BLTZAL = 0x01,
    505     BGEZ = 0x02,
    506     BGEZAL = 0x03,
    507     BLEZ = 0x04,
    508     BNEZC = 0x05,
    509     BGTZ = 0x06,
    510     BEQZC = 0x07,
    511     TLTI = 0x08,
    512     BC1EQZC = 0x08,
    513     TGEI = 0x09,
    514     BC1NEZC = 0x09,
    515     TLTIU = 0x0a,
    516     BC2EQZC = 0x0a,
    517     TGEIU = 0x0b,
    518     BC2NEZC = 0x0a,
    519     TNEI = 0x0c,
    520     R6_SYNCI = 0x0c,
    521     LUI = 0x0d,
    522     TEQI = 0x0e,
    523     SYNCI = 0x10,
    524     BLTZALS = 0x11,
    525     BGEZALS = 0x13,
    526     BC2F = 0x14,
    527     BC2T = 0x15,
    528     /* These overlap and are distinguished by bit16 of the instruction */
    529     BC1F = 0x1c,
    530     BC1T = 0x1d,
    531     BC1ANY2F = 0x1c,
    532     BC1ANY2T = 0x1d,
    533     BC1ANY4F = 0x1e,
    534     BC1ANY4T = 0x1f
    535 };
    536 
    537 /* POOL16A encoding of minor opcode field */
    538 
    539 enum {
    540     ADDU16 = 0x0,
    541     SUBU16 = 0x1
    542 };
    543 
    544 /* POOL16B encoding of minor opcode field */
    545 
    546 enum {
    547     SLL16 = 0x0,
    548     SRL16 = 0x1
    549 };
    550 
    551 /* POOL16C encoding of minor opcode field */
    552 
    553 enum {
    554     NOT16 = 0x00,
    555     XOR16 = 0x04,
    556     AND16 = 0x08,
    557     OR16 = 0x0c,
    558     LWM16 = 0x10,
    559     SWM16 = 0x14,
    560     JR16 = 0x18,
    561     JRC16 = 0x1a,
    562     JALR16 = 0x1c,
    563     JALR16S = 0x1e,
    564     MFHI16 = 0x20,
    565     MFLO16 = 0x24,
    566     BREAK16 = 0x28,
    567     SDBBP16 = 0x2c,
    568     JRADDIUSP = 0x30
    569 };
    570 
    571 /* R6 POOL16C encoding of minor opcode field (bits 0..5) */
    572 
    573 enum {
    574     R6_NOT16    = 0x00,
    575     R6_AND16    = 0x01,
    576     R6_LWM16    = 0x02,
    577     R6_JRC16    = 0x03,
    578     MOVEP       = 0x04,
    579     MOVEP_05    = 0x05,
    580     MOVEP_06    = 0x06,
    581     MOVEP_07    = 0x07,
    582     R6_XOR16    = 0x08,
    583     R6_OR16     = 0x09,
    584     R6_SWM16    = 0x0a,
    585     JALRC16     = 0x0b,
    586     MOVEP_0C    = 0x0c,
    587     MOVEP_0D    = 0x0d,
    588     MOVEP_0E    = 0x0e,
    589     MOVEP_0F    = 0x0f,
    590     JRCADDIUSP  = 0x13,
    591     R6_BREAK16  = 0x1b,
    592     R6_SDBBP16  = 0x3b
    593 };
    594 
    595 /* POOL16D encoding of minor opcode field */
    596 
    597 enum {
    598     ADDIUS5 = 0x0,
    599     ADDIUSP = 0x1
    600 };
    601 
    602 /* POOL16E encoding of minor opcode field */
    603 
    604 enum {
    605     ADDIUR2 = 0x0,
    606     ADDIUR1SP = 0x1
    607 };
    608 
    609 static int mmreg(int r)
    610 {
    611     static const int map[] = { 16, 17, 2, 3, 4, 5, 6, 7 };
    612 
    613     return map[r];
    614 }
    615 
    616 /* Used for 16-bit store instructions.  */
    617 static int mmreg2(int r)
    618 {
    619     static const int map[] = { 0, 17, 2, 3, 4, 5, 6, 7 };
    620 
    621     return map[r];
    622 }
    623 
    624 #define uMIPS_RD(op) ((op >> 7) & 0x7)
    625 #define uMIPS_RS(op) ((op >> 4) & 0x7)
    626 #define uMIPS_RS2(op) uMIPS_RS(op)
    627 #define uMIPS_RS1(op) ((op >> 1) & 0x7)
    628 #define uMIPS_RD5(op) ((op >> 5) & 0x1f)
    629 #define uMIPS_RS5(op) (op & 0x1f)
    630 
    631 /* Signed immediate */
    632 #define SIMM(op, start, width)                                          \
    633     ((int32_t)(((op >> start) & ((~0U) >> (32 - width)))                \
    634                << (32 - width))                                         \
    635      >> (32 - width))
    636 /* Zero-extended immediate */
    637 #define ZIMM(op, start, width) ((op >> start) & ((~0U) >> (32 - width)))
    638 
    639 static void gen_addiur1sp(DisasContext *ctx)
    640 {
    641     int rd = mmreg(uMIPS_RD(ctx->opcode));
    642 
    643     gen_arith_imm(ctx, OPC_ADDIU, rd, 29, ((ctx->opcode >> 1) & 0x3f) << 2);
    644 }
    645 
    646 static void gen_addiur2(DisasContext *ctx)
    647 {
    648     static const int decoded_imm[] = { 1, 4, 8, 12, 16, 20, 24, -1 };
    649     int rd = mmreg(uMIPS_RD(ctx->opcode));
    650     int rs = mmreg(uMIPS_RS(ctx->opcode));
    651 
    652     gen_arith_imm(ctx, OPC_ADDIU, rd, rs, decoded_imm[ZIMM(ctx->opcode, 1, 3)]);
    653 }
    654 
    655 static void gen_addiusp(DisasContext *ctx)
    656 {
    657     int encoded = ZIMM(ctx->opcode, 1, 9);
    658     int decoded;
    659 
    660     if (encoded <= 1) {
    661         decoded = 256 + encoded;
    662     } else if (encoded <= 255) {
    663         decoded = encoded;
    664     } else if (encoded <= 509) {
    665         decoded = encoded - 512;
    666     } else {
    667         decoded = encoded - 768;
    668     }
    669 
    670     gen_arith_imm(ctx, OPC_ADDIU, 29, 29, decoded << 2);
    671 }
    672 
    673 static void gen_addius5(DisasContext *ctx)
    674 {
    675     int imm = SIMM(ctx->opcode, 1, 4);
    676     int rd = (ctx->opcode >> 5) & 0x1f;
    677 
    678     gen_arith_imm(ctx, OPC_ADDIU, rd, rd, imm);
    679 }
    680 
    681 static void gen_andi16(DisasContext *ctx)
    682 {
    683     static const int decoded_imm[] = { 128, 1, 2, 3, 4, 7, 8, 15, 16,
    684                                  31, 32, 63, 64, 255, 32768, 65535 };
    685     int rd = mmreg(uMIPS_RD(ctx->opcode));
    686     int rs = mmreg(uMIPS_RS(ctx->opcode));
    687     int encoded = ZIMM(ctx->opcode, 0, 4);
    688 
    689     gen_logic_imm(ctx, OPC_ANDI, rd, rs, decoded_imm[encoded]);
    690 }
    691 
    692 static void gen_ldst_multiple(DisasContext *ctx, uint32_t opc, int reglist,
    693                               int base, int16_t offset)
    694 {
    695     TCGv t0, t1;
    696     TCGv_i32 t2;
    697 
    698     if (ctx->hflags & MIPS_HFLAG_BMASK) {
    699         gen_reserved_instruction(ctx);
    700         return;
    701     }
    702 
    703     t0 = tcg_temp_new();
    704 
    705     gen_base_offset_addr(ctx, t0, base, offset);
    706 
    707     t1 = tcg_const_tl(reglist);
    708     t2 = tcg_const_i32(ctx->mem_idx);
    709 
    710     save_cpu_state(ctx, 1);
    711     switch (opc) {
    712     case LWM32:
    713         gen_helper_lwm(cpu_env, t0, t1, t2);
    714         break;
    715     case SWM32:
    716         gen_helper_swm(cpu_env, t0, t1, t2);
    717         break;
    718 #ifdef TARGET_MIPS64
    719     case LDM:
    720         gen_helper_ldm(cpu_env, t0, t1, t2);
    721         break;
    722     case SDM:
    723         gen_helper_sdm(cpu_env, t0, t1, t2);
    724         break;
    725 #endif
    726     }
    727     tcg_temp_free(t0);
    728     tcg_temp_free(t1);
    729     tcg_temp_free_i32(t2);
    730 }
    731 
    732 
    733 static void gen_pool16c_insn(DisasContext *ctx)
    734 {
    735     int rd = mmreg((ctx->opcode >> 3) & 0x7);
    736     int rs = mmreg(ctx->opcode & 0x7);
    737 
    738     switch (((ctx->opcode) >> 4) & 0x3f) {
    739     case NOT16 + 0:
    740     case NOT16 + 1:
    741     case NOT16 + 2:
    742     case NOT16 + 3:
    743         gen_logic(ctx, OPC_NOR, rd, rs, 0);
    744         break;
    745     case XOR16 + 0:
    746     case XOR16 + 1:
    747     case XOR16 + 2:
    748     case XOR16 + 3:
    749         gen_logic(ctx, OPC_XOR, rd, rd, rs);
    750         break;
    751     case AND16 + 0:
    752     case AND16 + 1:
    753     case AND16 + 2:
    754     case AND16 + 3:
    755         gen_logic(ctx, OPC_AND, rd, rd, rs);
    756         break;
    757     case OR16 + 0:
    758     case OR16 + 1:
    759     case OR16 + 2:
    760     case OR16 + 3:
    761         gen_logic(ctx, OPC_OR, rd, rd, rs);
    762         break;
    763     case LWM16 + 0:
    764     case LWM16 + 1:
    765     case LWM16 + 2:
    766     case LWM16 + 3:
    767         {
    768             static const int lwm_convert[] = { 0x11, 0x12, 0x13, 0x14 };
    769             int offset = ZIMM(ctx->opcode, 0, 4);
    770 
    771             gen_ldst_multiple(ctx, LWM32, lwm_convert[(ctx->opcode >> 4) & 0x3],
    772                               29, offset << 2);
    773         }
    774         break;
    775     case SWM16 + 0:
    776     case SWM16 + 1:
    777     case SWM16 + 2:
    778     case SWM16 + 3:
    779         {
    780             static const int swm_convert[] = { 0x11, 0x12, 0x13, 0x14 };
    781             int offset = ZIMM(ctx->opcode, 0, 4);
    782 
    783             gen_ldst_multiple(ctx, SWM32, swm_convert[(ctx->opcode >> 4) & 0x3],
    784                               29, offset << 2);
    785         }
    786         break;
    787     case JR16 + 0:
    788     case JR16 + 1:
    789         {
    790             int reg = ctx->opcode & 0x1f;
    791 
    792             gen_compute_branch(ctx, OPC_JR, 2, reg, 0, 0, 4);
    793         }
    794         break;
    795     case JRC16 + 0:
    796     case JRC16 + 1:
    797         {
    798             int reg = ctx->opcode & 0x1f;
    799             gen_compute_branch(ctx, OPC_JR, 2, reg, 0, 0, 0);
    800             /*
    801              * Let normal delay slot handling in our caller take us
    802              * to the branch target.
    803              */
    804         }
    805         break;
    806     case JALR16 + 0:
    807     case JALR16 + 1:
    808         gen_compute_branch(ctx, OPC_JALR, 2, ctx->opcode & 0x1f, 31, 0, 4);
    809         ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
    810         break;
    811     case JALR16S + 0:
    812     case JALR16S + 1:
    813         gen_compute_branch(ctx, OPC_JALR, 2, ctx->opcode & 0x1f, 31, 0, 2);
    814         ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
    815         break;
    816     case MFHI16 + 0:
    817     case MFHI16 + 1:
    818         gen_HILO(ctx, OPC_MFHI, 0, uMIPS_RS5(ctx->opcode));
    819         break;
    820     case MFLO16 + 0:
    821     case MFLO16 + 1:
    822         gen_HILO(ctx, OPC_MFLO, 0, uMIPS_RS5(ctx->opcode));
    823         break;
    824     case BREAK16:
    825         generate_exception_break(ctx, extract32(ctx->opcode, 0, 4));
    826         break;
    827     case SDBBP16:
    828         if (is_uhi(ctx, extract32(ctx->opcode, 0, 4))) {
    829             ctx->base.is_jmp = DISAS_SEMIHOST;
    830         } else {
    831             /*
    832              * XXX: not clear which exception should be raised
    833              *      when in debug mode...
    834              */
    835             check_insn(ctx, ISA_MIPS_R1);
    836             generate_exception_end(ctx, EXCP_DBp);
    837         }
    838         break;
    839     case JRADDIUSP + 0:
    840     case JRADDIUSP + 1:
    841         {
    842             int imm = ZIMM(ctx->opcode, 0, 5);
    843             gen_compute_branch(ctx, OPC_JR, 2, 31, 0, 0, 0);
    844             gen_arith_imm(ctx, OPC_ADDIU, 29, 29, imm << 2);
    845             /*
    846              * Let normal delay slot handling in our caller take us
    847              * to the branch target.
    848              */
    849         }
    850         break;
    851     default:
    852         gen_reserved_instruction(ctx);
    853         break;
    854     }
    855 }
    856 
    857 static inline void gen_movep(DisasContext *ctx, int enc_dest, int enc_rt,
    858                              int enc_rs)
    859 {
    860     int rd, re;
    861     static const int rd_enc[] = { 5, 5, 6, 4, 4, 4, 4, 4 };
    862     static const int re_enc[] = { 6, 7, 7, 21, 22, 5, 6, 7 };
    863     static const int rs_rt_enc[] = { 0, 17, 2, 3, 16, 18, 19, 20 };
    864 
    865     rd = rd_enc[enc_dest];
    866     re = re_enc[enc_dest];
    867     gen_load_gpr(cpu_gpr[rd], rs_rt_enc[enc_rs]);
    868     gen_load_gpr(cpu_gpr[re], rs_rt_enc[enc_rt]);
    869 }
    870 
    871 static void gen_pool16c_r6_insn(DisasContext *ctx)
    872 {
    873     int rt = mmreg((ctx->opcode >> 7) & 0x7);
    874     int rs = mmreg((ctx->opcode >> 4) & 0x7);
    875 
    876     switch (ctx->opcode & 0xf) {
    877     case R6_NOT16:
    878         gen_logic(ctx, OPC_NOR, rt, rs, 0);
    879         break;
    880     case R6_AND16:
    881         gen_logic(ctx, OPC_AND, rt, rt, rs);
    882         break;
    883     case R6_LWM16:
    884         {
    885             int lwm_converted = 0x11 + extract32(ctx->opcode, 8, 2);
    886             int offset = extract32(ctx->opcode, 4, 4);
    887             gen_ldst_multiple(ctx, LWM32, lwm_converted, 29, offset << 2);
    888         }
    889         break;
    890     case R6_JRC16: /* JRCADDIUSP */
    891         if ((ctx->opcode >> 4) & 1) {
    892             /* JRCADDIUSP */
    893             int imm = extract32(ctx->opcode, 5, 5);
    894             gen_compute_branch(ctx, OPC_JR, 2, 31, 0, 0, 0);
    895             gen_arith_imm(ctx, OPC_ADDIU, 29, 29, imm << 2);
    896         } else {
    897             /* JRC16 */
    898             rs = extract32(ctx->opcode, 5, 5);
    899             gen_compute_branch(ctx, OPC_JR, 2, rs, 0, 0, 0);
    900         }
    901         break;
    902     case MOVEP:
    903     case MOVEP_05:
    904     case MOVEP_06:
    905     case MOVEP_07:
    906     case MOVEP_0C:
    907     case MOVEP_0D:
    908     case MOVEP_0E:
    909     case MOVEP_0F:
    910         {
    911             int enc_dest = uMIPS_RD(ctx->opcode);
    912             int enc_rt = uMIPS_RS2(ctx->opcode);
    913             int enc_rs = (ctx->opcode & 3) | ((ctx->opcode >> 1) & 4);
    914             gen_movep(ctx, enc_dest, enc_rt, enc_rs);
    915         }
    916         break;
    917     case R6_XOR16:
    918         gen_logic(ctx, OPC_XOR, rt, rt, rs);
    919         break;
    920     case R6_OR16:
    921         gen_logic(ctx, OPC_OR, rt, rt, rs);
    922         break;
    923     case R6_SWM16:
    924         {
    925             int swm_converted = 0x11 + extract32(ctx->opcode, 8, 2);
    926             int offset = extract32(ctx->opcode, 4, 4);
    927             gen_ldst_multiple(ctx, SWM32, swm_converted, 29, offset << 2);
    928         }
    929         break;
    930     case JALRC16: /* BREAK16, SDBBP16 */
    931         switch (ctx->opcode & 0x3f) {
    932         case JALRC16:
    933         case JALRC16 + 0x20:
    934             /* JALRC16 */
    935             gen_compute_branch(ctx, OPC_JALR, 2, (ctx->opcode >> 5) & 0x1f,
    936                                31, 0, 0);
    937             break;
    938         case R6_BREAK16:
    939             /* BREAK16 */
    940             generate_exception_break(ctx, extract32(ctx->opcode, 6, 4));
    941             break;
    942         case R6_SDBBP16:
    943             /* SDBBP16 */
    944             if (is_uhi(ctx, extract32(ctx->opcode, 6, 4))) {
    945                 ctx->base.is_jmp = DISAS_SEMIHOST;
    946             } else {
    947                 if (ctx->hflags & MIPS_HFLAG_SBRI) {
    948                     generate_exception(ctx, EXCP_RI);
    949                 } else {
    950                     generate_exception(ctx, EXCP_DBp);
    951                 }
    952             }
    953             break;
    954         }
    955         break;
    956     default:
    957         generate_exception(ctx, EXCP_RI);
    958         break;
    959     }
    960 }
    961 
    962 static void gen_ldst_pair(DisasContext *ctx, uint32_t opc, int rd,
    963                           int base, int16_t offset)
    964 {
    965     TCGv t0, t1;
    966 
    967     if (ctx->hflags & MIPS_HFLAG_BMASK || rd == 31) {
    968         gen_reserved_instruction(ctx);
    969         return;
    970     }
    971 
    972     t0 = tcg_temp_new();
    973     t1 = tcg_temp_new();
    974 
    975     gen_base_offset_addr(ctx, t0, base, offset);
    976 
    977     switch (opc) {
    978     case LWP:
    979         if (rd == base) {
    980             gen_reserved_instruction(ctx);
    981             return;
    982         }
    983         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL);
    984         gen_store_gpr(t1, rd);
    985         tcg_gen_movi_tl(t1, 4);
    986         gen_op_addr_add(ctx, t0, t0, t1);
    987         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL);
    988         gen_store_gpr(t1, rd + 1);
    989         break;
    990     case SWP:
    991         gen_load_gpr(t1, rd);
    992         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
    993         tcg_gen_movi_tl(t1, 4);
    994         gen_op_addr_add(ctx, t0, t0, t1);
    995         gen_load_gpr(t1, rd + 1);
    996         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
    997         break;
    998 #ifdef TARGET_MIPS64
    999     case LDP:
   1000         if (rd == base) {
   1001             gen_reserved_instruction(ctx);
   1002             return;
   1003         }
   1004         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TEUQ);
   1005         gen_store_gpr(t1, rd);
   1006         tcg_gen_movi_tl(t1, 8);
   1007         gen_op_addr_add(ctx, t0, t0, t1);
   1008         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TEUQ);
   1009         gen_store_gpr(t1, rd + 1);
   1010         break;
   1011     case SDP:
   1012         gen_load_gpr(t1, rd);
   1013         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUQ);
   1014         tcg_gen_movi_tl(t1, 8);
   1015         gen_op_addr_add(ctx, t0, t0, t1);
   1016         gen_load_gpr(t1, rd + 1);
   1017         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUQ);
   1018         break;
   1019 #endif
   1020     }
   1021     tcg_temp_free(t0);
   1022     tcg_temp_free(t1);
   1023 }
   1024 
   1025 static void gen_pool32axf(CPUMIPSState *env, DisasContext *ctx, int rt, int rs)
   1026 {
   1027     int extension = (ctx->opcode >> 6) & 0x3f;
   1028     int minor = (ctx->opcode >> 12) & 0xf;
   1029     uint32_t mips32_op;
   1030 
   1031     switch (extension) {
   1032     case TEQ:
   1033         mips32_op = OPC_TEQ;
   1034         goto do_trap;
   1035     case TGE:
   1036         mips32_op = OPC_TGE;
   1037         goto do_trap;
   1038     case TGEU:
   1039         mips32_op = OPC_TGEU;
   1040         goto do_trap;
   1041     case TLT:
   1042         mips32_op = OPC_TLT;
   1043         goto do_trap;
   1044     case TLTU:
   1045         mips32_op = OPC_TLTU;
   1046         goto do_trap;
   1047     case TNE:
   1048         mips32_op = OPC_TNE;
   1049     do_trap:
   1050         gen_trap(ctx, mips32_op, rs, rt, -1, extract32(ctx->opcode, 12, 4));
   1051         break;
   1052 #ifndef CONFIG_USER_ONLY
   1053     case MFC0:
   1054     case MFC0 + 32:
   1055         check_cp0_enabled(ctx);
   1056         if (rt == 0) {
   1057             /* Treat as NOP. */
   1058             break;
   1059         }
   1060         gen_mfc0(ctx, cpu_gpr[rt], rs, (ctx->opcode >> 11) & 0x7);
   1061         break;
   1062     case MTC0:
   1063     case MTC0 + 32:
   1064         check_cp0_enabled(ctx);
   1065         {
   1066             TCGv t0 = tcg_temp_new();
   1067 
   1068             gen_load_gpr(t0, rt);
   1069             gen_mtc0(ctx, t0, rs, (ctx->opcode >> 11) & 0x7);
   1070             tcg_temp_free(t0);
   1071         }
   1072         break;
   1073 #endif
   1074     case 0x2a:
   1075         switch (minor & 3) {
   1076         case MADD_ACC:
   1077             gen_muldiv(ctx, OPC_MADD, (ctx->opcode >> 14) & 3, rs, rt);
   1078             break;
   1079         case MADDU_ACC:
   1080             gen_muldiv(ctx, OPC_MADDU, (ctx->opcode >> 14) & 3, rs, rt);
   1081             break;
   1082         case MSUB_ACC:
   1083             gen_muldiv(ctx, OPC_MSUB, (ctx->opcode >> 14) & 3, rs, rt);
   1084             break;
   1085         case MSUBU_ACC:
   1086             gen_muldiv(ctx, OPC_MSUBU, (ctx->opcode >> 14) & 3, rs, rt);
   1087             break;
   1088         default:
   1089             goto pool32axf_invalid;
   1090         }
   1091         break;
   1092     case 0x32:
   1093         switch (minor & 3) {
   1094         case MULT_ACC:
   1095             gen_muldiv(ctx, OPC_MULT, (ctx->opcode >> 14) & 3, rs, rt);
   1096             break;
   1097         case MULTU_ACC:
   1098             gen_muldiv(ctx, OPC_MULTU, (ctx->opcode >> 14) & 3, rs, rt);
   1099             break;
   1100         default:
   1101             goto pool32axf_invalid;
   1102         }
   1103         break;
   1104     case 0x2c:
   1105         switch (minor) {
   1106         case BITSWAP:
   1107             check_insn(ctx, ISA_MIPS_R6);
   1108             gen_bitswap(ctx, OPC_BITSWAP, rs, rt);
   1109             break;
   1110         case SEB:
   1111             gen_bshfl(ctx, OPC_SEB, rs, rt);
   1112             break;
   1113         case SEH:
   1114             gen_bshfl(ctx, OPC_SEH, rs, rt);
   1115             break;
   1116         case CLO:
   1117             mips32_op = OPC_CLO;
   1118             goto do_cl;
   1119         case CLZ:
   1120             mips32_op = OPC_CLZ;
   1121         do_cl:
   1122             check_insn(ctx, ISA_MIPS_R1);
   1123             gen_cl(ctx, mips32_op, rt, rs);
   1124             break;
   1125         case RDHWR:
   1126             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1127             gen_rdhwr(ctx, rt, rs, 0);
   1128             break;
   1129         case WSBH:
   1130             gen_bshfl(ctx, OPC_WSBH, rs, rt);
   1131             break;
   1132         case MULT:
   1133             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1134             mips32_op = OPC_MULT;
   1135             goto do_mul;
   1136         case MULTU:
   1137             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1138             mips32_op = OPC_MULTU;
   1139             goto do_mul;
   1140         case DIV:
   1141             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1142             mips32_op = OPC_DIV;
   1143             goto do_div;
   1144         case DIVU:
   1145             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1146             mips32_op = OPC_DIVU;
   1147             goto do_div;
   1148         do_div:
   1149             check_insn(ctx, ISA_MIPS_R1);
   1150             gen_muldiv(ctx, mips32_op, 0, rs, rt);
   1151             break;
   1152         case MADD:
   1153             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1154             mips32_op = OPC_MADD;
   1155             goto do_mul;
   1156         case MADDU:
   1157             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1158             mips32_op = OPC_MADDU;
   1159             goto do_mul;
   1160         case MSUB:
   1161             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1162             mips32_op = OPC_MSUB;
   1163             goto do_mul;
   1164         case MSUBU:
   1165             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1166             mips32_op = OPC_MSUBU;
   1167         do_mul:
   1168             check_insn(ctx, ISA_MIPS_R1);
   1169             gen_muldiv(ctx, mips32_op, 0, rs, rt);
   1170             break;
   1171         default:
   1172             goto pool32axf_invalid;
   1173         }
   1174         break;
   1175     case 0x34:
   1176         switch (minor) {
   1177         case MFC2:
   1178         case MTC2:
   1179         case MFHC2:
   1180         case MTHC2:
   1181         case CFC2:
   1182         case CTC2:
   1183             generate_exception_err(ctx, EXCP_CpU, 2);
   1184             break;
   1185         default:
   1186             goto pool32axf_invalid;
   1187         }
   1188         break;
   1189     case 0x3c:
   1190         switch (minor) {
   1191         case JALR:    /* JALRC */
   1192         case JALR_HB: /* JALRC_HB */
   1193             if (ctx->insn_flags & ISA_MIPS_R6) {
   1194                 /* JALRC, JALRC_HB */
   1195                 gen_compute_branch(ctx, OPC_JALR, 4, rs, rt, 0, 0);
   1196             } else {
   1197                 /* JALR, JALR_HB */
   1198                 gen_compute_branch(ctx, OPC_JALR, 4, rs, rt, 0, 4);
   1199                 ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
   1200             }
   1201             break;
   1202         case JALRS:
   1203         case JALRS_HB:
   1204             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1205             gen_compute_branch(ctx, OPC_JALR, 4, rs, rt, 0, 2);
   1206             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
   1207             break;
   1208         default:
   1209             goto pool32axf_invalid;
   1210         }
   1211         break;
   1212     case 0x05:
   1213         switch (minor) {
   1214         case RDPGPR:
   1215             check_cp0_enabled(ctx);
   1216             check_insn(ctx, ISA_MIPS_R2);
   1217             gen_load_srsgpr(rs, rt);
   1218             break;
   1219         case WRPGPR:
   1220             check_cp0_enabled(ctx);
   1221             check_insn(ctx, ISA_MIPS_R2);
   1222             gen_store_srsgpr(rs, rt);
   1223             break;
   1224         default:
   1225             goto pool32axf_invalid;
   1226         }
   1227         break;
   1228 #ifndef CONFIG_USER_ONLY
   1229     case 0x0d:
   1230         switch (minor) {
   1231         case TLBP:
   1232             mips32_op = OPC_TLBP;
   1233             goto do_cp0;
   1234         case TLBR:
   1235             mips32_op = OPC_TLBR;
   1236             goto do_cp0;
   1237         case TLBWI:
   1238             mips32_op = OPC_TLBWI;
   1239             goto do_cp0;
   1240         case TLBWR:
   1241             mips32_op = OPC_TLBWR;
   1242             goto do_cp0;
   1243         case TLBINV:
   1244             mips32_op = OPC_TLBINV;
   1245             goto do_cp0;
   1246         case TLBINVF:
   1247             mips32_op = OPC_TLBINVF;
   1248             goto do_cp0;
   1249         case WAIT:
   1250             mips32_op = OPC_WAIT;
   1251             goto do_cp0;
   1252         case DERET:
   1253             mips32_op = OPC_DERET;
   1254             goto do_cp0;
   1255         case ERET:
   1256             mips32_op = OPC_ERET;
   1257         do_cp0:
   1258             gen_cp0(env, ctx, mips32_op, rt, rs);
   1259             break;
   1260         default:
   1261             goto pool32axf_invalid;
   1262         }
   1263         break;
   1264     case 0x1d:
   1265         switch (minor) {
   1266         case DI:
   1267             check_cp0_enabled(ctx);
   1268             {
   1269                 TCGv t0 = tcg_temp_new();
   1270 
   1271                 save_cpu_state(ctx, 1);
   1272                 gen_helper_di(t0, cpu_env);
   1273                 gen_store_gpr(t0, rs);
   1274                 /*
   1275                  * Stop translation as we may have switched the execution
   1276                  * mode.
   1277                  */
   1278                 ctx->base.is_jmp = DISAS_STOP;
   1279                 tcg_temp_free(t0);
   1280             }
   1281             break;
   1282         case EI:
   1283             check_cp0_enabled(ctx);
   1284             {
   1285                 TCGv t0 = tcg_temp_new();
   1286 
   1287                 save_cpu_state(ctx, 1);
   1288                 gen_helper_ei(t0, cpu_env);
   1289                 gen_store_gpr(t0, rs);
   1290                 /*
   1291                  * DISAS_STOP isn't sufficient, we need to ensure we break out
   1292                  * of translated code to check for pending interrupts.
   1293                  */
   1294                 gen_save_pc(ctx->base.pc_next + 4);
   1295                 ctx->base.is_jmp = DISAS_EXIT;
   1296                 tcg_temp_free(t0);
   1297             }
   1298             break;
   1299         default:
   1300             goto pool32axf_invalid;
   1301         }
   1302         break;
   1303 #endif
   1304     case 0x2d:
   1305         switch (minor) {
   1306         case SYNC:
   1307             gen_sync(extract32(ctx->opcode, 16, 5));
   1308             break;
   1309         case SYSCALL:
   1310             generate_exception_end(ctx, EXCP_SYSCALL);
   1311             break;
   1312         case SDBBP:
   1313             if (is_uhi(ctx, extract32(ctx->opcode, 16, 10))) {
   1314                 ctx->base.is_jmp = DISAS_SEMIHOST;
   1315             } else {
   1316                 check_insn(ctx, ISA_MIPS_R1);
   1317                 if (ctx->hflags & MIPS_HFLAG_SBRI) {
   1318                     gen_reserved_instruction(ctx);
   1319                 } else {
   1320                     generate_exception_end(ctx, EXCP_DBp);
   1321                 }
   1322             }
   1323             break;
   1324         default:
   1325             goto pool32axf_invalid;
   1326         }
   1327         break;
   1328     case 0x01:
   1329         switch (minor & 3) {
   1330         case MFHI_ACC:
   1331             gen_HILO(ctx, OPC_MFHI, minor >> 2, rs);
   1332             break;
   1333         case MFLO_ACC:
   1334             gen_HILO(ctx, OPC_MFLO, minor >> 2, rs);
   1335             break;
   1336         case MTHI_ACC:
   1337             gen_HILO(ctx, OPC_MTHI, minor >> 2, rs);
   1338             break;
   1339         case MTLO_ACC:
   1340             gen_HILO(ctx, OPC_MTLO, minor >> 2, rs);
   1341             break;
   1342         default:
   1343             goto pool32axf_invalid;
   1344         }
   1345         break;
   1346     case 0x35:
   1347         check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1348         switch (minor) {
   1349         case MFHI32:
   1350             gen_HILO(ctx, OPC_MFHI, 0, rs);
   1351             break;
   1352         case MFLO32:
   1353             gen_HILO(ctx, OPC_MFLO, 0, rs);
   1354             break;
   1355         case MTHI32:
   1356             gen_HILO(ctx, OPC_MTHI, 0, rs);
   1357             break;
   1358         case MTLO32:
   1359             gen_HILO(ctx, OPC_MTLO, 0, rs);
   1360             break;
   1361         default:
   1362             goto pool32axf_invalid;
   1363         }
   1364         break;
   1365     default:
   1366     pool32axf_invalid:
   1367         MIPS_INVAL("pool32axf");
   1368         gen_reserved_instruction(ctx);
   1369         break;
   1370     }
   1371 }
   1372 
   1373 static void gen_pool32fxf(DisasContext *ctx, int rt, int rs)
   1374 {
   1375     int extension = (ctx->opcode >> 6) & 0x3ff;
   1376     uint32_t mips32_op;
   1377 
   1378 #define FLOAT_1BIT_FMT(opc, fmt)    ((fmt << 8) | opc)
   1379 #define FLOAT_2BIT_FMT(opc, fmt)    ((fmt << 7) | opc)
   1380 #define COND_FLOAT_MOV(opc, cond)   ((cond << 7) | opc)
   1381 
   1382     switch (extension) {
   1383     case FLOAT_1BIT_FMT(CFC1, 0):
   1384         mips32_op = OPC_CFC1;
   1385         goto do_cp1;
   1386     case FLOAT_1BIT_FMT(CTC1, 0):
   1387         mips32_op = OPC_CTC1;
   1388         goto do_cp1;
   1389     case FLOAT_1BIT_FMT(MFC1, 0):
   1390         mips32_op = OPC_MFC1;
   1391         goto do_cp1;
   1392     case FLOAT_1BIT_FMT(MTC1, 0):
   1393         mips32_op = OPC_MTC1;
   1394         goto do_cp1;
   1395     case FLOAT_1BIT_FMT(MFHC1, 0):
   1396         mips32_op = OPC_MFHC1;
   1397         goto do_cp1;
   1398     case FLOAT_1BIT_FMT(MTHC1, 0):
   1399         mips32_op = OPC_MTHC1;
   1400     do_cp1:
   1401         gen_cp1(ctx, mips32_op, rt, rs);
   1402         break;
   1403 
   1404         /* Reciprocal square root */
   1405     case FLOAT_1BIT_FMT(RSQRT_FMT, FMT_SD_S):
   1406         mips32_op = OPC_RSQRT_S;
   1407         goto do_unaryfp;
   1408     case FLOAT_1BIT_FMT(RSQRT_FMT, FMT_SD_D):
   1409         mips32_op = OPC_RSQRT_D;
   1410         goto do_unaryfp;
   1411 
   1412         /* Square root */
   1413     case FLOAT_1BIT_FMT(SQRT_FMT, FMT_SD_S):
   1414         mips32_op = OPC_SQRT_S;
   1415         goto do_unaryfp;
   1416     case FLOAT_1BIT_FMT(SQRT_FMT, FMT_SD_D):
   1417         mips32_op = OPC_SQRT_D;
   1418         goto do_unaryfp;
   1419 
   1420         /* Reciprocal */
   1421     case FLOAT_1BIT_FMT(RECIP_FMT, FMT_SD_S):
   1422         mips32_op = OPC_RECIP_S;
   1423         goto do_unaryfp;
   1424     case FLOAT_1BIT_FMT(RECIP_FMT, FMT_SD_D):
   1425         mips32_op = OPC_RECIP_D;
   1426         goto do_unaryfp;
   1427 
   1428         /* Floor */
   1429     case FLOAT_1BIT_FMT(FLOOR_L, FMT_SD_S):
   1430         mips32_op = OPC_FLOOR_L_S;
   1431         goto do_unaryfp;
   1432     case FLOAT_1BIT_FMT(FLOOR_L, FMT_SD_D):
   1433         mips32_op = OPC_FLOOR_L_D;
   1434         goto do_unaryfp;
   1435     case FLOAT_1BIT_FMT(FLOOR_W, FMT_SD_S):
   1436         mips32_op = OPC_FLOOR_W_S;
   1437         goto do_unaryfp;
   1438     case FLOAT_1BIT_FMT(FLOOR_W, FMT_SD_D):
   1439         mips32_op = OPC_FLOOR_W_D;
   1440         goto do_unaryfp;
   1441 
   1442         /* Ceiling */
   1443     case FLOAT_1BIT_FMT(CEIL_L, FMT_SD_S):
   1444         mips32_op = OPC_CEIL_L_S;
   1445         goto do_unaryfp;
   1446     case FLOAT_1BIT_FMT(CEIL_L, FMT_SD_D):
   1447         mips32_op = OPC_CEIL_L_D;
   1448         goto do_unaryfp;
   1449     case FLOAT_1BIT_FMT(CEIL_W, FMT_SD_S):
   1450         mips32_op = OPC_CEIL_W_S;
   1451         goto do_unaryfp;
   1452     case FLOAT_1BIT_FMT(CEIL_W, FMT_SD_D):
   1453         mips32_op = OPC_CEIL_W_D;
   1454         goto do_unaryfp;
   1455 
   1456         /* Truncation */
   1457     case FLOAT_1BIT_FMT(TRUNC_L, FMT_SD_S):
   1458         mips32_op = OPC_TRUNC_L_S;
   1459         goto do_unaryfp;
   1460     case FLOAT_1BIT_FMT(TRUNC_L, FMT_SD_D):
   1461         mips32_op = OPC_TRUNC_L_D;
   1462         goto do_unaryfp;
   1463     case FLOAT_1BIT_FMT(TRUNC_W, FMT_SD_S):
   1464         mips32_op = OPC_TRUNC_W_S;
   1465         goto do_unaryfp;
   1466     case FLOAT_1BIT_FMT(TRUNC_W, FMT_SD_D):
   1467         mips32_op = OPC_TRUNC_W_D;
   1468         goto do_unaryfp;
   1469 
   1470         /* Round */
   1471     case FLOAT_1BIT_FMT(ROUND_L, FMT_SD_S):
   1472         mips32_op = OPC_ROUND_L_S;
   1473         goto do_unaryfp;
   1474     case FLOAT_1BIT_FMT(ROUND_L, FMT_SD_D):
   1475         mips32_op = OPC_ROUND_L_D;
   1476         goto do_unaryfp;
   1477     case FLOAT_1BIT_FMT(ROUND_W, FMT_SD_S):
   1478         mips32_op = OPC_ROUND_W_S;
   1479         goto do_unaryfp;
   1480     case FLOAT_1BIT_FMT(ROUND_W, FMT_SD_D):
   1481         mips32_op = OPC_ROUND_W_D;
   1482         goto do_unaryfp;
   1483 
   1484         /* Integer to floating-point conversion */
   1485     case FLOAT_1BIT_FMT(CVT_L, FMT_SD_S):
   1486         mips32_op = OPC_CVT_L_S;
   1487         goto do_unaryfp;
   1488     case FLOAT_1BIT_FMT(CVT_L, FMT_SD_D):
   1489         mips32_op = OPC_CVT_L_D;
   1490         goto do_unaryfp;
   1491     case FLOAT_1BIT_FMT(CVT_W, FMT_SD_S):
   1492         mips32_op = OPC_CVT_W_S;
   1493         goto do_unaryfp;
   1494     case FLOAT_1BIT_FMT(CVT_W, FMT_SD_D):
   1495         mips32_op = OPC_CVT_W_D;
   1496         goto do_unaryfp;
   1497 
   1498         /* Paired-foo conversions */
   1499     case FLOAT_1BIT_FMT(CVT_S_PL, 0):
   1500         mips32_op = OPC_CVT_S_PL;
   1501         goto do_unaryfp;
   1502     case FLOAT_1BIT_FMT(CVT_S_PU, 0):
   1503         mips32_op = OPC_CVT_S_PU;
   1504         goto do_unaryfp;
   1505     case FLOAT_1BIT_FMT(CVT_PW_PS, 0):
   1506         mips32_op = OPC_CVT_PW_PS;
   1507         goto do_unaryfp;
   1508     case FLOAT_1BIT_FMT(CVT_PS_PW, 0):
   1509         mips32_op = OPC_CVT_PS_PW;
   1510         goto do_unaryfp;
   1511 
   1512         /* Floating-point moves */
   1513     case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_S):
   1514         mips32_op = OPC_MOV_S;
   1515         goto do_unaryfp;
   1516     case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_D):
   1517         mips32_op = OPC_MOV_D;
   1518         goto do_unaryfp;
   1519     case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_PS):
   1520         mips32_op = OPC_MOV_PS;
   1521         goto do_unaryfp;
   1522 
   1523         /* Absolute value */
   1524     case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_S):
   1525         mips32_op = OPC_ABS_S;
   1526         goto do_unaryfp;
   1527     case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_D):
   1528         mips32_op = OPC_ABS_D;
   1529         goto do_unaryfp;
   1530     case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_PS):
   1531         mips32_op = OPC_ABS_PS;
   1532         goto do_unaryfp;
   1533 
   1534         /* Negation */
   1535     case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_S):
   1536         mips32_op = OPC_NEG_S;
   1537         goto do_unaryfp;
   1538     case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_D):
   1539         mips32_op = OPC_NEG_D;
   1540         goto do_unaryfp;
   1541     case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_PS):
   1542         mips32_op = OPC_NEG_PS;
   1543         goto do_unaryfp;
   1544 
   1545         /* Reciprocal square root step */
   1546     case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_S):
   1547         mips32_op = OPC_RSQRT1_S;
   1548         goto do_unaryfp;
   1549     case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_D):
   1550         mips32_op = OPC_RSQRT1_D;
   1551         goto do_unaryfp;
   1552     case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_PS):
   1553         mips32_op = OPC_RSQRT1_PS;
   1554         goto do_unaryfp;
   1555 
   1556         /* Reciprocal step */
   1557     case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_S):
   1558         mips32_op = OPC_RECIP1_S;
   1559         goto do_unaryfp;
   1560     case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_D):
   1561         mips32_op = OPC_RECIP1_S;
   1562         goto do_unaryfp;
   1563     case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_PS):
   1564         mips32_op = OPC_RECIP1_PS;
   1565         goto do_unaryfp;
   1566 
   1567         /* Conversions from double */
   1568     case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_S):
   1569         mips32_op = OPC_CVT_D_S;
   1570         goto do_unaryfp;
   1571     case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_W):
   1572         mips32_op = OPC_CVT_D_W;
   1573         goto do_unaryfp;
   1574     case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_L):
   1575         mips32_op = OPC_CVT_D_L;
   1576         goto do_unaryfp;
   1577 
   1578         /* Conversions from single */
   1579     case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_D):
   1580         mips32_op = OPC_CVT_S_D;
   1581         goto do_unaryfp;
   1582     case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_W):
   1583         mips32_op = OPC_CVT_S_W;
   1584         goto do_unaryfp;
   1585     case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_L):
   1586         mips32_op = OPC_CVT_S_L;
   1587     do_unaryfp:
   1588         gen_farith(ctx, mips32_op, -1, rs, rt, 0);
   1589         break;
   1590 
   1591         /* Conditional moves on floating-point codes */
   1592     case COND_FLOAT_MOV(MOVT, 0):
   1593     case COND_FLOAT_MOV(MOVT, 1):
   1594     case COND_FLOAT_MOV(MOVT, 2):
   1595     case COND_FLOAT_MOV(MOVT, 3):
   1596     case COND_FLOAT_MOV(MOVT, 4):
   1597     case COND_FLOAT_MOV(MOVT, 5):
   1598     case COND_FLOAT_MOV(MOVT, 6):
   1599     case COND_FLOAT_MOV(MOVT, 7):
   1600         check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1601         gen_movci(ctx, rt, rs, (ctx->opcode >> 13) & 0x7, 1);
   1602         break;
   1603     case COND_FLOAT_MOV(MOVF, 0):
   1604     case COND_FLOAT_MOV(MOVF, 1):
   1605     case COND_FLOAT_MOV(MOVF, 2):
   1606     case COND_FLOAT_MOV(MOVF, 3):
   1607     case COND_FLOAT_MOV(MOVF, 4):
   1608     case COND_FLOAT_MOV(MOVF, 5):
   1609     case COND_FLOAT_MOV(MOVF, 6):
   1610     case COND_FLOAT_MOV(MOVF, 7):
   1611         check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1612         gen_movci(ctx, rt, rs, (ctx->opcode >> 13) & 0x7, 0);
   1613         break;
   1614     default:
   1615         MIPS_INVAL("pool32fxf");
   1616         gen_reserved_instruction(ctx);
   1617         break;
   1618     }
   1619 }
   1620 
   1621 static void decode_micromips32_opc(CPUMIPSState *env, DisasContext *ctx)
   1622 {
   1623     int32_t offset;
   1624     uint16_t insn;
   1625     int rt, rs, rd, rr;
   1626     int16_t imm;
   1627     uint32_t op, minor, minor2, mips32_op;
   1628     uint32_t cond, fmt, cc;
   1629 
   1630     insn = translator_lduw(env, &ctx->base, ctx->base.pc_next + 2);
   1631     ctx->opcode = (ctx->opcode << 16) | insn;
   1632 
   1633     rt = (ctx->opcode >> 21) & 0x1f;
   1634     rs = (ctx->opcode >> 16) & 0x1f;
   1635     rd = (ctx->opcode >> 11) & 0x1f;
   1636     rr = (ctx->opcode >> 6) & 0x1f;
   1637     imm = (int16_t) ctx->opcode;
   1638 
   1639     op = (ctx->opcode >> 26) & 0x3f;
   1640     switch (op) {
   1641     case POOL32A:
   1642         minor = ctx->opcode & 0x3f;
   1643         switch (minor) {
   1644         case 0x00:
   1645             minor = (ctx->opcode >> 6) & 0xf;
   1646             switch (minor) {
   1647             case SLL32:
   1648                 mips32_op = OPC_SLL;
   1649                 goto do_shifti;
   1650             case SRA:
   1651                 mips32_op = OPC_SRA;
   1652                 goto do_shifti;
   1653             case SRL32:
   1654                 mips32_op = OPC_SRL;
   1655                 goto do_shifti;
   1656             case ROTR:
   1657                 mips32_op = OPC_ROTR;
   1658             do_shifti:
   1659                 gen_shift_imm(ctx, mips32_op, rt, rs, rd);
   1660                 break;
   1661             case SELEQZ:
   1662                 check_insn(ctx, ISA_MIPS_R6);
   1663                 gen_cond_move(ctx, OPC_SELEQZ, rd, rs, rt);
   1664                 break;
   1665             case SELNEZ:
   1666                 check_insn(ctx, ISA_MIPS_R6);
   1667                 gen_cond_move(ctx, OPC_SELNEZ, rd, rs, rt);
   1668                 break;
   1669             case R6_RDHWR:
   1670                 check_insn(ctx, ISA_MIPS_R6);
   1671                 gen_rdhwr(ctx, rt, rs, extract32(ctx->opcode, 11, 3));
   1672                 break;
   1673             default:
   1674                 goto pool32a_invalid;
   1675             }
   1676             break;
   1677         case 0x10:
   1678             minor = (ctx->opcode >> 6) & 0xf;
   1679             switch (minor) {
   1680                 /* Arithmetic */
   1681             case ADD:
   1682                 mips32_op = OPC_ADD;
   1683                 goto do_arith;
   1684             case ADDU32:
   1685                 mips32_op = OPC_ADDU;
   1686                 goto do_arith;
   1687             case SUB:
   1688                 mips32_op = OPC_SUB;
   1689                 goto do_arith;
   1690             case SUBU32:
   1691                 mips32_op = OPC_SUBU;
   1692                 goto do_arith;
   1693             case MUL:
   1694                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1695                 mips32_op = OPC_MUL;
   1696             do_arith:
   1697                 gen_arith(ctx, mips32_op, rd, rs, rt);
   1698                 break;
   1699                 /* Shifts */
   1700             case SLLV:
   1701                 mips32_op = OPC_SLLV;
   1702                 goto do_shift;
   1703             case SRLV:
   1704                 mips32_op = OPC_SRLV;
   1705                 goto do_shift;
   1706             case SRAV:
   1707                 mips32_op = OPC_SRAV;
   1708                 goto do_shift;
   1709             case ROTRV:
   1710                 mips32_op = OPC_ROTRV;
   1711             do_shift:
   1712                 gen_shift(ctx, mips32_op, rd, rs, rt);
   1713                 break;
   1714                 /* Logical operations */
   1715             case AND:
   1716                 mips32_op = OPC_AND;
   1717                 goto do_logic;
   1718             case OR32:
   1719                 mips32_op = OPC_OR;
   1720                 goto do_logic;
   1721             case NOR:
   1722                 mips32_op = OPC_NOR;
   1723                 goto do_logic;
   1724             case XOR32:
   1725                 mips32_op = OPC_XOR;
   1726             do_logic:
   1727                 gen_logic(ctx, mips32_op, rd, rs, rt);
   1728                 break;
   1729                 /* Set less than */
   1730             case SLT:
   1731                 mips32_op = OPC_SLT;
   1732                 goto do_slt;
   1733             case SLTU:
   1734                 mips32_op = OPC_SLTU;
   1735             do_slt:
   1736                 gen_slt(ctx, mips32_op, rd, rs, rt);
   1737                 break;
   1738             default:
   1739                 goto pool32a_invalid;
   1740             }
   1741             break;
   1742         case 0x18:
   1743             minor = (ctx->opcode >> 6) & 0xf;
   1744             switch (minor) {
   1745                 /* Conditional moves */
   1746             case MOVN: /* MUL */
   1747                 if (ctx->insn_flags & ISA_MIPS_R6) {
   1748                     /* MUL */
   1749                     gen_r6_muldiv(ctx, R6_OPC_MUL, rd, rs, rt);
   1750                 } else {
   1751                     /* MOVN */
   1752                     gen_cond_move(ctx, OPC_MOVN, rd, rs, rt);
   1753                 }
   1754                 break;
   1755             case MOVZ: /* MUH */
   1756                 if (ctx->insn_flags & ISA_MIPS_R6) {
   1757                     /* MUH */
   1758                     gen_r6_muldiv(ctx, R6_OPC_MUH, rd, rs, rt);
   1759                 } else {
   1760                     /* MOVZ */
   1761                     gen_cond_move(ctx, OPC_MOVZ, rd, rs, rt);
   1762                 }
   1763                 break;
   1764             case MULU:
   1765                 check_insn(ctx, ISA_MIPS_R6);
   1766                 gen_r6_muldiv(ctx, R6_OPC_MULU, rd, rs, rt);
   1767                 break;
   1768             case MUHU:
   1769                 check_insn(ctx, ISA_MIPS_R6);
   1770                 gen_r6_muldiv(ctx, R6_OPC_MUHU, rd, rs, rt);
   1771                 break;
   1772             case LWXS: /* DIV */
   1773                 if (ctx->insn_flags & ISA_MIPS_R6) {
   1774                     /* DIV */
   1775                     gen_r6_muldiv(ctx, R6_OPC_DIV, rd, rs, rt);
   1776                 } else {
   1777                     /* LWXS */
   1778                     gen_ldxs(ctx, rs, rt, rd);
   1779                 }
   1780                 break;
   1781             case MOD:
   1782                 check_insn(ctx, ISA_MIPS_R6);
   1783                 gen_r6_muldiv(ctx, R6_OPC_MOD, rd, rs, rt);
   1784                 break;
   1785             case R6_DIVU:
   1786                 check_insn(ctx, ISA_MIPS_R6);
   1787                 gen_r6_muldiv(ctx, R6_OPC_DIVU, rd, rs, rt);
   1788                 break;
   1789             case MODU:
   1790                 check_insn(ctx, ISA_MIPS_R6);
   1791                 gen_r6_muldiv(ctx, R6_OPC_MODU, rd, rs, rt);
   1792                 break;
   1793             default:
   1794                 goto pool32a_invalid;
   1795             }
   1796             break;
   1797         case INS:
   1798             gen_bitops(ctx, OPC_INS, rt, rs, rr, rd);
   1799             return;
   1800         case LSA:
   1801             check_insn(ctx, ISA_MIPS_R6);
   1802             gen_lsa(ctx, rd, rt, rs, extract32(ctx->opcode, 9, 2));
   1803             break;
   1804         case ALIGN:
   1805             check_insn(ctx, ISA_MIPS_R6);
   1806             gen_align(ctx, 32, rd, rs, rt, extract32(ctx->opcode, 9, 2));
   1807             break;
   1808         case EXT:
   1809             gen_bitops(ctx, OPC_EXT, rt, rs, rr, rd);
   1810             return;
   1811         case POOL32AXF:
   1812             gen_pool32axf(env, ctx, rt, rs);
   1813             break;
   1814         case BREAK32:
   1815             generate_exception_break(ctx, extract32(ctx->opcode, 6, 20));
   1816             break;
   1817         case SIGRIE:
   1818             check_insn(ctx, ISA_MIPS_R6);
   1819             gen_reserved_instruction(ctx);
   1820             break;
   1821         default:
   1822         pool32a_invalid:
   1823                 MIPS_INVAL("pool32a");
   1824                 gen_reserved_instruction(ctx);
   1825                 break;
   1826         }
   1827         break;
   1828     case POOL32B:
   1829         minor = (ctx->opcode >> 12) & 0xf;
   1830         switch (minor) {
   1831         case CACHE:
   1832             check_cp0_enabled(ctx);
   1833             if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
   1834                 gen_cache_operation(ctx, rt, rs, imm);
   1835             }
   1836             break;
   1837         case LWC2:
   1838         case SWC2:
   1839             /* COP2: Not implemented. */
   1840             generate_exception_err(ctx, EXCP_CpU, 2);
   1841             break;
   1842 #ifdef TARGET_MIPS64
   1843         case LDP:
   1844         case SDP:
   1845             check_insn(ctx, ISA_MIPS3);
   1846             check_mips_64(ctx);
   1847 #endif
   1848             /* fall through */
   1849         case LWP:
   1850         case SWP:
   1851             gen_ldst_pair(ctx, minor, rt, rs, SIMM(ctx->opcode, 0, 12));
   1852             break;
   1853 #ifdef TARGET_MIPS64
   1854         case LDM:
   1855         case SDM:
   1856             check_insn(ctx, ISA_MIPS3);
   1857             check_mips_64(ctx);
   1858 #endif
   1859             /* fall through */
   1860         case LWM32:
   1861         case SWM32:
   1862             gen_ldst_multiple(ctx, minor, rt, rs, SIMM(ctx->opcode, 0, 12));
   1863             break;
   1864         default:
   1865             MIPS_INVAL("pool32b");
   1866             gen_reserved_instruction(ctx);
   1867             break;
   1868         }
   1869         break;
   1870     case POOL32F:
   1871         if (ctx->CP0_Config1 & (1 << CP0C1_FP)) {
   1872             minor = ctx->opcode & 0x3f;
   1873             check_cp1_enabled(ctx);
   1874             switch (minor) {
   1875             case ALNV_PS:
   1876                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1877                 mips32_op = OPC_ALNV_PS;
   1878                 goto do_madd;
   1879             case MADD_S:
   1880                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1881                 mips32_op = OPC_MADD_S;
   1882                 goto do_madd;
   1883             case MADD_D:
   1884                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1885                 mips32_op = OPC_MADD_D;
   1886                 goto do_madd;
   1887             case MADD_PS:
   1888                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1889                 mips32_op = OPC_MADD_PS;
   1890                 goto do_madd;
   1891             case MSUB_S:
   1892                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1893                 mips32_op = OPC_MSUB_S;
   1894                 goto do_madd;
   1895             case MSUB_D:
   1896                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1897                 mips32_op = OPC_MSUB_D;
   1898                 goto do_madd;
   1899             case MSUB_PS:
   1900                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1901                 mips32_op = OPC_MSUB_PS;
   1902                 goto do_madd;
   1903             case NMADD_S:
   1904                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1905                 mips32_op = OPC_NMADD_S;
   1906                 goto do_madd;
   1907             case NMADD_D:
   1908                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1909                 mips32_op = OPC_NMADD_D;
   1910                 goto do_madd;
   1911             case NMADD_PS:
   1912                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1913                 mips32_op = OPC_NMADD_PS;
   1914                 goto do_madd;
   1915             case NMSUB_S:
   1916                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1917                 mips32_op = OPC_NMSUB_S;
   1918                 goto do_madd;
   1919             case NMSUB_D:
   1920                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1921                 mips32_op = OPC_NMSUB_D;
   1922                 goto do_madd;
   1923             case NMSUB_PS:
   1924                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1925                 mips32_op = OPC_NMSUB_PS;
   1926             do_madd:
   1927                 gen_flt3_arith(ctx, mips32_op, rd, rr, rs, rt);
   1928                 break;
   1929             case CABS_COND_FMT:
   1930                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1931                 cond = (ctx->opcode >> 6) & 0xf;
   1932                 cc = (ctx->opcode >> 13) & 0x7;
   1933                 fmt = (ctx->opcode >> 10) & 0x3;
   1934                 switch (fmt) {
   1935                 case 0x0:
   1936                     gen_cmpabs_s(ctx, cond, rt, rs, cc);
   1937                     break;
   1938                 case 0x1:
   1939                     gen_cmpabs_d(ctx, cond, rt, rs, cc);
   1940                     break;
   1941                 case 0x2:
   1942                     gen_cmpabs_ps(ctx, cond, rt, rs, cc);
   1943                     break;
   1944                 default:
   1945                     goto pool32f_invalid;
   1946                 }
   1947                 break;
   1948             case C_COND_FMT:
   1949                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1950                 cond = (ctx->opcode >> 6) & 0xf;
   1951                 cc = (ctx->opcode >> 13) & 0x7;
   1952                 fmt = (ctx->opcode >> 10) & 0x3;
   1953                 switch (fmt) {
   1954                 case 0x0:
   1955                     gen_cmp_s(ctx, cond, rt, rs, cc);
   1956                     break;
   1957                 case 0x1:
   1958                     gen_cmp_d(ctx, cond, rt, rs, cc);
   1959                     break;
   1960                 case 0x2:
   1961                     gen_cmp_ps(ctx, cond, rt, rs, cc);
   1962                     break;
   1963                 default:
   1964                     goto pool32f_invalid;
   1965                 }
   1966                 break;
   1967             case CMP_CONDN_S:
   1968                 check_insn(ctx, ISA_MIPS_R6);
   1969                 gen_r6_cmp_s(ctx, (ctx->opcode >> 6) & 0x1f, rt, rs, rd);
   1970                 break;
   1971             case CMP_CONDN_D:
   1972                 check_insn(ctx, ISA_MIPS_R6);
   1973                 gen_r6_cmp_d(ctx, (ctx->opcode >> 6) & 0x1f, rt, rs, rd);
   1974                 break;
   1975             case POOL32FXF:
   1976                 gen_pool32fxf(ctx, rt, rs);
   1977                 break;
   1978             case 0x00:
   1979                 /* PLL foo */
   1980                 switch ((ctx->opcode >> 6) & 0x7) {
   1981                 case PLL_PS:
   1982                     mips32_op = OPC_PLL_PS;
   1983                     goto do_ps;
   1984                 case PLU_PS:
   1985                     mips32_op = OPC_PLU_PS;
   1986                     goto do_ps;
   1987                 case PUL_PS:
   1988                     mips32_op = OPC_PUL_PS;
   1989                     goto do_ps;
   1990                 case PUU_PS:
   1991                     mips32_op = OPC_PUU_PS;
   1992                     goto do_ps;
   1993                 case CVT_PS_S:
   1994                     check_insn_opc_removed(ctx, ISA_MIPS_R6);
   1995                     mips32_op = OPC_CVT_PS_S;
   1996                 do_ps:
   1997                     gen_farith(ctx, mips32_op, rt, rs, rd, 0);
   1998                     break;
   1999                 default:
   2000                     goto pool32f_invalid;
   2001                 }
   2002                 break;
   2003             case MIN_FMT:
   2004                 check_insn(ctx, ISA_MIPS_R6);
   2005                 switch ((ctx->opcode >> 9) & 0x3) {
   2006                 case FMT_SDPS_S:
   2007                     gen_farith(ctx, OPC_MIN_S, rt, rs, rd, 0);
   2008                     break;
   2009                 case FMT_SDPS_D:
   2010                     gen_farith(ctx, OPC_MIN_D, rt, rs, rd, 0);
   2011                     break;
   2012                 default:
   2013                     goto pool32f_invalid;
   2014                 }
   2015                 break;
   2016             case 0x08:
   2017                 /* [LS][WDU]XC1 */
   2018                 switch ((ctx->opcode >> 6) & 0x7) {
   2019                 case LWXC1:
   2020                     check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2021                     mips32_op = OPC_LWXC1;
   2022                     goto do_ldst_cp1;
   2023                 case SWXC1:
   2024                     check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2025                     mips32_op = OPC_SWXC1;
   2026                     goto do_ldst_cp1;
   2027                 case LDXC1:
   2028                     check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2029                     mips32_op = OPC_LDXC1;
   2030                     goto do_ldst_cp1;
   2031                 case SDXC1:
   2032                     check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2033                     mips32_op = OPC_SDXC1;
   2034                     goto do_ldst_cp1;
   2035                 case LUXC1:
   2036                     check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2037                     mips32_op = OPC_LUXC1;
   2038                     goto do_ldst_cp1;
   2039                 case SUXC1:
   2040                     check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2041                     mips32_op = OPC_SUXC1;
   2042                 do_ldst_cp1:
   2043                     gen_flt3_ldst(ctx, mips32_op, rd, rd, rt, rs);
   2044                     break;
   2045                 default:
   2046                     goto pool32f_invalid;
   2047                 }
   2048                 break;
   2049             case MAX_FMT:
   2050                 check_insn(ctx, ISA_MIPS_R6);
   2051                 switch ((ctx->opcode >> 9) & 0x3) {
   2052                 case FMT_SDPS_S:
   2053                     gen_farith(ctx, OPC_MAX_S, rt, rs, rd, 0);
   2054                     break;
   2055                 case FMT_SDPS_D:
   2056                     gen_farith(ctx, OPC_MAX_D, rt, rs, rd, 0);
   2057                     break;
   2058                 default:
   2059                     goto pool32f_invalid;
   2060                 }
   2061                 break;
   2062             case 0x18:
   2063                 /* 3D insns */
   2064                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2065                 fmt = (ctx->opcode >> 9) & 0x3;
   2066                 switch ((ctx->opcode >> 6) & 0x7) {
   2067                 case RSQRT2_FMT:
   2068                     switch (fmt) {
   2069                     case FMT_SDPS_S:
   2070                         mips32_op = OPC_RSQRT2_S;
   2071                         goto do_3d;
   2072                     case FMT_SDPS_D:
   2073                         mips32_op = OPC_RSQRT2_D;
   2074                         goto do_3d;
   2075                     case FMT_SDPS_PS:
   2076                         mips32_op = OPC_RSQRT2_PS;
   2077                         goto do_3d;
   2078                     default:
   2079                         goto pool32f_invalid;
   2080                     }
   2081                     break;
   2082                 case RECIP2_FMT:
   2083                     switch (fmt) {
   2084                     case FMT_SDPS_S:
   2085                         mips32_op = OPC_RECIP2_S;
   2086                         goto do_3d;
   2087                     case FMT_SDPS_D:
   2088                         mips32_op = OPC_RECIP2_D;
   2089                         goto do_3d;
   2090                     case FMT_SDPS_PS:
   2091                         mips32_op = OPC_RECIP2_PS;
   2092                         goto do_3d;
   2093                     default:
   2094                         goto pool32f_invalid;
   2095                     }
   2096                     break;
   2097                 case ADDR_PS:
   2098                     mips32_op = OPC_ADDR_PS;
   2099                     goto do_3d;
   2100                 case MULR_PS:
   2101                     mips32_op = OPC_MULR_PS;
   2102                 do_3d:
   2103                     gen_farith(ctx, mips32_op, rt, rs, rd, 0);
   2104                     break;
   2105                 default:
   2106                     goto pool32f_invalid;
   2107                 }
   2108                 break;
   2109             case 0x20:
   2110                 /* MOV[FT].fmt, PREFX, RINT.fmt, CLASS.fmt*/
   2111                 cc = (ctx->opcode >> 13) & 0x7;
   2112                 fmt = (ctx->opcode >> 9) & 0x3;
   2113                 switch ((ctx->opcode >> 6) & 0x7) {
   2114                 case MOVF_FMT: /* RINT_FMT */
   2115                     if (ctx->insn_flags & ISA_MIPS_R6) {
   2116                         /* RINT_FMT */
   2117                         switch (fmt) {
   2118                         case FMT_SDPS_S:
   2119                             gen_farith(ctx, OPC_RINT_S, 0, rt, rs, 0);
   2120                             break;
   2121                         case FMT_SDPS_D:
   2122                             gen_farith(ctx, OPC_RINT_D, 0, rt, rs, 0);
   2123                             break;
   2124                         default:
   2125                             goto pool32f_invalid;
   2126                         }
   2127                     } else {
   2128                         /* MOVF_FMT */
   2129                         switch (fmt) {
   2130                         case FMT_SDPS_S:
   2131                             gen_movcf_s(ctx, rs, rt, cc, 0);
   2132                             break;
   2133                         case FMT_SDPS_D:
   2134                             gen_movcf_d(ctx, rs, rt, cc, 0);
   2135                             break;
   2136                         case FMT_SDPS_PS:
   2137                             check_ps(ctx);
   2138                             gen_movcf_ps(ctx, rs, rt, cc, 0);
   2139                             break;
   2140                         default:
   2141                             goto pool32f_invalid;
   2142                         }
   2143                     }
   2144                     break;
   2145                 case MOVT_FMT: /* CLASS_FMT */
   2146                     if (ctx->insn_flags & ISA_MIPS_R6) {
   2147                         /* CLASS_FMT */
   2148                         switch (fmt) {
   2149                         case FMT_SDPS_S:
   2150                             gen_farith(ctx, OPC_CLASS_S, 0, rt, rs, 0);
   2151                             break;
   2152                         case FMT_SDPS_D:
   2153                             gen_farith(ctx, OPC_CLASS_D, 0, rt, rs, 0);
   2154                             break;
   2155                         default:
   2156                             goto pool32f_invalid;
   2157                         }
   2158                     } else {
   2159                         /* MOVT_FMT */
   2160                         switch (fmt) {
   2161                         case FMT_SDPS_S:
   2162                             gen_movcf_s(ctx, rs, rt, cc, 1);
   2163                             break;
   2164                         case FMT_SDPS_D:
   2165                             gen_movcf_d(ctx, rs, rt, cc, 1);
   2166                             break;
   2167                         case FMT_SDPS_PS:
   2168                             check_ps(ctx);
   2169                             gen_movcf_ps(ctx, rs, rt, cc, 1);
   2170                             break;
   2171                         default:
   2172                             goto pool32f_invalid;
   2173                         }
   2174                     }
   2175                     break;
   2176                 case PREFX:
   2177                     check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2178                     break;
   2179                 default:
   2180                     goto pool32f_invalid;
   2181                 }
   2182                 break;
   2183 #define FINSN_3ARG_SDPS(prfx)                           \
   2184                 switch ((ctx->opcode >> 8) & 0x3) {     \
   2185                 case FMT_SDPS_S:                        \
   2186                     mips32_op = OPC_##prfx##_S;         \
   2187                     goto do_fpop;                       \
   2188                 case FMT_SDPS_D:                        \
   2189                     mips32_op = OPC_##prfx##_D;         \
   2190                     goto do_fpop;                       \
   2191                 case FMT_SDPS_PS:                       \
   2192                     check_ps(ctx);                      \
   2193                     mips32_op = OPC_##prfx##_PS;        \
   2194                     goto do_fpop;                       \
   2195                 default:                                \
   2196                     goto pool32f_invalid;               \
   2197                 }
   2198             case MINA_FMT:
   2199                 check_insn(ctx, ISA_MIPS_R6);
   2200                 switch ((ctx->opcode >> 9) & 0x3) {
   2201                 case FMT_SDPS_S:
   2202                     gen_farith(ctx, OPC_MINA_S, rt, rs, rd, 0);
   2203                     break;
   2204                 case FMT_SDPS_D:
   2205                     gen_farith(ctx, OPC_MINA_D, rt, rs, rd, 0);
   2206                     break;
   2207                 default:
   2208                     goto pool32f_invalid;
   2209                 }
   2210                 break;
   2211             case MAXA_FMT:
   2212                 check_insn(ctx, ISA_MIPS_R6);
   2213                 switch ((ctx->opcode >> 9) & 0x3) {
   2214                 case FMT_SDPS_S:
   2215                     gen_farith(ctx, OPC_MAXA_S, rt, rs, rd, 0);
   2216                     break;
   2217                 case FMT_SDPS_D:
   2218                     gen_farith(ctx, OPC_MAXA_D, rt, rs, rd, 0);
   2219                     break;
   2220                 default:
   2221                     goto pool32f_invalid;
   2222                 }
   2223                 break;
   2224             case 0x30:
   2225                 /* regular FP ops */
   2226                 switch ((ctx->opcode >> 6) & 0x3) {
   2227                 case ADD_FMT:
   2228                     FINSN_3ARG_SDPS(ADD);
   2229                     break;
   2230                 case SUB_FMT:
   2231                     FINSN_3ARG_SDPS(SUB);
   2232                     break;
   2233                 case MUL_FMT:
   2234                     FINSN_3ARG_SDPS(MUL);
   2235                     break;
   2236                 case DIV_FMT:
   2237                     fmt = (ctx->opcode >> 8) & 0x3;
   2238                     if (fmt == 1) {
   2239                         mips32_op = OPC_DIV_D;
   2240                     } else if (fmt == 0) {
   2241                         mips32_op = OPC_DIV_S;
   2242                     } else {
   2243                         goto pool32f_invalid;
   2244                     }
   2245                     goto do_fpop;
   2246                 default:
   2247                     goto pool32f_invalid;
   2248                 }
   2249                 break;
   2250             case 0x38:
   2251                 /* cmovs */
   2252                 switch ((ctx->opcode >> 6) & 0x7) {
   2253                 case MOVN_FMT: /* SELEQZ_FMT */
   2254                     if (ctx->insn_flags & ISA_MIPS_R6) {
   2255                         /* SELEQZ_FMT */
   2256                         switch ((ctx->opcode >> 9) & 0x3) {
   2257                         case FMT_SDPS_S:
   2258                             gen_sel_s(ctx, OPC_SELEQZ_S, rd, rt, rs);
   2259                             break;
   2260                         case FMT_SDPS_D:
   2261                             gen_sel_d(ctx, OPC_SELEQZ_D, rd, rt, rs);
   2262                             break;
   2263                         default:
   2264                             goto pool32f_invalid;
   2265                         }
   2266                     } else {
   2267                         /* MOVN_FMT */
   2268                         FINSN_3ARG_SDPS(MOVN);
   2269                     }
   2270                     break;
   2271                 case MOVN_FMT_04:
   2272                     check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2273                     FINSN_3ARG_SDPS(MOVN);
   2274                     break;
   2275                 case MOVZ_FMT: /* SELNEZ_FMT */
   2276                     if (ctx->insn_flags & ISA_MIPS_R6) {
   2277                         /* SELNEZ_FMT */
   2278                         switch ((ctx->opcode >> 9) & 0x3) {
   2279                         case FMT_SDPS_S:
   2280                             gen_sel_s(ctx, OPC_SELNEZ_S, rd, rt, rs);
   2281                             break;
   2282                         case FMT_SDPS_D:
   2283                             gen_sel_d(ctx, OPC_SELNEZ_D, rd, rt, rs);
   2284                             break;
   2285                         default:
   2286                             goto pool32f_invalid;
   2287                         }
   2288                     } else {
   2289                         /* MOVZ_FMT */
   2290                         FINSN_3ARG_SDPS(MOVZ);
   2291                     }
   2292                     break;
   2293                 case MOVZ_FMT_05:
   2294                     check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2295                     FINSN_3ARG_SDPS(MOVZ);
   2296                     break;
   2297                 case SEL_FMT:
   2298                     check_insn(ctx, ISA_MIPS_R6);
   2299                     switch ((ctx->opcode >> 9) & 0x3) {
   2300                     case FMT_SDPS_S:
   2301                         gen_sel_s(ctx, OPC_SEL_S, rd, rt, rs);
   2302                         break;
   2303                     case FMT_SDPS_D:
   2304                         gen_sel_d(ctx, OPC_SEL_D, rd, rt, rs);
   2305                         break;
   2306                     default:
   2307                         goto pool32f_invalid;
   2308                     }
   2309                     break;
   2310                 case MADDF_FMT:
   2311                     check_insn(ctx, ISA_MIPS_R6);
   2312                     switch ((ctx->opcode >> 9) & 0x3) {
   2313                     case FMT_SDPS_S:
   2314                         mips32_op = OPC_MADDF_S;
   2315                         goto do_fpop;
   2316                     case FMT_SDPS_D:
   2317                         mips32_op = OPC_MADDF_D;
   2318                         goto do_fpop;
   2319                     default:
   2320                         goto pool32f_invalid;
   2321                     }
   2322                     break;
   2323                 case MSUBF_FMT:
   2324                     check_insn(ctx, ISA_MIPS_R6);
   2325                     switch ((ctx->opcode >> 9) & 0x3) {
   2326                     case FMT_SDPS_S:
   2327                         mips32_op = OPC_MSUBF_S;
   2328                         goto do_fpop;
   2329                     case FMT_SDPS_D:
   2330                         mips32_op = OPC_MSUBF_D;
   2331                         goto do_fpop;
   2332                     default:
   2333                         goto pool32f_invalid;
   2334                     }
   2335                     break;
   2336                 default:
   2337                     goto pool32f_invalid;
   2338                 }
   2339                 break;
   2340             do_fpop:
   2341                 gen_farith(ctx, mips32_op, rt, rs, rd, 0);
   2342                 break;
   2343             default:
   2344             pool32f_invalid:
   2345                 MIPS_INVAL("pool32f");
   2346                 gen_reserved_instruction(ctx);
   2347                 break;
   2348             }
   2349         } else {
   2350             generate_exception_err(ctx, EXCP_CpU, 1);
   2351         }
   2352         break;
   2353     case POOL32I:
   2354         minor = (ctx->opcode >> 21) & 0x1f;
   2355         switch (minor) {
   2356         case BLTZ:
   2357             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2358             gen_compute_branch(ctx, OPC_BLTZ, 4, rs, -1, imm << 1, 4);
   2359             break;
   2360         case BLTZAL:
   2361             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2362             gen_compute_branch(ctx, OPC_BLTZAL, 4, rs, -1, imm << 1, 4);
   2363             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
   2364             break;
   2365         case BLTZALS:
   2366             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2367             gen_compute_branch(ctx, OPC_BLTZAL, 4, rs, -1, imm << 1, 2);
   2368             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
   2369             break;
   2370         case BGEZ:
   2371             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2372             gen_compute_branch(ctx, OPC_BGEZ, 4, rs, -1, imm << 1, 4);
   2373             break;
   2374         case BGEZAL:
   2375             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2376             gen_compute_branch(ctx, OPC_BGEZAL, 4, rs, -1, imm << 1, 4);
   2377             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
   2378             break;
   2379         case BGEZALS:
   2380             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2381             gen_compute_branch(ctx, OPC_BGEZAL, 4, rs, -1, imm << 1, 2);
   2382             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
   2383             break;
   2384         case BLEZ:
   2385             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2386             gen_compute_branch(ctx, OPC_BLEZ, 4, rs, -1, imm << 1, 4);
   2387             break;
   2388         case BGTZ:
   2389             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2390             gen_compute_branch(ctx, OPC_BGTZ, 4, rs, -1, imm << 1, 4);
   2391             break;
   2392 
   2393             /* Traps */
   2394         case TLTI: /* BC1EQZC */
   2395             if (ctx->insn_flags & ISA_MIPS_R6) {
   2396                 /* BC1EQZC */
   2397                 check_cp1_enabled(ctx);
   2398                 gen_compute_branch1_r6(ctx, OPC_BC1EQZ, rs, imm << 1, 0);
   2399             } else {
   2400                 /* TLTI */
   2401                 mips32_op = OPC_TLTI;
   2402                 goto do_trapi;
   2403             }
   2404             break;
   2405         case TGEI: /* BC1NEZC */
   2406             if (ctx->insn_flags & ISA_MIPS_R6) {
   2407                 /* BC1NEZC */
   2408                 check_cp1_enabled(ctx);
   2409                 gen_compute_branch1_r6(ctx, OPC_BC1NEZ, rs, imm << 1, 0);
   2410             } else {
   2411                 /* TGEI */
   2412                 mips32_op = OPC_TGEI;
   2413                 goto do_trapi;
   2414             }
   2415             break;
   2416         case TLTIU:
   2417             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2418             mips32_op = OPC_TLTIU;
   2419             goto do_trapi;
   2420         case TGEIU:
   2421             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2422             mips32_op = OPC_TGEIU;
   2423             goto do_trapi;
   2424         case TNEI: /* SYNCI */
   2425             if (ctx->insn_flags & ISA_MIPS_R6) {
   2426                 /* SYNCI */
   2427                 /*
   2428                  * Break the TB to be able to sync copied instructions
   2429                  * immediately.
   2430                  */
   2431                 ctx->base.is_jmp = DISAS_STOP;
   2432             } else {
   2433                 /* TNEI */
   2434                 mips32_op = OPC_TNEI;
   2435                 goto do_trapi;
   2436             }
   2437             break;
   2438         case TEQI:
   2439             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2440             mips32_op = OPC_TEQI;
   2441         do_trapi:
   2442             gen_trap(ctx, mips32_op, rs, -1, imm, 0);
   2443             break;
   2444 
   2445         case BNEZC:
   2446         case BEQZC:
   2447             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2448             gen_compute_branch(ctx, minor == BNEZC ? OPC_BNE : OPC_BEQ,
   2449                                4, rs, 0, imm << 1, 0);
   2450             /*
   2451              * Compact branches don't have a delay slot, so just let
   2452              * the normal delay slot handling take us to the branch
   2453              * target.
   2454              */
   2455             break;
   2456         case LUI:
   2457             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2458             gen_logic_imm(ctx, OPC_LUI, rs, 0, imm);
   2459             break;
   2460         case SYNCI:
   2461             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2462             /*
   2463              * Break the TB to be able to sync copied instructions
   2464              * immediately.
   2465              */
   2466             ctx->base.is_jmp = DISAS_STOP;
   2467             break;
   2468         case BC2F:
   2469         case BC2T:
   2470             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2471             /* COP2: Not implemented. */
   2472             generate_exception_err(ctx, EXCP_CpU, 2);
   2473             break;
   2474         case BC1F:
   2475             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2476             mips32_op = (ctx->opcode & (1 << 16)) ? OPC_BC1FANY2 : OPC_BC1F;
   2477             goto do_cp1branch;
   2478         case BC1T:
   2479             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2480             mips32_op = (ctx->opcode & (1 << 16)) ? OPC_BC1TANY2 : OPC_BC1T;
   2481             goto do_cp1branch;
   2482         case BC1ANY4F:
   2483             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2484             mips32_op = OPC_BC1FANY4;
   2485             goto do_cp1mips3d;
   2486         case BC1ANY4T:
   2487             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2488             mips32_op = OPC_BC1TANY4;
   2489         do_cp1mips3d:
   2490             check_cop1x(ctx);
   2491             check_insn(ctx, ASE_MIPS3D);
   2492             /* Fall through */
   2493         do_cp1branch:
   2494             if (env->CP0_Config1 & (1 << CP0C1_FP)) {
   2495                 check_cp1_enabled(ctx);
   2496                 gen_compute_branch1(ctx, mips32_op,
   2497                                     (ctx->opcode >> 18) & 0x7, imm << 1);
   2498             } else {
   2499                 generate_exception_err(ctx, EXCP_CpU, 1);
   2500             }
   2501             break;
   2502         default:
   2503             MIPS_INVAL("pool32i");
   2504             gen_reserved_instruction(ctx);
   2505             break;
   2506         }
   2507         break;
   2508     case POOL32C:
   2509         minor = (ctx->opcode >> 12) & 0xf;
   2510         offset = sextract32(ctx->opcode, 0,
   2511                             (ctx->insn_flags & ISA_MIPS_R6) ? 9 : 12);
   2512         switch (minor) {
   2513         case LWL:
   2514             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2515             mips32_op = OPC_LWL;
   2516             goto do_ld_lr;
   2517         case SWL:
   2518             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2519             mips32_op = OPC_SWL;
   2520             goto do_st_lr;
   2521         case LWR:
   2522             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2523             mips32_op = OPC_LWR;
   2524             goto do_ld_lr;
   2525         case SWR:
   2526             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2527             mips32_op = OPC_SWR;
   2528             goto do_st_lr;
   2529 #if defined(TARGET_MIPS64)
   2530         case LDL:
   2531             check_insn(ctx, ISA_MIPS3);
   2532             check_mips_64(ctx);
   2533             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2534             mips32_op = OPC_LDL;
   2535             goto do_ld_lr;
   2536         case SDL:
   2537             check_insn(ctx, ISA_MIPS3);
   2538             check_mips_64(ctx);
   2539             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2540             mips32_op = OPC_SDL;
   2541             goto do_st_lr;
   2542         case LDR:
   2543             check_insn(ctx, ISA_MIPS3);
   2544             check_mips_64(ctx);
   2545             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2546             mips32_op = OPC_LDR;
   2547             goto do_ld_lr;
   2548         case SDR:
   2549             check_insn(ctx, ISA_MIPS3);
   2550             check_mips_64(ctx);
   2551             check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2552             mips32_op = OPC_SDR;
   2553             goto do_st_lr;
   2554         case LWU:
   2555             check_insn(ctx, ISA_MIPS3);
   2556             check_mips_64(ctx);
   2557             mips32_op = OPC_LWU;
   2558             goto do_ld_lr;
   2559         case LLD:
   2560             check_insn(ctx, ISA_MIPS3);
   2561             check_mips_64(ctx);
   2562             mips32_op = OPC_LLD;
   2563             goto do_ld_lr;
   2564 #endif
   2565         case LL:
   2566             mips32_op = OPC_LL;
   2567             goto do_ld_lr;
   2568         do_ld_lr:
   2569             gen_ld(ctx, mips32_op, rt, rs, offset);
   2570             break;
   2571         do_st_lr:
   2572             gen_st(ctx, mips32_op, rt, rs, offset);
   2573             break;
   2574         case SC:
   2575             gen_st_cond(ctx, rt, rs, offset, MO_TESL, false);
   2576             break;
   2577 #if defined(TARGET_MIPS64)
   2578         case SCD:
   2579             check_insn(ctx, ISA_MIPS3);
   2580             check_mips_64(ctx);
   2581             gen_st_cond(ctx, rt, rs, offset, MO_TEUQ, false);
   2582             break;
   2583 #endif
   2584         case LD_EVA:
   2585             if (!ctx->eva) {
   2586                 MIPS_INVAL("pool32c ld-eva");
   2587                 gen_reserved_instruction(ctx);
   2588                 break;
   2589             }
   2590             check_cp0_enabled(ctx);
   2591 
   2592             minor2 = (ctx->opcode >> 9) & 0x7;
   2593             offset = sextract32(ctx->opcode, 0, 9);
   2594             switch (minor2) {
   2595             case LBUE:
   2596                 mips32_op = OPC_LBUE;
   2597                 goto do_ld_lr;
   2598             case LHUE:
   2599                 mips32_op = OPC_LHUE;
   2600                 goto do_ld_lr;
   2601             case LWLE:
   2602                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2603                 mips32_op = OPC_LWLE;
   2604                 goto do_ld_lr;
   2605             case LWRE:
   2606                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2607                 mips32_op = OPC_LWRE;
   2608                 goto do_ld_lr;
   2609             case LBE:
   2610                 mips32_op = OPC_LBE;
   2611                 goto do_ld_lr;
   2612             case LHE:
   2613                 mips32_op = OPC_LHE;
   2614                 goto do_ld_lr;
   2615             case LLE:
   2616                 mips32_op = OPC_LLE;
   2617                 goto do_ld_lr;
   2618             case LWE:
   2619                 mips32_op = OPC_LWE;
   2620                 goto do_ld_lr;
   2621             };
   2622             break;
   2623         case ST_EVA:
   2624             if (!ctx->eva) {
   2625                 MIPS_INVAL("pool32c st-eva");
   2626                 gen_reserved_instruction(ctx);
   2627                 break;
   2628             }
   2629             check_cp0_enabled(ctx);
   2630 
   2631             minor2 = (ctx->opcode >> 9) & 0x7;
   2632             offset = sextract32(ctx->opcode, 0, 9);
   2633             switch (minor2) {
   2634             case SWLE:
   2635                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2636                 mips32_op = OPC_SWLE;
   2637                 goto do_st_lr;
   2638             case SWRE:
   2639                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2640                 mips32_op = OPC_SWRE;
   2641                 goto do_st_lr;
   2642             case PREFE:
   2643                 /* Treat as no-op */
   2644                 if ((ctx->insn_flags & ISA_MIPS_R6) && (rt >= 24)) {
   2645                     /* hint codes 24-31 are reserved and signal RI */
   2646                     generate_exception(ctx, EXCP_RI);
   2647                 }
   2648                 break;
   2649             case CACHEE:
   2650                 /* Treat as no-op */
   2651                 if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
   2652                     gen_cache_operation(ctx, rt, rs, offset);
   2653                 }
   2654                 break;
   2655             case SBE:
   2656                 mips32_op = OPC_SBE;
   2657                 goto do_st_lr;
   2658             case SHE:
   2659                 mips32_op = OPC_SHE;
   2660                 goto do_st_lr;
   2661             case SCE:
   2662                 gen_st_cond(ctx, rt, rs, offset, MO_TESL, true);
   2663                 break;
   2664             case SWE:
   2665                 mips32_op = OPC_SWE;
   2666                 goto do_st_lr;
   2667             };
   2668             break;
   2669         case PREF:
   2670             /* Treat as no-op */
   2671             if ((ctx->insn_flags & ISA_MIPS_R6) && (rt >= 24)) {
   2672                 /* hint codes 24-31 are reserved and signal RI */
   2673                 generate_exception(ctx, EXCP_RI);
   2674             }
   2675             break;
   2676         default:
   2677             MIPS_INVAL("pool32c");
   2678             gen_reserved_instruction(ctx);
   2679             break;
   2680         }
   2681         break;
   2682     case ADDI32: /* AUI, LUI */
   2683         if (ctx->insn_flags & ISA_MIPS_R6) {
   2684             /* AUI, LUI */
   2685             gen_logic_imm(ctx, OPC_LUI, rt, rs, imm);
   2686         } else {
   2687             /* ADDI32 */
   2688             mips32_op = OPC_ADDI;
   2689             goto do_addi;
   2690         }
   2691         break;
   2692     case ADDIU32:
   2693         mips32_op = OPC_ADDIU;
   2694     do_addi:
   2695         gen_arith_imm(ctx, mips32_op, rt, rs, imm);
   2696         break;
   2697 
   2698         /* Logical operations */
   2699     case ORI32:
   2700         mips32_op = OPC_ORI;
   2701         goto do_logici;
   2702     case XORI32:
   2703         mips32_op = OPC_XORI;
   2704         goto do_logici;
   2705     case ANDI32:
   2706         mips32_op = OPC_ANDI;
   2707     do_logici:
   2708         gen_logic_imm(ctx, mips32_op, rt, rs, imm);
   2709         break;
   2710 
   2711         /* Set less than immediate */
   2712     case SLTI32:
   2713         mips32_op = OPC_SLTI;
   2714         goto do_slti;
   2715     case SLTIU32:
   2716         mips32_op = OPC_SLTIU;
   2717     do_slti:
   2718         gen_slt_imm(ctx, mips32_op, rt, rs, imm);
   2719         break;
   2720     case JALX32:
   2721         check_insn_opc_removed(ctx, ISA_MIPS_R6);
   2722         offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
   2723         gen_compute_branch(ctx, OPC_JALX, 4, rt, rs, offset, 4);
   2724         ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
   2725         break;
   2726     case JALS32: /* BOVC, BEQC, BEQZALC */
   2727         if (ctx->insn_flags & ISA_MIPS_R6) {
   2728             if (rs >= rt) {
   2729                 /* BOVC */
   2730                 mips32_op = OPC_BOVC;
   2731             } else if (rs < rt && rs == 0) {
   2732                 /* BEQZALC */
   2733                 mips32_op = OPC_BEQZALC;
   2734             } else {
   2735                 /* BEQC */
   2736                 mips32_op = OPC_BEQC;
   2737             }
   2738             gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
   2739         } else {
   2740             /* JALS32 */
   2741             offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 1;
   2742             gen_compute_branch(ctx, OPC_JAL, 4, rt, rs, offset, 2);
   2743             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
   2744         }
   2745         break;
   2746     case BEQ32: /* BC */
   2747         if (ctx->insn_flags & ISA_MIPS_R6) {
   2748             /* BC */
   2749             gen_compute_compact_branch(ctx, OPC_BC, 0, 0,
   2750                                        sextract32(ctx->opcode << 1, 0, 27));
   2751         } else {
   2752             /* BEQ32 */
   2753             gen_compute_branch(ctx, OPC_BEQ, 4, rt, rs, imm << 1, 4);
   2754         }
   2755         break;
   2756     case BNE32: /* BALC */
   2757         if (ctx->insn_flags & ISA_MIPS_R6) {
   2758             /* BALC */
   2759             gen_compute_compact_branch(ctx, OPC_BALC, 0, 0,
   2760                                        sextract32(ctx->opcode << 1, 0, 27));
   2761         } else {
   2762             /* BNE32 */
   2763             gen_compute_branch(ctx, OPC_BNE, 4, rt, rs, imm << 1, 4);
   2764         }
   2765         break;
   2766     case J32: /* BGTZC, BLTZC, BLTC */
   2767         if (ctx->insn_flags & ISA_MIPS_R6) {
   2768             if (rs == 0 && rt != 0) {
   2769                 /* BGTZC */
   2770                 mips32_op = OPC_BGTZC;
   2771             } else if (rs != 0 && rt != 0 && rs == rt) {
   2772                 /* BLTZC */
   2773                 mips32_op = OPC_BLTZC;
   2774             } else {
   2775                 /* BLTC */
   2776                 mips32_op = OPC_BLTC;
   2777             }
   2778             gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
   2779         } else {
   2780             /* J32 */
   2781             gen_compute_branch(ctx, OPC_J, 4, rt, rs,
   2782                                (int32_t)(ctx->opcode & 0x3FFFFFF) << 1, 4);
   2783         }
   2784         break;
   2785     case JAL32: /* BLEZC, BGEZC, BGEC */
   2786         if (ctx->insn_flags & ISA_MIPS_R6) {
   2787             if (rs == 0 && rt != 0) {
   2788                 /* BLEZC */
   2789                 mips32_op = OPC_BLEZC;
   2790             } else if (rs != 0 && rt != 0 && rs == rt) {
   2791                 /* BGEZC */
   2792                 mips32_op = OPC_BGEZC;
   2793             } else {
   2794                 /* BGEC */
   2795                 mips32_op = OPC_BGEC;
   2796             }
   2797             gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
   2798         } else {
   2799             /* JAL32 */
   2800             gen_compute_branch(ctx, OPC_JAL, 4, rt, rs,
   2801                                (int32_t)(ctx->opcode & 0x3FFFFFF) << 1, 4);
   2802             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
   2803         }
   2804         break;
   2805         /* Floating point (COP1) */
   2806     case LWC132:
   2807         mips32_op = OPC_LWC1;
   2808         goto do_cop1;
   2809     case LDC132:
   2810         mips32_op = OPC_LDC1;
   2811         goto do_cop1;
   2812     case SWC132:
   2813         mips32_op = OPC_SWC1;
   2814         goto do_cop1;
   2815     case SDC132:
   2816         mips32_op = OPC_SDC1;
   2817     do_cop1:
   2818         gen_cop1_ldst(ctx, mips32_op, rt, rs, imm);
   2819         break;
   2820     case ADDIUPC: /* PCREL: ADDIUPC, AUIPC, ALUIPC, LWPC */
   2821         if (ctx->insn_flags & ISA_MIPS_R6) {
   2822             /* PCREL: ADDIUPC, AUIPC, ALUIPC, LWPC */
   2823             switch ((ctx->opcode >> 16) & 0x1f) {
   2824             case ADDIUPC_00:
   2825             case ADDIUPC_01:
   2826             case ADDIUPC_02:
   2827             case ADDIUPC_03:
   2828             case ADDIUPC_04:
   2829             case ADDIUPC_05:
   2830             case ADDIUPC_06:
   2831             case ADDIUPC_07:
   2832                 gen_pcrel(ctx, OPC_ADDIUPC, ctx->base.pc_next & ~0x3, rt);
   2833                 break;
   2834             case AUIPC:
   2835                 gen_pcrel(ctx, OPC_AUIPC, ctx->base.pc_next, rt);
   2836                 break;
   2837             case ALUIPC:
   2838                 gen_pcrel(ctx, OPC_ALUIPC, ctx->base.pc_next, rt);
   2839                 break;
   2840             case LWPC_08:
   2841             case LWPC_09:
   2842             case LWPC_0A:
   2843             case LWPC_0B:
   2844             case LWPC_0C:
   2845             case LWPC_0D:
   2846             case LWPC_0E:
   2847             case LWPC_0F:
   2848                 gen_pcrel(ctx, R6_OPC_LWPC, ctx->base.pc_next & ~0x3, rt);
   2849                 break;
   2850             default:
   2851                 generate_exception(ctx, EXCP_RI);
   2852                 break;
   2853             }
   2854         } else {
   2855             /* ADDIUPC */
   2856             int reg = mmreg(ZIMM(ctx->opcode, 23, 3));
   2857             offset = SIMM(ctx->opcode, 0, 23) << 2;
   2858 
   2859             gen_addiupc(ctx, reg, offset, 0, 0);
   2860         }
   2861         break;
   2862     case BNVC: /* BNEC, BNEZALC */
   2863         check_insn(ctx, ISA_MIPS_R6);
   2864         if (rs >= rt) {
   2865             /* BNVC */
   2866             mips32_op = OPC_BNVC;
   2867         } else if (rs < rt && rs == 0) {
   2868             /* BNEZALC */
   2869             mips32_op = OPC_BNEZALC;
   2870         } else {
   2871             /* BNEC */
   2872             mips32_op = OPC_BNEC;
   2873         }
   2874         gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
   2875         break;
   2876     case R6_BNEZC: /* JIALC */
   2877         check_insn(ctx, ISA_MIPS_R6);
   2878         if (rt != 0) {
   2879             /* BNEZC */
   2880             gen_compute_compact_branch(ctx, OPC_BNEZC, rt, 0,
   2881                                        sextract32(ctx->opcode << 1, 0, 22));
   2882         } else {
   2883             /* JIALC */
   2884             gen_compute_compact_branch(ctx, OPC_JIALC, 0, rs, imm);
   2885         }
   2886         break;
   2887     case R6_BEQZC: /* JIC */
   2888         check_insn(ctx, ISA_MIPS_R6);
   2889         if (rt != 0) {
   2890             /* BEQZC */
   2891             gen_compute_compact_branch(ctx, OPC_BEQZC, rt, 0,
   2892                                        sextract32(ctx->opcode << 1, 0, 22));
   2893         } else {
   2894             /* JIC */
   2895             gen_compute_compact_branch(ctx, OPC_JIC, 0, rs, imm);
   2896         }
   2897         break;
   2898     case BLEZALC: /* BGEZALC, BGEUC */
   2899         check_insn(ctx, ISA_MIPS_R6);
   2900         if (rs == 0 && rt != 0) {
   2901             /* BLEZALC */
   2902             mips32_op = OPC_BLEZALC;
   2903         } else if (rs != 0 && rt != 0 && rs == rt) {
   2904             /* BGEZALC */
   2905             mips32_op = OPC_BGEZALC;
   2906         } else {
   2907             /* BGEUC */
   2908             mips32_op = OPC_BGEUC;
   2909         }
   2910         gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
   2911         break;
   2912     case BGTZALC: /* BLTZALC, BLTUC */
   2913         check_insn(ctx, ISA_MIPS_R6);
   2914         if (rs == 0 && rt != 0) {
   2915             /* BGTZALC */
   2916             mips32_op = OPC_BGTZALC;
   2917         } else if (rs != 0 && rt != 0 && rs == rt) {
   2918             /* BLTZALC */
   2919             mips32_op = OPC_BLTZALC;
   2920         } else {
   2921             /* BLTUC */
   2922             mips32_op = OPC_BLTUC;
   2923         }
   2924         gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
   2925         break;
   2926         /* Loads and stores */
   2927     case LB32:
   2928         mips32_op = OPC_LB;
   2929         goto do_ld;
   2930     case LBU32:
   2931         mips32_op = OPC_LBU;
   2932         goto do_ld;
   2933     case LH32:
   2934         mips32_op = OPC_LH;
   2935         goto do_ld;
   2936     case LHU32:
   2937         mips32_op = OPC_LHU;
   2938         goto do_ld;
   2939     case LW32:
   2940         mips32_op = OPC_LW;
   2941         goto do_ld;
   2942 #ifdef TARGET_MIPS64
   2943     case LD32:
   2944         check_insn(ctx, ISA_MIPS3);
   2945         check_mips_64(ctx);
   2946         mips32_op = OPC_LD;
   2947         goto do_ld;
   2948     case SD32:
   2949         check_insn(ctx, ISA_MIPS3);
   2950         check_mips_64(ctx);
   2951         mips32_op = OPC_SD;
   2952         goto do_st;
   2953 #endif
   2954     case SB32:
   2955         mips32_op = OPC_SB;
   2956         goto do_st;
   2957     case SH32:
   2958         mips32_op = OPC_SH;
   2959         goto do_st;
   2960     case SW32:
   2961         mips32_op = OPC_SW;
   2962         goto do_st;
   2963     do_ld:
   2964         gen_ld(ctx, mips32_op, rt, rs, imm);
   2965         break;
   2966     do_st:
   2967         gen_st(ctx, mips32_op, rt, rs, imm);
   2968         break;
   2969     default:
   2970         gen_reserved_instruction(ctx);
   2971         break;
   2972     }
   2973 }
   2974 
   2975 static int decode_isa_micromips(CPUMIPSState *env, DisasContext *ctx)
   2976 {
   2977     uint32_t op;
   2978 
   2979     /* make sure instructions are on a halfword boundary */
   2980     if (ctx->base.pc_next & 0x1) {
   2981         env->CP0_BadVAddr = ctx->base.pc_next;
   2982         generate_exception_end(ctx, EXCP_AdEL);
   2983         return 2;
   2984     }
   2985 
   2986     op = (ctx->opcode >> 10) & 0x3f;
   2987     /* Enforce properly-sized instructions in a delay slot */
   2988     if (ctx->hflags & MIPS_HFLAG_BDS_STRICT) {
   2989         switch (op & 0x7) { /* MSB-3..MSB-5 */
   2990         case 0:
   2991         /* POOL32A, POOL32B, POOL32I, POOL32C */
   2992         case 4:
   2993         /* ADDI32, ADDIU32, ORI32, XORI32, SLTI32, SLTIU32, ANDI32, JALX32 */
   2994         case 5:
   2995         /* LBU32, LHU32, POOL32F, JALS32, BEQ32, BNE32, J32, JAL32 */
   2996         case 6:
   2997         /* SB32, SH32, ADDIUPC, SWC132, SDC132, SW32 */
   2998         case 7:
   2999         /* LB32, LH32, LWC132, LDC132, LW32 */
   3000             if (ctx->hflags & MIPS_HFLAG_BDS16) {
   3001                 gen_reserved_instruction(ctx);
   3002                 return 2;
   3003             }
   3004             break;
   3005         case 1:
   3006         /* POOL16A, POOL16B, POOL16C, LWGP16, POOL16F */
   3007         case 2:
   3008         /* LBU16, LHU16, LWSP16, LW16, SB16, SH16, SWSP16, SW16 */
   3009         case 3:
   3010         /* MOVE16, ANDI16, POOL16D, POOL16E, BEQZ16, BNEZ16, B16, LI16 */
   3011             if (ctx->hflags & MIPS_HFLAG_BDS32) {
   3012                 gen_reserved_instruction(ctx);
   3013                 return 2;
   3014             }
   3015             break;
   3016         }
   3017     }
   3018 
   3019     switch (op) {
   3020     case POOL16A:
   3021         {
   3022             int rd = mmreg(uMIPS_RD(ctx->opcode));
   3023             int rs1 = mmreg(uMIPS_RS1(ctx->opcode));
   3024             int rs2 = mmreg(uMIPS_RS2(ctx->opcode));
   3025             uint32_t opc = 0;
   3026 
   3027             switch (ctx->opcode & 0x1) {
   3028             case ADDU16:
   3029                 opc = OPC_ADDU;
   3030                 break;
   3031             case SUBU16:
   3032                 opc = OPC_SUBU;
   3033                 break;
   3034             }
   3035             if (ctx->insn_flags & ISA_MIPS_R6) {
   3036                 /*
   3037                  * In the Release 6, the register number location in
   3038                  * the instruction encoding has changed.
   3039                  */
   3040                 gen_arith(ctx, opc, rs1, rd, rs2);
   3041             } else {
   3042                 gen_arith(ctx, opc, rd, rs1, rs2);
   3043             }
   3044         }
   3045         break;
   3046     case POOL16B:
   3047         {
   3048             int rd = mmreg(uMIPS_RD(ctx->opcode));
   3049             int rs = mmreg(uMIPS_RS(ctx->opcode));
   3050             int amount = (ctx->opcode >> 1) & 0x7;
   3051             uint32_t opc = 0;
   3052             amount = amount == 0 ? 8 : amount;
   3053 
   3054             switch (ctx->opcode & 0x1) {
   3055             case SLL16:
   3056                 opc = OPC_SLL;
   3057                 break;
   3058             case SRL16:
   3059                 opc = OPC_SRL;
   3060                 break;
   3061             }
   3062 
   3063             gen_shift_imm(ctx, opc, rd, rs, amount);
   3064         }
   3065         break;
   3066     case POOL16C:
   3067         if (ctx->insn_flags & ISA_MIPS_R6) {
   3068             gen_pool16c_r6_insn(ctx);
   3069         } else {
   3070             gen_pool16c_insn(ctx);
   3071         }
   3072         break;
   3073     case LWGP16:
   3074         {
   3075             int rd = mmreg(uMIPS_RD(ctx->opcode));
   3076             int rb = 28;            /* GP */
   3077             int16_t offset = SIMM(ctx->opcode, 0, 7) << 2;
   3078 
   3079             gen_ld(ctx, OPC_LW, rd, rb, offset);
   3080         }
   3081         break;
   3082     case POOL16F:
   3083         check_insn_opc_removed(ctx, ISA_MIPS_R6);
   3084         if (ctx->opcode & 1) {
   3085             gen_reserved_instruction(ctx);
   3086         } else {
   3087             /* MOVEP */
   3088             int enc_dest = uMIPS_RD(ctx->opcode);
   3089             int enc_rt = uMIPS_RS2(ctx->opcode);
   3090             int enc_rs = uMIPS_RS1(ctx->opcode);
   3091             gen_movep(ctx, enc_dest, enc_rt, enc_rs);
   3092         }
   3093         break;
   3094     case LBU16:
   3095         {
   3096             int rd = mmreg(uMIPS_RD(ctx->opcode));
   3097             int rb = mmreg(uMIPS_RS(ctx->opcode));
   3098             int16_t offset = ZIMM(ctx->opcode, 0, 4);
   3099             offset = (offset == 0xf ? -1 : offset);
   3100 
   3101             gen_ld(ctx, OPC_LBU, rd, rb, offset);
   3102         }
   3103         break;
   3104     case LHU16:
   3105         {
   3106             int rd = mmreg(uMIPS_RD(ctx->opcode));
   3107             int rb = mmreg(uMIPS_RS(ctx->opcode));
   3108             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 1;
   3109 
   3110             gen_ld(ctx, OPC_LHU, rd, rb, offset);
   3111         }
   3112         break;
   3113     case LWSP16:
   3114         {
   3115             int rd = (ctx->opcode >> 5) & 0x1f;
   3116             int rb = 29;            /* SP */
   3117             int16_t offset = ZIMM(ctx->opcode, 0, 5) << 2;
   3118 
   3119             gen_ld(ctx, OPC_LW, rd, rb, offset);
   3120         }
   3121         break;
   3122     case LW16:
   3123         {
   3124             int rd = mmreg(uMIPS_RD(ctx->opcode));
   3125             int rb = mmreg(uMIPS_RS(ctx->opcode));
   3126             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 2;
   3127 
   3128             gen_ld(ctx, OPC_LW, rd, rb, offset);
   3129         }
   3130         break;
   3131     case SB16:
   3132         {
   3133             int rd = mmreg2(uMIPS_RD(ctx->opcode));
   3134             int rb = mmreg(uMIPS_RS(ctx->opcode));
   3135             int16_t offset = ZIMM(ctx->opcode, 0, 4);
   3136 
   3137             gen_st(ctx, OPC_SB, rd, rb, offset);
   3138         }
   3139         break;
   3140     case SH16:
   3141         {
   3142             int rd = mmreg2(uMIPS_RD(ctx->opcode));
   3143             int rb = mmreg(uMIPS_RS(ctx->opcode));
   3144             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 1;
   3145 
   3146             gen_st(ctx, OPC_SH, rd, rb, offset);
   3147         }
   3148         break;
   3149     case SWSP16:
   3150         {
   3151             int rd = (ctx->opcode >> 5) & 0x1f;
   3152             int rb = 29;            /* SP */
   3153             int16_t offset = ZIMM(ctx->opcode, 0, 5) << 2;
   3154 
   3155             gen_st(ctx, OPC_SW, rd, rb, offset);
   3156         }
   3157         break;
   3158     case SW16:
   3159         {
   3160             int rd = mmreg2(uMIPS_RD(ctx->opcode));
   3161             int rb = mmreg(uMIPS_RS(ctx->opcode));
   3162             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 2;
   3163 
   3164             gen_st(ctx, OPC_SW, rd, rb, offset);
   3165         }
   3166         break;
   3167     case MOVE16:
   3168         {
   3169             int rd = uMIPS_RD5(ctx->opcode);
   3170             int rs = uMIPS_RS5(ctx->opcode);
   3171 
   3172             gen_arith(ctx, OPC_ADDU, rd, rs, 0);
   3173         }
   3174         break;
   3175     case ANDI16:
   3176         gen_andi16(ctx);
   3177         break;
   3178     case POOL16D:
   3179         switch (ctx->opcode & 0x1) {
   3180         case ADDIUS5:
   3181             gen_addius5(ctx);
   3182             break;
   3183         case ADDIUSP:
   3184             gen_addiusp(ctx);
   3185             break;
   3186         }
   3187         break;
   3188     case POOL16E:
   3189         switch (ctx->opcode & 0x1) {
   3190         case ADDIUR2:
   3191             gen_addiur2(ctx);
   3192             break;
   3193         case ADDIUR1SP:
   3194             gen_addiur1sp(ctx);
   3195             break;
   3196         }
   3197         break;
   3198     case B16: /* BC16 */
   3199         gen_compute_branch(ctx, OPC_BEQ, 2, 0, 0,
   3200                            sextract32(ctx->opcode, 0, 10) << 1,
   3201                            (ctx->insn_flags & ISA_MIPS_R6) ? 0 : 4);
   3202         break;
   3203     case BNEZ16: /* BNEZC16 */
   3204     case BEQZ16: /* BEQZC16 */
   3205         gen_compute_branch(ctx, op == BNEZ16 ? OPC_BNE : OPC_BEQ, 2,
   3206                            mmreg(uMIPS_RD(ctx->opcode)),
   3207                            0, sextract32(ctx->opcode, 0, 7) << 1,
   3208                            (ctx->insn_flags & ISA_MIPS_R6) ? 0 : 4);
   3209 
   3210         break;
   3211     case LI16:
   3212         {
   3213             int reg = mmreg(uMIPS_RD(ctx->opcode));
   3214             int imm = ZIMM(ctx->opcode, 0, 7);
   3215 
   3216             imm = (imm == 0x7f ? -1 : imm);
   3217             tcg_gen_movi_tl(cpu_gpr[reg], imm);
   3218         }
   3219         break;
   3220     case RES_29:
   3221     case RES_31:
   3222     case RES_39:
   3223         gen_reserved_instruction(ctx);
   3224         break;
   3225     default:
   3226         decode_micromips32_opc(env, ctx);
   3227         return 4;
   3228     }
   3229 
   3230     return 2;
   3231 }