This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[RFC PATCH, i386]: Use integer x87 FP instructions when optimizing for size


Hello!

IMO, we should use integer x87 FP instructions for -mfmpath=i387 when optimizing for size, since we have:

8: da 45 10 fiaddl 0x10(%ebp)

vs:

  8:    db 45 10                 fildl  0x10(%ebp)
  b:    de c1                    faddp  %st,%st(1)

The gain is obvious.

Attached patch shortcuts TARGET_USE_xxMODE_FIOP with optimize_size for relevant insn patterns.

The patch was bootstrapped and regression tested on x86_64-pc-linux-gnu/-m32. The plan is to commit the patch to mainline in a day or two.

2008-05-31 Uros Bizjak <ubizjak@gmail.com>

   * config/i386/i386.md (*cmpfp_<mode>): Enable for optimize_size.
   (*cmpfp_<mode>_cc): Ditto.
   (*fp_jcc_8<mode>_387): Ditto.
   (*fop_<MODEF:mode>_2_i387): Ditto.
   (*fop_<MODEF:mode>_3_i387): Ditto.
   (*fop_xf_2_i387): Ditto.
   (*fop_xf_3_i387): Ditto.

Uros.
Index: config/i386/i386.md
===================================================================
--- config/i386/i386.md	(revision 136238)
+++ config/i386/i386.md	(working copy)
@@ -1169,7 +1169,7 @@
 	       [(match_operand:X87MODEI12 2 "memory_operand" "m")]))]
 	  UNSPEC_FNSTSW))]
   "X87_FLOAT_MODE_P (GET_MODE (operands[1]))
-   && TARGET_USE_<MODE>MODE_FIOP
+   && (TARGET_USE_<MODE>MODE_FIOP || optimize_size)
    && (GET_MODE (operands [3]) == GET_MODE (operands[1]))"
   "* return output_fp_compare (insn, operands, 0, 0);"
   [(set_attr "type" "multi")
@@ -1186,7 +1186,7 @@
    (clobber (match_operand:HI 0 "register_operand" "=a"))]
   "X87_FLOAT_MODE_P (GET_MODE (operands[1]))
    && TARGET_SAHF && !TARGET_CMOVE
-   && TARGET_USE_<MODE>MODE_FIOP
+   && (TARGET_USE_<MODE>MODE_FIOP || optimize_size)
    && (GET_MODE (operands [3]) == GET_MODE (operands[1]))"
   "#"
   "&& reload_completed"
@@ -14288,7 +14288,7 @@
    (clobber (reg:CCFP FLAGS_REG))
    (clobber (match_scratch:HI 5 "=a,a"))]
   "X87_FLOAT_MODE_P (GET_MODE (operands[3]))
-   && TARGET_USE_<MODE>MODE_FIOP
+   && (TARGET_USE_<MODE>MODE_FIOP || optimize_size)
    && GET_MODE (operands[1]) == GET_MODE (operands[3])
    && !ix86_use_fcomi_compare (swap_condition (GET_CODE (operands[0])))
    && ix86_fp_compare_mode (swap_condition (GET_CODE (operands[0]))) == CCFPmode
@@ -15926,7 +15926,7 @@
 	     (match_operand:X87MODEI12 1 "nonimmediate_operand" "m,?r"))
 	   (match_operand:MODEF 2 "register_operand" "0,0")]))]
   "TARGET_80387 && !TARGET_SSE_MATH
-   && TARGET_USE_<X87MODEI12:MODE>MODE_FIOP"
+   && (TARGET_USE_<X87MODEI12:MODE>MODE_FIOP || optimize_size)"
   "* return which_alternative ? \"#\" : output_387_binary_op (insn, operands);"
   [(set (attr "type")
         (cond [(match_operand:MODEF 3 "mult_operator" "")
@@ -15945,7 +15945,7 @@
 	   (float:MODEF
 	     (match_operand:X87MODEI12 2 "nonimmediate_operand" "m,?r"))]))]
   "TARGET_80387 && !TARGET_SSE_MATH
-   && TARGET_USE_<X87MODEI12:MODE>MODE_FIOP"
+   && (TARGET_USE_<X87MODEI12:MODE>MODE_FIOP || optimize_size)"
   "* return which_alternative ? \"#\" : output_387_binary_op (insn, operands);"
   [(set (attr "type")
         (cond [(match_operand:MODEF 3 "mult_operator" "")
@@ -15960,7 +15960,8 @@
 (define_insn "*fop_df_4_i387"
   [(set (match_operand:DF 0 "register_operand" "=f,f")
 	(match_operator:DF 3 "binary_fp_operator"
-	   [(float_extend:DF (match_operand:SF 1 "nonimmediate_operand" "fm,0"))
+	   [(float_extend:DF
+	     (match_operand:SF 1 "nonimmediate_operand" "fm,0"))
 	    (match_operand:DF 2 "register_operand" "0,f")]))]
   "TARGET_80387 && !(TARGET_SSE2 && TARGET_SSE_MATH)
    && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
@@ -16046,7 +16047,7 @@
 	  [(float:XF
 	     (match_operand:X87MODEI12 1 "nonimmediate_operand" "m,?r"))
 	   (match_operand:XF 2 "register_operand" "0,0")]))]
-  "TARGET_80387 && TARGET_USE_<MODE>MODE_FIOP"
+  "TARGET_80387 && (TARGET_USE_<MODE>MODE_FIOP || optimize_size)"
   "* return which_alternative ? \"#\" : output_387_binary_op (insn, operands);"
   [(set (attr "type")
         (cond [(match_operand:XF 3 "mult_operator" "")
@@ -16064,7 +16065,7 @@
 	  [(match_operand:XF 1 "register_operand" "0,0")
 	   (float:XF
 	     (match_operand:X87MODEI12 2 "nonimmediate_operand" "m,?r"))]))]
-  "TARGET_80387 && TARGET_USE_<MODE>MODE_FIOP"
+  "TARGET_80387 && (TARGET_USE_<MODE>MODE_FIOP || optimize_size)"
   "* return which_alternative ? \"#\" : output_387_binary_op (insn, operands);"
   [(set (attr "type")
         (cond [(match_operand:XF 3 "mult_operator" "")

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]