This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

add MDMX support to binutils.


The patch below adds MIPS MDMX ASE support to binutils.  A subset of
this patch has been tested extensively on the SB-1, the rest has
been checked and re-checked and tested in simulation.

I believe the new test case does an adequate job of testing assembly
of all of the instructions.


cgd
===================================================================
[ gas/ChangeLog ]
2002-05-21  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-21  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-21  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-21  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.

===================================================================
Index: gas/config/tc-mips.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-mips.c,v
retrieving revision 1.123
diff -u -p -r1.123 tc-mips.c
--- gas/config/tc-mips.c	14 May 2002 23:35:59 -0000	1.123
+++ gas/config/tc-mips.c	21 May 2002 16:32:15 -0000
@@ -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.  */
@@ -1239,6 +1248,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"));
@@ -1251,6 +1262,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;
 
@@ -2913,8 +2925,8 @@ macro_build (place, counter, ep, name, f
   /* 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)
@@ -7584,11 +7596,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;
@@ -7707,6 +7725,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;
@@ -7750,7 +7769,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 */
@@ -8099,6 +8121,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 */
@@ -8106,8 +8169,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;
@@ -8148,14 +8214,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':
@@ -9780,8 +9883,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},
@@ -9986,6 +10093,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);
@@ -11319,6 +11434,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;
@@ -12810,6 +12929,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: gas/doc/as.texinfo
===================================================================
RCS file: /cvs/src/src/gas/doc/as.texinfo,v
retrieving revision 1.62
diff -u -p -r1.62 as.texinfo
--- gas/doc/as.texinfo	16 Mar 2002 03:09:15 -0000	1.62
+++ gas/doc/as.texinfo	21 May 2002 16:32:16 -0000
@@ -375,6 +375,7 @@ gcc(1), ld(1), and the Info entries for 
    [@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
@@ -887,6 +888,12 @@ instructions around accesses to the @sam
 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
Index: gas/doc/c-mips.texi
===================================================================
RCS file: /cvs/src/src/gas/doc/c-mips.texi,v
retrieving revision 1.20
diff -u -p -r1.20 c-mips.texi
--- gas/doc/c-mips.texi	16 Mar 2002 10:00:43 -0000	1.20
+++ gas/doc/c-mips.texi	21 May 2002 16:32:16 -0000
@@ -105,6 +105,12 @@ Generate code for the MIPS-3D Applicatio
 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 -no-mfix7000
 Cause nops to be inserted if the read of the destination register
@@ -341,6 +347,14 @@ Traditional @sc{mips} assemblers do not 
 The directive @code{.set mips3d} makes the assembler accept instructions
 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: gas/testsuite/gas/mips/mips.exp
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/mips/mips.exp,v
retrieving revision 1.32
diff -u -p -r1.32 mips.exp
--- gas/testsuite/gas/mips/mips.exp	4 Apr 2002 08:23:30 -0000	1.32
+++ gas/testsuite/gas/mips/mips.exp	21 May 2002 16:32:17 -0000
@@ -151,6 +151,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.
Index: gas/testsuite/gas/mips/mips64-mdmx.d
===================================================================
RCS file: gas/testsuite/gas/mips/mips64-mdmx.d
diff -N gas/testsuite/gas/mips/mips64-mdmx.d
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gas/testsuite/gas/mips/mips64-mdmx.d	21 May 2002 16:32:17 -0000
@@ -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
+	\.\.\.
Index: gas/testsuite/gas/mips/mips64-mdmx.s
===================================================================
RCS file: gas/testsuite/gas/mips/mips64-mdmx.s
diff -N gas/testsuite/gas/mips/mips64-mdmx.s
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gas/testsuite/gas/mips/mips64-mdmx.s	21 May 2002 16:32:17 -0000
@@ -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: include/opcode/mips.h
===================================================================
RCS file: /cvs/src/src/include/opcode/mips.h,v
retrieving revision 1.24
diff -u -p -r1.24 mips.h
--- include/opcode/mips.h	16 Mar 2002 03:09:18 -0000	1.24
+++ include/opcode/mips.h	21 May 2002 16:32:19 -0000
@@ -133,6 +133,16 @@ Software Foundation, 59 Temple Place - S
 #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: opcodes/mips-dis.c
===================================================================
RCS file: /cvs/src/src/opcodes/mips-dis.c,v
retrieving revision 1.29
diff -u -p -r1.29 mips-dis.c
--- opcodes/mips-dis.c	14 May 2002 23:34:00 -0000	1.29
+++ opcodes/mips-dis.c	21 May 2002 16:32:23 -0000
@@ -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: opcodes/mips-opc.c
===================================================================
RCS file: /cvs/src/src/opcodes/mips-opc.c,v
retrieving revision 1.32
diff -u -p -r1.32 mips-opc.c
--- opcodes/mips-opc.c	17 Mar 2002 02:42:25 -0000	1.32
+++ opcodes/mips-opc.c	21 May 2002 16:32:23 -0000
@@ -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 - S
 
 #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 - S
 /* 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_op
 {"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_op
 {"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_op
 {"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_op
 {"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      },
@@ -622,6 +646,8 @@ const struct mips_opcode mips_builtin_op
 {"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	},
@@ -634,28 +660,39 @@ const struct mips_opcode mips_builtin_op
 {"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	},
@@ -677,15 +714,25 @@ const struct mips_opcode mips_builtin_op
 {"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	},
@@ -704,19 +751,29 @@ const struct mips_opcode mips_builtin_op
 /* 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	},
@@ -733,6 +790,12 @@ const struct mips_opcode mips_builtin_op
 {"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	},
@@ -750,6 +813,9 @@ const struct mips_opcode mips_builtin_op
 {"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	},
@@ -794,6 +860,16 @@ const struct mips_opcode mips_builtin_op
 {"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	},
@@ -801,6 +877,8 @@ const struct mips_opcode mips_builtin_op
 {"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	},
@@ -815,16 +893,25 @@ const struct mips_opcode mips_builtin_op
 {"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	},
@@ -915,11 +1002,18 @@ const struct mips_opcode mips_builtin_op
 {"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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]