cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

micromips_translate.c.inc (94599B)


      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
     24enum {
     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 */
    127enum {
    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
    150enum {
    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
    216enum {
    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
    323enum {
    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
    339enum {
    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
    360enum {
    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
    373enum {
    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
    386enum {
    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
    464enum {
    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
    502enum {
    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
    539enum {
    540    ADDU16 = 0x0,
    541    SUBU16 = 0x1
    542};
    543
    544/* POOL16B encoding of minor opcode field */
    545
    546enum {
    547    SLL16 = 0x0,
    548    SRL16 = 0x1
    549};
    550
    551/* POOL16C encoding of minor opcode field */
    552
    553enum {
    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
    573enum {
    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
    597enum {
    598    ADDIUS5 = 0x0,
    599    ADDIUSP = 0x1
    600};
    601
    602/* POOL16E encoding of minor opcode field */
    603
    604enum {
    605    ADDIUR2 = 0x0,
    606    ADDIUR1SP = 0x1
    607};
    608
    609static 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.  */
    617static 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
    639static 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
    646static 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
    655static 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
    673static 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
    681static 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
    692static 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
    733static 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_end(ctx, EXCP_BREAK);
    826        break;
    827    case SDBBP16:
    828        if (is_uhi(extract32(ctx->opcode, 0, 4))) {
    829            gen_helper_do_semihosting(cpu_env);
    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
    857static 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
    871static 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(ctx, EXCP_BREAK);
    941            break;
    942        case R6_SDBBP16:
    943            /* SDBBP16 */
    944            if (is_uhi(extract32(ctx->opcode, 6, 4))) {
    945                gen_helper_do_semihosting(cpu_env);
    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
    962static 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_TEQ);
   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_TEQ);
   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_TEQ);
   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_TEQ);
   1018        break;
   1019#endif
   1020    }
   1021    tcg_temp_free(t0);
   1022    tcg_temp_free(t1);
   1023}
   1024
   1025static 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);
   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(extract32(ctx->opcode, 16, 10))) {
   1314                gen_helper_do_semihosting(cpu_env);
   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
   1373static 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
   1621static 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_end(ctx, EXCP_BREAK);
   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);
   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_TEQ, 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
   2975static 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}