aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/config/i386/i386.md58
-rw-r--r--gcc/reg-stack.c7
3 files changed, 70 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e38cf9c..924c0fa 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 781b0ca..4906d35 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 22b290f..31ebddb 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;
}
}