Added --nowarnswap arg to suppress "Swapping instructions" warning.
authorBill Moyer <billm@cygnus>
Wed, 28 Jan 1998 18:20:46 +0000 (18:20 +0000)
committerBill Moyer <billm@cygnus>
Wed, 28 Jan 1998 18:20:46 +0000 (18:20 +0000)
gas/ChangeLog
gas/as.c
gas/as.h
gas/config/tc-d10v.c

index 7f4e06cfea7d4804f38e543d794ded21e2e568c3..67ed5c5409f59aff1f63021f9a2a0729cdbd45a2 100644 (file)
@@ -1,3 +1,10 @@
+Fri Jan 28 10:18:06 1998  Bill Moyer <billm@cygnus.com>
+        
+       * as.h (flag_warn_instructionswap): added new flag variable.
+       * as.c (parse_args): added "--nowarnswap" command line arg.
+       * tc-d10v.c (write_2_short): emit "Swapping instructions"
+       warning only if flag_warn_instructionswap is set.
+
 start-sanitize-sky
 Wed Jan 28 10:00:40 1998  Doug Evans  <devans@canuck.cygnus.com>
 
index 42613087ca68fcf11b6928d185e592548f736d58..93959668dd33adfb5fdf273296aa9be7c6c1b71f 100644 (file)
--- a/gas/as.c
+++ b/gas/as.c
@@ -356,7 +356,9 @@ parse_args (pargc, pargv)
 #define OPTION_GSTABS (OPTION_STD_BASE + 14)
     {"gstabs", no_argument, NULL, OPTION_GSTABS},
 #define OPTION_STRIP_LOCAL_ABSOLUTE (OPTION_STD_BASE + 15)
-    {"strip-local-absolute", no_argument, NULL, OPTION_STRIP_LOCAL_ABSOLUTE}
+    {"strip-local-absolute", no_argument, NULL, OPTION_STRIP_LOCAL_ABSOLUTE},
+#define OPTION_NOWARNSWAP (OPTION_STD_BASE + 16)
+    {"nowarnswap", no_argument, NULL, OPTION_NOWARNSWAP}
   };
 
   /* Construct the option lists from the standard list and the
@@ -532,6 +534,10 @@ the GNU General Public License.  This program has absolutely no warranty.\n");
        case OPTION_GSTABS:
          debug_type = DEBUG_STABS;
          break;
+        case OPTION_NOWARNSWAP:
+          flag_warn_instructionswap = 0;
+          break;
 
        case 'J':
          flag_signed_overflow_ok = 1;
@@ -702,6 +708,7 @@ main (argc, argv)
 #endif
 
   out_file_name = OBJ_DEFAULT_OUTPUT_FILE_NAME;
+  flag_warn_instructionswap = 1;
 
   hex_init ();
 #ifdef BFD_ASSEMBLER
index e5991908cb716c4a449456525de2b4ea3a3fe488..2d7052c66939f26dc7d104d73a7a48200e28d170 100644 (file)
--- a/gas/as.h
+++ b/gas/as.h
@@ -423,6 +423,9 @@ COMMON int flag_no_warnings; /* -W */
    are detected.  */
 COMMON unsigned char flag_always_generate_output; /* -Z */
 
+/* True if instruction swapping warnings should be inhibited.  */
+COMMON unsigned char flag_warn_instructionswap; /* --nowarnswap */
+
 /* This is true if the assembler should output time and space usage. */
 COMMON unsigned char flag_print_statistics;
 
index c8324b4585b1e2c2c61f859396f943fee154138b..195e26665944c110eb1a0ccbb558fc5d46056669 100644 (file)
@@ -501,7 +501,7 @@ build_insn (opcode, opers, insn)
      unsigned long insn;
 {
   int i, bits, shift, flags, format;
-  unsigned int number;
+  unsigned long number;
   
   /* the insn argument is only used for the DIVS kludge */
   if (insn)
@@ -718,14 +718,16 @@ write_2_short (opcode1, insn1, opcode2, insn2, exec_type, fx)
        {
          if (opcode2->unit == IU)
            as_fatal ("Two IU instructions may not be executed in parallel");
-         as_warn ("Swapping instruction order");
+          if (flag_warn_instructionswap)
+           as_warn ("Swapping instruction order");
          insn = FM00 | (insn2 << 15) | insn1;
        }
       else if (opcode2->unit == MU)
        {
          if (opcode1->unit == MU)
            as_fatal ("Two MU instructions may not be executed in parallel");
-         as_warn ("Swapping instruction order");
+          if (flag_warn_instructionswap)
+           as_warn ("Swapping instruction order");
          insn = FM00 | (insn2 << 15) | insn1;
        }
       else
@@ -863,7 +865,7 @@ parallel_ok (op1, insn1, op2, insn2, exec_type)
                  else
                    regno = 18; 
                }
-             else if (flags & OPERAND_FLAG)  
+             else if (flags & (OPERAND_FFLAG|OPERAND_CFLAG))  
                regno = 19;
              
              if ( flags & OPERAND_DEST )
@@ -1086,6 +1088,7 @@ find_opcode (opcode, myops)
   if (opcode->format == OPCODE_FAKE)
     {
       int opnum = opcode->operands[0];
+      int flags;
                         
       if (myops[opnum].X_op == O_register)
        {
@@ -1095,11 +1098,31 @@ find_opcode (opcode, myops)
          myops[opnum].X_op_symbol = NULL;
        }
 
+      next_opcode=opcode+1;
+
+      /* If the first operand is supposed to be a register, make sure
+        we got a valid one.  */
+      flags = d10v_operands[next_opcode->operands[0]].flags;
+      if (flags & OPERAND_REG)
+       {
+         int X_op = myops[0].X_op;
+         int num = myops[0].X_add_number;
+
+         if (X_op != O_register
+             || (flags & OPERAND_ACC) != (num & OPERAND_ACC)
+             || (flags & OPERAND_FFLAG) != (num & OPERAND_FFLAG)
+             || (flags & OPERAND_CFLAG) != (num & OPERAND_CFLAG)
+             || (flags & OPERAND_CONTROL) != (num & OPERAND_CONTROL))
+           {
+             as_bad ("bad opcode or operands");
+             return 0;
+           }
+       }
+
       if (myops[opnum].X_op == O_constant || (myops[opnum].X_op == O_symbol &&
          S_IS_DEFINED(myops[opnum].X_add_symbol) &&
          (S_GET_SEGMENT(myops[opnum].X_add_symbol) == now_seg)))
        {
-         next_opcode=opcode+1;
          for (i=0; opcode->operands[i+1]; i++)
            {
              int bits = d10v_operands[next_opcode->operands[opnum]].bits;
@@ -1173,7 +1196,8 @@ find_opcode (opcode, myops)
                {
                  if ((X_op != O_register) ||
                      ((flags & OPERAND_ACC) != (num & OPERAND_ACC)) ||
-                     ((flags & OPERAND_FLAG) != (num & OPERAND_FLAG)) ||
+                     ((flags & OPERAND_FFLAG) != (num & OPERAND_FFLAG)) ||
+                     ((flags & OPERAND_CFLAG) != (num & OPERAND_CFLAG)) ||
                      ((flags & OPERAND_CONTROL) != (num & OPERAND_CONTROL)))
                    {
                      match=0;