aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2013-03-20 10:23:39 +0100
committerUros Bizjak <uros@gcc.gnu.org>2013-03-20 10:23:39 +0100
commit2a930377f9274c613ea5a78fee27e5599841b854 (patch)
treeca626e3e5db1aca7b54614e6aee855e0d73317dc /gcc
parentd6d305febc69430ee94dd7eb4c492c7b013232e1 (diff)
downloadgcc-2a930377f9274c613ea5a78fee27e5599841b854.zip
gcc-2a930377f9274c613ea5a78fee27e5599841b854.tar.gz
gcc-2a930377f9274c613ea5a78fee27e5599841b854.tar.bz2
re PR bootstrap/56656 (Suffix or operands invalid for 'movq')
PR bootstrap/56656 * config/i386/i386.md (*movdi_internal): Handle broken assemblers that require movd instead of movq. From-SVN: r196813
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/i386/i386.md36
2 files changed, 27 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a011230..ceb5f28 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index e7eaabb..ff8e36b 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -1876,8 +1876,7 @@
/* 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]);
@@ -1886,14 +1885,19 @@
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 ();
}
@@ -2771,33 +2775,35 @@
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 ();
}