re PR bootstrap/56656 (Suffix or operands invalid for 'movq')
authorUros Bizjak <ubizjak@gmail.com>
Wed, 20 Mar 2013 09:23:39 +0000 (10:23 +0100)
committerUros Bizjak <uros@gcc.gnu.org>
Wed, 20 Mar 2013 09:23:39 +0000 (10:23 +0100)
PR bootstrap/56656
* config/i386/i386.md (*movdi_internal): Handle broken assemblers
that require movd instead of movq.

From-SVN: r196813

gcc/ChangeLog
gcc/config/i386/i386.md

index a011230..ceb5f28 100644 (file)
@@ -1,3 +1,9 @@
+2013-03-20  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR bootstrap/56656
+       * config/i386/i386.md (*movdi_internal): Handle broken assemblers
+       that require movd instead of movq.
+
 2013-03-20  Richard Biener  <rguenther@suse.de>
 
        * tree-ssa-structalias.c (struct variable_info): Add pointer
index e7eaabb..ff8e36b 100644 (file)
       /* Handle broken assemblers that require movd instead of movq.  */
       if (GENERAL_REG_P (operands[0]) || GENERAL_REG_P (operands[1]))
        return "movd\t{%1, %0|%0, %1}";
-      else
-       return "movq\t{%1, %0|%0, %1}";
+      return "movq\t{%1, %0|%0, %1}";
 
     case TYPE_SSELOG1:
       return standard_sse_constant_opcode (insn, operands[1]);
       switch (get_attr_mode (insn))
        {
        case MODE_DI:
-          return "%vmovq\t{%1, %0|%0, %1}";
+         /* Handle broken assemblers that require movd instead of movq.  */
+         if (GENERAL_REG_P (operands[0]) || GENERAL_REG_P (operands[1]))
+           return "%vmovd\t{%1, %0|%0, %1}";
+         return "%vmovq\t{%1, %0|%0, %1}";
        case MODE_TI:
          return "%vmovdqa\t{%1, %0|%0, %1}";
+
        case MODE_V4SF:
          return "%vmovaps\t{%1, %0|%0, %1}";
        case MODE_V2SF:
          gcc_assert (!TARGET_AVX);
          return "movlps\t{%1, %0|%0, %1}";
+
        default:
          gcc_unreachable ();
        }
     case 14:
     case 15:
     case 16:
+    case 17:
+    case 18:
       switch (get_attr_mode (insn))
        {
-       case MODE_V2DF:
-         return "%vmovapd\t{%1, %0|%0, %1}";
-       case MODE_V4SF:
-         return "%vmovaps\t{%1, %0|%0, %1}";
-
-       case MODE_DI:
-         return "%vmovq\t{%1, %0|%0, %1}";
        case MODE_DF:
          if (TARGET_AVX && REG_P (operands[0]) && REG_P (operands[1]))
            return "vmovsd\t{%1, %0, %0|%0, %0, %1}";
          return "%vmovsd\t{%1, %0|%0, %1}";
+
        case MODE_V1DF:
          return "%vmovlpd\t{%1, %d0|%d0, %1}";
+       case MODE_V2DF:
+         return "%vmovapd\t{%1, %0|%0, %1}";
        case MODE_V2SF:
          gcc_assert (!TARGET_AVX);
          return "movlps\t{%1, %0|%0, %1}";
+       case MODE_V4SF:
+         return "%vmovaps\t{%1, %0|%0, %1}";
+
+       case MODE_DI:
+         /* Handle broken assemblers that require movd instead of movq.  */
+         if (GENERAL_REG_P (operands[0]) || GENERAL_REG_P (operands[1]))
+           return "%vmovd\t{%1, %0|%0, %1}";
+         return "%vmovq\t{%1, %0|%0, %1}";
+
        default:
          gcc_unreachable ();
        }
 
-    case 17:
-    case 18:
-      /* Handle broken assemblers that require movd instead of movq.  */
-      return "%vmovd\t{%1, %0|%0, %1}";
-
     default:
       gcc_unreachable ();
     }