]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
reg-stack.c (get_true_reg): Handle FLOAT_TRUNCATE like FLOAT_EXTEND if flag_unsafe_ma...
authorRoger Sayle <roger@eyesopen.com>
Wed, 24 Mar 2004 02:28:41 +0000 (02:28 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Wed, 24 Mar 2004 02:28:41 +0000 (02:28 +0000)
* 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
gcc/config/i386/i386.md
gcc/reg-stack.c

index e38cf9c0e4a39ffe38ce1286853c95f9e13c3fef..924c0fa7f0f5d9284ad708a3f9e6aeb8a1cb930b 100644 (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.
index 781b0cad07dfbabef9a364dde217e89bd9553f88..4906d35b7d0216b6467c3b9e5d1a87003f21f7c1 100644 (file)
              (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
                    (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")
                    (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")
index 22b290fd5cbd093dc0ba8b3165ab16bbd49a0168..31ebddb46401a7370b102ee56b5b9678e1d2690a 100644 (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;
       }
 }
 \f