Hello! This patch backports recent fixes in FP moves from mainline to 4.5 and 4.6 branches.
2011-05-16 Uros Bizjak <ubiz...@gmail.com> * config/i386/i386.md (*movxf_internal): Disable CONST_DOUBLE optimization for CM_MEDIUM and CM_LARGE code models. Fix usage of standard_80387_constant_p. (*movxf_internal_nointeger): Ditto. (*movdf_internal): Remove dead code-size optimization. (*movdf_internal_rex64): Fix usage of standard_80387_constant_p. (*movdf_internal_nointeger): Ditto. (*movsf_internal): Ditto. (floating point move splitters): Ditto. * config/i386/constraints.md (G): Ditto. * config/i386/i386.c (ix86_preferred_reload_class): Ditto. Tested on x86_64-pc-linux-gnu {,-m32}, committed to 4.5 and 4.6 branches. Uros.
Index: i386.md =================================================================== --- i386.md (revision 173495) +++ i386.md (working copy) @@ -2836,6 +2836,7 @@ "optimize_function_for_speed_p (cfun) && !(MEM_P (operands[0]) && MEM_P (operands[1])) && (reload_in_progress || reload_completed + || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE) || GET_CODE (operands[1]) != CONST_DOUBLE || memory_operand (operands[0], XFmode))" { @@ -2865,7 +2866,8 @@ "optimize_function_for_size_p (cfun) && !(MEM_P (operands[0]) && MEM_P (operands[1])) && (reload_in_progress || reload_completed - || standard_80387_constant_p (operands[1]) + || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE) + || standard_80387_constant_p (operands[1]) > 0 || GET_CODE (operands[1]) != CONST_DOUBLE || memory_operand (operands[0], XFmode))" { @@ -2911,7 +2913,7 @@ || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE) || (!(TARGET_SSE2 && TARGET_SSE_MATH) && optimize_function_for_size_p (cfun) - && standard_80387_constant_p (operands[1])) + && standard_80387_constant_p (operands[1]) > 0) || GET_CODE (operands[1]) != CONST_DOUBLE || memory_operand (operands[0], DFmode))" { @@ -3078,9 +3080,6 @@ && TARGET_INTEGER_DFMODE_MOVES && (reload_in_progress || reload_completed || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE) - || (!(TARGET_SSE2 && TARGET_SSE_MATH) - && optimize_function_for_size_p (cfun) - && standard_80387_constant_p (operands[1])) || GET_CODE (operands[1]) != CONST_DOUBLE || memory_operand (operands[0], DFmode))" { @@ -3249,11 +3248,10 @@ || (!(TARGET_SSE2 && TARGET_SSE_MATH) && optimize_function_for_size_p (cfun) && !memory_operand (operands[0], DFmode) - && standard_80387_constant_p (operands[1])) + && standard_80387_constant_p (operands[1]) > 0) || GET_CODE (operands[1]) != CONST_DOUBLE || ((optimize_function_for_size_p (cfun) - || !TARGET_MEMORY_MISMATCH_STALL - || reload_in_progress || reload_completed) + || !TARGET_MEMORY_MISMATCH_STALL) && memory_operand (operands[0], DFmode)))" { switch (which_alternative) @@ -3427,7 +3425,7 @@ && (reload_in_progress || reload_completed || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE) || (!TARGET_SSE_MATH && optimize_function_for_size_p (cfun) - && standard_80387_constant_p (operands[1])) + && standard_80387_constant_p (operands[1]) > 0) || GET_CODE (operands[1]) != CONST_DOUBLE || memory_operand (operands[0], SFmode))" { @@ -3540,7 +3538,7 @@ } else if (FP_REG_P (r)) { - if (!standard_80387_constant_p (c)) + if (standard_80387_constant_p (c) < 1) FAIL; } else if (MMX_REG_P (r)) @@ -3572,7 +3570,7 @@ } else if (FP_REG_P (r)) { - if (!standard_80387_constant_p (c)) + if (standard_80387_constant_p (c) < 1) FAIL; } else if (MMX_REG_P (r)) Index: constraints.md =================================================================== --- constraints.md (revision 173491) +++ constraints.md (working copy) @@ -149,7 +149,7 @@ (define_constraint "G" "Standard 80387 floating point constant." (and (match_code "const_double") - (match_test "standard_80387_constant_p (op)"))) + (match_test "standard_80387_constant_p (op) > 0"))) ;; This can theoretically be any mode's CONST0_RTX. (define_constraint "C" Index: i386.c =================================================================== --- i386.c (revision 173491) +++ i386.c (working copy) @@ -28252,7 +28252,7 @@ ix86_preferred_reload_class (rtx x, reg_ zero above. We only want to wind up preferring 80387 registers if we plan on doing computation with them. */ if (TARGET_80387 - && standard_80387_constant_p (x)) + && standard_80387_constant_p (x) > 0) { /* Limit class to non-sse. */ if (regclass == FLOAT_SSE_REGS)