daily update
[binutils-gdb.git] / opcodes / micromips-opc.c
index f4978db7b0ae8cc82f8dd75429fb6028519dd0ca..5e71dfb5f911dd538ec3cbdee193679acae9bca2 100644 (file)
@@ -1,5 +1,5 @@
 /* micromips-opc.c.  microMIPS opcode table.
-   Copyright 2008 Free Software Foundation, Inc.
+   Copyright 2008, 2012 Free Software Foundation, Inc.
    Contributed by Chao-ying Fu, MIPS Technologies, Inc.
 
    This file is part of the GNU opcodes library.
@@ -19,8 +19,8 @@
    Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
    MA 02110-1301, USA.  */
 
-#include <stdio.h>
 #include "sysdep.h"
+#include <stdio.h>
 #include "opcode/mips.h"
 
 #define UBD    INSN_UNCOND_BRANCH_DELAY
 /* For 16-bit/32-bit microMIPS instructions.  They are used in pinfo2.  */
 #define UBR    INSN2_UNCOND_BRANCH
 #define CBR    INSN2_COND_BRANCH
-#define MOD_mb INSN2_MOD_GPR_MB
-#define MOD_mc INSN2_MOD_GPR_MC
-#define MOD_md INSN2_MOD_GPR_MD
-#define MOD_me INSN2_MOD_GPR_ME
-#define MOD_mf INSN2_MOD_GPR_MF
-#define MOD_mg INSN2_MOD_GPR_MG
-#define MOD_mhi        INSN2_MOD_GPR_MHI
-#define MOD_mj INSN2_MOD_GPR_MJ
-#define MOD_ml MOD_mc  /* Reuse, since the bit position is the same.  */
-#define MOD_mm INSN2_MOD_GPR_MM
-#define MOD_mn INSN2_MOD_GPR_MN
-#define MOD_mp INSN2_MOD_GPR_MP
-#define MOD_mq INSN2_MOD_GPR_MQ
-#define MOD_sp INSN2_MOD_SP
+#define WR_mb  INSN2_WRITE_GPR_MB
+#define RD_mc  INSN2_READ_GPR_MC
+#define RD_md  INSN2_MOD_GPR_MD
+#define WR_md  INSN2_MOD_GPR_MD
+#define RD_me  INSN2_READ_GPR_ME
+#define RD_mf  INSN2_MOD_GPR_MF
+#define WR_mf  INSN2_MOD_GPR_MF
+#define RD_mg  INSN2_READ_GPR_MG
+#define WR_mhi INSN2_WRITE_GPR_MHI
+#define RD_mj  INSN2_READ_GPR_MJ
+#define WR_mj  INSN2_WRITE_GPR_MJ
+#define RD_ml  RD_mc   /* Reuse, since the bit position is the same.  */
+#define RD_mmn INSN2_READ_GPR_MMN
+#define RD_mp  INSN2_READ_GPR_MP
+#define WR_mp  INSN2_WRITE_GPR_MP
+#define RD_mq  INSN2_READ_GPR_MQ
+#define RD_sp  INSN2_MOD_SP
+#define WR_sp  INSN2_MOD_SP
 #define RD_31  INSN2_READ_GPR_31
 #define RD_gp  INSN2_READ_GP
 #define RD_pc  INSN2_READ_PC
 
 /* For 32-bit microMIPS instructions.  */
-#define WR_s   INSN2_WRITE_GPR_S       /* Used in pinfo2.  */
+#define WR_s   INSN_WRITE_GPR_S
 #define WR_d   INSN_WRITE_GPR_D
 #define WR_t   INSN_WRITE_GPR_T
 #define WR_31  INSN_WRITE_GPR_31
 #define I1     INSN_ISA1
 #define I3     INSN_ISA3
 
+/* MIPS DSP ASE support.  */
+#define WR_a   WR_HILO         /* Write DSP accumulators (reuse WR_HILO).  */
+#define RD_a   RD_HILO         /* Read DSP accumulators (reuse RD_HILO).  */
+#define MOD_a  WR_a|RD_a
+#define DSP_VOLA INSN_NO_DELAY_SLOT
+#define D32    INSN_DSP
+#define D33    INSN_DSPR2
+
+/* MIPS MCU (MicroController) ASE support.  */
+#define MC     INSN_MCU
+
 const struct mips_opcode micromips_opcodes[] =
 {
 /* These instructions appear first so that the disassembler will find
    them first.  The assemblers uses a hash table based on the
    instruction name anyhow.  */
-/* name,    args,      match,      mask,       pinfo,                  pinfo2,         membership */
+/* name,    args,      match,      mask,       pinfo,                  pinfo2,         membership,     [exclusions] */
 {"pref",    "k,~(b)",  0x60002000, 0xfc00f000, RD_b,                   0,              I1      },
 {"pref",    "k,o(b)",  0,    (int) M_PREF_OB,  INSN_MACRO,             0,              I1      },
 {"pref",    "k,A(b)",  0,    (int) M_PREF_AB,  INSN_MACRO,             0,              I1      },
@@ -110,7 +125,7 @@ const struct mips_opcode micromips_opcodes[] =
 {"ssnop",   "",                0x00000800, 0xffffffff, 0,                      INSN2_ALIAS,    I1      }, /* sll */
 {"ehb",     "",                0x00001800, 0xffffffff, 0,                      INSN2_ALIAS,    I1      }, /* sll */
 {"pause",   "",                0x00002800, 0xffffffff, 0,                      INSN2_ALIAS,    I1      }, /* sll */
-{"li",      "md,mI",       0xec00,     0xfc00, 0,                      MOD_md,         I1      },
+{"li",      "md,mI",       0xec00,     0xfc00, 0,                      WR_md,          I1      },
 {"li",      "t,j",     0x30000000, 0xfc1f0000, WR_t,                   INSN2_ALIAS,    I1      }, /* addiu */
 {"li",      "t,i",     0x50000000, 0xfc1f0000, WR_t,                   INSN2_ALIAS,    I1      }, /* ori */
 #if 0
@@ -119,7 +134,7 @@ const struct mips_opcode micromips_opcodes[] =
 #endif
 {"li",      "t,I",     0,    (int) M_LI,       INSN_MACRO,             0,              I1      },
 {"move",    "d,s",     0,    (int) M_MOVE,     INSN_MACRO,             0,              I1      },
-{"move",    "mp,mj",       0x0c00,     0xfc00, 0,                      MOD_mp|MOD_mj,  I1      },
+{"move",    "mp,mj",       0x0c00,     0xfc00, 0,                      WR_mp|RD_mj,    I1      },
 {"move",    "d,s",     0x58000150, 0xffe007ff, WR_d|RD_s,              INSN2_ALIAS,    I3      }, /* daddu */
 {"move",    "d,s",     0x00000150, 0xffe007ff, WR_d|RD_s,              INSN2_ALIAS,    I1      }, /* addu */
 {"move",    "d,s",     0x00000290, 0xffe007ff, WR_d|RD_s,              INSN2_ALIAS,    I1      }, /* or */
@@ -134,38 +149,44 @@ const struct mips_opcode micromips_opcodes[] =
 {"abs.d",   "T,V",     0x5400237b, 0xfc00ffff, WR_T|RD_S|FP_D,         0,              I1      },
 {"abs.s",   "T,V",     0x5400037b, 0xfc00ffff, WR_T|RD_S|FP_S,         0,              I1      },
 {"abs.ps",  "T,V",     0x5400437b, 0xfc00ffff, WR_T|RD_S|FP_D,         0,              I1      },
+{"aclr",    "\\,~(b)", 0x2000b000, 0xff00f000, SM|RD_b|NODS,           0,              MC      },
+{"aclr",    "\\,o(b)", 0,    (int) M_ACLR_OB,  INSN_MACRO,             0,              MC      },
+{"aclr",    "\\,A(b)", 0,    (int) M_ACLR_AB,  INSN_MACRO,             0,              MC      },
 {"add",     "d,v,t",   0x00000110, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              I1      },
 {"add",     "t,r,I",   0,    (int) M_ADD_I,    INSN_MACRO,             0,              I1      },
 {"add.d",   "D,V,T",   0x54000130, 0xfc0007ff, WR_D|RD_S|RD_T|FP_D,    0,              I1      },
 {"add.s",   "D,V,T",   0x54000030, 0xfc0007ff, WR_D|RD_S|RD_T|FP_S,    0,              I1      },
 {"add.ps",  "D,V,T",   0x54000230, 0xfc0007ff, WR_D|RD_S|RD_T|FP_D,    0,              I1      },
 {"addi",    "t,r,j",   0x10000000, 0xfc000000, WR_t|RD_s,              0,              I1      },
-{"addiu",   "mp,mj,mZ",            0x0c00,     0xfc00, 0,                      MOD_mp|MOD_mj,  I1      }, /* move */
-{"addiu",   "md,ms,mW",            0x6c01,     0xfc01, 0,                      MOD_md|MOD_sp,  I1      }, /* addiur1sp */
-{"addiu",   "md,mc,mB",            0x6c00,     0xfc01, 0,                      MOD_md|MOD_mc,  I1      }, /* addiur2 */
-{"addiu",   "ms,mt,mY",            0x4c01,     0xfc01, 0,                      MOD_sp,         I1      }, /* addiusp */
-{"addiu",   "mp,mt,mX",            0x4c00,     0xfc01, 0,                      MOD_mp,         I1      }, /* addius5 */
-{"addiu",   "mb,mr,mQ",        0x78000000, 0xfc000000, 0,                      MOD_mb|RD_pc,   I1      }, /* addiupc */
+{"addiu",   "mp,mj,mZ",            0x0c00,     0xfc00, 0,                      WR_mp|RD_mj,    I1      }, /* move */
+{"addiu",   "md,ms,mW",            0x6c01,     0xfc01, 0,                      WR_md|RD_sp,    I1      }, /* addiur1sp */
+{"addiu",   "md,mc,mB",            0x6c00,     0xfc01, 0,                      WR_md|RD_mc,    I1      }, /* addiur2 */
+{"addiu",   "ms,mt,mY",            0x4c01,     0xfc01, 0,                      WR_sp|RD_sp,            I1      }, /* addiusp */
+{"addiu",   "mp,mt,mX",            0x4c00,     0xfc01, 0,                      WR_mp|RD_mp,            I1      }, /* addius5 */
+{"addiu",   "mb,mr,mQ",        0x78000000, 0xfc000000, 0,                      WR_mb|RD_pc,    I1      }, /* addiupc */
 {"addiu",   "t,r,j",   0x30000000, 0xfc000000, WR_t|RD_s,              0,              I1      },
-{"addiupc", "mb,mQ",   0x78000000, 0xfc000000, 0,                      MOD_mb|RD_pc,   I1      },
-{"addiur1sp", "md,mW",     0x6c01,     0xfc01, 0,                      MOD_md|MOD_sp,  I1      },
-{"addiur2", "md,mc,mB",            0x6c00,     0xfc01, 0,                      MOD_md|MOD_mc,  I1      },
-{"addiusp", "mY",          0x4c01,     0xfc01, 0,                      MOD_sp,         I1      },
-{"addius5", "mp,mX",       0x4c00,     0xfc01, 0,                      MOD_mp,         I1      },
-{"addu",    "mp,mj,mz",            0x0c00,     0xfc00, 0,                      MOD_mp|MOD_mj,  I1      }, /* move */
-{"addu",    "mp,mz,mj",            0x0c00,     0xfc00, 0,                      MOD_mp|MOD_mj,  I1      }, /* move */
-{"addu",    "md,me,ml",            0x0400,     0xfc01, 0,                      MOD_md|MOD_me|MOD_ml,   I1      },
+{"addiupc", "mb,mQ",   0x78000000, 0xfc000000, 0,                      WR_mb|RD_pc,    I1      },
+{"addiur1sp", "md,mW",     0x6c01,     0xfc01, 0,                      WR_md|RD_sp,    I1      },
+{"addiur2", "md,mc,mB",            0x6c00,     0xfc01, 0,                      WR_md|RD_mc,    I1      },
+{"addiusp", "mY",          0x4c01,     0xfc01, 0,                      WR_sp|RD_sp,            I1      },
+{"addius5", "mp,mX",       0x4c00,     0xfc01, 0,                      WR_mp|RD_mp,            I1      },
+{"addu",    "mp,mj,mz",            0x0c00,     0xfc00, 0,                      WR_mp|RD_mj,    I1      }, /* move */
+{"addu",    "mp,mz,mj",            0x0c00,     0xfc00, 0,                      WR_mp|RD_mj,    I1      }, /* move */
+{"addu",    "md,me,ml",            0x0400,     0xfc01, 0,                      WR_md|RD_me|RD_ml,      I1      },
 {"addu",    "d,v,t",   0x00000150, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              I1      },
 {"addu",    "t,r,I",   0,    (int) M_ADDU_I,   INSN_MACRO,             0,              I1      },
-/* We have no flag to mark the read from "y", so we use TRAP to disable
+/* We have no flag to mark the read from "y", so we use NODS to disable
    delay slot scheduling of ALNV.PS altogether.  */
-{"alnv.ps", "D,V,T,y", 0x54000019, 0xfc00003f, TRAP|WR_D|RD_S|RD_T|FP_D, 0,            I1      },
-{"and",     "mf,mt,mg",            0x4480,     0xffc0, 0,                      MOD_mf|MOD_mg,  I1      },
-{"and",     "mf,mg,mx",            0x4480,     0xffc0, 0,                      MOD_mf|MOD_mg,  I1      },
+{"alnv.ps", "D,V,T,y", 0x54000019, 0xfc00003f, NODS|WR_D|RD_S|RD_T|FP_D, 0,            I1      },
+{"and",     "mf,mt,mg",            0x4480,     0xffc0, 0,                      WR_mf|RD_mf|RD_mg,      I1      },
+{"and",     "mf,mg,mx",            0x4480,     0xffc0, 0,                      WR_mf|RD_mf|RD_mg,      I1      },
 {"and",     "d,v,t",   0x00000250, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              I1      },
 {"and",     "t,r,I",   0,    (int) M_AND_I,    INSN_MACRO,             0,              I1      },
-{"andi",    "md,mc,mC",            0x2c00,     0xfc00, 0,                      MOD_md|MOD_mc,  I1      },
+{"andi",    "md,mc,mC",            0x2c00,     0xfc00, 0,                      WR_md|RD_mc,    I1      },
 {"andi",    "t,r,i",   0xd0000000, 0xfc000000, WR_t|RD_s,              0,              I1      },
+{"aset",    "\\,~(b)", 0x20003000, 0xff00f000, SM|RD_b|NODS,           0,              MC      },
+{"aset",    "\\,o(b)", 0,    (int) M_ASET_OB,  INSN_MACRO,             0,              MC      },
+{"aset",    "\\,A(b)", 0,    (int) M_ASET_AB,  INSN_MACRO,             0,              MC      },
 /* b is at the top of the table.  */
 /* bal is at the top of the table.  */
 {"bc1f",    "p",       0x43800000, 0xffff0000, CBD|RD_CC|FP_S,         0,              I1      },
@@ -184,12 +205,12 @@ const struct mips_opcode micromips_opcodes[] =
 {"bc2t",    "N,p",     0x42a00000, 0xffe30000, CBD|RD_CC,              0,              I1      },
 {"bc2tl",   "p",       0,    (int) M_BC2TL,    INSN_MACRO,             0,              I1      },
 {"bc2tl",   "N,p",     0,    (int) M_BC2TL,    INSN_MACRO,             0,              I1      },
-{"beqz",    "md,mE",       0x8c00,     0xfc00, CBD,                    MOD_md,         I1      },
+{"beqz",    "md,mE",       0x8c00,     0xfc00, CBD,                    RD_md,          I1      },
 {"beqz",    "s,p",     0x94000000, 0xffe00000, CBD|RD_s,               0,              I1      },
 {"beqzc",   "s,p",     0x40e00000, 0xffe00000, NODS|RD_s,              CBR,            I1      },
 {"beqzl",   "s,p",     0,    (int) M_BEQL,     INSN_MACRO,             0,              I1      },
-{"beq",     "md,mz,mE",            0x8c00,     0xfc00, CBD,                    MOD_md,         I1      }, /* beqz */
-{"beq",     "mz,md,mE",            0x8c00,     0xfc00, CBD,                    MOD_md,         I1      }, /* beqz */
+{"beq",     "md,mz,mE",            0x8c00,     0xfc00, CBD,                    RD_md,          I1      }, /* beqz */
+{"beq",     "mz,md,mE",            0x8c00,     0xfc00, CBD,                    RD_md,          I1      }, /* beqz */
 {"beq",     "s,t,p",   0x94000000, 0xfc000000, CBD|RD_s|RD_t,          0,              I1      },
 {"beq",     "s,I,p",   0,    (int) M_BEQ_I,    INSN_MACRO,             0,              I1      },
 {"beql",    "s,t,p",   0,    (int) M_BEQL,     INSN_MACRO,             0,              I1      },
@@ -240,12 +261,12 @@ const struct mips_opcode micromips_opcodes[] =
 {"bltzal",  "s,p",     0x40200000, 0xffe00000, CBD|RD_s|WR_31,         BD32,           I1      },
 {"bltzals", "s,p",     0x42200000, 0xffe00000, CBD|RD_s|WR_31,         BD16,           I1      },
 {"bltzall", "s,p",     0,    (int) M_BLTZALL,  INSN_MACRO,             0,              I1      },
-{"bnez",    "md,mE",       0xac00,     0xfc00, CBD,                    MOD_md,         I1      },
+{"bnez",    "md,mE",       0xac00,     0xfc00, CBD,                    RD_md,          I1      },
 {"bnez",    "s,p",     0xb4000000, 0xffe00000, CBD|RD_s,               0,              I1      },
 {"bnezc",   "s,p",     0x40a00000, 0xffe00000, NODS|RD_s,              CBR,            I1      },
 {"bnezl",   "s,p",     0,    (int) M_BNEL,     INSN_MACRO,             0,              I1      },
-{"bne",     "md,mz,mE",            0xac00,     0xfc00, CBD,                    MOD_md,         I1      }, /* bnez */
-{"bne",     "mz,md,mE",            0xac00,     0xfc00, CBD,                    MOD_md,         I1      }, /* bnez */
+{"bne",     "md,mz,mE",            0xac00,     0xfc00, CBD,                    RD_md,          I1      }, /* bnez */
+{"bne",     "mz,md,mE",            0xac00,     0xfc00, CBD,                    RD_md,          I1      }, /* bnez */
 {"bne",     "s,t,p",   0xb4000000, 0xfc000000, CBD|RD_s|RD_t,          0,              I1      },
 {"bne",     "s,I,p",   0,    (int) M_BNE_I,    INSN_MACRO,             0,              I1      },
 {"bnel",    "s,t,p",   0,    (int) M_BNEL,     INSN_MACRO,             0,              I1      },
@@ -405,8 +426,8 @@ const struct mips_opcode micromips_opcodes[] =
 {"ddivu",   "z,t",     0x5800bb3c, 0xfc1fffff, RD_s|RD_t|WR_HILO,      0,              I3      },
 {"ddivu",   "d,v,t",   0,    (int) M_DDIVU_3,  INSN_MACRO,             0,              I3      },
 {"ddivu",   "d,v,I",   0,    (int) M_DDIVU_3I, INSN_MACRO,             0,              I3      },
-{"di",      "",                0x0000477c, 0xffffffff, RD_C0,                  WR_s,           I1      },
-{"di",      "s",       0x0000477c, 0xffe0ffff, RD_C0,                  WR_s,           I1      },
+{"di",      "",                0x0000477c, 0xffffffff, WR_s|RD_C0,             0,              I1      },
+{"di",      "s",       0x0000477c, 0xffe0ffff, WR_s|RD_C0,             0,              I1      },
 {"dins",    "t,r,I,+I",        0,    (int) M_DINS,     INSN_MACRO,             0,              I3      },
 {"dins",    "t,r,+A,+B",0x5800000c, 0xfc00003f, WR_t|RD_s,             0,              I3      },
 {"dinsm",   "t,r,+A,+F",0x58000004, 0xfc00003f, WR_t|RD_s,             0,              I3      },
@@ -495,8 +516,8 @@ const struct mips_opcode micromips_opcodes[] =
 {"dsub",    "d,v,I",   0,    (int) M_DSUB_I,   INSN_MACRO,             0,              I3      },
 {"dsubu",   "d,v,t",   0x580001d0, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              I3      },
 {"dsubu",   "d,v,I",   0,    (int) M_DSUBU_I,  INSN_MACRO,             0,              I3      },
-{"ei",      "",                0x0000577c, 0xffffffff, WR_C0,                  WR_s,           I1      },
-{"ei",      "s",       0x0000577c, 0xffe0ffff, WR_C0,                  WR_s,           I1      },
+{"ei",      "",                0x0000577c, 0xffffffff, WR_s|WR_C0,             0,              I1      },
+{"ei",      "s",       0x0000577c, 0xffe0ffff, WR_s|WR_C0,             0,              I1      },
 {"eret",    "",                0x0000f37c, 0xffffffff, NODS,                   0,              I1      },
 {"ext",     "t,r,+A,+C", 0x0000002c, 0xfc00003f, WR_t|RD_s,            0,              I1      },
 {"floor.l.d", "T,V",   0x5400433b, 0xfc00ffff, WR_T|RD_S|FP_D,         0,              I1      },
@@ -504,14 +525,15 @@ const struct mips_opcode micromips_opcodes[] =
 {"floor.w.d", "T,V",   0x54004b3b, 0xfc00ffff, WR_T|RD_S|FP_S|FP_D,    0,              I1      },
 {"floor.w.s", "T,V",   0x54000b3b, 0xfc00ffff, WR_T|RD_S|FP_S,         0,              I1      },
 {"ins",     "t,r,+A,+B", 0x0000000c, 0xfc00003f, WR_t|RD_s,            0,              I1      },
-{"jr",      "mj",          0x4580,     0xffe0, UBD,                    MOD_mj,         I1      },
+{"iret",    "",                0x0000d37c, 0xffffffff, NODS,                   0,              MC      },
+{"jr",      "mj",          0x4580,     0xffe0, UBD,                    RD_mj,          I1      },
 {"jr",      "s",       0x00000f3c, 0xffe0ffff, UBD|RD_s,               BD32,           I1      }, /* jalr */
 {"jrs",     "s",       0x00004f3c, 0xffe0ffff, UBD|RD_s,               BD16,           I1      }, /* jalrs */
-{"jraddiusp", "mP",        0x4700,     0xffe0, NODS,                   UBR|RD_31|MOD_sp,       I1      },
-{"jrc",     "mj",          0x45a0,     0xffe0, NODS,                   UBR|MOD_mj,             I1      },
+{"jraddiusp", "mP",        0x4700,     0xffe0, NODS,                   UBR|RD_31|WR_sp|RD_sp,  I1      },
+{"jrc",     "mj",          0x45a0,     0xffe0, NODS,                   UBR|RD_mj,              I1      },
 {"jr.hb",   "s",       0x00001f3c, 0xffe0ffff, UBD|RD_s,               BD32,           I1      }, /* jalr.hb */
 {"jrs.hb",  "s",       0x00005f3c, 0xffe0ffff, UBD|RD_s,               BD16,           I1      }, /* jalrs.hb */
-{"j",       "mj",          0x4580,     0xffe0, UBD,                    MOD_mj,         I1      }, /* jr */
+{"j",       "mj",          0x4580,     0xffe0, UBD,                    RD_mj,          I1      }, /* jr */
 {"j",       "s",       0x00000f3c, 0xffe0ffff, UBD|RD_s,               BD32,           I1      }, /* jr */
 /* SVR4 PIC code requires special handling for j, so it must be a
    macro.  */
@@ -520,14 +542,14 @@ const struct mips_opcode micromips_opcodes[] =
    assembler, but will never match user input (because the line above
    will match first).  */
 {"j",       "a",       0xd4000000, 0xfc000000, UBD,                    0,              I1      },
-{"jalr",    "mj",          0x45c0,     0xffe0, UBD|WR_31,              MOD_mj|BD32,    I1      },
-{"jalr",    "my,mj",       0x45c0,     0xffe0, UBD|WR_31,              MOD_mj|BD32,    I1      },
+{"jalr",    "mj",          0x45c0,     0xffe0, UBD|WR_31,              RD_mj|BD32,     I1      },
+{"jalr",    "my,mj",       0x45c0,     0xffe0, UBD|WR_31,              RD_mj|BD32,     I1      },
 {"jalr",    "s",       0x03e00f3c, 0xffe0ffff, UBD|RD_s|WR_t,          BD32,           I1      },
 {"jalr",    "t,s",     0x00000f3c, 0xfc00ffff, UBD|RD_s|WR_t,          BD32,           I1      },
 {"jalr.hb", "s",       0x03e01f3c, 0xffe0ffff, UBD|RD_s|WR_t,          BD32,           I1      },
 {"jalr.hb", "t,s",     0x00001f3c, 0xfc00ffff, UBD|RD_s|WR_t,          BD32,           I1      },
-{"jalrs",   "mj",          0x45e0,     0xffe0, UBD|WR_31,              MOD_mj|BD16,    I1      },
-{"jalrs",   "my,mj",       0x45e0,     0xffe0, UBD|WR_31,              MOD_mj|BD16,    I1      },
+{"jalrs",   "mj",          0x45e0,     0xffe0, UBD|WR_31,              RD_mj|BD16,     I1      },
+{"jalrs",   "my,mj",       0x45e0,     0xffe0, UBD|WR_31,              RD_mj|BD16,     I1      },
 {"jalrs",   "s",       0x03e04f3c, 0xffe0ffff, UBD|RD_s|WR_t,          BD16,           I1      },
 {"jalrs",   "t,s",     0x00004f3c, 0xfc00ffff, UBD|RD_s|WR_t,          BD16,           I1      },
 {"jalrs.hb", "s",      0x03e05f3c, 0xffe0ffff, UBD|RD_s|WR_t,          BD16,           I1      },
@@ -549,7 +571,7 @@ const struct mips_opcode micromips_opcodes[] =
 {"la",      "t,A(b)",  0,    (int) M_LA_AB,    INSN_MACRO,             0,              I1      },
 {"lb",      "t,o(b)",  0x1c000000, 0xfc000000, RD_b|WR_t,              0,              I1      },
 {"lb",      "t,A(b)",  0,    (int) M_LB_AB,    INSN_MACRO,             0,              I1      },
-{"lbu",     "md,mG(ml)",    0x0800,     0xfc00,        0,                      MOD_md|MOD_ml,  I1      },
+{"lbu",     "md,mG(ml)",    0x0800,     0xfc00,        0,                      WR_md|RD_ml,    I1      },
 {"lbu",     "t,o(b)",  0x14000000, 0xfc000000, RD_b|WR_t,              0,              I1      },
 {"lbu",     "t,A(b)",  0,    (int) M_LBU_AB,   INSN_MACRO,             0,              I1      },
 {"lca",     "t,A(b)",  0,    (int) M_LCA_AB,   INSN_MACRO,             0,              I1      },
@@ -581,7 +603,7 @@ const struct mips_opcode micromips_opcodes[] =
 {"ldxc1",   "D,t(b)",  0x540000c8, 0xfc0007ff, WR_D|RD_t|RD_b|FP_D,    0,              I1      },
 {"lh",      "t,o(b)",  0x3c000000, 0xfc000000, RD_b|WR_t,              0,              I1      },
 {"lh",      "t,A(b)",  0,    (int) M_LH_AB,    INSN_MACRO,             0,              I1      },
-{"lhu",     "md,mH(ml)",    0x2800,     0xfc00,        0,                      MOD_md|MOD_ml,  I1      },
+{"lhu",     "md,mH(ml)",    0x2800,     0xfc00,        0,                      WR_md|RD_ml,    I1      },
 {"lhu",     "t,o(b)",  0x34000000, 0xfc000000, RD_b|WR_t,              0,              I1      },
 {"lhu",     "t,A(b)",  0,    (int) M_LHU_AB,   INSN_MACRO,             0,              I1      },
 /* li is at the start of the table.  */
@@ -595,11 +617,11 @@ const struct mips_opcode micromips_opcodes[] =
 {"lld",     "t,~(b)",  0x60007000, 0xfc00f000, RD_b|WR_t,              0,              I3      },
 {"lld",     "t,o(b)",  0,    (int) M_LLD_OB,   INSN_MACRO,             0,              I3      },
 {"lld",     "t,A(b)",  0,    (int) M_LLD_AB,   INSN_MACRO,             0,              I3      },
-{"lui",     "s,u",     0x41a00000, 0xffe00000, 0,                      WR_s,           I1      },
+{"lui",     "s,u",     0x41a00000, 0xffe00000, WR_s,                   0,              I1      },
 {"luxc1",   "D,t(b)",  0x54000148, 0xfc0007ff, WR_D|RD_t|RD_b|FP_D,    0,              I1      },
-{"lw",      "md,mJ(ml)",    0x6800,     0xfc00,        0,                      MOD_md|MOD_ml,  I1      },
-{"lw",      "mp,mU(ms)",    0x4800,     0xfc00,        0,                      MOD_mp|MOD_sp,  I1      }, /* lwsp */
-{"lw",      "md,mA(ma)",    0x6400,     0xfc00,        0,                      MOD_md|RD_gp,   I1      }, /* lwgp */
+{"lw",      "md,mJ(ml)",    0x6800,     0xfc00,        0,                      WR_md|RD_ml,    I1      },
+{"lw",      "mp,mU(ms)",    0x4800,     0xfc00,        0,                      WR_mp|RD_sp,    I1      }, /* lwsp */
+{"lw",      "md,mA(ma)",    0x6400,     0xfc00,        0,                      WR_md|RD_gp,    I1      }, /* lwgp */
 {"lw",      "t,o(b)",  0xfc000000, 0xfc000000, RD_b|WR_t,              0,              I1      },
 {"lw",      "t,A(b)",  0,    (int) M_LW_AB,    INSN_MACRO,             0,              I1      },
 {"lwc1",    "T,o(b)",  0x9c000000, 0xfc000000, RD_b|WR_T|FP_S,         0,              I1      },
@@ -617,7 +639,7 @@ const struct mips_opcode micromips_opcodes[] =
 {"lcache",  "t,~(b)",  0x60000000, 0xfc00f000, RD_b|WR_t,              0,              I1      }, /* same */
 {"lcache",  "t,o(b)",  0,    (int) M_LWL_OB,   INSN_MACRO,             0,              I1      },
 {"lcache",  "t,A(b)",  0,    (int) M_LWL_AB,   INSN_MACRO,             0,              I1      },
-{"lwm",     "mN,mJ(ms)",    0x4500,     0xffc0,        NODS,                   MOD_sp,         I1      },
+{"lwm",     "mN,mJ(ms)",    0x4500,     0xffc0,        NODS,                   RD_sp,          I1      },
 {"lwm",     "n,~(b)",  0x20005000, 0xfc00f000, RD_b|NODS,              0,              I1      },
 {"lwm",     "n,o(b)",  0,    (int) M_LWM_OB,   INSN_MACRO,             0,              I1      },
 {"lwm",     "n,A(b)",  0,    (int) M_LWM_AB,   INSN_MACRO,             0,              I1      },
@@ -636,10 +658,12 @@ const struct mips_opcode micromips_opcodes[] =
 {"flush",   "t,A(b)",  0,    (int) M_LWR_AB,   INSN_MACRO,             0,              I1      },
 {"lwxs",    "d,t(b)",  0x00000118, 0xfc0007ff, RD_b|RD_t|WR_d,         0,              I1      },
 {"madd",    "s,t",     0x0000cb3c, 0xfc00ffff, RD_s|RD_t|MOD_HILO,     0,              I1      },
+{"madd",    "7,s,t",   0x00000abc, 0xfc003fff, MOD_a|RD_s|RD_t,        0,              D32     },
 {"madd.d",  "D,R,S,T", 0x54000009, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_D, 0,            I1      },
 {"madd.s",  "D,R,S,T", 0x54000001, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_S, 0,            I1      },
 {"madd.ps", "D,R,S,T", 0x54000011, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_D, 0,            I1      },
 {"maddu",   "s,t",     0x0000db3c, 0xfc00ffff, RD_s|RD_t|MOD_HILO,     0,              I1      },
+{"maddu",   "7,s,t",   0x00001abc, 0xfc003fff, MOD_a|RD_s|RD_t,        0,              D32     },
 {"mfc0",    "t,G",     0x000000fc, 0xfc00ffff, WR_t|RD_C0,             0,              I1      },
 {"mfc0",    "t,+D",    0x000000fc, 0xfc00c7ff, WR_t|RD_C0,             0,              I1      },
 {"mfc0",    "t,G,H",   0x000000fc, 0xfc00c7ff, WR_t|RD_C0,             0,              I1      },
@@ -649,14 +673,16 @@ const struct mips_opcode micromips_opcodes[] =
 {"mfhc1",   "t,S",     0x5400303b, 0xfc00ffff, WR_t|RD_S|FP_D,         0,              I1      },
 {"mfhc1",   "t,G",     0x5400303b, 0xfc00ffff, WR_t|RD_S|FP_D,         0,              I1      },
 {"mfhc2",   "t,G",     0x00008d3c, 0xfc00ffff, WR_t|RD_C2,             0,              I1      },
-{"mfhi",    "mj",          0x4600,     0xffe0, RD_HI,                  MOD_mj,         I1      },
-{"mfhi",    "s",       0x00000d7c, 0xffe0ffff, RD_HI,                  WR_s,           I1      },
-{"mflo",    "mj",          0x4640,     0xffe0, RD_LO,                  MOD_mj,         I1      },
-{"mflo",    "s",       0x00001d7c, 0xffe0ffff, RD_LO,                  WR_s,           I1      },
+{"mfhi",    "mj",          0x4600,     0xffe0, RD_HI,                  WR_mj,          I1      },
+{"mfhi",    "s",       0x00000d7c, 0xffe0ffff, WR_s|RD_HI,             0,              I1      },
+{"mfhi",    "s,7",     0x0000007c, 0xffe03fff, WR_s|RD_HI,             0,              D32     },
+{"mflo",    "mj",          0x4640,     0xffe0, RD_LO,                  WR_mj,          I1      },
+{"mflo",    "s",       0x00001d7c, 0xffe0ffff, WR_s|RD_LO,             0,              I1      },
+{"mflo",    "s,7",     0x0000107c, 0xffe03fff, WR_s|RD_LO,             0,              D32     },
 {"mov.d",   "T,S",     0x5400207b, 0xfc00ffff, WR_T|RD_S|FP_D,         0,              I1      },
 {"mov.s",   "T,S",     0x5400007b, 0xfc00ffff, WR_T|RD_S|FP_S,         0,              I1      },
 {"mov.ps",  "T,S",     0x5400407b, 0xfc00ffff, WR_T|RD_S|FP_D,         0,              I1      },
-{"movep",   "mh,mi,mm,mn",  0x8400,     0xfc01,        NODS,                   MOD_mhi|MOD_mm|MOD_mn,  I1      },
+{"movep",   "mh,mi,mm,mn",  0x8400,     0xfc01,        NODS,                   WR_mhi|RD_mmn,  I1      },
 {"movf",    "t,s,M",   0x5400017b, 0xfc001fff, WR_t|RD_s|RD_CC|FP_S|FP_D, 0,           I1      },
 {"movf.d",  "T,S,M",   0x54000220, 0xfc001fff, WR_T|RD_S|RD_CC|FP_D,   0,              I1      },
 {"movf.s",  "T,S,M",   0x54000020, 0xfc001fff, WR_T|RD_S|RD_CC|FP_S,   0,              I1      },
@@ -674,10 +700,12 @@ const struct mips_opcode micromips_opcodes[] =
 {"movz.s",  "D,S,t",   0x54000078, 0xfc0007ff, WR_D|RD_S|RD_t|FP_S,    0,              I1      },
 {"movz.ps", "D,S,t",   0x54000278, 0xfc0007ff, WR_D|RD_S|RD_t|FP_D,    0,              I1      },
 {"msub",    "s,t",     0x0000eb3c, 0xfc00ffff, RD_s|RD_t|MOD_HILO,     0,              I1      },
+{"msub",    "7,s,t",   0x00002abc, 0xfc003fff, MOD_a|RD_s|RD_t,        0,              D32     },
 {"msub.d",  "D,R,S,T", 0x54000029, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_D, 0,            I1      },
 {"msub.s",  "D,R,S,T", 0x54000021, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_S, 0,            I1      },
 {"msub.ps", "D,R,S,T", 0x54000031, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_D, 0,            I1      },
 {"msubu",   "s,t",     0x0000fb3c, 0xfc00ffff, RD_s|RD_t|MOD_HILO,     0,              I1      },
+{"msubu",   "7,s,t",   0x00003abc, 0xfc003fff, MOD_a|RD_s|RD_t,        0,              D32     },
 {"mtc0",    "t,G",     0x000002fc, 0xfc00ffff, RD_t|WR_C0|WR_CC,       0,              I1      },
 {"mtc0",    "t,+D",    0x000002fc, 0xfc00c7ff, RD_t|WR_C0|WR_CC,       0,              I1      },
 {"mtc0",    "t,G,H",   0x000002fc, 0xfc00c7ff, RD_t|WR_C0|WR_CC,       0,              I1      },
@@ -688,7 +716,9 @@ const struct mips_opcode micromips_opcodes[] =
 {"mthc1",   "t,G",     0x5400383b, 0xfc00ffff, RD_t|WR_S|FP_D,         0,              I1      },
 {"mthc2",   "t,G",     0x00009d3c, 0xfc00ffff, RD_t|WR_C2|WR_CC,       0,              I1      },
 {"mthi",    "s",       0x00002d7c, 0xffe0ffff, RD_s|WR_HI,             0,              I1      },
+{"mthi",    "s,7",     0x0000207c, 0xffe03fff, RD_s|WR_HI,             0,              D32     },
 {"mtlo",    "s",       0x00003d7c, 0xffe0ffff, RD_s|WR_LO,             0,              I1      },
+{"mtlo",    "s,7",     0x0000307c, 0xffe03fff, RD_s|WR_LO,             0,              D32     },
 {"mul",     "d,v,t",   0x00000210, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, 0,              I1      },
 {"mul",     "d,v,I",   0,    (int) M_MUL_I,    INSN_MACRO,             0,              I1      },
 {"mul.d",   "D,V,T",   0x540001b0, 0xfc0007ff, WR_D|RD_S|RD_T|FP_D,    0,              I1      },
@@ -699,7 +729,9 @@ const struct mips_opcode micromips_opcodes[] =
 {"mulou",   "d,v,t",   0,    (int) M_MULOU,    INSN_MACRO,             0,              I1      },
 {"mulou",   "d,v,I",   0,    (int) M_MULOU_I,  INSN_MACRO,             0,              I1      },
 {"mult",    "s,t",     0x00008b3c, 0xfc00ffff, RD_s|RD_t|WR_HILO,      0,              I1      },
+{"mult",    "7,s,t",   0x00000cbc, 0xfc003fff, WR_a|RD_s|RD_t,         0,              D32     },
 {"multu",   "s,t",     0x00009b3c, 0xfc00ffff, RD_s|RD_t|WR_HILO,      0,              I1      },
+{"multu",   "7,s,t",   0x00001cbc, 0xfc003fff, WR_a|RD_s|RD_t,         0,              D32     },
 {"neg",     "d,w",     0x00000190, 0xfc1f07ff, WR_d|RD_t,              0,              I1      }, /* sub 0 */
 {"negu",    "d,w",     0x000001d0, 0xfc1f07ff, WR_d|RD_t,              0,              I1      }, /* subu 0 */
 {"neg.d",   "T,V",     0x54002b7b, 0xfc00ffff, WR_T|RD_S|FP_D,         0,              I1      },
@@ -712,19 +744,19 @@ const struct mips_opcode micromips_opcodes[] =
 {"nmsub.s", "D,R,S,T", 0x54000022, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_S, 0,            I1      },
 {"nmsub.ps", "D,R,S,T",        0x54000032, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_D, 0,            I1      },
 /* nop is at the start of the table.  */
-{"not",     "mf,mg",       0x4400,     0xffc0, 0,                      MOD_mf|MOD_mg,  I1      }, /* put not before nor */
+{"not",     "mf,mg",       0x4400,     0xffc0, 0,                      WR_mf|RD_mg,    I1      }, /* put not before nor */
 {"not",     "d,v",     0x000002d0, 0xffe007ff, WR_d|RD_s|RD_t,         0,              I1      }, /* nor d,s,0 */
-{"nor",     "mf,mz,mg",            0x4400,     0xffc0, 0,                      MOD_mf|MOD_mg,  I1      }, /* not */
-{"nor",     "mf,mg,mz",            0x4400,     0xffc0, 0,                      MOD_mf|MOD_mg,  I1      }, /* not */
+{"nor",     "mf,mz,mg",            0x4400,     0xffc0, 0,                      WR_mf|RD_mg,    I1      }, /* not */
+{"nor",     "mf,mg,mz",            0x4400,     0xffc0, 0,                      WR_mf|RD_mg,    I1      }, /* not */
 {"nor",     "d,v,t",   0x000002d0, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              I1      },
 {"nor",     "t,r,I",   0,    (int) M_NOR_I,    INSN_MACRO,             0,              I1      },
-{"or",      "mp,mj,mz",            0x0c00,     0xfc00, 0,                      MOD_mp|MOD_mj,  I1      }, /* move */
-{"or",      "mp,mz,mj",            0x0c00,     0xfc00, 0,                      MOD_mp|MOD_mj,  I1      }, /* move */
-{"or",      "mf,mt,mg",            0x44c0,     0xffc0, 0,                      MOD_mf|MOD_mg,  I1      },
-{"or",      "mf,mg,mx",            0x44c0,     0xffc0, 0,                      MOD_mf|MOD_mg,  I1      },
+{"or",      "mp,mj,mz",            0x0c00,     0xfc00, 0,                      WR_mp|RD_mj,    I1      }, /* move */
+{"or",      "mp,mz,mj",            0x0c00,     0xfc00, 0,                      WR_mp|RD_mj,    I1      }, /* move */
+{"or",      "mf,mt,mg",            0x44c0,     0xffc0, 0,                      WR_mf|RD_mf|RD_mg,      I1      },
+{"or",      "mf,mg,mx",            0x44c0,     0xffc0, 0,                      WR_mf|RD_mf|RD_mg,      I1      },
 {"or",      "d,v,t",   0x00000290, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              I1      },
 {"or",      "t,r,I",   0,    (int) M_OR_I,     INSN_MACRO,             0,              I1      },
-{"ori",     "mp,mj,mZ",            0x0c00,     0xfc00, 0,                      MOD_mp|MOD_mj,  I1      }, /* move */
+{"ori",     "mp,mj,mZ",            0x0c00,     0xfc00, 0,                      WR_mp|RD_mj,    I1      }, /* move */
 {"ori",     "t,r,i",   0x50000000, 0xfc000000, WR_t|RD_s,              0,              I1      },
 {"pll.ps",  "D,V,T",   0x54000080, 0xfc0007ff, WR_D|RD_S|RD_T|FP_D,    0,              I1      },
 {"plu.ps",  "D,V,T",   0x540000c0, 0xfc0007ff, WR_D|RD_S|RD_T|FP_D,    0,              I1      },
@@ -758,7 +790,7 @@ const struct mips_opcode micromips_opcodes[] =
 {"round.w.s", "T,S",   0x54003b3b, 0xfc00ffff, WR_T|RD_S|FP_S,         0,              I1      },
 {"rsqrt.d", "T,S",     0x5400423b, 0xfc00ffff, WR_T|RD_S|FP_D,         0,              I1      },
 {"rsqrt.s", "T,S",     0x5400023b, 0xfc00ffff, WR_T|RD_S|FP_S,         0,              I1      },
-{"sb",      "mq,mL(ml)",    0x8800,     0xfc00,        SM,                     MOD_mq|MOD_ml,          I1      },
+{"sb",      "mq,mL(ml)",    0x8800,     0xfc00,        SM,                     RD_mq|RD_ml,            I1      },
 {"sb",      "t,o(b)",  0x18000000, 0xfc000000, SM|RD_t|RD_b,           0,              I1      },
 {"sb",      "t,A(b)",  0,    (int) M_SB_AB,    INSN_MACRO,             0,              I1      },
 {"sc",      "t,~(b)",  0x6000b000, 0xfc00f000, SM|RD_t|WR_t|RD_b,      0,              I1      },
@@ -809,7 +841,7 @@ const struct mips_opcode micromips_opcodes[] =
 {"sgt",     "d,v,I",   0,    (int) M_SGT_I,    INSN_MACRO,             0,              I1      },
 {"sgtu",    "d,v,t",   0,    (int) M_SGTU,     INSN_MACRO,             0,              I1      },
 {"sgtu",    "d,v,I",   0,    (int) M_SGTU_I,   INSN_MACRO,             0,              I1      },
-{"sh",      "mq,mH(ml)",    0xa800,     0xfc00,        SM,                     MOD_mq|MOD_ml,  I1      },
+{"sh",      "mq,mH(ml)",    0xa800,     0xfc00,        SM,                     RD_mq|RD_ml,    I1      },
 {"sh",      "t,o(b)",  0x38000000, 0xfc000000, SM|RD_t|RD_b,           0,              I1      },
 {"sh",      "t,A(b)",  0,    (int) M_SH_AB,    INSN_MACRO,             0,              I1      },
 {"sle",     "d,v,t",   0,    (int) M_SLE,      INSN_MACRO,             0,              I1      },
@@ -817,7 +849,7 @@ const struct mips_opcode micromips_opcodes[] =
 {"sleu",    "d,v,t",   0,    (int) M_SLEU,     INSN_MACRO,             0,              I1      },
 {"sleu",    "d,v,I",   0,    (int) M_SLEU_I,   INSN_MACRO,             0,              I1      },
 {"sllv",    "d,t,s",   0x00000010, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              I1      },
-{"sll",     "md,mc,mM",            0x2400,     0xfc01, 0,                      MOD_md|MOD_mc,  I1      },
+{"sll",     "md,mc,mM",            0x2400,     0xfc01, 0,                      WR_md|RD_mc,    I1      },
 {"sll",     "d,w,s",   0x00000010, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              I1      }, /* sllv */
 {"sll",     "t,r,<",   0x00000000, 0xfc0007ff, WR_t|RD_s,              0,              I1      },
 {"slt",     "d,v,t",   0x00000350, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              I1      },
@@ -834,7 +866,7 @@ const struct mips_opcode micromips_opcodes[] =
 {"sra",     "d,w,s",   0x00000090, 0xfc0007ff, WR_d|RD_t|RD_s,         0,              I1      }, /* srav */
 {"sra",     "t,r,<",   0x00000080, 0xfc0007ff, WR_t|RD_s,              0,              I1      },
 {"srlv",    "d,t,s",   0x00000050, 0xfc0007ff, WR_d|RD_t|RD_s,         0,              I1      },
-{"srl",     "md,mc,mM",            0x2401,     0xfc01, 0,                      MOD_md|MOD_mc,  I1      },
+{"srl",     "md,mc,mM",            0x2401,     0xfc01, 0,                      WR_md|RD_mc,    I1      },
 {"srl",     "d,w,s",   0x00000050, 0xfc0007ff, WR_d|RD_t|RD_s,         0,              I1      }, /* srlv */
 {"srl",     "t,r,<",   0x00000040, 0xfc0007ff, WR_t|RD_s,              0,              I1      },
 /* ssnop is at the start of the table.  */
@@ -843,12 +875,12 @@ const struct mips_opcode micromips_opcodes[] =
 {"sub.d",   "D,V,T",   0x54000170, 0xfc0007ff, WR_D|RD_S|RD_T|FP_D,    0,              I1      },
 {"sub.s",   "D,V,T",   0x54000070, 0xfc0007ff, WR_D|RD_S|RD_T|FP_S,    0,              I1      },
 {"sub.ps",  "D,V,T",   0x54000270, 0xfc0007ff, WR_D|RD_S|RD_T|FP_D,    0,              I1      },
-{"subu",    "md,me,ml",            0x0401,     0xfc01, 0,                      MOD_md|MOD_me|MOD_ml,   I1      },
+{"subu",    "md,me,ml",            0x0401,     0xfc01, 0,                      WR_md|RD_me|RD_ml,      I1      },
 {"subu",    "d,v,t",   0x000001d0, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              I1      },
 {"subu",    "d,v,I",   0,    (int) M_SUBU_I,   INSN_MACRO,             0,              I1      },
 {"suxc1",   "D,t(b)",  0x54000188, 0xfc0007ff, SM|RD_t|RD_b|FP_D,      RD_D,           I1      },
-{"sw",      "mq,mJ(ml)",    0xe800,     0xfc00,        SM,                     MOD_mq|MOD_ml,  I1      },
-{"sw",      "mp,mU(ms)",    0xc800,     0xfc00,        SM,                     MOD_mp|MOD_sp,  I1      }, /* swsp */
+{"sw",      "mq,mJ(ml)",    0xe800,     0xfc00,        SM,                     RD_mq|RD_ml,    I1      },
+{"sw",      "mp,mU(ms)",    0xc800,     0xfc00,        SM,                     RD_mp|RD_sp,    I1      }, /* swsp */
 {"sw",      "t,o(b)",  0xf8000000, 0xfc000000, SM|RD_t|RD_b,           0,              I1      },
 {"sw",      "t,A(b)",  0,    (int) M_SW_AB,    INSN_MACRO,             0,              I1      },
 {"swc1",    "T,o(b)",  0x98000000, 0xfc000000, SM|RD_T|RD_b|FP_S,      0,              I1      },
@@ -866,7 +898,7 @@ const struct mips_opcode micromips_opcodes[] =
 {"scache",  "t,~(b)",  0x60008000, 0xfc00f000, SM|RD_t|RD_b,           0,              I1      }, /* same */
 {"scache",  "t,o(b)",  0,    (int) M_SWL_OB,   INSN_MACRO,             0,              I1      },
 {"scache",  "t,A(b)",  0,    (int) M_SWL_AB,   INSN_MACRO,             0,              I1      },
-{"swm",     "mN,mJ(ms)",    0x4540,     0xffc0,        NODS,                   MOD_sp,         I1      },
+{"swm",     "mN,mJ(ms)",    0x4540,     0xffc0,        NODS,                   RD_sp,          I1      },
 {"swm",     "n,~(b)",  0x2000d000, 0xfc00f000, SM|RD_b|NODS,           0,              I1      },
 {"swm",     "n,o(b)",  0,    (int) M_SWM_OB,   INSN_MACRO,             0,              I1      },
 {"swm",     "n,A(b)",  0,    (int) M_SWM_AB,   INSN_MACRO,             0,              I1      },
@@ -879,7 +911,7 @@ const struct mips_opcode micromips_opcodes[] =
 {"invalidate", "t,~(b)",0x60009000, 0xfc00f000,        SM|RD_b|RD_t,           0,              I1      }, /* same */
 {"invalidate", "t,o(b)",0,    (int) M_SWR_OB,  INSN_MACRO,             0,              I1      },
 {"invalidate", "t,A(b)",0,    (int) M_SWR_AB,  INSN_MACRO,             0,              I1      },
-{"swxc1",   "D,t(b)",  0x54000048, 0xfc0007ff, SM|RD_t|RD_b|FP_S,      RD_D,           I1      },
+{"swxc1",   "D,t(b)",  0x54000088, 0xfc0007ff, SM|RD_t|RD_b|FP_S,      RD_D,           I1      },
 {"sync_acquire", "",   0x00116b7c, 0xffffffff, NODS,                   0,              I1      },
 {"sync_mb", "",                0x00106b7c, 0xffffffff, NODS,                   0,              I1      },
 {"sync_release", "",   0x00126b7c, 0xffffffff, NODS,                   0,              I1      },
@@ -946,11 +978,165 @@ const struct mips_opcode micromips_opcodes[] =
 {"wait",    "B",       0x0000937c, 0xfc00ffff, NODS,                   0,              I1      },
 {"wrpgpr",  "t,r",     0x0000f17c, 0xfc00ffff, RD_s,                   0,              I1      },
 {"wsbh",    "t,r",     0x00007b3c, 0xfc00ffff, WR_t|RD_s,              0,              I1      },
-{"xor",     "mf,mt,mg",            0x4440,     0xffc0, 0,                      MOD_mf|MOD_mg,  I1      },
-{"xor",     "mf,mg,mx",            0x4440,     0xffc0, 0,                      MOD_mf|MOD_mg,  I1      },
+{"xor",     "mf,mt,mg",            0x4440,     0xffc0, 0,                      WR_mf|RD_mf|RD_mg,      I1      },
+{"xor",     "mf,mg,mx",            0x4440,     0xffc0, 0,                      WR_mf|RD_mf|RD_mg,      I1      },
 {"xor",     "d,v,t",   0x00000310, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              I1      },
 {"xor",     "t,r,I",   0,    (int) M_XOR_I,    INSN_MACRO,             0,              I1      },
 {"xori",    "t,r,i",   0x70000000, 0xfc000000, WR_t|RD_s,              0,              I1      },
+/* MIPS DSP ASE.  */
+{"absq_s.ph", "t,s",   0x0000113c, 0xfc00ffff, WR_t|RD_s,              0,              D32     },
+{"absq_s.w", "t,s",    0x0000213c, 0xfc00ffff, WR_t|RD_s,              0,              D32     },
+{"addq.ph", "d,s,t",   0x0000000d, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D32     },
+{"addq_s.ph", "d,s,t", 0x0000040d, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D32     },
+{"addq_s.w", "d,s,t",  0x00000305, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D32     },
+{"addsc",   "d,s,t",   0x00000385, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D32     },
+{"addu.qb", "d,s,t",   0x000000cd, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D32     },
+{"addu_s.qb", "d,s,t", 0x000004cd, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D32     },
+{"addwc",   "d,s,t",   0x000003c5, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D32     },
+{"bitrev",  "t,s",     0x0000313c, 0xfc00ffff, WR_t|RD_s,              0,              D32     },
+{"bposge32", "p",      0x43600000, 0xffff0000, CBD,                    0,              D32     },
+{"cmp.eq.ph", "s,t",   0x00000005, 0xfc00ffff, RD_s|RD_t,              0,              D32     },
+{"cmpgu.eq.qb", "d,s,t", 0x000000c5, 0xfc0007ff, WR_d|RD_s|RD_t,       0,              D32     },
+{"cmp.le.ph", "s,t",   0x00000085, 0xfc00ffff, RD_s|RD_t,              0,              D32     },
+{"cmpgu.le.qb", "d,s,t", 0x00000145, 0xfc0007ff, WR_d|RD_s|RD_t,       0,              D32     },
+{"cmp.lt.ph", "s,t",   0x00000045, 0xfc00ffff, RD_s|RD_t,              0,              D32     },
+{"cmpgu.lt.qb", "d,s,t", 0x00000105, 0xfc0007ff, WR_d|RD_s|RD_t,       0,              D32     },
+{"cmpu.eq.qb", "s,t",  0x00000245, 0xfc00ffff, RD_s|RD_t,              0,              D32     },
+{"cmpu.le.qb", "s,t",  0x000002c5, 0xfc00ffff, RD_s|RD_t,              0,              D32     },
+{"cmpu.lt.qb", "s,t",  0x00000285, 0xfc00ffff, RD_s|RD_t,              0,              D32     },
+{"dpaq_sa.l.w", "7,s,t", 0x000012bc, 0xfc003fff, MOD_a|RD_s|RD_t,      0,              D32     },
+{"dpaq_s.w.ph", "7,s,t", 0x000002bc, 0xfc003fff, MOD_a|RD_s|RD_t,      0,              D32     },
+{"dpau.h.qbl", "7,s,t", 0x000020bc, 0xfc003fff,        MOD_a|RD_s|RD_t,        0,              D32     },
+{"dpau.h.qbr", "7,s,t", 0x000030bc, 0xfc003fff,        MOD_a|RD_s|RD_t,        0,              D32     },
+{"dpsq_sa.l.w", "7,s,t", 0x000016bc, 0xfc003fff, MOD_a|RD_s|RD_t,      0,              D32     },
+{"dpsq_s.w.ph", "7,s,t", 0x000006bc, 0xfc003fff, MOD_a|RD_s|RD_t,      0,              D32     },
+{"dpsu.h.qbl", "7,s,t",        0x000024bc, 0xfc003fff, MOD_a|RD_s|RD_t,        0,              D32     },
+{"dpsu.h.qbr", "7,s,t",        0x000034bc, 0xfc003fff, MOD_a|RD_s|RD_t,        0,              D32     },
+{"extpdp",  "t,7,6",   0x0000367c, 0xfc003fff, WR_t|RD_a|DSP_VOLA,     0,              D32     },
+{"extpdpv", "t,7,s",   0x000038bc, 0xfc003fff, WR_t|RD_a|RD_s|DSP_VOLA, 0,             D32     },
+{"extp",    "t,7,6",   0x0000267c, 0xfc003fff, WR_t|RD_a,              0,              D32     },
+{"extpv",   "t,7,s",   0x000028bc, 0xfc003fff, WR_t|RD_a|RD_s,         0,              D32     },
+{"extr_rs.w", "t,7,6", 0x00002e7c, 0xfc003fff, WR_t|RD_a,              0,              D32     },
+{"extr_r.w", "t,7,6",  0x00001e7c, 0xfc003fff, WR_t|RD_a,              0,              D32     },
+{"extr_s.h", "t,7,6",  0x00003e7c, 0xfc003fff, WR_t|RD_a,              0,              D32     },
+{"extrv_rs.w", "t,7,s",        0x00002ebc, 0xfc003fff, WR_t|RD_a|RD_s,         0,              D32     },
+{"extrv_r.w", "t,7,s", 0x00001ebc, 0xfc003fff, WR_t|RD_a|RD_s,         0,              D32     },
+{"extrv_s.h", "t,7,s", 0x00003ebc, 0xfc003fff, WR_t|RD_a|RD_s,         0,              D32     },
+{"extrv.w", "t,7,s",   0x00000ebc, 0xfc003fff, WR_t|RD_a|RD_s,         0,              D32     },
+{"extr.w",  "t,7,6",   0x00000e7c, 0xfc003fff, WR_t|RD_a,              0,              D32     },
+{"insv",    "t,s",     0x0000413c, 0xfc00ffff, WR_t|RD_s,              0,              D32     },
+{"lbux",    "d,t(b)",  0x00000225, 0xfc0007ff, WR_d|RD_b|RD_t,         0,              D32     },
+{"lhx",     "d,t(b)",  0x00000165, 0xfc0007ff, WR_d|RD_b|RD_t,         0,              D32     },
+{"lwx",     "d,t(b)",  0x000001a5, 0xfc0007ff, WR_d|RD_b|RD_t,         0,              D32     },
+{"maq_sa.w.phl", "7,s,t", 0x00003a7c, 0xfc003fff, MOD_a|RD_s|RD_t,     0,              D32     },
+{"maq_sa.w.phr", "7,s,t", 0x00002a7c, 0xfc003fff, MOD_a|RD_s|RD_t,     0,              D32     },
+{"maq_s.w.phl", "7,s,t", 0x00001a7c, 0xfc003fff, MOD_a|RD_s|RD_t,      0,              D32     },
+{"maq_s.w.phr", "7,s,t", 0x00000a7c, 0xfc003fff, MOD_a|RD_s|RD_t,      0,              D32     },
+{"modsub",  "d,s,t",   0x00000295, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D32     },
+{"mthlip",  "s,7",     0x0000027c, 0xffe03fff, RD_s|MOD_a|DSP_VOLA,    0,              D32     },
+{"muleq_s.w.phl", "d,s,t", 0x00000025, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, 0,          D32     },
+{"muleq_s.w.phr", "d,s,t", 0x00000065, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, 0,          D32     },
+{"muleu_s.ph.qbl", "d,s,t", 0x00000095, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, 0,         D32     },
+{"muleu_s.ph.qbr", "d,s,t", 0x000000d5, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, 0,         D32     },
+{"mulq_rs.ph", "d,s,t",        0x00000115, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, 0,              D32     },
+{"mulsaq_s.w.ph", "7,s,t", 0x00003cbc, 0xfc003fff, MOD_a|RD_s|RD_t,    0,              D32     },
+{"packrl.ph", "d,s,t", 0x000001ad, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D32     },
+{"pick.ph", "d,s,t",   0x0000022d, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D32     },
+{"pick.qb", "d,s,t",   0x000001ed, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D32     },
+{"precequ.ph.qbla", "t,s", 0x0000733c, 0xfc00ffff, WR_t|RD_s,          0,              D32     },
+{"precequ.ph.qbl", "t,s", 0x0000713c, 0xfc00ffff, WR_t|RD_s,           0,              D32     },
+{"precequ.ph.qbra", "t,s", 0x0000933c, 0xfc00ffff, WR_t|RD_s,          0,              D32     },
+{"precequ.ph.qbr", "t,s", 0x0000913c, 0xfc00ffff, WR_t|RD_s,           0,              D32     },
+{"preceq.w.phl", "t,s",        0x0000513c, 0xfc00ffff, WR_t|RD_s,              0,              D32     },
+{"preceq.w.phr", "t,s",        0x0000613c, 0xfc00ffff, WR_t|RD_s,              0,              D32     },
+{"preceu.ph.qbla", "t,s", 0x0000b33c, 0xfc00ffff, WR_t|RD_s,           0,              D32     },
+{"preceu.ph.qbl", "t,s", 0x0000b13c, 0xfc00ffff, WR_t|RD_s,            0,              D32     },
+{"preceu.ph.qbra", "t,s",0x0000d33c, 0xfc00ffff, WR_t|RD_s,            0,              D32     },
+{"preceu.ph.qbr", "t,s", 0x0000d13c, 0xfc00ffff, WR_t|RD_s,            0,              D32     },
+{"precrq.ph.w", "d,s,t", 0x000000ed, 0xfc0007ff, WR_d|RD_s|RD_t,       0,              D32     },
+{"precrq.qb.ph", "d,s,t", 0x000000ad, 0xfc0007ff, WR_d|RD_s|RD_t,      0,              D32     },
+{"precrq_rs.ph.w", "d,s,t", 0x0000012d, 0xfc0007ff, WR_d|RD_s|RD_t,    0,              D32     },
+{"precrqu_s.qb.ph", "d,s,t", 0x0000016d, 0xfc0007ff, WR_d|RD_s|RD_t,   0,              D32     },
+{"raddu.w.qb", "t,s",  0x0000f13c, 0xfc00ffff, WR_t|RD_s,              0,              D32     },
+{"rddsp",   "t",       0x000fc67c, 0xfc1fffff, WR_t,                   0,              D32     },
+{"rddsp",   "t,8",     0x0000067c, 0xfc103fff, WR_t,                   0,              D32     },
+{"repl.ph", "d,@",     0x0000003d, 0xfc0007ff, WR_d,                   0,              D32     },
+{"repl.qb", "t,5",     0x000005fc, 0xfc001fff, WR_t,                   0,              D32     },
+{"replv.ph", "t,s",    0x0000033c, 0xfc00ffff, WR_t|RD_s,              0,              D32     },
+{"replv.qb", "t,s",    0x0000133c, 0xfc00ffff, WR_t|RD_s,              0,              D32     },
+{"shilo",   "7,0",     0x0000001d, 0xffc03fff, MOD_a,                  0,              D32     },
+{"shilov",  "7,s",     0x0000127c, 0xffe03fff, MOD_a|RD_s,             0,              D32     },
+{"shll.ph", "t,s,4",   0x000003b5, 0xfc000fff, WR_t|RD_s,              0,              D32     },
+{"shll.qb", "t,s,3",   0x0000087c, 0xfc001fff, WR_t|RD_s,              0,              D32     },
+{"shll_s.ph", "t,s,4", 0x00000bb5, 0xfc000fff, WR_t|RD_s,              0,              D32     },
+{"shll_s.w", "t,s,^",  0x000003f5, 0xfc0007ff, WR_t|RD_s,              0,              D32     },
+{"shllv.ph", "d,t,s",  0x0000038d, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D32     },
+{"shllv.qb", "d,t,s",  0x00000395, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D32     },
+{"shllv_s.ph", "d,t,s",        0x0000078d, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D32     },
+{"shllv_s.w", "d,t,s", 0x000003d5, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D32     },
+{"shra.ph", "t,s,4",   0x00000335, 0xfc000fff, WR_t|RD_s,              0,              D32     },
+{"shra_r.ph", "t,s,4", 0x00000735, 0xfc000fff, WR_t|RD_s,              0,              D32     },
+{"shra_r.w", "t,s,^",  0x000002f5, 0xfc0007ff, WR_t|RD_s,              0,              D32     },
+{"shrav.ph", "d,t,s",  0x0000018d, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D32     },
+{"shrav_r.ph", "d,t,s",        0x0000058d, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D32     },
+{"shrav_r.w", "d,t,s", 0x000002d5, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D32     },
+{"shrl.qb", "t,s,3",   0x0000187c, 0xfc001fff, WR_t|RD_s,              0,              D32     },
+{"shrlv.qb", "d,t,s",  0x00000355, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D32     },
+{"subq.ph", "d,s,t",   0x0000020d, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D32     },
+{"subq_s.ph", "d,s,t", 0x0000060d, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D32     },
+{"subq_s.w", "d,s,t",  0x00000345, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D32     },
+{"subu.qb", "d,s,t",   0x000002cd, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D32     },
+{"subu_s.qb", "d,s,t", 0x000006cd, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D32     },
+{"wrdsp",   "t",       0x000fd67c, 0xfc1fffff, RD_t|DSP_VOLA,          0,              D32     },
+{"wrdsp",   "t,8",     0x0000167c, 0xfc103fff, RD_t|DSP_VOLA,          0,              D32     },
+/* MIPS DSP ASE Rev2.  */
+{"absq_s.qb", "t,s",   0x0000013c, 0xfc00ffff, WR_t|RD_s,              0,              D33     },
+{"addqh.ph", "d,s,t",  0x0000004d, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D33     },
+{"addqh_r.ph", "d,s,t",        0x0000044d, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D33     },
+{"addqh.w", "d,s,t",   0x0000008d, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D33     },
+{"addqh_r.w", "d,s,t", 0x0000048d, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D33     },
+{"addu.ph", "d,s,t",   0x0000010d, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D33     },
+{"addu_s.ph", "d,s,t", 0x0000050d, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D33     },
+{"adduh.qb", "d,s,t",  0x0000014d, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D33     },
+{"adduh_r.qb", "d,s,t",        0x0000054d, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D33     },
+{"append",  "t,s,h",   0x00000215, 0xfc0007ff, WR_t|RD_t|RD_s,         0,              D33     },
+{"balign",  "t,s,I",   0,    (int) M_BALIGN,   INSN_MACRO,             0,              D33     },
+{"balign",  "t,s,2",   0x000008bc, 0xfc003fff, WR_t|RD_t|RD_s,         0,              D33     },
+{"cmpgdu.eq.qb", "d,s,t", 0x00000185, 0xfc0007ff, WR_d|RD_s|RD_t,      0,              D33     },
+{"cmpgdu.lt.qb", "d,s,t", 0x000001c5, 0xfc0007ff, WR_d|RD_s|RD_t,      0,              D33     },
+{"cmpgdu.le.qb", "d,s,t", 0x00000205, 0xfc0007ff, WR_d|RD_s|RD_t,      0,              D33     },
+{"dpa.w.ph", "7,s,t",  0x000000bc, 0xfc003fff, MOD_a|RD_s|RD_t,        0,              D33     },
+{"dpaqx_s.w.ph", "7,s,t", 0x000022bc, 0xfc003fff, MOD_a|RD_s|RD_t,     0,              D33     },
+{"dpaqx_sa.w.ph", "7,s,t", 0x000032bc, 0xfc003fff, MOD_a|RD_s|RD_t,    0,              D33     },
+{"dpax.w.ph", "7,s,t", 0x000010bc, 0xfc003fff, MOD_a|RD_s|RD_t,        0,              D33     },
+{"dps.w.ph", "7,s,t",  0x000004bc, 0xfc003fff, MOD_a|RD_s|RD_t,        0,              D33     },
+{"dpsqx_s.w.ph", "7,s,t", 0x000026bc, 0xfc003fff, MOD_a|RD_s|RD_t,     0,              D33     },
+{"dpsqx_sa.w.ph", "7,s,t", 0x000036bc, 0xfc003fff, MOD_a|RD_s|RD_t,    0,              D33     },
+{"dpsx.w.ph", "7,s,t", 0x000014bc, 0xfc003fff, MOD_a|RD_s|RD_t,        0,              D33     },
+{"mul.ph",  "d,s,t",   0x0000002d, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, 0,              D33     },
+{"mul_s.ph", "d,s,t",  0x0000042d, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, 0,              D33     },
+{"mulq_rs.w", "d,s,t", 0x00000195, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, 0,              D33     },
+{"mulq_s.ph", "d,s,t", 0x00000155, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, 0,              D33     },
+{"mulq_s.w", "d,s,t",  0x000001d5, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, 0,              D33     },
+{"mulsa.w.ph", "7,s,t",        0x00002cbc, 0xfc003fff, MOD_a|RD_s|RD_t,        0,              D33     },
+{"precr.qb.ph", "d,s,t", 0x0000006d, 0xfc0007ff, WR_d|RD_s|RD_t,       0,              D33     },
+{"precr_sra.ph.w", "t,s,h", 0x000003cd, 0xfc0007ff, WR_t|RD_t|RD_s,    0,              D33     },
+{"precr_sra_r.ph.w", "t,s,h", 0x000007cd, 0xfc0007ff, WR_t|RD_t|RD_s,  0,              D33     },
+{"prepend", "t,s,h",   0x00000255, 0xfc0007ff, WR_t|RD_t|RD_s,         0,              D33     },
+{"shra.qb", "t,s,3",   0x000001fc, 0xfc001fff, WR_t|RD_s,              0,              D33     },
+{"shra_r.qb", "t,s,3", 0x000011fc, 0xfc001fff, WR_t|RD_s,              0,              D33     },
+{"shrav.qb", "d,t,s",  0x000001cd, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D33     },
+{"shrav_r.qb", "d,t,s",        0x000005cd, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D33     },
+{"shrl.ph", "t,s,4",   0x000003fc, 0xfc000fff, WR_t|RD_s,              0,              D33     },
+{"shrlv.ph", "d,t,s",  0x00000315, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D33     },
+{"subu.ph", "d,s,t",   0x0000030d, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D33     },
+{"subu_s.ph", "d,s,t", 0x0000070d, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D33     },
+{"subuh.qb", "d,s,t",  0x0000034d, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D33     },
+{"subuh_r.qb", "d,s,t",        0x0000074d, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D33     },
+{"subqh.ph", "d,s,t",  0x0000024d, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D33     },
+{"subqh_r.ph", "d,s,t",        0x0000064d, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D33     },
+{"subqh.w", "d,s,t",   0x0000028d, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D33     },
+{"subqh_r.w", "d,s,t", 0x0000068d, 0xfc0007ff, WR_d|RD_s|RD_t,         0,              D33     },
 };
 
 const int bfd_micromips_num_opcodes =