From 2a930377f9274c613ea5a78fee27e5599841b854 Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Wed, 20 Mar 2013 10:23:39 +0100 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++++++ 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 + + PR bootstrap/56656 + * config/i386/i386.md (*movdi_internal): Handle broken assemblers + that require movd instead of movq. + 2013-03-20 Richard Biener * 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 (); } -- 2.7.4