[ gas/ChangeLog ]
authorChris Demetriou <cgd@google.com>
Fri, 31 May 2002 01:17:18 +0000 (01:17 +0000)
committerChris Demetriou <cgd@google.com>
Fri, 31 May 2002 01:17:18 +0000 (01:17 +0000)
2002-05-30  Chris G. Demetriou  <cgd@broadcom.com>
            Ed Satterthwaite  <ehs@broadcom.com>

* config/tc-mips.c (mips_set_options): New "ase_mdmx" member.
(mips_opts): Initialize "ase_mdmx" member.
(file_ase_mdmx): New variable.
(CPU_HAS_MDMX): New macro.
(md_begin): Initialize mips_opts.ase_mdmx and file_ase_mdmx
based on command line options and configuration defaults.
(macro_build): Note in comment that use of MDMX in macros is
not currently allowed.
(validate_mips_insn): Add support for the "O", "Q", "X", "Y", and
"Z" MDMX operand types.
(mips_ip): Accept MDMX instructions if mips_opts.ase_mdmx is set,
and add support for the "O", "Q", "X", "Y", and "Z" MDMX operand
types.
(OPTION_MDMX, OPTION_NO_MDMX, md_longopts, md_parse_option):
Add support for "-mdmx" and "-no-mdmx" options.
(OPTION_ELF_BASE): Move to accomodate new options.
(s_mipsset): Support ".set mdmx" and ".set nomdmx".
(mips_elf_final_processing): Set MDMX ASE ELF header flag if
file_ase_mdmx was set.
* doc/as.texinfo: Document -mdmx and -no-mdmx options.
* doc/c-mips.texi: Likewise, and document ".set mdmx" and ".set
nomdmx" directives.

[ gas/testsuite/ChangeLog ]
2002-05-30  Chris G. Demetriou  <cgd@broadcom.com>

* gas/mips/mips64-mdmx.s: New file.
* gas/mips/mips64-mdmx.d: Likewise.
* gas/mips/mips.exp: Run new "mips64-mdmx" test.

[ include/opcode/ChangeLog ]
2002-05-30  Chris G. Demetriou  <cgd@broadcom.com>

* mips.h (OP_SH_ALN, OP_MASK_ALN, OP_SH_VSEL, OP_MASK_VSEL)
(MDMX_FMTSEL_IMM_QH, MDMX_FMTSEL_IMM_OB, MDMX_FMTSEL_VEC_QH)
(MDMX_FMTSEL_VEC_OB, INSN_READ_MDMX_ACC, INSN_WRITE_MDMX_ACC)
(INSN_MDMX): New constants, for MDMX support.
(opcode character list): Add "O", "Q", "X", "Y", and "Z" for MDMX.

[ opcodes/ChangeLog ]
2002-05-30  Chris G. Demetriou  <cgd@broadcom.com>
            Ed Satterthwaite  <ehs@broadcom.com>

* mips-dis.c (print_insn_arg): Add support for 'O', 'Q', 'X', 'Y',
and 'Z' formats, for MDMX.
        (mips_isa_type): Add MDMX instructions to the ISA
bit mask for bfd_mach_mipsisa64.
* mips-opc.c: Add support for MDMX instructions.
(MX): New definition.

* mips-dis.c: Update copyright years to include 2002.

13 files changed:
gas/ChangeLog
gas/config/tc-mips.c
gas/doc/as.texinfo
gas/doc/c-mips.texi
gas/testsuite/ChangeLog
gas/testsuite/gas/mips/mips.exp
gas/testsuite/gas/mips/mips64-mdmx.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips64-mdmx.s [new file with mode: 0644]
include/opcode/ChangeLog
include/opcode/mips.h
opcodes/ChangeLog
opcodes/mips-dis.c
opcodes/mips-opc.c

index da7c4b8..3c281f8 100644 (file)
@@ -1,3 +1,29 @@
+2002-05-30  Chris G. Demetriou  <cgd@broadcom.com>
+            Ed Satterthwaite  <ehs@broadcom.com>
+
+       * config/tc-mips.c (mips_set_options): New "ase_mdmx" member.
+       (mips_opts): Initialize "ase_mdmx" member.
+       (file_ase_mdmx): New variable.
+       (CPU_HAS_MDMX): New macro.
+       (md_begin): Initialize mips_opts.ase_mdmx and file_ase_mdmx
+       based on command line options and configuration defaults.
+       (macro_build): Note in comment that use of MDMX in macros is
+       not currently allowed.
+       (validate_mips_insn): Add support for the "O", "Q", "X", "Y", and
+       "Z" MDMX operand types.
+       (mips_ip): Accept MDMX instructions if mips_opts.ase_mdmx is set,
+       and add support for the "O", "Q", "X", "Y", and "Z" MDMX operand
+       types.
+       (OPTION_MDMX, OPTION_NO_MDMX, md_longopts, md_parse_option):
+       Add support for "-mdmx" and "-no-mdmx" options.
+       (OPTION_ELF_BASE): Move to accomodate new options.
+       (s_mipsset): Support ".set mdmx" and ".set nomdmx".
+       (mips_elf_final_processing): Set MDMX ASE ELF header flag if
+       file_ase_mdmx was set.
+       * doc/as.texinfo: Document -mdmx and -no-mdmx options.
+       * doc/c-mips.texi: Likewise, and document ".set mdmx" and ".set
+       nomdmx" directives.
+
 2002-05-31  Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de>
 
        * config/tc-mips.c (OPTION_NO_M7000_HILO_FIX): Rename to
index 02ec3f1..c742089 100644 (file)
@@ -141,6 +141,7 @@ struct mips_set_options
      if they have not been initialized.  Changed by `.set <asename>', by
      command line options, and based on the default architecture.  */
   int ase_mips3d;
+  int ase_mdmx;
   /* Whether we are assembling for the mips16 processor.  0 if we are
      not, 1 if we are, and -1 if the value has not been initialized.
      Changed by `.set mips16' and `.set nomips16', and the -mips16 and
@@ -189,7 +190,7 @@ static int file_mips_fp32 = -1;
 
 static struct mips_set_options mips_opts =
 {
-  ISA_UNKNOWN, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, NO_ABI
+  ISA_UNKNOWN, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, NO_ABI
 };
 
 /* These variables are filled in with the masks of registers used.
@@ -205,6 +206,10 @@ static int file_mips_isa = ISA_UNKNOWN;
    command line (e.g., by -march).  */
 static int file_ase_mips3d;
 
+/* True if -mdmx was passed or implied by arguments passed on the
+   command line (e.g., by -march).  */
+static int file_ase_mdmx;
+
 /* The argument of the -mcpu= flag.  Historical for code generation.  */
 static int mips_cpu = CPU_UNKNOWN;
 
@@ -275,6 +280,10 @@ static int mips_32bitmode = 0;
 #define CPU_HAS_MIPS3D(cpu)    ((cpu) == CPU_SB1      \
                                 )
 
+/* Return true if the given CPU supports the MDMX ASE.  */
+#define CPU_HAS_MDMX(cpu)      (0                    \
+                                )
+
 /* Whether the processor uses hardware interlocks to protect
    reads from the HI and LO registers, and thus does not
    require nops to be inserted.  */
@@ -1241,6 +1250,8 @@ md_begin ()
      generation of code for them.  */
   if (mips_opts.ase_mips3d == -1 && CPU_HAS_MIPS3D (mips_arch))
     mips_opts.ase_mips3d = 1;
+  if (mips_opts.ase_mdmx == -1 && CPU_HAS_MDMX (mips_arch))
+    mips_opts.ase_mdmx = 1;
 
   if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, mips_arch))
     as_warn (_("Could not set architecture and machine"));
@@ -1253,6 +1264,7 @@ md_begin ()
   file_mips_isa = mips_opts.isa;
   file_mips_abi = mips_opts.abi;
   file_ase_mips3d = mips_opts.ase_mips3d;
+  file_ase_mdmx = mips_opts.ase_mdmx;
   mips_opts.gp32 = file_mips_gp32;
   mips_opts.fp32 = file_mips_fp32;
 
@@ -2917,8 +2929,8 @@ macro_build (place, counter, ep, name, fmt, va_alist)
   /* Search until we get a match for NAME.  */
   while (1)
     {
-      /* It is assumed here that macros will never generate
-         MIPS-3D instructions.  */
+      /* It is assumed here that macros will never generate 
+         MDMX or MIPS-3D instructions.  */
       if (strcmp (fmt, insn.insn_mo->args) == 0
          && insn.insn_mo->pinfo != INSN_MACRO
          && OPCODE_IS_MEMBER (insn.insn_mo, mips_opts.isa, mips_arch)
@@ -7795,11 +7807,17 @@ validate_mips_insn (opc)
       case 'L': break;
       case 'M':        USE_BITS (OP_MASK_CCC,          OP_SH_CCC);     break;
       case 'N':        USE_BITS (OP_MASK_BCC,          OP_SH_BCC);     break;
+      case 'O':        USE_BITS (OP_MASK_ALN,          OP_SH_ALN);     break;
+      case 'Q':        USE_BITS (OP_MASK_VSEL,         OP_SH_VSEL);
+               USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
       case 'R':        USE_BITS (OP_MASK_FR,           OP_SH_FR);      break;
       case 'S':        USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
       case 'T':        USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
       case 'V':        USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
       case 'W':        USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
+      case 'X':        USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
+      case 'Y':        USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
+      case 'Z':        USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
       case 'a':        USE_BITS (OP_MASK_TARGET,       OP_SH_TARGET);  break;
       case 'b':        USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
       case 'c':        USE_BITS (OP_MASK_CODE,         OP_SH_CODE);    break;
@@ -7918,6 +7936,7 @@ mips_ip (str, ip)
 
       if (OPCODE_IS_MEMBER (insn,
                            (mips_opts.isa
+                            | (mips_opts.ase_mdmx ? INSN_MDMX : 0)
                             | (mips_opts.ase_mips3d ? INSN_MIPS3D : 0)),
                            mips_arch))
        ok = true;
@@ -7961,7 +7980,10 @@ mips_ip (str, ip)
       insn_error = NULL;
       for (args = insn->args;; ++args)
        {
+         int is_mdmx;
+
          s += strspn (s, " \t");
+         is_mdmx = 0;
          switch (*args)
            {
            case '\0':          /* end of args */
@@ -8310,6 +8332,47 @@ mips_ip (str, ip)
                }
              break;
 
+           case 'O':           /* MDMX alignment immediate constant.  */
+             my_getExpression (&imm_expr, s);
+             check_absolute_expr (ip, &imm_expr);
+             if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
+               {
+                 as_warn ("Improper align amount (%ld), using low bits",
+                          (long) imm_expr.X_add_number);
+                 imm_expr.X_add_number &= OP_MASK_ALN;
+               }
+             ip->insn_opcode |= imm_expr.X_add_number << OP_SH_ALN;
+             imm_expr.X_op = O_absent;
+             s = expr_end;
+             continue;
+
+           case 'Q':           /* MDMX vector, element sel, or const.  */
+             if (s[0] != '$')
+               {
+                 /* MDMX Immediate.  */
+                 my_getExpression (&imm_expr, s);
+                 check_absolute_expr (ip, &imm_expr);
+                 if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
+                   {
+                     as_warn (_("Invalid MDMX Immediate (%ld)"),
+                              (long) imm_expr.X_add_number);
+                     imm_expr.X_add_number &= OP_MASK_FT;
+                   }
+                 imm_expr.X_add_number &= OP_MASK_FT;
+                 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
+                   ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
+                 else
+                   ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
+                 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_FT;
+                 imm_expr.X_op = O_absent;
+                 s = expr_end;
+                 continue;
+               }
+             /* Not MDMX Immediate.  Fall through.  */
+           case 'X':           /* MDMX destination register.  */
+           case 'Y':           /* MDMX source register.  */
+           case 'Z':           /* MDMX target register.  */
+             is_mdmx = 1;
            case 'D':           /* floating point destination register */
            case 'S':           /* floating point source register */
            case 'T':           /* floating point target register */
@@ -8317,8 +8380,11 @@ mips_ip (str, ip)
            case 'V':
            case 'W':
              s_reset = s;
-             if (s[0] == '$' && s[1] == 'f'
-                 && ISDIGIT (s[2]))
+             /* Accept $fN for FP and MDMX register numbers, and in
+                 addition accept $vN for MDMX register numbers.  */
+             if ((s[0] == '$' && s[1] == 'f' && ISDIGIT (s[2]))
+                 || (is_mdmx != 0 && s[0] == '$' && s[1] == 'v'
+                     && ISDIGIT (s[2])))
                {
                  s += 2;
                  regno = 0;
@@ -8359,14 +8425,51 @@ mips_ip (str, ip)
                  switch (c)
                    {
                    case 'D':
+                   case 'X':
                      ip->insn_opcode |= regno << OP_SH_FD;
                      break;
                    case 'V':
                    case 'S':
+                   case 'Y':
                      ip->insn_opcode |= regno << OP_SH_FS;
                      break;
+                   case 'Q':
+                     /* This is like 'Z', but also needs to fix the MDMX
+                        vector/scalar select bits.  Note that the
+                        scalar immediate case is handled above.  */
+                     if (*s == '[')
+                       {
+                         int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
+                         int max_el = (is_qh ? 3 : 7);
+                         s++;
+                         my_getExpression(&imm_expr, s);
+                         check_absolute_expr (ip, &imm_expr);
+                         s = expr_end;
+                         if (imm_expr.X_add_number > max_el)
+                           as_bad(_("Bad element selector %ld"),
+                                  (long) imm_expr.X_add_number);
+                         imm_expr.X_add_number &= max_el;
+                         ip->insn_opcode |= (imm_expr.X_add_number
+                                             << (OP_SH_VSEL +
+                                                 (is_qh ? 2 : 1)));
+                         if (*s != ']')
+                           as_warn(_("Expecting ']' found '%s'"), s);
+                         else
+                           s++;
+                       }
+                     else
+                        {
+                          if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
+                            ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
+                                               << OP_SH_VSEL);
+                         else
+                           ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
+                                               OP_SH_VSEL);
+                       }
+                      /* Fall through */
                    case 'W':
                    case 'T':
+                   case 'Z':
                      ip->insn_opcode |= regno << OP_SH_FT;
                      break;
                    case 'R':
@@ -9992,8 +10095,12 @@ struct option md_longopts[] =
   {"mips3d", no_argument, NULL, OPTION_MIPS3D},
 #define OPTION_NO_MIPS3D (OPTION_MD_BASE + 34)
   {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
+#define OPTION_MDMX (OPTION_MD_BASE + 35)
+  {"mdmx", no_argument, NULL, OPTION_MDMX},
+#define OPTION_NO_MDMX (OPTION_MD_BASE + 36)
+  {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
 #ifdef OBJ_ELF
-#define OPTION_ELF_BASE    (OPTION_MD_BASE + 35)
+#define OPTION_ELF_BASE    (OPTION_MD_BASE + 37)
 #define OPTION_CALL_SHARED (OPTION_ELF_BASE + 0)
   {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
   {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
@@ -10198,6 +10305,14 @@ md_parse_option (c, arg)
     case OPTION_NO_M3900:
       break;
 
+    case OPTION_MDMX:
+      mips_opts.ase_mdmx = 1;
+      break;
+
+    case OPTION_NO_MDMX:
+      mips_opts.ase_mdmx = 0;
+      break;
+
     case OPTION_MIPS16:
       mips_opts.mips16 = 1;
       mips_no_prev_insn (false);
@@ -11532,6 +11647,10 @@ s_mipsset (x)
     {
       mips_opts.nobopt = 1;
     }
+  else if (strcmp (name, "mdmx") == 0)
+    mips_opts.ase_mdmx = 1;
+  else if (strcmp (name, "nomdmx") == 0)
+    mips_opts.ase_mdmx = 0;
   else if (strcmp (name, "mips16") == 0
           || strcmp (name, "MIPS-16") == 0)
     mips_opts.mips16 = 1;
@@ -13021,6 +13140,8 @@ mips_elf_final_processing ()
   if (file_ase_mips3d)
     elf_elfheader (stdoutput)->e_flags |= ???;
 #endif
+  if (file_ase_mdmx)
+    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
 
   /* Set the MIPS ELF ABI flags.  */
   if (file_mips_abi == NO_ABI)
index 7bd85d7..2b37eb4 100644 (file)
@@ -375,6 +375,7 @@ gcc(1), ld(1), and the Info entries for @file{binutils} and @file{ld}.
    [@b{-mips32}] [@b{-mips64}]
    [@b{-m4650}] [@b{-no-m4650}]
    [@b{-mips3d}] [@b{-no-mips3d}]
+   [@b{-mdmx}] [@b{-no-mdmx}]
    [@b{--trap}] [@b{--break}] [@b{-n}]
    [@b{--emulation}=@var{name} ]
 @end ifset
@@ -888,6 +889,12 @@ Generate code for the MIPS-3D Application Specific Extension.
 This tells the assembler to accept MIPS-3D instructions.
 @samp{-no-mips3d} turns off this option.
 
+@item -mdmx
+@itemx -no-mdmx
+Generate code for the MDMX Application Specific Extension.
+This tells the assembler to accept MDMX instructions.
+@samp{-no-mdmx} turns off this option.
+
 @item -mcpu=@var{CPU}
 Generate code for a particular MIPS cpu.  It is exactly equivalent to
 @samp{-m@var{cpu}}, except that there are more value of @var{cpu}
index c81d0ab..7bf75b3 100644 (file)
@@ -105,6 +105,12 @@ Generate code for the MIPS-3D Application Specific Extension.
 This tells the assembler to accept MIPS-3D instructions.
 @samp{-no-mips3d} turns off this option.
 
+@item -mdmx
+@itemx -no-mdmx
+Generate code for the MDMX Application Specific Extension.
+This tells the assembler to accept MDMX instructions.
+@samp{-no-mdmx} turns off this option.
+
 @item -mfix7000
 @itemx -mno-fix7000
 Cause nops to be inserted if the read of the destination register
@@ -343,4 +349,12 @@ from the MIPS-3D Application Specific Extension from that point on
 in the assembly.  The @code{.set nomips3d} directive prevents MIPS-3D
 instructions from being accepted.
 
+@cindex MIPS MDMX instruction generation override
+@kindex @code{.set mdmx}
+@kindex @code{.set nomdmx}
+The directive @code{.set mdmx} makes the assembler accept instructions
+from the MDMX Application Specific Extension from that point on
+in the assembly.  The @code{.set nomdmx} directive prevents MDMX
+instructions from being accepted.
+
 Traditional @sc{mips} assemblers do not support these directives.
index 9554e69..26af36c 100644 (file)
@@ -1,3 +1,9 @@
+2002-05-30  Chris G. Demetriou  <cgd@broadcom.com>
+
+       * gas/mips/mips64-mdmx.s: New file.
+       * gas/mips/mips64-mdmx.d: Likewise.
+       * gas/mips/mips.exp: Run new "mips64-mdmx" test.
+
 2002-05-30  Richard Henderson  <rth@redhat.com>
 
        * gas/alpha/elf-tls-1.s, gas/alpha/elf-tls-1.d: New.
index 37a945a..b357dec 100644 (file)
@@ -152,6 +152,7 @@ if { [istarget mips*-*-*] } then {
     run_dump_test "mips32"
     run_dump_test "mips64"
     run_dump_test "mips64-mips3d"
+    run_dump_test "mips64-mdmx"
     run_dump_test "sb1-ext-ps"
 
     # It will always fail until someone fixes it.
diff --git a/gas/testsuite/gas/mips/mips64-mdmx.d b/gas/testsuite/gas/mips/mips64-mdmx.d
new file mode 100644 (file)
index 0000000..66bc896
--- /dev/null
@@ -0,0 +1,215 @@
+#objdump: -dr --prefix-addresses --show-raw-insn -mmips:isa64
+#name: MIPS MIPS64 MDMX ASE instructions
+#as: -mips64 -mdmx
+
+# Check MIPS64 MDMX ASE instruction assembly and disassembly
+
+.*: +file format .*mips.*
+
+Disassembly of section .text:
+0+0000 <[^>]*> 46b46051        movf\.l \$f1,\$f12,\$fcc5
+0+0004 <[^>]*> 46b26053        movn\.l \$f1,\$f12,s2
+0+0008 <[^>]*> 46b56051        movt\.l \$f1,\$f12,\$fcc5
+0+000c <[^>]*> 46b26052        movz\.l \$f1,\$f12,s2
+0+0010 <[^>]*> 7ad2604b        add\.ob \$v1,\$v12,\$v18
+0+0014 <[^>]*> 7ad2604b        add\.ob \$v1,\$v12,\$v18
+0+0018 <[^>]*> 7992604b        add\.ob \$v1,\$v12,\$v18\[6\]
+0+001c <[^>]*> 7bb2604b        add\.qh \$v1,\$v12,0x12
+0+0020 <[^>]*> 7932604b        add\.qh \$v1,\$v12,\$v18\[2\]
+0+0024 <[^>]*> 7bb2604b        add\.qh \$v1,\$v12,0x12
+0+0028 <[^>]*> 7ad26037        adda\.ob        \$v12,\$v18
+0+002c <[^>]*> 7ad26037        adda\.ob        \$v12,\$v18
+0+0030 <[^>]*> 79926037        adda\.ob        \$v12,\$v18\[6\]
+0+0034 <[^>]*> 7ab26037        adda\.qh        \$v12,\$v18
+0+0038 <[^>]*> 7ab26037        adda\.qh        \$v12,\$v18
+0+003c <[^>]*> 79326037        adda\.qh        \$v12,\$v18\[2\]
+0+0040 <[^>]*> 7ad26437        addl\.ob        \$v12,\$v18
+0+0044 <[^>]*> 7ad26437        addl\.ob        \$v12,\$v18
+0+0048 <[^>]*> 79926437        addl\.ob        \$v12,\$v18\[6\]
+0+004c <[^>]*> 7ab26437        addl\.qh        \$v12,\$v18
+0+0050 <[^>]*> 7ab26437        addl\.qh        \$v12,\$v18
+0+0054 <[^>]*> 79326437        addl\.qh        \$v12,\$v18\[2\]
+0+0058 <[^>]*> 78d26058        alni\.ob        \$v1,\$v12,\$v18,6
+0+005c <[^>]*> 7852605a        alni\.qh        \$v1,\$v12,\$v18,2
+0+0060 <[^>]*> 7ab26059        alnv\.ob        \$v1,\$v12,\$v18,s5
+0+0064 <[^>]*> 7ab2605b        alnv\.qh        \$v1,\$v12,\$v18,s5
+0+0068 <[^>]*> 7ad2604c        and\.ob \$v1,\$v12,\$v18
+0+006c <[^>]*> 7ad2604c        and\.ob \$v1,\$v12,\$v18
+0+0070 <[^>]*> 7992604c        and\.ob \$v1,\$v12,\$v18\[6\]
+0+0074 <[^>]*> 7bb2604c        and\.qh \$v1,\$v12,0x12
+0+0078 <[^>]*> 7932604c        and\.qh \$v1,\$v12,\$v18\[2\]
+0+007c <[^>]*> 7bb2604c        and\.qh \$v1,\$v12,0x12
+0+0080 <[^>]*> 7ad26001        c\.eq\.ob       \$v12,\$v18
+0+0084 <[^>]*> 7ad26001        c\.eq\.ob       \$v12,\$v18
+0+0088 <[^>]*> 79926001        c\.eq\.ob       \$v12,\$v18\[6\]
+0+008c <[^>]*> 7ab26001        c\.eq\.qh       \$v12,\$v18
+0+0090 <[^>]*> 7ab26001        c\.eq\.qh       \$v12,\$v18
+0+0094 <[^>]*> 79326001        c\.eq\.qh       \$v12,\$v18\[2\]
+0+0098 <[^>]*> 7ad26005        c\.le\.ob       \$v12,\$v18
+0+009c <[^>]*> 7ad26005        c\.le\.ob       \$v12,\$v18
+0+00a0 <[^>]*> 79926005        c\.le\.ob       \$v12,\$v18\[6\]
+0+00a4 <[^>]*> 7ab26005        c\.le\.qh       \$v12,\$v18
+0+00a8 <[^>]*> 7ab26005        c\.le\.qh       \$v12,\$v18
+0+00ac <[^>]*> 79326005        c\.le\.qh       \$v12,\$v18\[2\]
+0+00b0 <[^>]*> 7ad26004        c\.lt\.ob       \$v12,\$v18
+0+00b4 <[^>]*> 7ad26004        c\.lt\.ob       \$v12,\$v18
+0+00b8 <[^>]*> 79926004        c\.lt\.ob       \$v12,\$v18\[6\]
+0+00bc <[^>]*> 7ab26004        c\.lt\.qh       \$v12,\$v18
+0+00c0 <[^>]*> 7ab26004        c\.lt\.qh       \$v12,\$v18
+0+00c4 <[^>]*> 79326004        c\.lt\.qh       \$v12,\$v18\[2\]
+0+00c8 <[^>]*> 7ad26047        max\.ob \$v1,\$v12,\$v18
+0+00cc <[^>]*> 7ad26047        max\.ob \$v1,\$v12,\$v18
+0+00d0 <[^>]*> 79926047        max\.ob \$v1,\$v12,\$v18\[6\]
+0+00d4 <[^>]*> 7bb26047        max\.qh \$v1,\$v12,0x12
+0+00d8 <[^>]*> 79326047        max\.qh \$v1,\$v12,\$v18\[2\]
+0+00dc <[^>]*> 7bb26047        max\.qh \$v1,\$v12,0x12
+0+00e0 <[^>]*> 7ad26046        min\.ob \$v1,\$v12,\$v18
+0+00e4 <[^>]*> 7ad26046        min\.ob \$v1,\$v12,\$v18
+0+00e8 <[^>]*> 79926046        min\.ob \$v1,\$v12,\$v18\[6\]
+0+00ec <[^>]*> 7bb26046        min\.qh \$v1,\$v12,0x12
+0+00f0 <[^>]*> 79326046        min\.qh \$v1,\$v12,\$v18\[2\]
+0+00f4 <[^>]*> 7bb26046        min\.qh \$v1,\$v12,0x12
+0+00f8 <[^>]*> 7bb26040        msgn\.qh        \$v1,\$v12,0x12
+0+00fc <[^>]*> 79326040        msgn\.qh        \$v1,\$v12,\$v18\[2\]
+0+0100 <[^>]*> 7bb26040        msgn\.qh        \$v1,\$v12,0x12
+0+0104 <[^>]*> 7ad26070        mul\.ob \$v1,\$v12,\$v18
+0+0108 <[^>]*> 7ad26070        mul\.ob \$v1,\$v12,\$v18
+0+010c <[^>]*> 79926070        mul\.ob \$v1,\$v12,\$v18\[6\]
+0+0110 <[^>]*> 7bb26070        mul\.qh \$v1,\$v12,0x12
+0+0114 <[^>]*> 79326070        mul\.qh \$v1,\$v12,\$v18\[2\]
+0+0118 <[^>]*> 7bb26070        mul\.qh \$v1,\$v12,0x12
+0+011c <[^>]*> 7ad26033        mula\.ob        \$v12,\$v18
+0+0120 <[^>]*> 7ad26033        mula\.ob        \$v12,\$v18
+0+0124 <[^>]*> 79926033        mula\.ob        \$v12,\$v18\[6\]
+0+0128 <[^>]*> 7ab26033        mula\.qh        \$v12,\$v18
+0+012c <[^>]*> 7ab26033        mula\.qh        \$v12,\$v18
+0+0130 <[^>]*> 79326033        mula\.qh        \$v12,\$v18\[2\]
+0+0134 <[^>]*> 7ad26433        mull\.ob        \$v12,\$v18
+0+0138 <[^>]*> 7ad26433        mull\.ob        \$v12,\$v18
+0+013c <[^>]*> 79926433        mull\.ob        \$v12,\$v18\[6\]
+0+0140 <[^>]*> 7ab26433        mull\.qh        \$v12,\$v18
+0+0144 <[^>]*> 7ab26433        mull\.qh        \$v12,\$v18
+0+0148 <[^>]*> 79326433        mull\.qh        \$v12,\$v18\[2\]
+0+014c <[^>]*> 7ad26032        muls\.ob        \$v12,\$v18
+0+0150 <[^>]*> 7ad26032        muls\.ob        \$v12,\$v18
+0+0154 <[^>]*> 79926032        muls\.ob        \$v12,\$v18\[6\]
+0+0158 <[^>]*> 7ab26032        muls\.qh        \$v12,\$v18
+0+015c <[^>]*> 7ab26032        muls\.qh        \$v12,\$v18
+0+0160 <[^>]*> 79326032        muls\.qh        \$v12,\$v18\[2\]
+0+0164 <[^>]*> 7ad26432        mulsl\.ob       \$v12,\$v18
+0+0168 <[^>]*> 7ad26432        mulsl\.ob       \$v12,\$v18
+0+016c <[^>]*> 79926432        mulsl\.ob       \$v12,\$v18\[6\]
+0+0170 <[^>]*> 7ab26432        mulsl\.qh       \$v12,\$v18
+0+0174 <[^>]*> 7ab26432        mulsl\.qh       \$v12,\$v18
+0+0178 <[^>]*> 79326432        mulsl\.qh       \$v12,\$v18\[2\]
+0+017c <[^>]*> 7ad2604f        nor\.ob \$v1,\$v12,\$v18
+0+0180 <[^>]*> 7ad2604f        nor\.ob \$v1,\$v12,\$v18
+0+0184 <[^>]*> 7992604f        nor\.ob \$v1,\$v12,\$v18\[6\]
+0+0188 <[^>]*> 7bb2604f        nor\.qh \$v1,\$v12,0x12
+0+018c <[^>]*> 7932604f        nor\.qh \$v1,\$v12,\$v18\[2\]
+0+0190 <[^>]*> 7bb2604f        nor\.qh \$v1,\$v12,0x12
+0+0194 <[^>]*> 7ad2604e        or\.ob  \$v1,\$v12,\$v18
+0+0198 <[^>]*> 7ad2604e        or\.ob  \$v1,\$v12,\$v18
+0+019c <[^>]*> 7992604e        or\.ob  \$v1,\$v12,\$v18\[6\]
+0+01a0 <[^>]*> 7bb2604e        or\.qh  \$v1,\$v12,0x12
+0+01a4 <[^>]*> 7932604e        or\.qh  \$v1,\$v12,\$v18\[2\]
+0+01a8 <[^>]*> 7bb2604e        or\.qh  \$v1,\$v12,0x12
+0+01ac <[^>]*> 7ad26042        pickf\.ob       \$v1,\$v12,\$v18
+0+01b0 <[^>]*> 7ad26042        pickf\.ob       \$v1,\$v12,\$v18
+0+01b4 <[^>]*> 79926042        pickf\.ob       \$v1,\$v12,\$v18\[6\]
+0+01b8 <[^>]*> 7bb26042        pickf\.qh       \$v1,\$v12,0x12
+0+01bc <[^>]*> 79326042        pickf\.qh       \$v1,\$v12,\$v18\[2\]
+0+01c0 <[^>]*> 7bb26042        pickf\.qh       \$v1,\$v12,0x12
+0+01c4 <[^>]*> 7ad26043        pickt\.ob       \$v1,\$v12,\$v18
+0+01c8 <[^>]*> 7ad26043        pickt\.ob       \$v1,\$v12,\$v18
+0+01cc <[^>]*> 79926043        pickt\.ob       \$v1,\$v12,\$v18\[6\]
+0+01d0 <[^>]*> 7bb26043        pickt\.qh       \$v1,\$v12,0x12
+0+01d4 <[^>]*> 79326043        pickt\.qh       \$v1,\$v12,\$v18\[2\]
+0+01d8 <[^>]*> 7bb26043        pickt\.qh       \$v1,\$v12,0x12
+0+01dc <[^>]*> 7a00007f        rach\.ob        \$v1
+0+01e0 <[^>]*> 7a20007f        rach\.qh        \$v1
+0+01e4 <[^>]*> 7800007f        racl\.ob        \$v1
+0+01e8 <[^>]*> 7820007f        racl\.qh        \$v1
+0+01ec <[^>]*> 7900007f        racm\.ob        \$v1
+0+01f0 <[^>]*> 7920007f        racm\.qh        \$v1
+0+01f4 <[^>]*> 7bb20065        rnas\.qh        \$v1,0x12
+0+01f8 <[^>]*> 79320065        rnas\.qh        \$v1,\$v18\[2\]
+0+01fc <[^>]*> 7bb20065        rnas\.qh        \$v1,0x12
+0+0200 <[^>]*> 7bd20061        rnau\.ob        \$v1,0x12
+0+0204 <[^>]*> 78920061        rnau\.ob        \$v1,\$v18\[2\]
+0+0208 <[^>]*> 7bd20061        rnau\.ob        \$v1,0x12
+0+020c <[^>]*> 7bb20061        rnau\.qh        \$v1,0x12
+0+0210 <[^>]*> 79320061        rnau\.qh        \$v1,\$v18\[2\]
+0+0214 <[^>]*> 7bb20061        rnau\.qh        \$v1,0x12
+0+0218 <[^>]*> 7bb20066        rnes\.qh        \$v1,0x12
+0+021c <[^>]*> 79320066        rnes\.qh        \$v1,\$v18\[2\]
+0+0220 <[^>]*> 7bb20066        rnes\.qh        \$v1,0x12
+0+0224 <[^>]*> 7bd20062        rneu\.ob        \$v1,0x12
+0+0228 <[^>]*> 78920062        rneu\.ob        \$v1,\$v18\[2\]
+0+022c <[^>]*> 7bd20062        rneu\.ob        \$v1,0x12
+0+0230 <[^>]*> 7bb20062        rneu\.qh        \$v1,0x12
+0+0234 <[^>]*> 79320062        rneu\.qh        \$v1,\$v18\[2\]
+0+0238 <[^>]*> 7bb20062        rneu\.qh        \$v1,0x12
+0+023c <[^>]*> 7bb20064        rzs\.qh \$v1,0x12
+0+0240 <[^>]*> 79320064        rzs\.qh \$v1,\$v18\[2\]
+0+0244 <[^>]*> 7bb20064        rzs\.qh \$v1,0x12
+0+0248 <[^>]*> 7bd20060        rzu\.ob \$v1,0x12
+0+024c <[^>]*> 78920060        rzu\.ob \$v1,\$v18\[2\]
+0+0250 <[^>]*> 7bd20060        rzu\.ob \$v1,0x12
+0+0254 <[^>]*> 7bb20060        rzu\.qh \$v1,0x12
+0+0258 <[^>]*> 79320060        rzu\.qh \$v1,\$v18\[2\]
+0+025c <[^>]*> 7bb20060        rzu\.qh \$v1,0x12
+0+0260 <[^>]*> 7a32605f        shfl\.bfla\.qh  \$v1,\$v12,\$v18
+0+0264 <[^>]*> 7992605f        shfl\.mixh\.ob  \$v1,\$v12,\$v18
+0+0268 <[^>]*> 7832605f        shfl\.mixh\.qh  \$v1,\$v12,\$v18
+0+026c <[^>]*> 79d2605f        shfl\.mixl\.ob  \$v1,\$v12,\$v18
+0+0270 <[^>]*> 78b2605f        shfl\.mixl\.qh  \$v1,\$v12,\$v18
+0+0274 <[^>]*> 7912605f        shfl\.pach\.ob  \$v1,\$v12,\$v18
+0+0278 <[^>]*> 7932605f        shfl\.pach\.qh  \$v1,\$v12,\$v18
+0+027c <[^>]*> 7b32605f        shfl\.repa\.qh  \$v1,\$v12,\$v18
+0+0280 <[^>]*> 7bb2605f        shfl\.repb\.qh  \$v1,\$v12,\$v18
+0+0284 <[^>]*> 78d2605f        shfl\.upsl\.ob  \$v1,\$v12,\$v18
+0+0288 <[^>]*> 7ad26050        sll\.ob \$v1,\$v12,\$v18
+0+028c <[^>]*> 7ad26050        sll\.ob \$v1,\$v12,\$v18
+0+0290 <[^>]*> 79926050        sll\.ob \$v1,\$v12,\$v18\[6\]
+0+0294 <[^>]*> 7bb26050        sll\.qh \$v1,\$v12,0x12
+0+0298 <[^>]*> 79326050        sll\.qh \$v1,\$v12,\$v18\[2\]
+0+029c <[^>]*> 7bb26050        sll\.qh \$v1,\$v12,0x12
+0+02a0 <[^>]*> 7bb26053        sra\.qh \$v1,\$v12,0x12
+0+02a4 <[^>]*> 79326053        sra\.qh \$v1,\$v12,\$v18\[2\]
+0+02a8 <[^>]*> 7bb26053        sra\.qh \$v1,\$v12,0x12
+0+02ac <[^>]*> 7ad26052        srl\.ob \$v1,\$v12,\$v18
+0+02b0 <[^>]*> 7ad26052        srl\.ob \$v1,\$v12,\$v18
+0+02b4 <[^>]*> 79926052        srl\.ob \$v1,\$v12,\$v18\[6\]
+0+02b8 <[^>]*> 7bb26052        srl\.qh \$v1,\$v12,0x12
+0+02bc <[^>]*> 79326052        srl\.qh \$v1,\$v12,\$v18\[2\]
+0+02c0 <[^>]*> 7bb26052        srl\.qh \$v1,\$v12,0x12
+0+02c4 <[^>]*> 7ad2604a        sub\.ob \$v1,\$v12,\$v18
+0+02c8 <[^>]*> 7ad2604a        sub\.ob \$v1,\$v12,\$v18
+0+02cc <[^>]*> 7992604a        sub\.ob \$v1,\$v12,\$v18\[6\]
+0+02d0 <[^>]*> 7bb2604a        sub\.qh \$v1,\$v12,0x12
+0+02d4 <[^>]*> 7932604a        sub\.qh \$v1,\$v12,\$v18\[2\]
+0+02d8 <[^>]*> 7bb2604a        sub\.qh \$v1,\$v12,0x12
+0+02dc <[^>]*> 7ad26036        suba\.ob        \$v12,\$v18
+0+02e0 <[^>]*> 7ad26036        suba\.ob        \$v12,\$v18
+0+02e4 <[^>]*> 79926036        suba\.ob        \$v12,\$v18\[6\]
+0+02e8 <[^>]*> 7ab26036        suba\.qh        \$v12,\$v18
+0+02ec <[^>]*> 7ab26036        suba\.qh        \$v12,\$v18
+0+02f0 <[^>]*> 79326036        suba\.qh        \$v12,\$v18\[2\]
+0+02f4 <[^>]*> 7ad26436        subl\.ob        \$v12,\$v18
+0+02f8 <[^>]*> 7ad26436        subl\.ob        \$v12,\$v18
+0+02fc <[^>]*> 79926436        subl\.ob        \$v12,\$v18\[6\]
+0+0300 <[^>]*> 7ab26436        subl\.qh        \$v12,\$v18
+0+0304 <[^>]*> 7ab26436        subl\.qh        \$v12,\$v18
+0+0308 <[^>]*> 79326436        subl\.qh        \$v12,\$v18\[2\]
+0+030c <[^>]*> 7a00603e        wach\.ob        \$v12
+0+0310 <[^>]*> 7a20603e        wach\.qh        \$v12
+0+0314 <[^>]*> 7812603e        wacl\.ob        \$v12,\$v18
+0+0318 <[^>]*> 7832603e        wacl\.qh        \$v12,\$v18
+0+031c <[^>]*> 7ad2604d        xor\.ob \$v1,\$v12,\$v18
+0+0320 <[^>]*> 7ad2604d        xor\.ob \$v1,\$v12,\$v18
+0+0324 <[^>]*> 7992604d        xor\.ob \$v1,\$v12,\$v18\[6\]
+0+0328 <[^>]*> 7bb2604d        xor\.qh \$v1,\$v12,0x12
+0+032c <[^>]*> 7932604d        xor\.qh \$v1,\$v12,\$v18\[2\]
+0+0330 <[^>]*> 7bb2604d        xor\.qh \$v1,\$v12,0x12
+       \.\.\.
diff --git a/gas/testsuite/gas/mips/mips64-mdmx.s b/gas/testsuite/gas/mips/mips64-mdmx.s
new file mode 100644 (file)
index 0000000..7ba494e
--- /dev/null
@@ -0,0 +1,299 @@
+# source file to test assembly of MIPS64 MDMX ASE instructions
+
+       .set noreorder
+       .set noat
+
+       .globl text_label .text
+text_label:
+
+       movf.l          $v1, $v12, $fcc5
+
+       movn.l          $v1, $v12, $18
+
+       movt.l          $v1, $v12, $fcc5
+
+       movz.l          $v1, $v12, $18
+
+       add.ob          $v1, $v12, $v18
+       add.ob          $v1, $v12, $v18
+       add.ob          $v1, $v12, $v18[6]
+
+       add.qh          $v1, $v12, 18
+       add.qh          $v1, $v12, $v18[2]
+       add.qh          $v1, $v12, 18
+
+       adda.ob         $v12, $v18
+       adda.ob         $v12, $v18
+       adda.ob         $v12, $v18[6]
+
+       adda.qh         $v12, $v18
+       adda.qh         $v12, $v18
+       adda.qh         $v12, $v18[2]
+
+       addl.ob         $v12, $v18
+       addl.ob         $v12, $v18
+       addl.ob         $v12, $v18[6]
+
+       addl.qh         $v12, $v18
+       addl.qh         $v12, $v18
+       addl.qh         $v12, $v18[2]
+
+       alni.ob         $v1, $v12, $v18, 6
+
+       alni.qh         $v1, $v12, $v18, 2
+
+       alnv.ob         $v1, $v12, $v18, $21
+
+       alnv.qh         $v1, $v12, $v18, $21
+
+       and.ob          $v1, $v12, $v18
+       and.ob          $v1, $v12, $v18
+       and.ob          $v1, $v12, $v18[6]
+
+       and.qh          $v1, $v12, 18
+       and.qh          $v1, $v12, $v18[2]
+       and.qh          $v1, $v12, 18
+
+       c.eq.ob         $v12, $v18
+       c.eq.ob         $v12, $v18
+       c.eq.ob         $v12, $v18[6]
+
+       c.eq.qh         $v12, $v18
+       c.eq.qh         $v12, $v18
+       c.eq.qh         $v12, $v18[2]
+
+       c.le.ob         $v12, $v18
+       c.le.ob         $v12, $v18
+       c.le.ob         $v12, $v18[6]
+
+       c.le.qh         $v12, $v18
+       c.le.qh         $v12, $v18
+       c.le.qh         $v12, $v18[2]
+
+       c.lt.ob         $v12, $v18
+       c.lt.ob         $v12, $v18
+       c.lt.ob         $v12, $v18[6]
+
+       c.lt.qh         $v12, $v18
+       c.lt.qh         $v12, $v18
+       c.lt.qh         $v12, $v18[2]
+
+       max.ob          $v1, $v12, $v18
+       max.ob          $v1, $v12, $v18
+       max.ob          $v1, $v12, $v18[6]
+
+       max.qh          $v1, $v12, 18
+       max.qh          $v1, $v12, $v18[2]
+       max.qh          $v1, $v12, 18
+
+       min.ob          $v1, $v12, $v18
+       min.ob          $v1, $v12, $v18
+       min.ob          $v1, $v12, $v18[6]
+
+       min.qh          $v1, $v12, 18
+       min.qh          $v1, $v12, $v18[2]
+       min.qh          $v1, $v12, 18
+
+       msgn.qh         $v1, $v12, 18
+       msgn.qh         $v1, $v12, $v18[2]
+       msgn.qh         $v1, $v12, 18
+
+       mul.ob          $v1, $v12, $v18
+       mul.ob          $v1, $v12, $v18
+       mul.ob          $v1, $v12, $v18[6]
+
+       mul.qh          $v1, $v12, 18
+       mul.qh          $v1, $v12, $v18[2]
+       mul.qh          $v1, $v12, 18
+
+       mula.ob         $v12, $v18
+       mula.ob         $v12, $v18
+       mula.ob         $v12, $v18[6]
+
+       mula.qh         $v12, $v18
+       mula.qh         $v12, $v18
+       mula.qh         $v12, $v18[2]
+
+       mull.ob         $v12, $v18
+       mull.ob         $v12, $v18
+       mull.ob         $v12, $v18[6]
+
+       mull.qh         $v12, $v18
+       mull.qh         $v12, $v18
+       mull.qh         $v12, $v18[2]
+
+       muls.ob         $v12, $v18
+       muls.ob         $v12, $v18
+       muls.ob         $v12, $v18[6]
+
+       muls.qh         $v12, $v18
+       muls.qh         $v12, $v18
+       muls.qh         $v12, $v18[2]
+
+       mulsl.ob        $v12, $v18
+       mulsl.ob        $v12, $v18
+       mulsl.ob        $v12, $v18[6]
+
+       mulsl.qh        $v12, $v18
+       mulsl.qh        $v12, $v18
+       mulsl.qh        $v12, $v18[2]
+
+       nor.ob          $v1, $v12, $v18
+       nor.ob          $v1, $v12, $v18
+       nor.ob          $v1, $v12, $v18[6]
+
+       nor.qh          $v1, $v12, 18
+       nor.qh          $v1, $v12, $v18[2]
+       nor.qh          $v1, $v12, 18
+
+       or.ob           $v1, $v12, $v18
+       or.ob           $v1, $v12, $v18
+       or.ob           $v1, $v12, $v18[6]
+
+       or.qh           $v1, $v12, 18
+       or.qh           $v1, $v12, $v18[2]
+       or.qh           $v1, $v12, 18
+
+       pickf.ob        $v1, $v12, $v18
+       pickf.ob        $v1, $v12, $v18
+       pickf.ob        $v1, $v12, $v18[6]
+
+       pickf.qh        $v1, $v12, 18
+       pickf.qh        $v1, $v12, $v18[2]
+       pickf.qh        $v1, $v12, 18
+
+       pickt.ob        $v1, $v12, $v18
+       pickt.ob        $v1, $v12, $v18
+       pickt.ob        $v1, $v12, $v18[6]
+
+       pickt.qh        $v1, $v12, 18
+       pickt.qh        $v1, $v12, $v18[2]
+       pickt.qh        $v1, $v12, 18
+
+       rach.ob         $v1
+
+       rach.qh         $v1
+
+       racl.ob         $v1
+
+       racl.qh         $v1
+
+       racm.ob         $v1
+
+       racm.qh         $v1
+
+       rnas.qh         $v1, 18
+       rnas.qh         $v1, $v18[2]
+       rnas.qh         $v1, 18
+
+       rnau.ob         $v1, 18
+       rnau.ob         $v1, $v18[2]
+       rnau.ob         $v1, 18
+
+       rnau.qh         $v1, 18
+       rnau.qh         $v1, $v18[2]
+       rnau.qh         $v1, 18
+
+       rnes.qh         $v1, 18
+       rnes.qh         $v1, $v18[2]
+       rnes.qh         $v1, 18
+
+       rneu.ob         $v1, 18
+       rneu.ob         $v1, $v18[2]
+       rneu.ob         $v1, 18
+
+       rneu.qh         $v1, 18
+       rneu.qh         $v1, $v18[2]
+       rneu.qh         $v1, 18
+
+       rzs.qh          $v1, 18
+       rzs.qh          $v1, $v18[2]
+       rzs.qh          $v1, 18
+
+       rzu.ob          $v1, 18
+       rzu.ob          $v1, $v18[2]
+       rzu.ob          $v1, 18
+
+       rzu.qh          $v1, 18
+       rzu.qh          $v1, $v18[2]
+       rzu.qh          $v1, 18
+
+       shfl.bfla.qh    $v1, $v12, $v18
+
+       shfl.mixh.ob    $v1, $v12, $v18
+       shfl.mixh.qh    $v1, $v12, $v18
+
+       shfl.mixl.ob    $v1, $v12, $v18
+       shfl.mixl.qh    $v1, $v12, $v18
+
+       shfl.pach.ob    $v1, $v12, $v18
+       shfl.pach.qh    $v1, $v12, $v18
+
+       shfl.repa.qh    $v1, $v12, $v18
+
+       shfl.repb.qh    $v1, $v12, $v18
+
+       shfl.upsl.ob    $v1, $v12, $v18
+
+       sll.ob          $v1, $v12, $v18
+       sll.ob          $v1, $v12, $v18
+       sll.ob          $v1, $v12, $v18[6]
+
+       sll.qh          $v1, $v12, 18
+       sll.qh          $v1, $v12, $v18[2]
+       sll.qh          $v1, $v12, 18
+
+       sra.qh          $v1, $v12, 18
+       sra.qh          $v1, $v12, $v18[2]
+       sra.qh          $v1, $v12, 18
+
+       srl.ob          $v1, $v12, $v18
+       srl.ob          $v1, $v12, $v18
+       srl.ob          $v1, $v12, $v18[6]
+
+       srl.qh          $v1, $v12, 18
+       srl.qh          $v1, $v12, $v18[2]
+       srl.qh          $v1, $v12, 18
+
+       sub.ob          $v1, $v12, $v18
+       sub.ob          $v1, $v12, $v18
+       sub.ob          $v1, $v12, $v18[6]
+
+       sub.qh          $v1, $v12, 18
+       sub.qh          $v1, $v12, $v18[2]
+       sub.qh          $v1, $v12, 18
+
+       suba.ob         $v12, $v18
+       suba.ob         $v12, $v18
+       suba.ob         $v12, $v18[6]
+
+       suba.qh         $v12, $v18
+       suba.qh         $v12, $v18
+       suba.qh         $v12, $v18[2]
+
+       subl.ob         $v12, $v18
+       subl.ob         $v12, $v18
+       subl.ob         $v12, $v18[6]
+
+       subl.qh         $v12, $v18
+       subl.qh         $v12, $v18
+       subl.qh         $v12, $v18[2]
+
+       wach.ob         $v12
+
+       wach.qh         $v12
+
+       wacl.ob         $v12, $v18
+
+       wacl.qh         $v12, $v18
+
+       xor.ob          $v1, $v12, $v18
+       xor.ob          $v1, $v12, $v18
+       xor.ob          $v1, $v12, $v18[6]
+
+       xor.qh          $v1, $v12, 18
+       xor.qh          $v1, $v12, $v18[2]
+       xor.qh          $v1, $v12, 18
+
+# Force at least 8 (non-delay-slot) zero bytes, to make 'objdump' print ...
+      .space  8
index 100c886..2b0d552 100644 (file)
@@ -1,3 +1,11 @@
+2002-05-30  Chris G. Demetriou  <cgd@broadcom.com>
+
+       * mips.h (OP_SH_ALN, OP_MASK_ALN, OP_SH_VSEL, OP_MASK_VSEL)
+       (MDMX_FMTSEL_IMM_QH, MDMX_FMTSEL_IMM_OB, MDMX_FMTSEL_VEC_QH)
+       (MDMX_FMTSEL_VEC_OB, INSN_READ_MDMX_ACC, INSN_WRITE_MDMX_ACC)
+       (INSN_MDMX): New constants, for MDMX support.
+       (opcode character list): Add "O", "Q", "X", "Y", and "Z" for MDMX.
+
 2002-05-28  Kuang Hwa Lin <kuang@sbcglobal.net>
 
        * dlx.h: New file.
index 06f5625..801999c 100644 (file)
@@ -133,6 +133,16 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  *
 #define OP_MASK_SEL            0x7     /* The sel field of mfcZ and mtcZ.  */
 #define OP_SH_CODE19           6       /* 19 bit wait code.  */
 #define OP_MASK_CODE19         0x7ffff
+#define OP_SH_ALN              21
+#define OP_MASK_ALN            0x7
+#define OP_SH_VSEL             21
+#define OP_MASK_VSEL           0x1f
+
+/* Values in the 'VSEL' field.  */
+#define MDMX_FMTSEL_IMM_QH     0x1d
+#define MDMX_FMTSEL_IMM_OB     0x1e
+#define MDMX_FMTSEL_VEC_QH     0x15
+#define MDMX_FMTSEL_VEC_OB     0x16
 
 /* This structure holds information for a particular instruction.  */
 
@@ -220,13 +230,21 @@ struct mips_opcode
    "f" 32 bit floating point constant
    "l" 32 bit floating point constant in .lit4
 
+   MDMX instruction operands (note that while these use the FP register
+   fields, they accept both $fN and $vN names for the registers):  
+   "O" MDMX alignment offset (OP_*_ALN)
+   "Q" MDMX vector/scalar/immediate source (OP_*_VSEL and OP_*_FT)
+   "X" MDMX destination register (OP_*_FD) 
+   "Y" MDMX source register (OP_*_FS)
+   "Z" MDMX source register (OP_*_FT)
+
    Other:
    "()" parens surrounding optional value
    ","  separates operands
 
    Characters used so far, for quick reference when adding more:
    "<>(),"
-   "ABCDEFGHIJLMNPRSTUVW"
+   "ABCDEFGHIJLMNOPQRSTUVWXYZ"
    "abcdfhijklopqrstuvwxz"
 */
 
@@ -297,6 +315,10 @@ struct mips_opcode
 #define INSN_MULT                   0x40000000
 /* Instruction synchronize shared memory.  */
 #define INSN_SYNC                  0x80000000
+/* Instruction reads MDMX accumulator.  XXX FIXME: No bits left!  */
+#define INSN_READ_MDMX_ACC         0
+/* Instruction writes MDMX accumulator.  XXX FIXME: No bits left!  */
+#define INSN_WRITE_MDMX_ACC        0
 
 /* Instruction is actually a macro.  It should be ignored by the
    disassembler, and requires special treatment by the assembler.  */
@@ -320,6 +342,8 @@ struct mips_opcode
 
 /* MIPS-3D ASE */
 #define INSN_MIPS3D               0x00004000
+/* MDMX ASE */ 
+#define INSN_MDMX                 0x00008000
 
 /* Chip specific instructions.  These are bitmasks.  */
 
index 3e0c3d7..215cb0b 100644 (file)
@@ -1,3 +1,15 @@
+2002-05-30  Chris G. Demetriou  <cgd@broadcom.com>
+            Ed Satterthwaite  <ehs@broadcom.com>
+
+       * mips-dis.c (print_insn_arg): Add support for 'O', 'Q', 'X', 'Y',
+       and 'Z' formats, for MDMX.
+        (mips_isa_type): Add MDMX instructions to the ISA
+       bit mask for bfd_mach_mipsisa64.
+       * mips-opc.c: Add support for MDMX instructions.
+       (MX): New definition.
+
+       * mips-dis.c: Update copyright years to include 2002.
+
 2002-05-30  Diego Novillo  <dnovillo@redhat.com>
 
        * d10v-opc.c (d10v_opcodes): `btsti' does not modify its
index 661c179..b832ca2 100644 (file)
@@ -284,6 +284,53 @@ print_insn_arg (d, l, pc, info)
                             (l >> OP_SH_SEL) & OP_MASK_SEL);
       break;
 
+    case 'O':
+      (*info->fprintf_func) (info->stream, "%d",
+                            (l >> OP_SH_ALN) & OP_MASK_ALN);
+      break;
+
+    case 'Q':
+      {
+       unsigned int vsel = (l >> OP_SH_VSEL) & OP_MASK_VSEL;
+       if ((vsel & 0x10) == 0)
+         {
+           int fmt;
+           vsel &= 0x0f;
+           for (fmt = 0; fmt < 3; fmt++, vsel >>= 1)
+             if ((vsel & 1) == 0)
+               break;
+           (*info->fprintf_func) (info->stream, "$v%d[%d]",
+                                  (l >> OP_SH_FT) & OP_MASK_FT, 
+                                  vsel >> 1);
+         }
+       else if ((vsel & 0x08) == 0)
+         {
+           (*info->fprintf_func) (info->stream, "$v%d",
+                                  (l >> OP_SH_FT) & OP_MASK_FT);
+         }
+       else
+         {
+           (*info->fprintf_func) (info->stream, "0x%x",
+                                  (l >> OP_SH_FT) & OP_MASK_FT);
+         }
+      }
+      break;
+
+    case 'X':
+      (*info->fprintf_func) (info->stream, "$v%d",
+                            (l >> OP_SH_FD) & OP_MASK_FD);
+      break;
+
+    case 'Y':
+      (*info->fprintf_func) (info->stream, "$v%d",
+                            (l >> OP_SH_FS) & OP_MASK_FS);
+      break;
+
+    case 'Z':
+      (*info->fprintf_func) (info->stream, "$v%d",
+                            (l >> OP_SH_FT) & OP_MASK_FT);
+      break;
+
     default:
       /* xgettext:c-format */
       (*info->fprintf_func) (info->stream,
@@ -378,8 +425,8 @@ mips_isa_type (mach, isa, cputype)
     case bfd_mach_mipsisa32:
       *cputype = CPU_MIPS32;
       /* For stock MIPS32, disassemble all applicable MIPS-specified ASEs.
-        Note that MIPS-3D is not applicable to MIPS32.  (See _MIPS32
-        Architecture For Programmers Volume I: Introduction to the
+        Note that MIPS-3D and MDMX are not applicable to MIPS32.  (See
+        _MIPS32 Architecture For Programmers Volume I: Introduction to the
         MIPS32 Architecture_ (MIPS Document Number MD00082, Revision 0.95),
         page 1.  */
       *isa = ISA_MIPS32;
@@ -387,7 +434,7 @@ mips_isa_type (mach, isa, cputype)
     case bfd_mach_mipsisa64:
       *cputype = CPU_MIPS64;
       /* For stock MIPS64, disassemble all applicable MIPS-specified ASEs.  */
-      *isa = ISA_MIPS64 | INSN_MIPS3D;
+      *isa = ISA_MIPS64 | INSN_MDMX | INSN_MIPS3D;
       break;
 
     default:
index 4b8cbc7..1a76248 100644 (file)
@@ -4,7 +4,7 @@
    Contributed by Ralph Campbell and OSF
    Commented and modified by Ian Lance Taylor, Cygnus Support
    Extended for MIPS32 support by Anders Norlander, and by SiByte, Inc.
-   MIPS-3D support added by Broadcom Corporation (SiByte).
+   MIPS-3D and MDMX support added by Broadcom Corporation (SiByte).
 
 This file is part of GDB, GAS, and the GNU binutils.
 
@@ -75,6 +75,9 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  *
 
 #define IS_M    INSN_MULT
 
+#define        WR_MACC INSN_WRITE_MDMX_ACC
+#define        RD_MACC INSN_READ_MDMX_ACC
+
 #define I1     INSN_ISA1
 #define I2     INSN_ISA2
 #define I3     INSN_ISA3
@@ -86,6 +89,9 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  *
 /* MIPS64 MIPS-3D ASE support.  */
 #define M3D     INSN_MIPS3D
 
+/* MIPS64 MDMX ASE support.  */
+#define MX     INSN_MDMX
+
 #define P3     INSN_4650
 #define L1     INSN_4010
 #define V1      INSN_4100
@@ -144,15 +150,27 @@ const struct mips_opcode mips_builtin_opcodes[] =
 {"add",     "t,r,I",   0,    (int) M_ADD_I,    INSN_MACRO,             I1      },
 {"add.s",   "D,V,T",   0x46000000, 0xffe0003f, WR_D|RD_S|RD_T|FP_S,    I1      },
 {"add.d",   "D,V,T",   0x46200000, 0xffe0003f, WR_D|RD_S|RD_T|FP_D,    I1      },
+{"add.ob",  "X,Y,Q",   0x7800000b, 0xfc20003f, WR_D|RD_S|RD_T|FP_D,    MX      },
 {"add.ps",  "D,V,T",   0x46c00000, 0xffe0003f, WR_D|RD_S|RD_T|FP_D,    I5      },
+{"add.qh",  "X,Y,Q",   0x7820000b, 0xfc20003f, WR_D|RD_S|RD_T|FP_D,    MX      },
+{"adda.ob", "Y,Q",     0x78000037, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX      },
+{"adda.qh", "Y,Q",     0x78200037, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX      },
 {"addi",    "t,r,j",   0x20000000, 0xfc000000, WR_t|RD_s,              I1      },
 {"addiu",   "t,r,j",   0x24000000, 0xfc000000, WR_t|RD_s,              I1      },
+{"addl.ob", "Y,Q",     0x78000437, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX      },
+{"addl.qh", "Y,Q",     0x78200437, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX      },
 {"addr.ps", "D,S,T",   0x46c00018, 0xffe0003f, WR_D|RD_S|RD_T|FP_D,    M3D     },
 {"addu",    "d,v,t",   0x00000021, 0xfc0007ff, WR_d|RD_s|RD_t,         I1      },
 {"addu",    "t,r,I",   0,    (int) M_ADDU_I,   INSN_MACRO,             I1      },
+{"alni.ob", "X,Y,Z,O", 0x78000018, 0xff00003f, WR_D|RD_S|RD_T|FP_D,    MX      },
+{"alni.qh", "X,Y,Z,O", 0x7800001a, 0xff00003f, WR_D|RD_S|RD_T|FP_D,    MX      },
 {"alnv.ps", "D,V,T,s", 0x4c00001e, 0xfc00003f, WR_D|RD_S|RD_T|FP_D,    I5      },
+{"alnv.ob", "X,Y,Z,s", 0x78000019, 0xfc00003f, WR_D|RD_S|RD_T|RD_s|FP_D, MX    },
+{"alnv.qh", "X,Y,Z,s", 0x7800001b, 0xfc00003f, WR_D|RD_S|RD_T|RD_s|FP_D, MX    },
 {"and",     "d,v,t",   0x00000024, 0xfc0007ff, WR_d|RD_s|RD_t,         I1      },
 {"and",     "t,r,I",   0,    (int) M_AND_I,    INSN_MACRO,             I1      },
+{"and.ob",  "X,Y,Q",   0x7800000c, 0xfc20003f, WR_D|RD_S|RD_T|FP_D,    MX      },
+{"and.qh",  "X,Y,Q",   0x7820000c, 0xfc20003f, WR_D|RD_S|RD_T|FP_D,    MX      },
 {"andi",    "t,r,i",   0x30000000, 0xfc000000, WR_t|RD_s,              I1      },
 /* b is at the top of the table.  */
 /* bal is at the top of the table.  */
@@ -256,8 +274,10 @@ const struct mips_opcode mips_builtin_opcodes[] =
 {"c.eq.d",  "M,S,T",    0x46200032, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D,   I4|I32 },
 {"c.eq.s",  "S,T",      0x46000032, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S,   I1      },
 {"c.eq.s",  "M,S,T",    0x46000032, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S,   I4|I32 },
+{"c.eq.ob", "Y,Q",     0x78000001, 0xfc2007ff, WR_CC|RD_S|RD_T|FP_D,   MX      },
 {"c.eq.ps", "S,T",     0x46c00032, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D,   I5      },
 {"c.eq.ps", "M,S,T",   0x46c00032, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D,   I5      },
+{"c.eq.qh", "Y,Q",     0x78200001, 0xfc2007ff, WR_CC|RD_S|RD_T|FP_D,   MX      },
 {"c.ueq.d", "S,T",     0x46200033, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D,   I1      },
 {"c.ueq.d", "M,S,T",    0x46200033, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D,   I4|I32 },
 {"c.ueq.s", "S,T",      0x46000033, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S,   I1      },
@@ -316,8 +336,10 @@ const struct mips_opcode mips_builtin_opcodes[] =
 {"c.lt.d",  "M,S,T",    0x4620003c, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D,   I4|I32 },
 {"c.lt.s",  "S,T",     0x4600003c, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S,   I1      },
 {"c.lt.s",  "M,S,T",    0x4600003c, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S,   I4|I32 },
+{"c.lt.ob", "Y,Q",     0x78000004, 0xfc2007ff, WR_CC|RD_S|RD_T|FP_D,   MX      },
 {"c.lt.ps", "S,T",     0x46c0003c, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D,   I5      },
 {"c.lt.ps", "M,S,T",   0x46c0003c, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D,   I5      },
+{"c.lt.qh", "Y,Q",     0x78200004, 0xfc2007ff, WR_CC|RD_S|RD_T|FP_D,   MX      },
 {"c.nge.d", "S,T",     0x4620003d, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D,   I1      },
 {"c.nge.d", "M,S,T",    0x4620003d, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D,   I4|I32 },
 {"c.nge.s", "S,T",      0x4600003d, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S,   I1      },
@@ -328,8 +350,10 @@ const struct mips_opcode mips_builtin_opcodes[] =
 {"c.le.d",  "M,S,T",    0x4620003e, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D,   I4|I32 },
 {"c.le.s",  "S,T",     0x4600003e, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S,   I1      },
 {"c.le.s",  "M,S,T",    0x4600003e, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S,   I4|I32 },
+{"c.le.ob", "Y,Q",     0x78000005, 0xfc2007ff, WR_CC|RD_S|RD_T|FP_D,   MX      },
 {"c.le.ps", "S,T",     0x46c0003e, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D,   I5      },
 {"c.le.ps", "M,S,T",   0x46c0003e, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D,   I5      },
+{"c.le.qh", "Y,Q",     0x78200005, 0xfc2007ff, WR_CC|RD_S|RD_T|FP_D,   MX      },
 {"c.ngt.d", "S,T",     0x4620003f, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D,   I1      },
 {"c.ngt.d", "M,S,T",    0x4620003f, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D,   I4|I32 },
 {"c.ngt.s", "S,T",      0x4600003f, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S,   I1      },
@@ -626,6 +650,8 @@ const struct mips_opcode mips_builtin_opcodes[] =
 {"maddu",   "s,t",      0x70000001, 0xfc00ffff, RD_s|RD_t|WR_HILO|IS_M,      G1        },
 {"maddu",   "d,s,t",    0x70000001, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d|IS_M, G1        },
 {"madd16",  "s,t",      0x00000028, 0xfc00ffff, RD_s|RD_t|MOD_HILO,          V1 },
+{"max.ob",  "X,Y,Q",   0x78000007, 0xfc20003f, WR_D|RD_S|RD_T|FP_D,    MX      },
+{"max.qh",  "X,Y,Q",   0x78200007, 0xfc20003f, WR_D|RD_S|RD_T|FP_D,    MX      },
 {"mfpc",    "t,P",     0x4000c801, 0xffe0ffc1, LCD|WR_t|RD_C0,         M1      },
 {"mfps",    "t,P",     0x4000c800, 0xffe0ffc1, LCD|WR_t|RD_C0,         M1      },
 {"mfc0",    "t,G",     0x40000000, 0xffe007ff, LCD|WR_t|RD_C0,         I1      },
@@ -638,28 +664,39 @@ const struct mips_opcode mips_builtin_opcodes[] =
 {"mfc3",    "t,G,H",    0x4c000000, 0xffe007f8, LCD|WR_t|RD_C3,        I32     },
 {"mfhi",    "d",       0x00000010, 0xffff07ff, WR_d|RD_HI,             I1      },
 {"mflo",    "d",       0x00000012, 0xffff07ff, WR_d|RD_LO,             I1      },
+{"min.ob",  "X,Y,Q",   0x78000006, 0xfc20003f, WR_D|RD_S|RD_T|FP_D,    MX      },
+{"min.qh",  "X,Y,Q",   0x78200006, 0xfc20003f, WR_D|RD_S|RD_T|FP_D,    MX      },
 {"mov.d",   "D,S",     0x46200006, 0xffff003f, WR_D|RD_S|FP_D,         I1      },
 {"mov.s",   "D,S",     0x46000006, 0xffff003f, WR_D|RD_S|FP_S,         I1      },
 {"mov.ps",  "D,S",     0x46c00006, 0xffff003f, WR_D|RD_S|FP_D,         I5      },
 {"movf",    "d,s,N",    0x00000001, 0xfc0307ff, WR_d|RD_s|RD_CC|FP_D|FP_S, I4|I32},
 {"movf.d",  "D,S,N",    0x46200011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D,   I4|I32 },
+{"movf.l",  "D,S,N",   0x46a00011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D,   MX      },
+{"movf.l",  "X,Y,N",   0x46a00011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D,   MX      },
 {"movf.s",  "D,S,N",    0x46000011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_S,   I4|I32 },
 {"movf.ps", "D,S,N",   0x46c00011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D,   I5      },
 {"movn",    "d,v,t",    0x0000000b, 0xfc0007ff, WR_d|RD_s|RD_t,        I4|I32  },
 {"ffc",     "d,v",     0x0000000b, 0xfc1f07ff, WR_d|RD_s,              L1      },
 {"movn.d",  "D,S,t",    0x46200013, 0xffe0003f, WR_D|RD_S|RD_t|FP_D,    I4|I32 },
+{"movn.l",  "D,S,t",    0x46a00013, 0xffe0003f, WR_D|RD_S|RD_t|FP_D,    MX     },
+{"movn.l",  "X,Y,t",    0x46a00013, 0xffe0003f, WR_D|RD_S|RD_t|FP_D,    MX     },
 {"movn.s",  "D,S,t",    0x46000013, 0xffe0003f, WR_D|RD_S|RD_t|FP_S,    I4|I32 },
 {"movn.ps", "D,S,t",    0x46c00013, 0xffe0003f, WR_D|RD_S|RD_t|FP_D,    I5     },
 {"movt",    "d,s,N",    0x00010001, 0xfc0307ff, WR_d|RD_s|RD_CC,        I4|I32 },
 {"movt.d",  "D,S,N",    0x46210011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D,   I4|I32 },
+{"movt.l",  "D,S,N",    0x46a10011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D,   MX     },
+{"movt.l",  "X,Y,N",    0x46a10011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D,   MX     },
 {"movt.s",  "D,S,N",    0x46010011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_S,   I4|I32 },
 {"movt.ps", "D,S,N",   0x46c10011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D,   I5      },
 {"movz",    "d,v,t",    0x0000000a, 0xfc0007ff, WR_d|RD_s|RD_t,        I4|I32  },
 {"ffs",     "d,v",     0x0000000a, 0xfc1f07ff, WR_d|RD_s,              L1      },
 {"movz.d",  "D,S,t",    0x46200012, 0xffe0003f, WR_D|RD_S|RD_t|FP_D,    I4|I32 },
+{"movz.l",  "D,S,t",    0x46a00012, 0xffe0003f, WR_D|RD_S|RD_t|FP_D,    MX     },
+{"movz.l",  "X,Y,t",    0x46a00012, 0xffe0003f, WR_D|RD_S|RD_t|FP_D,    MX     },
 {"movz.s",  "D,S,t",    0x46000012, 0xffe0003f, WR_D|RD_S|RD_t|FP_S,    I4|I32 },
 {"movz.ps", "D,S,t",    0x46c00012, 0xffe0003f, WR_D|RD_S|RD_t|FP_D,    I5     },
 /* move is at the top of the table.  */
+{"msgn.qh", "X,Y,Q",   0x78200000, 0xfc20003f, WR_D|RD_S|RD_T|FP_D,    MX      },
 {"msub.d",  "D,R,S,T", 0x4c000029, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_D, I4    },
 {"msub.s",  "D,R,S,T", 0x4c000028, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_S, I4    },
 {"msub.ps", "D,R,S,T", 0x4c00002e, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_D, I5    },
@@ -681,15 +718,25 @@ const struct mips_opcode mips_builtin_opcodes[] =
 {"mtlo",    "s",       0x00000013, 0xfc1fffff, RD_s|WR_LO,             I1      },
 {"mul.d",   "D,V,T",   0x46200002, 0xffe0003f, WR_D|RD_S|RD_T|FP_D,    I1      },
 {"mul.s",   "D,V,T",   0x46000002, 0xffe0003f, WR_D|RD_S|RD_T|FP_S,    I1      },
+{"mul.ob",  "X,Y,Q",   0x78000030, 0xfc20003f, WR_D|RD_S|RD_T|FP_D,    MX      },
 {"mul.ps",  "D,V,T",   0x46c00002, 0xffe0003f, WR_D|RD_S|RD_T|FP_D,    I5      },
+{"mul.qh",  "X,Y,Q",   0x78200030, 0xfc20003f, WR_D|RD_S|RD_T|FP_D,    MX      },
 {"mul",     "d,v,t",    0x70000002, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, I32|P3  },
 {"mul",     "d,v,t",   0,    (int) M_MUL,      INSN_MACRO,             I1      },
 {"mul",     "d,v,I",   0,    (int) M_MUL_I,    INSN_MACRO,             I1      },
+{"mula.ob", "Y,Q",     0x78000033, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX      },
+{"mula.qh", "Y,Q",     0x78200033, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX      },
+{"mull.ob", "Y,Q",     0x78000433, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX      },
+{"mull.qh", "Y,Q",     0x78200433, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX      },
 {"mulo",    "d,v,t",   0,    (int) M_MULO,     INSN_MACRO,             I1      },
 {"mulo",    "d,v,I",   0,    (int) M_MULO_I,   INSN_MACRO,             I1      },
 {"mulou",   "d,v,t",   0,    (int) M_MULOU,    INSN_MACRO,             I1      },
 {"mulou",   "d,v,I",   0,    (int) M_MULOU_I,  INSN_MACRO,             I1      },
 {"mulr.ps", "D,S,T",   0x46c0001a, 0xffe0003f, WR_D|RD_S|RD_T|FP_D,    M3D     },
+{"muls.ob", "Y,Q",     0x78000032, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX      },
+{"muls.qh", "Y,Q",     0x78200032, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX      },
+{"mulsl.ob", "Y,Q",    0x78000432, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX      },
+{"mulsl.qh", "Y,Q",    0x78200432, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX      },
 {"mult",    "s,t",      0x00000018, 0xfc00ffff, RD_s|RD_t|WR_HILO|IS_M, I1     },
 {"mult",    "d,s,t",    0x00000018, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d|IS_M, G1        },
 {"multu",   "s,t",      0x00000019, 0xfc00ffff, RD_s|RD_t|WR_HILO|IS_M, I1     },
@@ -708,19 +755,29 @@ const struct mips_opcode mips_builtin_opcodes[] =
 /* nop is at the start of the table.  */
 {"nor",     "d,v,t",   0x00000027, 0xfc0007ff, WR_d|RD_s|RD_t,         I1      },
 {"nor",     "t,r,I",   0,    (int) M_NOR_I,    INSN_MACRO,             I1      },
+{"nor.ob",  "X,Y,Q",   0x7800000f, 0xfc20003f, WR_D|RD_S|RD_T|FP_D,    MX      },
+{"nor.qh",  "X,Y,Q",   0x7820000f, 0xfc20003f, WR_D|RD_S|RD_T|FP_D,    MX      },
 {"not",     "d,v",     0x00000027, 0xfc1f07ff, WR_d|RD_s|RD_t,         I1      },/*nor d,s,0*/
 {"or",      "d,v,t",   0x00000025, 0xfc0007ff, WR_d|RD_s|RD_t,         I1      },
 {"or",      "t,r,I",   0,    (int) M_OR_I,     INSN_MACRO,             I1      },
+{"or.ob",   "X,Y,Q",   0x7800000e, 0xfc20003f, WR_D|RD_S|RD_T|FP_D,    MX      },
+{"or.qh",   "X,Y,Q",   0x7820000e, 0xfc20003f, WR_D|RD_S|RD_T|FP_D,    MX      },
 {"ori",     "t,r,i",   0x34000000, 0xfc000000, WR_t|RD_s,              I1      },
-
+{"pickf.ob", "X,Y,Q",  0x78000002, 0xfc20003f, WR_D|RD_S|RD_T|FP_D,    MX      },
+{"pickf.qh", "X,Y,Q",  0x78200002, 0xfc20003f, WR_D|RD_S|RD_T|FP_D,    MX      },
+{"pickt.ob", "X,Y,Q",  0x78000003, 0xfc20003f, WR_D|RD_S|RD_T|FP_D,    MX      },
+{"pickt.qh", "X,Y,Q",  0x78200003, 0xfc20003f, WR_D|RD_S|RD_T|FP_D,    MX      },
 {"pll.ps",  "D,V,T",   0x46c0002c, 0xffe0003f, WR_D|RD_S|RD_T|FP_D,    I5      },
 {"plu.ps",  "D,V,T",   0x46c0002d, 0xffe0003f, WR_D|RD_S|RD_T|FP_D,    I5      },
-
   /* pref and prefx are at the start of the table.  */
-
 {"pul.ps",  "D,V,T",   0x46c0002e, 0xffe0003f, WR_D|RD_S|RD_T|FP_D,    I5      },
 {"puu.ps",  "D,V,T",   0x46c0002f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D,    I5      },
-
+{"rach.ob", "X",       0x7a00003f, 0xfffff83f, WR_D|RD_MACC|FP_D,      MX      },
+{"rach.qh", "X",       0x7a20003f, 0xfffff83f, WR_D|RD_MACC|FP_D,      MX      },
+{"racl.ob", "X",       0x7800003f, 0xfffff83f, WR_D|RD_MACC|FP_D,      MX      },
+{"racl.qh", "X",       0x7820003f, 0xfffff83f, WR_D|RD_MACC|FP_D,      MX      },
+{"racm.ob", "X",       0x7900003f, 0xfffff83f, WR_D|RD_MACC|FP_D,      MX      },
+{"racm.qh", "X",       0x7920003f, 0xfffff83f, WR_D|RD_MACC|FP_D,      MX      },
 {"recip.d", "D,S",     0x46200015, 0xffff003f, WR_D|RD_S|FP_D,         I4      },
 {"recip.ps","D,S",     0x46c00015, 0xffff003f, WR_D|RD_S|FP_D,         SB1     },
 {"recip.s", "D,S",     0x46000015, 0xffff003f, WR_D|RD_S|FP_S,         I4      },
@@ -737,6 +794,12 @@ const struct mips_opcode mips_builtin_opcodes[] =
 {"remu",    "d,v,t",   0,    (int) M_REMU_3,   INSN_MACRO,             I1      },
 {"remu",    "d,v,I",   0,    (int) M_REMU_3I,  INSN_MACRO,             I1      },
 {"rfe",     "",                0x42000010, 0xffffffff, 0,                      I1|T3   },
+{"rnas.qh", "X,Q",     0x78200025, 0xfc20f83f, WR_D|RD_MACC|RD_T|FP_D, MX      },
+{"rnau.ob", "X,Q",     0x78000021, 0xfc20f83f, WR_D|RD_MACC|RD_T|FP_D, MX      },
+{"rnau.qh", "X,Q",     0x78200021, 0xfc20f83f, WR_D|RD_MACC|RD_T|FP_D, MX      },
+{"rnes.qh", "X,Q",     0x78200026, 0xfc20f83f, WR_D|RD_MACC|RD_T|FP_D, MX      },
+{"rneu.ob", "X,Q",     0x78000022, 0xfc20f83f, WR_D|RD_MACC|RD_T|FP_D, MX      },
+{"rneu.qh", "X,Q",     0x78200022, 0xfc20f83f, WR_D|RD_MACC|RD_T|FP_D, MX      },
 {"rol",     "d,v,t",   0,    (int) M_ROL,      INSN_MACRO,             I1      },
 {"rol",     "d,v,I",   0,    (int) M_ROL_I,    INSN_MACRO,             I1      },
 {"ror",     "d,v,t",   0,    (int) M_ROR,      INSN_MACRO,             I1      },
@@ -754,6 +817,9 @@ const struct mips_opcode mips_builtin_opcodes[] =
 {"rsqrt2.d",  "D,S,T", 0x4620001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D,    M3D     },
 {"rsqrt2.ps", "D,S,T", 0x46c0001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_S,    M3D     },
 {"rsqrt2.s",  "D,S,T", 0x4600001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_S,    M3D     },
+{"rzs.qh",  "X,Q",     0x78200024, 0xfc20f83f, WR_D|RD_MACC|RD_T|FP_D, MX      },
+{"rzu.ob",  "X,Q",     0x78000020, 0xfc20f83f, WR_D|RD_MACC|RD_T|FP_D, MX      },
+{"rzu.qh",  "X,Q",     0x78200020, 0xfc20f83f, WR_D|RD_MACC|RD_T|FP_D, MX      },
 {"sb",      "t,o(b)",  0xa0000000, 0xfc000000, SM|RD_t|RD_b,           I1      },
 {"sb",      "t,A(b)",  0,    (int) M_SB_AB,    INSN_MACRO,             I1      },
 {"sc",     "t,o(b)",   0xe0000000, 0xfc000000, SM|RD_t|WR_t|RD_b,      I2      },
@@ -798,6 +864,16 @@ const struct mips_opcode mips_builtin_opcodes[] =
 {"sgtu",    "d,v,I",   0,    (int) M_SGTU_I,   INSN_MACRO,             I1      },
 {"sh",      "t,o(b)",  0xa4000000, 0xfc000000, SM|RD_t|RD_b,           I1      },
 {"sh",      "t,A(b)",  0,    (int) M_SH_AB,    INSN_MACRO,             I1      },
+{"shfl.bfla.qh", "X,Y,Z", 0x7a20001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, MX      },
+{"shfl.mixh.ob", "X,Y,Z", 0x7980001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, MX      },
+{"shfl.mixh.qh", "X,Y,Z", 0x7820001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, MX      },
+{"shfl.mixl.ob", "X,Y,Z", 0x79c0001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, MX      },
+{"shfl.mixl.qh", "X,Y,Z", 0x78a0001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, MX      },
+{"shfl.pach.ob", "X,Y,Z", 0x7900001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, MX      },
+{"shfl.pach.qh", "X,Y,Z", 0x7920001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, MX      },
+{"shfl.repa.qh", "X,Y,Z", 0x7b20001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, MX      },
+{"shfl.repb.qh", "X,Y,Z", 0x7ba0001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, MX      },
+{"shfl.upsl.ob", "X,Y,Z", 0x78c0001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, MX      },
 {"sle",     "d,v,t",   0,    (int) M_SLE,      INSN_MACRO,             I1      },
 {"sle",     "d,v,I",   0,    (int) M_SLE_I,    INSN_MACRO,             I1      },
 {"sleu",    "d,v,t",   0,    (int) M_SLEU,     INSN_MACRO,             I1      },
@@ -805,6 +881,8 @@ const struct mips_opcode mips_builtin_opcodes[] =
 {"sllv",    "d,t,s",   0x00000004, 0xfc0007ff, WR_d|RD_t|RD_s,         I1      },
 {"sll",     "d,w,s",   0x00000004, 0xfc0007ff, WR_d|RD_t|RD_s,         I1      }, /* sllv */
 {"sll",     "d,w,<",   0x00000000, 0xffe0003f, WR_d|RD_t,              I1      },
+{"sll.ob",  "X,Y,Q",   0x78000010, 0xfc20003f, WR_D|RD_S|RD_T|FP_D,    MX      },
+{"sll.qh",  "X,Y,Q",   0x78200010, 0xfc20003f, WR_D|RD_S|RD_T|FP_D,    MX      },
 {"slt",     "d,v,t",   0x0000002a, 0xfc0007ff, WR_d|RD_s|RD_t,         I1      },
 {"slt",     "d,v,I",   0,    (int) M_SLT_I,    INSN_MACRO,             I1      },
 {"slti",    "t,r,j",   0x28000000, 0xfc000000, WR_t|RD_s,              I1      },
@@ -819,16 +897,25 @@ const struct mips_opcode mips_builtin_opcodes[] =
 {"srav",    "d,t,s",   0x00000007, 0xfc0007ff, WR_d|RD_t|RD_s,         I1      },
 {"sra",     "d,w,s",   0x00000007, 0xfc0007ff, WR_d|RD_t|RD_s,         I1      }, /* srav */
 {"sra",     "d,w,<",   0x00000003, 0xffe0003f, WR_d|RD_t,              I1      },
+{"sra.qh",  "X,Y,Q",   0x78200013, 0xfc20003f, WR_D|RD_S|RD_T|FP_D,    MX      },
 {"srlv",    "d,t,s",   0x00000006, 0xfc0007ff, WR_d|RD_t|RD_s,         I1      },
 {"srl",     "d,w,s",   0x00000006, 0xfc0007ff, WR_d|RD_t|RD_s,         I1      }, /* srlv */
 {"srl",     "d,w,<",   0x00000002, 0xffe0003f, WR_d|RD_t,              I1      },
+{"srl.ob",  "X,Y,Q",   0x78000012, 0xfc20003f, WR_D|RD_S|RD_T|FP_D,    MX      },
+{"srl.qh",  "X,Y,Q",   0x78200012, 0xfc20003f, WR_D|RD_S|RD_T|FP_D,    MX      },
 /* ssnop is at the start of the table.  */
 {"standby", "",         0x42000021, 0xffffffff,        0,                      V1      },
 {"sub",     "d,v,t",   0x00000022, 0xfc0007ff, WR_d|RD_s|RD_t,         I1      },
 {"sub",     "d,v,I",   0,    (int) M_SUB_I,    INSN_MACRO,             I1      },
 {"sub.d",   "D,V,T",   0x46200001, 0xffe0003f, WR_D|RD_S|RD_T|FP_D,    I1      },
 {"sub.s",   "D,V,T",   0x46000001, 0xffe0003f, WR_D|RD_S|RD_T|FP_S,    I1      },
+{"sub.ob",  "X,Y,Q",   0x7800000a, 0xfc20003f, WR_D|RD_S|RD_T|FP_D,    MX      },
 {"sub.ps",  "D,V,T",   0x46c00001, 0xffe0003f, WR_D|RD_S|RD_T|FP_D,    I5      },
+{"sub.qh",  "X,Y,Q",   0x7820000a, 0xfc20003f, WR_D|RD_S|RD_T|FP_D,    MX      },
+{"suba.ob", "Y,Q",     0x78000036, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX      },
+{"suba.qh", "Y,Q",     0x78200036, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX      },
+{"subl.ob", "Y,Q",     0x78000436, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX      },
+{"subl.qh", "Y,Q",     0x78200436, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX      },
 {"subu",    "d,v,t",   0x00000023, 0xfc0007ff, WR_d|RD_s|RD_t,         I1      },
 {"subu",    "d,v,I",   0,    (int) M_SUBU_I,   INSN_MACRO,             I1      },
 {"suspend", "",         0x42000022, 0xffffffff,        0,                      V1      },
@@ -919,11 +1006,18 @@ const struct mips_opcode mips_builtin_opcodes[] =
 {"usw",     "t,A(b)",  0,    (int) M_USW_A,    INSN_MACRO,             I1      },
 {"xor",     "d,v,t",   0x00000026, 0xfc0007ff, WR_d|RD_s|RD_t,         I1      },
 {"xor",     "t,r,I",   0,    (int) M_XOR_I,    INSN_MACRO,             I1      },
+{"xor.ob",  "X,Y,Q",   0x7800000d, 0xfc20003f, WR_D|RD_S|RD_T|FP_D,    MX      },
+{"xor.qh",  "X,Y,Q",   0x7820000d, 0xfc20003f, WR_D|RD_S|RD_T|FP_D,    MX      },
 {"xori",    "t,r,i",   0x38000000, 0xfc000000, WR_t|RD_s,              I1      },
+{"wach.ob", "Y",       0x7a00003e, 0xffff07ff, WR_MACC|RD_S|FP_D,      MX      },
+{"wach.qh", "Y",       0x7a20003e, 0xffff07ff, WR_MACC|RD_S|FP_D,      MX      },
+{"wacl.ob", "Y,Z",     0x7800003e, 0xffe007ff, WR_MACC|RD_S|RD_T|FP_D, MX      },
+{"wacl.qh", "Y,Z",     0x7820003e, 0xffe007ff, WR_MACC|RD_S|RD_T|FP_D, MX      },
 {"wait",    "",         0x42000020, 0xffffffff, TRAP,                  I3|I32  },
 {"wait",    "J",        0x42000020, 0xfe00003f, TRAP,                  I32     },
 {"waiti",   "",                0x42000020, 0xffffffff, TRAP,                   L1      },
 {"wb",             "o(b)",     0xbc040000, 0xfc1f0000, SM|RD_b,                L1      },
+
 /* No hazard protection on coprocessor instructions--they shouldn't
    change the state of the processor and if they do it's up to the
    user to put in nops as necessary.  These are at the end so that the