Module Name:    src
Committed By:   matt
Date:           Fri Apr 29 06:34:18 UTC 2011

Modified Files:
        src/gnu/dist/binutils/bfd [matt-nb5-mips64]: aoutx.h archures.c
            bfd-in2.h cpu-mips.c elfxx-mips.c
        src/gnu/dist/binutils/binutils [matt-nb5-mips64]: readelf.c
        src/gnu/dist/binutils/gas/config [matt-nb5-mips64]: tc-mips.c
        src/gnu/dist/binutils/gas/doc [matt-nb5-mips64]: c-mips.texi
        src/gnu/dist/binutils/gas/testsuite/gas/mips [matt-nb5-mips64]:
            mips.exp
        src/gnu/dist/binutils/include/elf [matt-nb5-mips64]: mips.h
        src/gnu/dist/binutils/include/opcode [matt-nb5-mips64]: mips.h
        src/gnu/dist/binutils/opcodes [matt-nb5-mips64]: mips-dis.c mips-opc.c
Added Files:
        src/gnu/dist/binutils/gas/testsuite/gas/mips [matt-nb5-mips64]:
            xlr-ext.d xlr-ext.s

Log Message:
Integrate MIPS XLR support from
http://sourceware.org/ml/binutils/2009-01/msg00383.html


To generate a diff of this commit:
cvs rdiff -u -r1.1.1.3 -r1.1.1.3.32.1 src/gnu/dist/binutils/bfd/aoutx.h \
    src/gnu/dist/binutils/bfd/archures.c src/gnu/dist/binutils/bfd/bfd-in2.h \
    src/gnu/dist/binutils/bfd/cpu-mips.c
cvs rdiff -u -r1.1.1.3.32.1 -r1.1.1.3.32.2 \
    src/gnu/dist/binutils/bfd/elfxx-mips.c
cvs rdiff -u -r1.2 -r1.2.32.1 src/gnu/dist/binutils/binutils/readelf.c
cvs rdiff -u -r1.6 -r1.6.32.1 src/gnu/dist/binutils/gas/config/tc-mips.c
cvs rdiff -u -r1.1.1.3 -r1.1.1.3.32.1 \
    src/gnu/dist/binutils/gas/doc/c-mips.texi
cvs rdiff -u -r1.1.1.3 -r1.1.1.3.32.1 \
    src/gnu/dist/binutils/gas/testsuite/gas/mips/mips.exp
cvs rdiff -u -r0 -r1.1.2.1 \
    src/gnu/dist/binutils/gas/testsuite/gas/mips/xlr-ext.d \
    src/gnu/dist/binutils/gas/testsuite/gas/mips/xlr-ext.s
cvs rdiff -u -r1.1.1.3 -r1.1.1.3.32.1 \
    src/gnu/dist/binutils/include/elf/mips.h
cvs rdiff -u -r1.1.1.3 -r1.1.1.3.32.1 \
    src/gnu/dist/binutils/include/opcode/mips.h
cvs rdiff -u -r1.1.1.3 -r1.1.1.3.32.1 \
    src/gnu/dist/binutils/opcodes/mips-dis.c
cvs rdiff -u -r1.1.1.3.32.3 -r1.1.1.3.32.4 \
    src/gnu/dist/binutils/opcodes/mips-opc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/gnu/dist/binutils/bfd/aoutx.h
diff -u src/gnu/dist/binutils/bfd/aoutx.h:1.1.1.3 src/gnu/dist/binutils/bfd/aoutx.h:1.1.1.3.32.1
--- src/gnu/dist/binutils/bfd/aoutx.h:1.1.1.3	Thu Feb  2 20:43:24 2006
+++ src/gnu/dist/binutils/bfd/aoutx.h	Fri Apr 29 06:34:17 2011
@@ -796,6 +796,7 @@
 	case bfd_mach_mipsisa64:
 	case bfd_mach_mipsisa64r2:
 	case bfd_mach_mips_sb1:
+	case bfd_mach_mips_xlr:
 	  /* FIXME: These should be MIPS3, MIPS4, MIPS16, MIPS32, etc.  */
 	  arch_flags = M_MIPS2;
 	  break;
Index: src/gnu/dist/binutils/bfd/archures.c
diff -u src/gnu/dist/binutils/bfd/archures.c:1.1.1.3 src/gnu/dist/binutils/bfd/archures.c:1.1.1.3.32.1
--- src/gnu/dist/binutils/bfd/archures.c:1.1.1.3	Thu Feb  2 20:43:27 2006
+++ src/gnu/dist/binutils/bfd/archures.c	Fri Apr 29 06:34:17 2011
@@ -155,6 +155,7 @@
 .#define bfd_mach_mips16		16
 .#define bfd_mach_mips5                 5
 .#define bfd_mach_mips_sb1              12310201 {* octal 'SB', 01 *}
+.#define bfd_mach_mips_xlr              887682   {* decimal 'XLR'  *}
 .#define bfd_mach_mipsisa32             32
 .#define bfd_mach_mipsisa32r2           33
 .#define bfd_mach_mipsisa64             64
Index: src/gnu/dist/binutils/bfd/bfd-in2.h
diff -u src/gnu/dist/binutils/bfd/bfd-in2.h:1.1.1.3 src/gnu/dist/binutils/bfd/bfd-in2.h:1.1.1.3.32.1
--- src/gnu/dist/binutils/bfd/bfd-in2.h:1.1.1.3	Thu Feb  2 20:43:34 2006
+++ src/gnu/dist/binutils/bfd/bfd-in2.h	Fri Apr 29 06:34:17 2011
@@ -1600,6 +1600,7 @@
 #define bfd_mach_mips16                16
 #define bfd_mach_mips5                 5
 #define bfd_mach_mips_sb1              12310201 /* octal 'SB', 01 */
+#define bfd_mach_mips_xlr              887682   /* decimal 'XLR'  */
 #define bfd_mach_mipsisa32             32
 #define bfd_mach_mipsisa32r2           33
 #define bfd_mach_mipsisa64             64
Index: src/gnu/dist/binutils/bfd/cpu-mips.c
diff -u src/gnu/dist/binutils/bfd/cpu-mips.c:1.1.1.3 src/gnu/dist/binutils/bfd/cpu-mips.c:1.1.1.3.32.1
--- src/gnu/dist/binutils/bfd/cpu-mips.c:1.1.1.3	Thu Feb  2 20:44:45 2006
+++ src/gnu/dist/binutils/bfd/cpu-mips.c	Fri Apr 29 06:34:17 2011
@@ -86,6 +86,7 @@
   I_mipsisa64,
   I_mipsisa64r2,
   I_sb1,
+  I_xlr
 };
 
 #define NN(index) (&arch_info_struct[(index) + 1])
@@ -118,7 +119,9 @@
   N (32, 32, bfd_mach_mipsisa32r2,"mips:isa32r2", FALSE, NN(I_mipsisa32r2)),
   N (64, 64, bfd_mach_mipsisa64,  "mips:isa64",   FALSE, NN(I_mipsisa64)),
   N (64, 64, bfd_mach_mipsisa64r2,"mips:isa64r2", FALSE, NN(I_mipsisa64r2)),
-  N (64, 64, bfd_mach_mips_sb1, "mips:sb1",       FALSE, 0),
+  N (64, 64, bfd_mach_mips_sb1, "mips:sb1",       FALSE, NN(I_sb1)),
+  N (64, 64, bfd_mach_mips_xlr, "mips:xlr",       FALSE, 0)
+
 };
 
 /* The default architecture is mips:3000, but with a machine number of

Index: src/gnu/dist/binutils/bfd/elfxx-mips.c
diff -u src/gnu/dist/binutils/bfd/elfxx-mips.c:1.1.1.3.32.1 src/gnu/dist/binutils/bfd/elfxx-mips.c:1.1.1.3.32.2
--- src/gnu/dist/binutils/bfd/elfxx-mips.c:1.1.1.3.32.1	Sat Sep  5 03:10:39 2009
+++ src/gnu/dist/binutils/bfd/elfxx-mips.c	Fri Apr 29 06:34:17 2011
@@ -4669,6 +4669,9 @@
     case E_MIPS_MACH_SB1:
       return bfd_mach_mips_sb1;
 
+    case E_MIPS_MACH_XLR:
+      return bfd_mach_mips_xlr;
+
     default:
       switch (flags & EF_MIPS_ARCH)
 	{
@@ -7955,6 +7958,10 @@
       val = E_MIPS_ARCH_64 | E_MIPS_MACH_SB1;
       break;
 
+    case bfd_mach_mips_xlr:
+      val = E_MIPS_ARCH_64 | E_MIPS_MACH_XLR;
+      break;
+
     case bfd_mach_mipsisa32:
       val = E_MIPS_ARCH_32;
       break;
@@ -9614,6 +9621,7 @@
   /* MIPS64 extensions.  */
   { bfd_mach_mipsisa64r2, bfd_mach_mipsisa64 },
   { bfd_mach_mips_sb1, bfd_mach_mipsisa64 },
+  { bfd_mach_mips_xlr, bfd_mach_mipsisa64 },
 
   /* MIPS V extensions.  */
   { bfd_mach_mipsisa64, bfd_mach_mips5 },

Index: src/gnu/dist/binutils/binutils/readelf.c
diff -u src/gnu/dist/binutils/binutils/readelf.c:1.2 src/gnu/dist/binutils/binutils/readelf.c:1.2.32.1
--- src/gnu/dist/binutils/binutils/readelf.c:1.2	Fri Feb 17 13:14:25 2006
+++ src/gnu/dist/binutils/binutils/readelf.c	Fri Apr 29 06:34:17 2011
@@ -2043,6 +2043,7 @@
 	    case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
 	    case E_MIPS_MACH_SB1:  strcat (buf, ", sb1");  break;
 	    case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
+	    case E_MIPS_MACH_XLR:  strcat (buf, ", xlr");  break;
 	    case 0:
 	    /* We simply ignore the field in this case to avoid confusion:
 	       MIPS ELF does not specify EF_MIPS_MACH, it is a GNU

Index: src/gnu/dist/binutils/gas/config/tc-mips.c
diff -u src/gnu/dist/binutils/gas/config/tc-mips.c:1.6 src/gnu/dist/binutils/gas/config/tc-mips.c:1.6.32.1
--- src/gnu/dist/binutils/gas/config/tc-mips.c:1.6	Thu Feb  2 22:03:55 2006
+++ src/gnu/dist/binutils/gas/config/tc-mips.c	Fri Apr 29 06:34:17 2011
@@ -5426,6 +5426,43 @@
 	macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
       break;
 
+    case M_MSGSND:
+      {
+	unsigned long temp = (treg << 16) | (0x01);
+	macro_build (NULL, "c2", "C", temp);
+      }
+      /* AT is not used, just return */
+      return;
+
+    case M_MSGLD:
+      {
+	unsigned long temp = (0x02);
+	macro_build (NULL, "c2", "C", temp);
+      }
+      /* AT is not used, just return */
+      return;
+
+    case M_MSGLD_T:
+      {
+	unsigned long temp = (treg << 16) | (0x02);
+	macro_build (NULL, "c2", "C", temp);
+      }
+      /* AT is not used, just return */
+      return;
+
+    case M_MSGWAIT:
+      macro_build (NULL, "c2", "C", 3);
+      /* AT is not used, just return */
+      return;
+
+    case M_MSGWAIT_T:
+      {
+	unsigned long temp = (treg << 16) | 0x03;
+	macro_build (NULL, "c2", "C", temp);
+      }
+      /* AT is not used, just return */
+      return;
+
     case M_J_A:
       /* The j instruction may not be used in PIC code, since it
 	 requires an absolute address.  We convert it to a b
@@ -13785,6 +13822,9 @@
   /* Broadcom SB-1 CPU core */
   { "sb1",            0,      ISA_MIPS64,     CPU_SB1 },
 
+  /* RMI Xlr */
+  { "xlr",	      0,      ISA_MIPS64,     CPU_XLR },
+
   /* End marker */
   { NULL, 0, 0, 0 }
 };

Index: src/gnu/dist/binutils/gas/doc/c-mips.texi
diff -u src/gnu/dist/binutils/gas/doc/c-mips.texi:1.1.1.3 src/gnu/dist/binutils/gas/doc/c-mips.texi:1.1.1.3.32.1
--- src/gnu/dist/binutils/gas/doc/c-mips.texi:1.1.1.3	Thu Feb  2 20:59:33 2006
+++ src/gnu/dist/binutils/gas/doc/c-mips.texi	Fri Apr 29 06:34:17 2011
@@ -191,7 +191,8 @@
 10000,
 12000,
 mips32-4k,
-sb1
+sb1,
+xlr
 @end quotation
 
 @item -mtune=@var{cpu}

Index: src/gnu/dist/binutils/gas/testsuite/gas/mips/mips.exp
diff -u src/gnu/dist/binutils/gas/testsuite/gas/mips/mips.exp:1.1.1.3 src/gnu/dist/binutils/gas/testsuite/gas/mips/mips.exp:1.1.1.3.32.1
--- src/gnu/dist/binutils/gas/testsuite/gas/mips/mips.exp:1.1.1.3	Thu Feb  2 21:05:41 2006
+++ src/gnu/dist/binutils/gas/testsuite/gas/mips/mips.exp	Fri Apr 29 06:34:17 2011
@@ -382,7 +382,8 @@
 mips_arch_create sb1 	64	mips64	{ mips3d } \
 			{ -march=sb1 -mtune=sb1 } { -mmips:sb1 } \
 			{ mipsisa64sb1-*-* mipsisa64sb1el-*-* }
-
+mips_arch_create xlr	64	mips64 {} \
+			{ -march=xlr -mtune=xlr } { -mmips:xlr }
 
 #
 # And now begin the actual tests!
@@ -575,6 +576,7 @@
 	run_dump_test "mips64-mdmx"
 	run_dump_test "sb1-ext-mdmx"
 	run_dump_test "sb1-ext-ps"
+	run_dump_test "xlr-ext"
     }
 
     run_dump_test "relax"

Index: src/gnu/dist/binutils/include/elf/mips.h
diff -u src/gnu/dist/binutils/include/elf/mips.h:1.1.1.3 src/gnu/dist/binutils/include/elf/mips.h:1.1.1.3.32.1
--- src/gnu/dist/binutils/include/elf/mips.h:1.1.1.3	Thu Feb  2 21:11:53 2006
+++ src/gnu/dist/binutils/include/elf/mips.h	Fri Apr 29 06:34:18 2011
@@ -209,6 +209,7 @@
 #define E_MIPS_MACH_4120	0x00870000
 #define E_MIPS_MACH_4111	0x00880000
 #define E_MIPS_MACH_SB1         0x008a0000
+#define E_MIPS_MACH_XLR		0x008c0000
 #define E_MIPS_MACH_5400	0x00910000
 #define E_MIPS_MACH_5500	0x00980000
 #define E_MIPS_MACH_9000	0x00990000

Index: src/gnu/dist/binutils/include/opcode/mips.h
diff -u src/gnu/dist/binutils/include/opcode/mips.h:1.1.1.3 src/gnu/dist/binutils/include/opcode/mips.h:1.1.1.3.32.1
--- src/gnu/dist/binutils/include/opcode/mips.h:1.1.1.3	Thu Feb  2 21:12:25 2006
+++ src/gnu/dist/binutils/include/opcode/mips.h	Fri Apr 29 06:34:18 2011
@@ -410,6 +410,9 @@
 #define INSN_ISA32R2              0x00000080
 #define INSN_ISA64R2              0x00000100
 
+/* Masks used for Chip specific instructions.  */
+#define INSN_CHIP_MASK		  0xc3ff0820
+
 /* Masks used for MIPS-defined ASEs.  */
 #define INSN_ASE_MASK		  0x0000f000
 
@@ -442,6 +445,8 @@
 #define INSN_5400		  0x01000000
 /* NEC VR5500 instruction.  */
 #define INSN_5500		  0x02000000
+/* RMI Xlr instruction.  */
+#define INSN_XLR		  0x00000020
 
 /* MIPS ISA defines, use instead of hardcoding ISA level.  */
 
@@ -489,6 +494,8 @@
 #define CPU_MIPS64      64
 #define CPU_MIPS64R2	65
 #define CPU_SB1         12310201        /* octal 'SB', 01.  */
+#define CPU_XLR		887682		/* decimal 'XLR'   */
+
 
 /* Test for membership in an ISA including chip specific ISAs.  INSN
    is pointer to an element of the opcode table; ISA is the specified
@@ -510,6 +517,7 @@
      || (cpu == CPU_VR4120 && ((insn)->membership & INSN_4120) != 0)	\
      || (cpu == CPU_VR5400 && ((insn)->membership & INSN_5400) != 0)	\
      || (cpu == CPU_VR5500 && ((insn)->membership & INSN_5500) != 0)	\
+     || (cpu == CPU_XLR && ((insn)->membership & INSN_XLR) != 0)	\
      || 0)	/* Please keep this term for easier source merging.  */
 
 /* This is a list of macro expanded instructions.
@@ -640,6 +648,11 @@
   M_LWR_A,
   M_LWR_AB,
   M_LWU_AB,
+  M_MSGSND,
+  M_MSGLD,
+  M_MSGLD_T,
+  M_MSGWAIT,
+  M_MSGWAIT_T,
   M_MOVE,
   M_MUL,
   M_MUL_I,

Index: src/gnu/dist/binutils/opcodes/mips-dis.c
diff -u src/gnu/dist/binutils/opcodes/mips-dis.c:1.1.1.3 src/gnu/dist/binutils/opcodes/mips-dis.c:1.1.1.3.32.1
--- src/gnu/dist/binutils/opcodes/mips-dis.c:1.1.1.3	Thu Feb  2 21:16:09 2006
+++ src/gnu/dist/binutils/opcodes/mips-dis.c	Fri Apr 29 06:34:18 2011
@@ -185,6 +185,7 @@
 
 static const struct mips_cp0sel_name mips_cp0sel_names_mips3264r2[] = {
   {  4, 1, "c0_contextconfig"	},
+  {  4, 2, "c0_userlocal"	},
   {  5, 1, "c0_pagegrain"	},
   { 12, 1, "c0_intctl"		},
   { 12, 2, "c0_srsctl"		},
@@ -272,6 +273,63 @@
   { 29, 2, "c0_taghi_d"		},
   { 29, 3, "c0_datahi_d"	},
 };
+ 
+/* Xlr cop0 register names.  */
+static const char * const mips_cp0_names_xlr[32] = {
+  "c0_index",     "c0_random",    "c0_entrylo0",  "c0_entrylo1",
+  "c0_context",   "c0_pagemask",  "c0_wired",     "c0_hwrena",
+  "c0_badvaddr",  "c0_count",     "c0_entryhi",   "c0_compare",
+  "c0_status",    "c0_cause",     "c0_epc",       "c0_prid",
+  "c0_config",    "c0_lladdr",    "c0_watchlo",   "c0_watchhi",
+  "c0_xcontext",  "$21",          "c0_osscratch", "c0_debug",
+  "c0_depc",      "c0_perfcnt",   "c0_errctl",    "c0_cacheerr_i",
+  "c0_taglo_i",   "c0_taghi_i",   "c0_errorepc",  "c0_desave",
+};
+
+/* XLR's CP0 Select Registers.  */
+
+static const struct mips_cp0sel_name mips_cp0sel_names_xlr[] = {
+  {  9, 6, "c0_extintreq"       },
+  {  9, 7, "c0_extintmask"      },
+  { 15, 1, "c0_ebase"           },
+  { 16, 1, "c0_config1"         },
+  { 16, 2, "c0_config2"         },
+  { 16, 3, "c0_config3"         },
+  { 16, 7, "c0_procid2"         },
+  { 18, 1, "c0_watchlo,1"       },
+  { 18, 2, "c0_watchlo,2"       },
+  { 18, 3, "c0_watchlo,3"       },
+  { 18, 4, "c0_watchlo,4"       },
+  { 18, 5, "c0_watchlo,5"       },
+  { 18, 6, "c0_watchlo,6"       },
+  { 18, 7, "c0_watchlo,7"       },
+  { 19, 1, "c0_watchhi,1"       },
+  { 19, 2, "c0_watchhi,2"       },
+  { 19, 3, "c0_watchhi,3"       },
+  { 19, 4, "c0_watchhi,4"       },
+  { 19, 5, "c0_watchhi,5"       },
+  { 19, 6, "c0_watchhi,6"       },
+  { 19, 7, "c0_watchhi,7"       },
+  { 22, 1, "c0_osscratch,1"     },
+  { 22, 2, "c0_osscratch,2"     },
+  { 22, 3, "c0_osscratch,3"     },
+  { 22, 4, "c0_osscratch,4"     },
+  { 22, 5, "c0_osscratch,5"     },
+  { 22, 6, "c0_osscratch,6"     },
+  { 22, 7, "c0_osscratch,7"     },
+  { 25, 1, "c0_perfcnt,1"       },
+  { 25, 2, "c0_perfcnt,2"       },
+  { 25, 3, "c0_perfcnt,3"       },
+  { 25, 4, "c0_perfcnt,4"       },
+  { 25, 5, "c0_perfcnt,5"       },
+  { 25, 6, "c0_perfcnt,6"       },
+  { 25, 7, "c0_perfcnt,7"       },
+  { 27, 1, "c0_cacheerr,1"      },
+  { 27, 2, "c0_cacheerr,2"      },
+  { 27, 3, "c0_cacheerr,3"      },
+  { 28, 1, "c0_datalo"          },
+  { 29, 1, "c0_datahi"          }
+};
 
 static const char * const mips_hwr_names_numeric[32] = {
   "$0",   "$1",   "$2",   "$3",   "$4",   "$5",   "$6",   "$7",
@@ -285,7 +343,7 @@
   "$4",          "$5",            "$6",           "$7",
   "$8",   "$9",   "$10",  "$11",  "$12",  "$13",  "$14",  "$15",
   "$16",  "$17",  "$18",  "$19",  "$20",  "$21",  "$22",  "$23",
-  "$24",  "$25",  "$26",  "$27",  "$28",  "$29",  "$30",  "$31"
+  "$24",  "$25",  "$26",  "$27",  "$28",  "hwr_userlocal",  "$30",  "$31"
 };
 
 struct mips_abi_choice {
@@ -396,6 +454,12 @@
     mips_cp0sel_names_sb1, ARRAY_SIZE (mips_cp0sel_names_sb1),
     mips_hwr_names_numeric },
 
+  { "xlr", 1, bfd_mach_mips_xlr, CPU_XLR,
+    ISA_MIPS64 | INSN_XLR,
+    mips_cp0_names_xlr,
+    mips_cp0sel_names_xlr, ARRAY_SIZE (mips_cp0sel_names_xlr),
+    mips_hwr_names_numeric },
+
   /* This entry, mips16, is here only for ISA/processor selection; do
      not print its name.  */
   { "",		1, bfd_mach_mips16, CPU_MIPS16, ISA_MIPS3 | INSN_MIPS16,

Index: src/gnu/dist/binutils/opcodes/mips-opc.c
diff -u src/gnu/dist/binutils/opcodes/mips-opc.c:1.1.1.3.32.3 src/gnu/dist/binutils/opcodes/mips-opc.c:1.1.1.3.32.4
--- src/gnu/dist/binutils/opcodes/mips-opc.c:1.1.1.3.32.3	Wed Feb 17 08:41:43 2010
+++ src/gnu/dist/binutils/opcodes/mips-opc.c	Fri Apr 29 06:34:18 2011
@@ -109,6 +109,7 @@
 #define N5	(INSN_5400 | INSN_5500)
 #define N54	INSN_5400
 #define N55	INSN_5500
+#define	XLR	INSN_XLR
 
 #define G1      (T3             \
                  )
@@ -471,6 +472,7 @@
 {"daddiu",  "t,r,j",	0x64000000, 0xfc000000, WR_t|RD_s,		0,		I3	},
 {"daddu",   "d,v,t",	0x0000002d, 0xfc0007ff, WR_d|RD_s|RD_t,		0,		I3	},
 {"daddu",   "t,r,I",	0,    (int) M_DADDU_I,	INSN_MACRO,		0,		I3	},
+{"daddwc",  "d,s,t", 	0x70000038, 0xfc0007ff, WR_d|RD_s|RD_t|WR_C0|RD_C0,	0,	XLR	},
 {"dbreak",  "",		0x7000003f, 0xffffffff,	0,			0,		N5	},
 {"dclo",    "U,s",      0x70000025, 0xfc0007ff, RD_s|WR_d|WR_t, 	0,		I64|N55 },
 {"dclz",    "U,s",      0x70000024, 0xfc0007ff, RD_s|WR_d|WR_t, 	0,		I64|N55 },
@@ -639,6 +641,9 @@
 {"ld",	    "t,o(b)",   0xdc000000, 0xfc000000, WR_t|RD_b,		0,		I3	},
 {"ld",      "t,o(b)",	0,    (int) M_LD_OB,	INSN_MACRO,		0,		I1	},
 {"ld",      "t,A(b)",	0,    (int) M_LD_AB,	INSN_MACRO,		0,		I1	},
+{"ldaddw",  "t,b",	0x70000010, 0xfc00ffff,	SM|RD_t|WR_t|RD_b,	0,		XLR	},
+{"ldaddwu", "t,b",	0x70000011, 0xfc00ffff,	SM|RD_t|WR_t|RD_b,	0,		XLR	},
+{"ldaddd",  "t,b",	0x70000012, 0xfc00ffff,	SM|RD_t|WR_t|RD_b,	0,		XLR	},
 {"ldc1",    "T,o(b)",	0xd4000000, 0xfc000000, CLD|RD_b|WR_T|FP_D,	0,		I2	},
 {"ldc1",    "E,o(b)",	0xd4000000, 0xfc000000, CLD|RD_b|WR_T|FP_D,	0,		I2	},
 {"ldc1",    "T,A(b)",	0,    (int) M_LDC1_AB,	INSN_MACRO,		0,		I2	},
@@ -742,6 +747,7 @@
 {"mfdr",    "t,G",	0x7000003d, 0xffe007ff,	LCD|WR_t|RD_C0,		0,		N5      },
 {"mfhi",    "d",	0x00000010, 0xffff07ff,	WR_d|RD_HI,		0,		I1	},
 {"mflo",    "d",	0x00000012, 0xffff07ff,	WR_d|RD_LO,		0,		I1	},
+{"mfcr",    "t,s",	0x70000018, 0xfc00ffff, WR_t,			0,		XLR	},
 {"min.ob",  "X,Y,Q",	0x78000006, 0xfc20003f,	WR_D|RD_S|RD_T|FP_D,	0,		MX|SB1	},
 {"min.ob",  "D,S,T",	0x4ac00006, 0xffe0003f,	WR_D|RD_S|RD_T,		0,		N54	},
 {"min.ob",  "D,S,T[e]",	0x48000006, 0xfe20003f,	WR_D|RD_S|RD_T,		0,		N54	},
@@ -782,6 +788,11 @@
 {"msachiu", "d,s,t",	0x000003d9, 0xfc0007ff,	RD_s|RD_t|WR_HILO|WR_d,	0,		N5	},
 /* move is at the top of the table.  */
 {"msgn.qh", "X,Y,Q",	0x78200000, 0xfc20003f,	WR_D|RD_S|RD_T|FP_D,	0,		MX	},
+{"msgsnd",  "t",	0,    (int) M_MSGSND,	INSN_MACRO,		0,		XLR	},
+{"msgld",   "",		0,    (int) M_MSGLD,	INSN_MACRO,		0,		XLR	},
+{"msgld",   "t",	0,    (int) M_MSGLD_T,	INSN_MACRO,		0,		XLR	},
+{"msgwait", "",		0,    (int) M_MSGWAIT,	INSN_MACRO,		0,		XLR	},
+{"msgwait", "t",	0,    (int) M_MSGWAIT_T,INSN_MACRO,		0,		XLR	},
 {"msub.d",  "D,R,S,T",	0x4c000029, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_D, 0,		I4	},
 {"msub.s",  "D,R,S,T",	0x4c000028, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_S, 0,		I4	},
 {"msub.ps", "D,R,S,T",	0x4c00002e, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_D, 0,		I5	},
@@ -802,11 +813,10 @@
 /* mthc2 is at the bottom of the table.  */
 {"mtc3",    "t,G",	0x4c800000, 0xffe007ff,	COD|RD_t|WR_C3|WR_CC,	0,		I1	},
 {"mtc3",    "t,G,H",    0x4c800000, 0xffe007f8, COD|RD_t|WR_C3|WR_CC,   0,		I32     },
-{"mfcr",    "t,s",	0x70000018, 0xfc00ffff,	WR_t|RD_s,		0,		I64	},
-{"mtcr",    "t,s",	0x70000019, 0xfc00ffff,	WR_t|RD_s,		0,		I64	},
 {"mtdr",    "t,G",	0x7080003d, 0xffe007ff,	COD|RD_t|WR_C0,		0,		N5	},
 {"mthi",    "s",	0x00000011, 0xfc1fffff,	RD_s|WR_HI,		0,		I1	},
 {"mtlo",    "s",	0x00000013, 0xfc1fffff,	RD_s|WR_LO,		0,		I1	},
+{"mtcr",    "t,s",	0x70000019, 0xfc00ffff, RD_t,			0,		XLR	},
 {"mul.d",   "D,V,T",	0x46200002, 0xffe0003f,	WR_D|RD_S|RD_T|FP_D,	0,		I1	},
 {"mul.s",   "D,V,T",	0x46000002, 0xffe0003f,	WR_D|RD_S|RD_T|FP_S,	0,		I1	},
 {"mul.ob",  "X,Y,Q",	0x78000030, 0xfc20003f,	WR_D|RD_S|RD_T|FP_D,	0,		MX|SB1	},
@@ -1077,6 +1087,9 @@
 {"suxc1",   "S,t(b)",   0x4c00000d, 0xfc0007ff, SM|RD_S|RD_t|RD_b,	0,		I5|N55	},
 {"sw",      "t,o(b)",	0xac000000, 0xfc000000,	SM|RD_t|RD_b,		0,		I1	},
 {"sw",      "t,A(b)",	0,    (int) M_SW_AB,	INSN_MACRO,		0,		I1	},
+{"swapw",   "t,b",	0x70000014, 0xfc00ffff, SM|RD_t|WR_t|RD_b,	0,		XLR	},
+{"swapwu",  "t,b",	0x70000015, 0xfc00ffff, SM|RD_t|WR_t|RD_b,	0,		XLR	},
+{"swapd",   "t,b",	0x70000016, 0xfc00ffff, SM|RD_t|WR_t|RD_b,	0,		XLR	},
 {"swc0",    "E,o(b)",	0xe0000000, 0xfc000000,	SM|RD_C0|RD_b,		0,		I1	},
 {"swc0",    "E,A(b)",	0,    (int) M_SWC0_AB,	INSN_MACRO,		0,		I1	},
 {"swc1",    "T,o(b)",	0xe4000000, 0xfc000000,	SM|RD_T|RD_b|FP_S,	0,		I1	},
@@ -1200,11 +1213,6 @@
 {"mtc2",    "t,G,H",	0x48800000, 0xffe007f8,	COD|RD_t|WR_C2|WR_CC,	0,		I32	},
 {"mthc2",   "t,i",	0x48e00000, 0xffe00000,	COD|RD_t|WR_C2|WR_CC,	0,		I33	},
 
-/* RMI Coprocessor 2 ops */
-{"msgsnd",  "t",	0x4a000001, 0xffe0ffff,	COD|RD_t|WR_C2,		0,		I64	},
-{"msgld",   "t",	0x4a000002, 0xffe0ffff,	COD|RD_t|WR_C2,		0,		I64	},
-{"msgwait", "t",	0x4a000003, 0xffe0ffff,	COD|RD_t|WR_C2,		0,		I64	},
-
 /* 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

Added files:

Index: src/gnu/dist/binutils/gas/testsuite/gas/mips/xlr-ext.d
diff -u /dev/null src/gnu/dist/binutils/gas/testsuite/gas/mips/xlr-ext.d:1.1.2.1
--- /dev/null	Fri Apr 29 06:34:18 2011
+++ src/gnu/dist/binutils/gas/testsuite/gas/mips/xlr-ext.d	Fri Apr 29 06:34:17 2011
@@ -0,0 +1,20 @@
+#objdump: -dr --prefix-addresses --show-raw-insn -mmips:xlr
+#name: XLRs native MIPS64 extensions
+#as: -march=xlr
+
+.*: +file format .*mips.*
+
+Disassembly of section .text:
+0+0000 <[^>]*> 3c000000 	lui	zero,0x0
+0+0004 <[^>]*> 8c010001 	lw	at,1\(zero\)
+0+0008 <[^>]*> 8c020002 	lw	v0,2\(zero\)
+0+000c <[^>]*> 70221838 	daddwc	v1,at,v0
+0+0010 <[^>]*> 70230010 	ldaddw	v1,at
+0+0014 <[^>]*> 70230011 	ldaddwu	v1,at
+0+0018 <[^>]*> 70230012 	ldaddd	v1,at
+0+001c <[^>]*> 70230014 	swapw	v1,at
+0+0020 <[^>]*> 70230015 	swapwu	v1,at
+0+0024 <[^>]*> 4a000003 	c2	0x3
+0+0028 <[^>]*> 4a000002 	c2	0x2
+0+002c <[^>]*> 4a000001 	c2	0x1
+	\.\.\.
Index: src/gnu/dist/binutils/gas/testsuite/gas/mips/xlr-ext.s
diff -u /dev/null src/gnu/dist/binutils/gas/testsuite/gas/mips/xlr-ext.s:1.1.2.1
--- /dev/null	Fri Apr 29 06:34:18 2011
+++ src/gnu/dist/binutils/gas/testsuite/gas/mips/xlr-ext.s	Fri Apr 29 06:34:17 2011
@@ -0,0 +1,27 @@
+# Source file used to test XLR's assembler instructions
+
+	.set 	noreorder
+	.set 	noat
+
+	.globl	text_label	.text
+text_label:	
+
+	lui     $0, 0x00
+	lw 	    $1, 0x01
+	lw 	    $2, 0x02
+	
+	daddwc	$3, $1, $2
+	
+	ldaddw	$3, $1
+	ldaddwu	$3, $1
+	ldaddd	$3, $1
+
+	swapw	$3, $1
+	swapwu	$3, $1
+	
+	msgwait
+	msgld	$0
+	msgsnd	$0
+
+# Force at least 8 (non-delay-slot) zero bytes, to make 'objdump' print ...
+	.space  8

Reply via email to