This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[RFC PATCH, i386]: Use integer x87 FP instructions when optimizing for size
- From: Uros Bizjak <ubizjak at gmail dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Sat, 31 May 2008 18:43:07 +0200
- Subject: [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" "")