diff options
author | Uros Bizjak <ubizjak@gmail.com> | 2013-03-20 10:23:39 +0100 |
---|---|---|
committer | Uros Bizjak <uros@gcc.gnu.org> | 2013-03-20 10:23:39 +0100 |
commit | 2a930377f9274c613ea5a78fee27e5599841b854 (patch) | |
tree | ca626e3e5db1aca7b54614e6aee855e0d73317dc | |
parent | d6d305febc69430ee94dd7eb4c492c7b013232e1 (diff) | |
download | gcc-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
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 36 |
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 (); } |