Commit bafda723 by Uros Bizjak Committed by Uros Bizjak

i386.md (<rounding_insn><mode>2): Macroize expander from…

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
parent 975667e7
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> 2012-06-20 Steven Bosscher <steven@gcc.gnu.org>
* system.h: Poison ASM_OUTPUT_IDENT and IDENT_ASM_OP. * system.h: Poison ASM_OUTPUT_IDENT and IDENT_ASM_OP.
......
...@@ -15178,89 +15178,11 @@ ...@@ -15178,89 +15178,11 @@
&& flag_unsafe_math_optimizations && flag_unsafe_math_optimizations
&& !optimize_insn_for_size_p ()") && !optimize_insn_for_size_p ()")
(define_expand "floor<mode>2" (define_expand "<rounding_insn><mode>2"
[(use (match_operand:MODEF 0 "register_operand")) [(parallel [(set (match_operand:MODEF 0 "register_operand")
(use (match_operand:MODEF 1 "register_operand"))] (unspec:MODEF [(match_operand:MODEF 1 "register_operand")]
"(TARGET_USE_FANCY_MATH_387 FRNDINT_ROUNDING))
&& (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH) (clobber (reg:CC FLAGS_REG))])]
|| 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"))]
"(TARGET_USE_FANCY_MATH_387 "(TARGET_USE_FANCY_MATH_387
&& (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH) && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
|| TARGET_MIX_SSE_I387) || TARGET_MIX_SSE_I387)
...@@ -15273,13 +15195,31 @@ ...@@ -15273,13 +15195,31 @@
{ {
if (TARGET_ROUND) if (TARGET_ROUND)
emit_insn (gen_sse4_1_round<mode>2 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 ()) else if (optimize_insn_for_size_p ())
FAIL; FAIL;
else if (TARGET_64BIT || (<MODE>mode != DFmode)) 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 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 else
{ {
...@@ -15291,7 +15231,7 @@ ...@@ -15291,7 +15231,7 @@
op0 = gen_reg_rtx (XFmode); op0 = gen_reg_rtx (XFmode);
op1 = gen_reg_rtx (XFmode); op1 = gen_reg_rtx (XFmode);
emit_insn (gen_extend<mode>xf2 (op1, operands[1])); 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)); emit_insn (gen_truncxf<mode>2_i387_noop (operands[0], op0));
} }
...@@ -15519,25 +15459,24 @@ ...@@ -15519,25 +15459,24 @@
&& (!TARGET_SSE_MATH || TARGET_MIX_SSE_I387) && (!TARGET_SSE_MATH || TARGET_MIX_SSE_I387)
&& flag_unsafe_math_optimizations") && flag_unsafe_math_optimizations")
(define_expand "lfloor<MODEF:mode><SWI48:mode>2" (define_expand "l<rounding_insn><MODEF:mode><SWI48:mode>2"
[(match_operand:SWI48 0 "nonimmediate_operand") [(parallel [(set (match_operand:SWI48 0 "nonimmediate_operand")
(match_operand:MODEF 1 "register_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 "SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_SSE_MATH
&& !flag_trapping_math" && !flag_trapping_math"
{ {
if (TARGET_64BIT && optimize_insn_for_size_p ()) if (TARGET_64BIT && optimize_insn_for_size_p ())
FAIL; FAIL;
ix86_expand_lfloorceil (operands[0], operands[1], true);
DONE;
})
(define_expand "lceil<MODEF:mode><SWI48:mode>2" if (ROUND_<ROUNDING> == ROUND_FLOOR)
[(match_operand:SWI48 0 "nonimmediate_operand") ix86_expand_lfloorceil (operands[0], operands[1], true);
(match_operand:MODEF 1 "register_operand")] else if (ROUND_<ROUNDING> == ROUND_CEIL)
"SSE_FLOAT_MODE_P (<MODEF:MODE>mode) && TARGET_SSE_MATH ix86_expand_lfloorceil (operands[0], operands[1], false);
&& !flag_trapping_math" else
{ gcc_unreachable ();
ix86_expand_lfloorceil (operands[0], operands[1], false);
DONE; DONE;
}) })
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment