Hello! Attached patch detects assemblers that expects movd instead of movq for interunit moves and adds fixup code only in case of broken assembler.
2013-03-21 Uros Bizjak <ubiz...@gmail.com> PR bootstrap/56656 * configure.ac (HAVE_AS_IX86_INTERUNIT_MOVQ): New test. * configure: Regenerate. * config.in: Regenerate. * config/i386/i386.md (*movdf_internal): Use HAVE_AS_IX86_INTERUNIT_MOVQ to handle broken assemblers that require movd instead of movq mnemonic for interunit moves. (*movdi_internal): Ditto. Tested on x86_64-pc-linux-gnu, committed to mainline SVN. Uros.
Index: config/i386/i386.md =================================================================== --- config/i386/i386.md (revision 196841) +++ config/i386/i386.md (working copy) @@ -1878,9 +1878,11 @@ return "pxor\t%0, %0"; case TYPE_MMXMOV: +#ifndef HAVE_AS_IX86_INTERUNIT_MOVQ /* 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}"; +#endif return "movq\t{%1, %0|%0, %1}"; case TYPE_SSELOG1: @@ -1890,9 +1892,11 @@ switch (get_attr_mode (insn)) { case MODE_DI: +#ifndef HAVE_AS_IX86_INTERUNIT_MOVQ /* 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}"; +#endif return "%vmovq\t{%1, %0|%0, %1}"; case MODE_TI: return "%vmovdqa\t{%1, %0|%0, %1}"; @@ -2797,9 +2801,11 @@ return "movlpd\t{%1, %0|%0, %1}"; case MODE_DI: +#ifndef HAVE_AS_IX86_INTERUNIT_MOVQ /* 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}"; +#endif return "%vmovq\t{%1, %0|%0, %1}"; default: Index: configure.ac =================================================================== --- configure.ac (revision 196841) +++ configure.ac (working copy) @@ -3723,6 +3723,14 @@ [AC_DEFINE(HAVE_AS_IX86_SAHF, 1, [Define if your assembler supports the sahf mnemonic in 64bit mode.])]) + gcc_GAS_CHECK_FEATURE([interunit movq mnemonic], + gcc_cv_as_ix86_interunit_movq,,, + [.code64 + movq %mm0, %rax + movq %rax, %xmm0],, + [AC_DEFINE(HAVE_AS_IX86_INTERUNIT_MOVQ, 1, + [Define if your assembler supports interunit movq mnemonic.])]) + gcc_GAS_CHECK_FEATURE([hle prefixes], gcc_cv_as_ix86_hle,,, [lock xacquire cmpxchg %esi, (%ecx)],,