aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2012-06-20 19:37:40 +0200
committerUros Bizjak <uros@gcc.gnu.org>2012-06-20 19:37:40 +0200
commitbafda72341d399da97197e738167a8606bc45e54 (patch)
tree0bcf60c1ade986481733e6b5fb38f276abbae475
parent975667e7fb254910851ec33e3a650bcffb51f237 (diff)
downloadgcc-bafda72341d399da97197e738167a8606bc45e54.zip
gcc-bafda72341d399da97197e738167a8606bc45e54.tar.gz
gcc-bafda72341d399da97197e738167a8606bc45e54.tar.bz2
i386.md (<rounding_insn><mode>2): Macroize expander from {floor,ceil,btrunc}<mode>2 using FIST_ROUNDING int iterator.
* config/i386/i386.md (<rounding_insn><mode>2): Macroize expander from {floor,ceil,btrunc}<mode>2 using FIST_ROUNDING int iterator. (l<rounding_insn><MODEF:mode><SWI48:mode>2): Macroize expander from l{floor,ceil}<MODEF:mode><SWI48:mode>2 using FIST_ROUNDING int iterator. From-SVN: r188840
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/i386/i386.md139
2 files changed, 47 insertions, 100 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 304d5a9..4e4dfe5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2012-06-20 Uros Bizjak <ubizjak@gmail.com>
+
+ * config/i386/i386.md (<rounding_insn><mode>2): Macroize expander
+ from {floor,ceil,btrunc}<mode>2 using FIST_ROUNDING int iterator.
+ (l<rounding_insn><MODEF:mode><SWI48:mode>2): Macroize expander
+ from l{floor,ceil}<MODEF:mode><SWI48:mode>2 using FIST_ROUNDING
+ int iterator.
+
2012-06-20 Steven Bosscher <steven@gcc.gnu.org>
* system.h: Poison ASM_OUTPUT_IDENT and IDENT_ASM_OP.
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index af80786..a74fdc0 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -15178,89 +15178,11 @@
&& flag_unsafe_math_optimizations
&& !optimize_insn_for_size_p ()")
-(define_expand "floor<mode>2"
- [(use (match_operand:MODEF 0 "register_operand"))
- (use (match_operand:MODEF 1 "register_operand"))]
- "(TARGET_USE_FANCY_MATH_387
- && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
- || TARGET_MIX_SSE_I387)
- && flag_unsafe_math_optimizations)
- || (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH
- && !flag_trapping_math)"
-{
- if (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH
- && !flag_trapping_math)
- {
- if (TARGET_ROUND)
- emit_insn (gen_sse4_1_round<mode>2
- (operands[0], operands[1], GEN_INT (ROUND_FLOOR)));
- else if (optimize_insn_for_size_p ())
- FAIL;
- else if (TARGET_64BIT || (<MODE>mode != DFmode))
- ix86_expand_floorceil (operands[0], operands[1], true);
- else
- ix86_expand_floorceildf_32 (operands[0], operands[1], true);
- }
- else
- {
- rtx op0, op1;
-
- if (optimize_insn_for_size_p ())
- FAIL;
-
- op0 = gen_reg_rtx (XFmode);
- op1 = gen_reg_rtx (XFmode);
- emit_insn (gen_extend<mode>xf2 (op1, operands[1]));
- emit_insn (gen_frndintxf2_floor (op0, op1));
-
- emit_insn (gen_truncxf<mode>2_i387_noop (operands[0], op0));
- }
- DONE;
-})
-
-(define_expand "ceil<mode>2"
- [(use (match_operand:MODEF 0 "register_operand"))
- (use (match_operand:MODEF 1 "register_operand"))]
- "(TARGET_USE_FANCY_MATH_387
- && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
- || TARGET_MIX_SSE_I387)
- && flag_unsafe_math_optimizations)
- || (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH
- && !flag_trapping_math)"
-{
- if (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH
- && !flag_trapping_math)
- {
- if (TARGET_ROUND)
- emit_insn (gen_sse4_1_round<mode>2
- (operands[0], operands[1], GEN_INT (ROUND_CEIL)));
- else if (optimize_insn_for_size_p ())
- FAIL;
- else if (TARGET_64BIT || (<MODE>mode != DFmode))
- ix86_expand_floorceil (operands[0], operands[1], false);
- else
- ix86_expand_floorceildf_32 (operands[0], operands[1], false);
- }
- else
- {
- rtx op0, op1;
-
- if (optimize_insn_for_size_p ())
- FAIL;
-
- op0 = gen_reg_rtx (XFmode);
- op1 = gen_reg_rtx (XFmode);
- emit_insn (gen_extend<mode>xf2 (op1, operands[1]));
- emit_insn (gen_frndintxf2_ceil (op0, op1));
-
- emit_insn (gen_truncxf<mode>2_i387_noop (operands[0], op0));
- }
- DONE;
-})
-
-(define_expand "btrunc<mode>2"
- [(use (match_operand:MODEF 0 "register_operand"))
- (use (match_operand:MODEF 1 "register_operand"))]
+(define_expand "<rounding_insn><mode>2"
+ [(parallel [(set (match_operand:MODEF 0 "register_operand")
+ (unspec:MODEF [(match_operand:MODEF 1 "register_operand")]
+ FRNDINT_ROUNDING))
+ (clobber (reg:CC FLAGS_REG))])]
"(TARGET_USE_FANCY_MATH_387
&& (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
|| TARGET_MIX_SSE_I387)
@@ -15273,13 +15195,31 @@
{
if (TARGET_ROUND)
emit_insn (gen_sse4_1_round<mode>2
- (operands[0], operands[1], GEN_INT (ROUND_TRUNC)));
+ (operands[0], operands[1], GEN_INT (ROUND_<ROUNDING>)));
else if (optimize_insn_for_size_p ())
FAIL;
else if (TARGET_64BIT || (<MODE>mode != DFmode))
- ix86_expand_trunc (operands[0], operands[1]);
+ {
+ if (ROUND_<ROUNDING> == ROUND_FLOOR)
+ ix86_expand_floorceil (operands[0], operands[1], true);
+ else if (ROUND_<ROUNDING> == ROUND_CEIL)
+ ix86_expand_floorceil (operands[0], operands[1], false);
+ else if (ROUND_<ROUNDING> == ROUND_TRUNC)
+ ix86_expand_trunc (operands[0], operands[1]);
+ else
+ gcc_unreachable ();
+ }
else
- ix86_expand_truncdf_32 (operands[0], operands[1]);
+ {
+ if (ROUND_<ROUNDING> == ROUND_FLOOR)
+ ix86_expand_floorceildf_32 (operands[0], operands[1], true);
+ else if (ROUND_<ROUNDING> == ROUND_CEIL)
+ ix86_expand_floorceildf_32 (operands[0], operands[1], false);
+ else if (ROUND_<ROUNDING> == ROUND_TRUNC)
+ ix86_expand_truncdf_32 (operands[0], operands[1]);
+ else
+ gcc_unreachable ();
+ }
}
else
{
@@ -15291,7 +15231,7 @@
op0 = gen_reg_rtx (XFmode);
op1 = gen_reg_rtx (XFmode);
emit_insn (gen_extend<mode>xf2 (op1, operands[1]));
- emit_insn (gen_frndintxf2_trunc (op0, op1));
+ emit_insn (gen_frndintxf2_<rounding> (op0, op1));
emit_insn (gen_truncxf<mode>2_i387_noop (operands[0], op0));
}
@@ -15519,25 +15459,24 @@
&& (!TARGET_SSE_MATH || TARGET_MIX_SSE_I387)
&& flag_unsafe_math_optimizations")
-(define_expand "lfloor<MODEF:mode><SWI48:mode>2"
- [(match_operand:SWI48 0 "nonimmediate_operand")
- (match_operand:MODEF 1 "register_operand")]
+(define_expand "l<rounding_insn><MODEF:mode><SWI48:mode>2"
+ [(parallel [(set (match_operand:SWI48 0 "nonimmediate_operand")
+ (unspec:SWI48 [(match_operand:MODEF 1 "register_operand")]
+ FIST_ROUNDING))
+ (clobber (reg:CC FLAGS_REG))])]
"SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_SSE_MATH
&& !flag_trapping_math"
{
if (TARGET_64BIT && optimize_insn_for_size_p ())
FAIL;
- ix86_expand_lfloorceil (operands[0], operands[1], true);
- DONE;
-})
-(define_expand "lceil<MODEF:mode><SWI48:mode>2"
- [(match_operand:SWI48 0 "nonimmediate_operand")
- (match_operand:MODEF 1 "register_operand")]
- "SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_SSE_MATH
- && !flag_trapping_math"
-{
- ix86_expand_lfloorceil (operands[0], operands[1], false);
+ if (ROUND_<ROUNDING> == ROUND_FLOOR)
+ ix86_expand_lfloorceil (operands[0], operands[1], true);
+ else if (ROUND_<ROUNDING> == ROUND_CEIL)
+ ix86_expand_lfloorceil (operands[0], operands[1], false);
+ else
+ gcc_unreachable ();
+
DONE;
})