* config/tc-mips.c (macro): The 4650 doesn't permit M_LDC1_AB,
authorIan Lance Taylor <ian@airs.com>
Mon, 22 Dec 1997 09:56:49 +0000 (09:56 +0000)
committerIan Lance Taylor <ian@airs.com>
Mon, 22 Dec 1997 09:56:49 +0000 (09:56 +0000)
M_SDC1_AB, M_L_DOB, M_L_DAB, M_S_DAB, or M_S_DOB.
(mips_ip): Always check for FP_D, not just for instructions that
are not part of the regular ISA.

gas/ChangeLog
gas/config/tc-mips.c

index 7d5e376021bcede296ae0f2890b1117e90f5fb14..7fedfaa42f9aab4dc813a0c734b0cfa6eecd8675 100644 (file)
@@ -1,3 +1,10 @@
+Mon Dec 22 12:54:07 1997  Ian Lance Taylor  <ian@cygnus.com>
+
+       * config/tc-mips.c (macro): The 4650 doesn't permit M_LDC1_AB,
+       M_SDC1_AB, M_L_DOB, M_L_DAB, M_S_DAB, or M_S_DOB.
+       (mips_ip): Always check for FP_D, not just for instructions that
+       are not part of the regular ISA.
+
 Thu Dec 18 16:49:28 1997  Richard Henderson  <rth@cygnus.com>
 
        * config/tc-d10v.c (build_insn): Make `number' a long for 64-bit hosts.
index c39e11ee4b5cebb13d887635f10862a1e489db30..28ee593a110ad8812bac595bd43a7bd5555a768b 100644 (file)
@@ -242,11 +242,20 @@ static int mips_4900 = -1;
 /* Whether the processor uses hardware interlocks to protect reads
    from the GPRs, and thus does not require nops to be inserted.  */
 #define gpr_interlocks (mips_opts.isa >= 2 || mips_3900)
+/* start-sanitize-vr5400 */
+#undef gpr_interlocks
+#define gpr_interlocks (mips_opts.isa >= 2 || mips_3900 || mips_5400)
+/* end-sanitize-vr5400 */
+
 
 /* As with other "interlocks" this is used by hardware that has FP
    (co-processor) interlocks.  */
 /* Itbl support may require additional care here. */
 #define cop_interlocks (mips_cpu == 4300)
+/* start-sanitize-vr5400 */
+#undef cop_interlocks
+#define cop_interlocks (mips_cpu == 4300 || mips_cpu == 5400)
+/* end-sanitize-vr5400 */
 
 /* MIPS PIC level.  */
 
@@ -2400,9 +2409,7 @@ macro_build (place, counter, ep, name, fmt, va_alist)
   /* Search until we get a match for NAME.  */
   while (1)
     {
-      if (insn.insn_mo->pinfo == INSN_MACRO)
-       insn_isa = insn.insn_mo->match;
-      else if ((insn.insn_mo->membership & INSN_ISA) == INSN_ISA1)
+      if ((insn.insn_mo->membership & INSN_ISA) == INSN_ISA1)
        insn_isa = 1;
       else if ((insn.insn_mo->membership & INSN_ISA) == INSN_ISA2)
        insn_isa = 2;
@@ -4651,6 +4658,11 @@ macro (ip)
       lr = 1;
       goto ld;
     case M_LDC1_AB:
+      if (mips_4650)
+       {
+         as_bad ("opcode not supported on this processor");
+         return;
+       }
       s = "ldc1";
       /* Itbl support may require additional care here. */
       coproc = 1;
@@ -4735,6 +4747,11 @@ macro (ip)
       s = "scd";
       goto st;
     case M_SDC1_AB:
+      if (mips_4650)
+       {
+         as_bad ("opcode not supported on this processor");
+         return;
+       }
       s = "sdc1";
       coproc = 1;
       /* Itbl support may require additional care here. */
@@ -5190,6 +5207,11 @@ macro (ip)
        }
 
     case M_L_DOB:
+      if (mips_4650)
+       {
+         as_bad ("opcode not supported on this processor");
+         return;
+       }
       /* Even on a big endian machine $fn comes before $fn+1.  We have
         to adjust when loading from memory.  */
       r = BFD_RELOC_LO16;
@@ -5226,6 +5248,11 @@ macro (ip)
        * But, the resulting address is the same after relocation so why
        * generate the extra instruction?
        */
+      if (mips_4650)
+       {
+         as_bad ("opcode not supported on this processor");
+         return;
+       }
       /* Itbl support may require additional care here. */
       coproc = 1;
       if (mips_opts.isa >= 2)
@@ -5239,6 +5266,12 @@ macro (ip)
       goto ldd_std;
 
     case M_S_DAB:
+      if (mips_4650)
+       {
+         as_bad ("opcode not supported on this processor");
+         return;
+       }
+
       if (mips_opts.isa >= 2)
        {
          s = "sdc1";
@@ -5820,6 +5853,11 @@ macro2 (ip)
       break;
 
     case M_S_DOB:
+      if (mips_4650)
+       {
+         as_bad ("opcode not supported on this processor");
+         return;
+       }
       assert (mips_opts.isa < 2);
       /* Even on a big endian machine $fn comes before $fn+1.  We have
         to adjust when storing to memory.  */
@@ -6672,8 +6710,8 @@ validate_mips_insn (opc)
       case 'w':        USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
       case 'x': break;
       case 'z': break;
-       /* start-sanitize-vr5400 */
       case 'P': USE_BITS (OP_MASK_PERFREG,     OP_SH_PERFREG); break;
+       /* start-sanitize-vr5400 */
       case 'e': USE_BITS (OP_MASK_VECBYTE,     OP_SH_VECBYTE); break;
       case '%': USE_BITS (OP_MASK_VECALIGN,    OP_SH_VECALIGN); break;
       case '[': break;
@@ -6750,9 +6788,7 @@ mips_ip (str, ip)
 
       assert (strcmp (insn->name, str) == 0);
 
-      if (insn->pinfo == INSN_MACRO)
-       insn_isa = insn->match;
-      else if ((insn->membership & INSN_ISA) == INSN_ISA1)
+      if ((insn->membership & INSN_ISA) == INSN_ISA1)
        insn_isa = 1;
       else if ((insn->membership & INSN_ISA) == INSN_ISA2)
        insn_isa = 2;
@@ -6780,18 +6816,17 @@ mips_ip (str, ip)
               || (mips_5400 && (insn->membership & INSN_5400) != 0)
               /* end-sanitize-vr5400 */
               || (mips_3900 && (insn->membership & INSN_3900) != 0))
-       {
-         ok = true;
-         if (mips_4650 && (insn->pinfo & FP_D) != 0)
-           ok = false;
-         /* start-sanitize-r5900 */
-         if (mips_5900 && (insn->pinfo & FP_D) != 0)
-           ok = false;
-         /* end-sanitize-r5900 */
-       }
+       ok = true;
       else
        ok = false;
 
+      if (mips_4650 && (insn->pinfo & FP_D) != 0)
+       ok = false;
+      /* start-sanitize-r5900 */
+      if (mips_5900 && (insn->pinfo & FP_D) != 0)
+       ok = false;
+      /* end-sanitize-r5900 */
+
       if (! ok)
        {
          if (insn + 1 < &mips_opcodes[NUMOPCODES]
@@ -6964,9 +6999,7 @@ mips_ip (str, ip)
            case 'G':           /* coprocessor destination register */
            case 'x':           /* ignore register name */
            case 'z':           /* must be zero register */
-             /* start-sanitize-vr5400 */
            case 'P':           /* performance register */
-             /* end-sanitize-vr5400 */
              s_reset = s;
              if (s[0] == '$')
                {
@@ -7049,6 +7082,7 @@ mips_ip (str, ip)
                  if (regno == AT
                      && ! mips_opts.noat
                      && *args != 'E'
+                     && *args != 'P'
                      && *args != 'G')
                    as_warn ("Used $at without \".set noat\"");
                  c = *args;
@@ -7104,6 +7138,9 @@ mips_ip (str, ip)
                    case 'D':
                      /* Itbl operand; not yet implemented. FIXME ?? */
                      break;
+                   case 'P':
+                     ip->insn_opcode |= regno << 1;
+                     break;
                      /* What about all other operands like 'i', which
                         can be specified in the opcode table? */
                    }