reg-stack.c (get_true_reg): Handle FLOAT_TRUNCATE like FLOAT_EXTEND if flag_unsafe_math_optimizations.

* reg-stack.c (get_true_reg): Handle FLOAT_TRUNCATE like FLOAT_EXTEND
	if flag_unsafe_math_optimizations.
	* config/i386/i386.md (truncdfsf2): If flag_unsafe_math_optimizations
	and TARGET_80387 expand using truncdfsf2_noop pattern.
	(truncxfsf2): Likewise using truncxfsf2_noop.
	(truncxfdf2): Likewise using truncxfdf2_noop.
	(truncdfsf2_noop, truncxfsf2_noop, truncxfdf2_noop): New patterns.

From-SVN: r79893
This commit is contained in:
Roger Sayle 2004-03-24 02:28:41 +00:00 committed by Roger Sayle
parent cbfd7e06e5
commit 0c5faf294f
3 changed files with 70 additions and 5 deletions

View File

@ -1,3 +1,13 @@
2004-03-23 Roger Sayle <roger@eyesopen.com>
* reg-stack.c (get_true_reg): Handle FLOAT_TRUNCATE like FLOAT_EXTEND
if flag_unsafe_math_optimizations.
* config/i386/i386.md (truncdfsf2): If flag_unsafe_math_optimizations
and TARGET_80387 expand using truncdfsf2_noop pattern.
(truncxfsf2): Likewise using truncxfsf2_noop.
(truncxfdf2): Likewise using truncxfdf2_noop.
(truncdfsf2_noop, truncxfsf2_noop, truncxfdf2_noop): New patterns.
2004-03-23 Ziemowit Laski <zlaski@apple.com>
* hooks.c (hook_constcharptr_tree_null): New hook.

View File

@ -3653,15 +3653,29 @@
(clobber (match_dup 2))])]
"TARGET_80387 || TARGET_SSE2"
"
if (TARGET_80387)
operands[2] = assign_386_stack_local (SFmode, 0);
else
if (!TARGET_80387)
{
emit_insn (gen_truncdfsf2_sse_only (operands[0], operands[1]));
DONE;
}
else if (flag_unsafe_math_optimizations)
{
rtx reg = REG_P (operands[0]) ? operands[0] : gen_reg_rtx (SFmode);
emit_insn (gen_truncdfsf2_noop (reg, operands[1]));
if (reg != operands[0])
emit_move_insn (operands[0], reg);
DONE;
}
else
operands[2] = assign_386_stack_local (SFmode, 0);
")
(define_insn "truncdfsf2_noop"
[(set (match_operand:SF 0 "register_operand" "=f")
(float_truncate:SF (match_operand:DF 1 "register_operand" "f")))]
"TARGET_80387 && flag_unsafe_math_optimizations"
"#")
(define_insn "*truncdfsf2_1"
[(set (match_operand:SF 0 "nonimmediate_operand" "=m,?f#rx,?r#fx,?x#rf")
(float_truncate:SF
@ -3886,7 +3900,24 @@
(match_operand:XF 1 "register_operand" "")))
(clobber (match_dup 2))])]
"TARGET_80387"
"operands[2] = assign_386_stack_local (SFmode, 0);")
"
if (flag_unsafe_math_optimizations)
{
rtx reg = REG_P (operands[0]) ? operands[0] : gen_reg_rtx (SFmode);
emit_insn (gen_truncxfsf2_noop (reg, operands[1]));
if (reg != operands[0])
emit_move_insn (operands[0], reg);
DONE;
}
else
operands[2] = assign_386_stack_local (SFmode, 0);
")
(define_insn "truncxfsf2_noop"
[(set (match_operand:SF 0 "register_operand" "=f")
(float_truncate:SF (match_operand:XF 1 "register_operand" "f")))]
"TARGET_80387 && flag_unsafe_math_optimizations"
"#")
(define_insn "*truncxfsf2_1"
[(set (match_operand:SF 0 "nonimmediate_operand" "=m,?f#rx,?r#fx,?x#rf")
@ -3948,7 +3979,24 @@
(match_operand:XF 1 "register_operand" "")))
(clobber (match_dup 2))])]
"TARGET_80387"
"operands[2] = assign_386_stack_local (DFmode, 0);")
"
if (flag_unsafe_math_optimizations)
{
rtx reg = REG_P (operands[0]) ? operands[0] : gen_reg_rtx (DFmode);
emit_insn (gen_truncxfdf2_noop (reg, operands[1]));
if (reg != operands[0])
emit_move_insn (operands[0], reg);
DONE;
}
else
operands[2] = assign_386_stack_local (DFmode, 0);
")
(define_insn "truncxfdf2_noop"
[(set (match_operand:DF 0 "register_operand" "=f")
(float_truncate:DF (match_operand:XF 1 "register_operand" "f")))]
"TARGET_80387 && flag_unsafe_math_optimizations"
"#")
(define_insn "*truncxfdf2_1"
[(set (match_operand:DF 0 "nonimmediate_operand" "=m,?f#rY,?r#fY,?Y#rf")

View File

@ -574,6 +574,13 @@ get_true_reg (rtx *pat)
case FIX:
case FLOAT_EXTEND:
pat = & XEXP (*pat, 0);
break;
case FLOAT_TRUNCATE:
if (!flag_unsafe_math_optimizations)
return pat;
pat = & XEXP (*pat, 0);
break;
}
}