Patchwork [4.5/4.6,i386] : Some random fixes in FP move patterns

login
register
mail settings
Submitter Uros Bizjak
Date May 16, 2011, 8:27 p.m.
Message ID <BANLkTi=84itFVCFS0tZkGWzTTAm7oUh5WQ@mail.gmail.com>
Download mbox | patch
Permalink /patch/95831/
State New
Headers show

Comments

Uros Bizjak - May 16, 2011, 8:27 p.m.
Hello!

This patch backports recent fixes in FP moves from mainline to 4.5 and
4.6 branches.

2011-05-16  Uros Bizjak  <ubizjak@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.

Patch

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)