From 0c5faf294f9329ea1d10c3424f82339cf30d893a Mon Sep 17 00:00:00 2001 From: Roger Sayle Date: Wed, 24 Mar 2004 02:28:41 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 10 +++++++ gcc/config/i386/i386.md | 58 +++++++++++++++++++++++++++++++++++++---- gcc/reg-stack.c | 7 +++++ 3 files changed, 70 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e38cf9c0e4a3..924c0fa7f0f5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2004-03-23 Roger Sayle + + * 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 * hooks.c (hook_constcharptr_tree_null): New hook. diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 781b0cad07df..4906d35b7d02 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -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") diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c index 22b290fd5cbd..31ebddb46401 100644 --- a/gcc/reg-stack.c +++ b/gcc/reg-stack.c @@ -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; } }