i386.md (extend<mode>xf2): Rename from extendsfxf2 and extenddfxf2.
authorUros Bizjak <ubizjak@gmail.com>
Fri, 6 Apr 2007 20:14:12 +0000 (22:14 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Fri, 6 Apr 2007 20:14:12 +0000 (22:14 +0200)
        * config/i386/i386.md (extend<mode>xf2): Rename from extendsfxf2
        and extenddfxf2. Macroize expander using X87MODEF12 mode macro.
        (*truncdfsf_mixed, *truncdfsf_i387, *truncdfsf2_i387_1):
        Use output_387_reg_move().
        (*truncxf<mode>2): Rename from *truncxfsf2 and truncxfdf2. Macroize
        expander using X87MODEF12 mode macro.
        (*truncxfsf2_mixed): Combine alternatives, ignore "r" alternative when
        choosing register preferences.  Use output_387_reg_move().
        (*truncxfdf2_mixed): Combine alternatives, use "r" alternative
        instead of "x".  Use output_387_reg_move().
        (*truncxf<mode>2_i387_noop): Rename from *truncxfsf2_i387_noop and
        *truncxfdf2_i387_noop.  Macroize insn using X87MODEF12 mode macro.
        (*truncxf<mode>2_i387): Rename from *truncxfsf2_i387 and
        *truncxfdf2_i387.  Macroize insn using X87MODEF12 mode macro.
        Use output_387_reg_move().
        (*truncxf?f_mixed splitter): Macroize splitter using X87MODEF12
        mode macro.
        (*truncxf?f_i387 splitter): Ditto.

From-SVN: r123626

gcc/ChangeLog
gcc/config/i386/i386.md

index 70befba11294807d5e52a404211947f538a4b00e..898aeaaa2829488c4ab12a15ad7cfb67789f3a43 100644 (file)
@@ -1,3 +1,24 @@
+2007-04-06  Uros Bizjak  <ubizjak@gmail.com>
+
+       * config/i386/i386.md (extend<mode>xf2): Rename from extendsfxf2
+       and extenddfxf2. Macroize expander using X87MODEF12 mode macro.
+       (*truncdfsf_mixed, *truncdfsf_i387, *truncdfsf2_i387_1):
+       Use output_387_reg_move().
+       (*truncxf<mode>2): Rename from *truncxfsf2 and truncxfdf2. Macroize
+       expander using X87MODEF12 mode macro.
+       (*truncxfsf2_mixed): Combine alternatives, ignore "r" alternative when
+       choosing register preferences.  Use output_387_reg_move().
+       (*truncxfdf2_mixed): Combine alternatives, use "r" alternative
+       instead of "x".  Use output_387_reg_move().
+       (*truncxf<mode>2_i387_noop): Rename from *truncxfsf2_i387_noop and
+       *truncxfdf2_i387_noop.  Macroize insn using X87MODEF12 mode macro.
+       (*truncxf<mode>2_i387): Rename from *truncxfsf2_i387 and
+       *truncxfdf2_i387.  Macroize insn using X87MODEF12 mode macro.
+       Use output_387_reg_move().
+       (*truncxf?f_mixed splitter): Macroize splitter using X87MODEF12
+       mode macro.
+       (*truncxf?f_i387 splitter): Ditto.
+
 2007-04-06  Daniel Berlin  <dberlin@dberlin.org>
 
        * langhooks-def.h (LANG_HOOKS_INITIALIZER): Remove
index 885e6770339621bfb3521a819bef4cecea80d471..e524f08dd260e2c336a9997be8b83acd4e2374e2 100644 (file)
   [(set_attr "type" "fmov")
    (set_attr "mode" "SF,XF")])
 
-(define_expand "extendsfxf2"
+(define_expand "extend<mode>xf2"
   [(set (match_operand:XF 0 "nonimmediate_operand" "")
-        (float_extend:XF (match_operand:SF 1 "general_operand" "")))]
+        (float_extend:XF (match_operand:X87MODEF12 1 "general_operand" "")))]
   "TARGET_80387"
 {
   /* ??? Needed for compress_float_constant since all fp constants
       if (standard_80387_constant_p (operands[1]) > 0)
        {
          operands[1] = simplify_const_unary_operation
-           (FLOAT_EXTEND, XFmode, operands[1], SFmode);
+           (FLOAT_EXTEND, XFmode, operands[1], <MODE>mode);
          emit_move_insn_1 (operands[0], operands[1]);
          DONE;
        }
-      operands[1] = validize_mem (force_const_mem (SFmode, operands[1]));
+      operands[1] = validize_mem (force_const_mem (<MODE>mode, operands[1]));
     }
 })
 
-(define_insn "*extendsfxf2_i387"
+(define_insn "*extend<mode>xf2_i387"
   [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m")
-        (float_extend:XF (match_operand:SF 1 "nonimmediate_operand" "fm,f")))]
+        (float_extend:XF
+         (match_operand:X87MODEF12 1 "nonimmediate_operand" "fm,f")))]
   "TARGET_80387"
   "* return output_387_reg_move (insn, operands);"
   [(set_attr "type" "fmov")
-   (set_attr "mode" "SF,XF")])
-
-(define_expand "extenddfxf2"
-  [(set (match_operand:XF 0 "nonimmediate_operand" "")
-        (float_extend:XF (match_operand:DF 1 "general_operand" "")))]
-  "TARGET_80387"
-{
-  /* ??? Needed for compress_float_constant since all fp constants
-     are LEGITIMATE_CONSTANT_P.  */
-  if (GET_CODE (operands[1]) == CONST_DOUBLE)
-    {
-      if (standard_80387_constant_p (operands[1]) > 0)
-       {
-         operands[1] = simplify_const_unary_operation
-           (FLOAT_EXTEND, XFmode, operands[1], DFmode);
-         emit_move_insn_1 (operands[0], operands[1]);
-         DONE;
-       }
-      operands[1] = validize_mem (force_const_mem (DFmode, operands[1]));
-    }
-})
-
-(define_insn "*extenddfxf2_i387"
-  [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m")
-        (float_extend:XF (match_operand:DF 1 "nonimmediate_operand" "fm,f")))]
-  "TARGET_80387"
-  "* return output_387_reg_move (insn, operands);"
-  [(set_attr "type" "fmov")
-   (set_attr "mode" "DF,XF")])
+   (set_attr "mode" "<MODE>,XF")])
 
 ;; %%% This seems bad bad news.
 ;; This cannot output into an f-reg because there is no way to be sure
   switch (which_alternative)
     {
     case 0:
-      if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-       return "fstp%z0\t%y0";
-      else
-       return "fst%z0\t%y0";
+      return output_387_reg_move (insn, operands);
+
     case 1:
       return "#";
     case 2:
   switch (which_alternative)
     {
     case 0:
-      if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-       return "fstp%z0\t%y0";
-      else
-       return "fst%z0\t%y0";
+      return output_387_reg_move (insn, operands);
+
     case 1:
       return "#";
     default:
   "TARGET_80387
    && !(TARGET_SSE2 && TARGET_SSE_MATH)
    && !TARGET_MIX_SSE_I387"
-{
-  if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-    return "fstp%z0\t%y0";
-  else
-    return "fst%z0\t%y0";
-}
+  "* return output_387_reg_move (insn, operands);"
   [(set_attr "type" "fmov")
    (set_attr "mode" "SF")])
 
   operands[1] = gen_rtx_REG (SFmode, true_regnum (operands[1]));
 })
 
-;; Conversion from XFmode to SFmode.
+;; Conversion from XFmode to {SF,DF}mode
 
-(define_expand "truncxfsf2"
-  [(parallel [(set (match_operand:SF 0 "nonimmediate_operand" "")
-                  (float_truncate:SF
-                   (match_operand:XF 1 "register_operand" "")))
+(define_expand "truncxf<mode>2"
+  [(parallel [(set (match_operand:X87MODEF12 0 "nonimmediate_operand" "")
+                  (float_truncate:X87MODEF12
+                    (match_operand:XF 1 "register_operand" "")))
              (clobber (match_dup 2))])]
   "TARGET_80387"
 {
   if (flag_unsafe_math_optimizations)
     {
-      rtx reg = REG_P (operands[0]) ? operands[0] : gen_reg_rtx (SFmode);
-      emit_insn (gen_truncxfsf2_i387_noop (reg, operands[1]));
+      rtx reg = REG_P (operands[0]) ? operands[0] : gen_reg_rtx (<MODE>mode);
+      emit_insn (gen_truncxf<mode>2_i387_noop (reg, operands[1]));
       if (reg != operands[0])
        emit_move_insn (operands[0], reg);
       DONE;
     }
   else
-    operands[2] = assign_386_stack_local (SFmode, SLOT_TEMP);
+    operands[2] = assign_386_stack_local (<MODE>mode, SLOT_TEMP);
 })
 
 (define_insn "*truncxfsf2_mixed"
-  [(set (match_operand:SF 0 "nonimmediate_operand" "=m,?f,?r,?x")
+  [(set (match_operand:SF 0 "nonimmediate_operand" "=m,?fx*r")
        (float_truncate:SF
-        (match_operand:XF 1 "register_operand" "f,f,f,f")))
-   (clobber (match_operand:SF 2 "memory_operand" "=X,m,m,m"))]
+         (match_operand:XF 1 "register_operand" "f,f")))
+   (clobber (match_operand:SF 2 "memory_operand" "=X,m"))]
   "TARGET_80387"
 {
   gcc_assert (!which_alternative);
-  if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-    return "fstp%z0\t%y0";
-  else
-    return "fst%z0\t%y0";
+  return output_387_reg_move (insn, operands);
 }
-  [(set_attr "type" "fmov,multi,multi,multi")
-   (set_attr "unit" "*,i387,i387,i387")
-   (set_attr "mode" "SF")])
-
-(define_insn "truncxfsf2_i387_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"
-  "* return output_387_reg_move (insn, operands);"
-  [(set_attr "type" "fmov")
-   (set_attr "mode" "SF")])
-
-(define_insn "*truncxfsf2_i387"
-  [(set (match_operand:SF 0 "memory_operand" "=m")
-       (float_truncate:SF
-        (match_operand:XF 1 "register_operand" "f")))]
-  "TARGET_80387"
-{
-  if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-    return "fstp%z0\t%y0";
-  else
-    return "fst%z0\t%y0";
-}
-  [(set_attr "type" "fmov")
+  [(set_attr "type" "fmov,multi")
+   (set_attr "unit" "*,i387")
    (set_attr "mode" "SF")])
 
-(define_split
-  [(set (match_operand:SF 0 "register_operand" "")
-       (float_truncate:SF
-        (match_operand:XF 1 "register_operand" "")))
-   (clobber (match_operand:SF 2 "memory_operand" ""))]
-  "TARGET_80387 && reload_completed"
-  [(set (match_dup 2) (float_truncate:SF (match_dup 1)))
-   (set (match_dup 0) (match_dup 2))]
-  "")
-
-(define_split
-  [(set (match_operand:SF 0 "memory_operand" "")
-       (float_truncate:SF
-        (match_operand:XF 1 "register_operand" "")))
-   (clobber (match_operand:SF 2 "memory_operand" ""))]
-  "TARGET_80387"
-  [(set (match_dup 0) (float_truncate:SF (match_dup 1)))]
-  "")
-
-;; Conversion from XFmode to DFmode.
-
-(define_expand "truncxfdf2"
-  [(parallel [(set (match_operand:DF 0 "nonimmediate_operand" "")
-                  (float_truncate:DF
-                   (match_operand:XF 1 "register_operand" "")))
-             (clobber (match_dup 2))])]
-  "TARGET_80387"
-{
-  if (flag_unsafe_math_optimizations)
-    {
-      rtx reg = REG_P (operands[0]) ? operands[0] : gen_reg_rtx (DFmode);
-      emit_insn (gen_truncxfdf2_i387_noop (reg, operands[1]));
-      if (reg != operands[0])
-       emit_move_insn (operands[0], reg);
-      DONE;
-    }
-  else
-    operands[2] = assign_386_stack_local (DFmode, SLOT_TEMP);
-})
-
 (define_insn "*truncxfdf2_mixed"
-  [(set (match_operand:DF 0 "nonimmediate_operand" "=m,?f,?r,?Y2*x")
+  [(set (match_operand:DF 0 "nonimmediate_operand" "=m,?fY2*r")
        (float_truncate:DF
-        (match_operand:XF 1 "register_operand" "f,f,f,f")))
-   (clobber (match_operand:DF 2 "memory_operand" "=X,m,m,m"))]
+         (match_operand:XF 1 "register_operand" "f,f")))
+   (clobber (match_operand:DF 2 "memory_operand" "=X,m"))]
   "TARGET_80387"
 {
   gcc_assert (!which_alternative);
-  if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-    return "fstp%z0\t%y0";
-  else
-    return "fst%z0\t%y0";
+  return output_387_reg_move (insn, operands);
 }
-  [(set_attr "type" "fmov,multi,multi,multi")
-   (set_attr "unit" "*,i387,i387,i387")
+  [(set_attr "type" "fmov,multi")
+   (set_attr "unit" "*,i387")
    (set_attr "mode" "DF")])
 
-(define_insn "truncxfdf2_i387_noop"
-  [(set (match_operand:DF 0 "register_operand" "=f")
-       (float_truncate:DF (match_operand:XF 1 "register_operand" "f")))]
+(define_insn "truncxf<mode>2_i387_noop"
+  [(set (match_operand:X87MODEF12 0 "register_operand" "=f")
+       (float_truncate:X87MODEF12
+         (match_operand:XF 1 "register_operand" "f")))]
   "TARGET_80387 && flag_unsafe_math_optimizations"
   "* return output_387_reg_move (insn, operands);"
   [(set_attr "type" "fmov")
-   (set_attr "mode" "DF")])
+   (set_attr "mode" "<MODE>")])
 
-(define_insn "*truncxfdf2_i387"
-  [(set (match_operand:DF 0 "memory_operand" "=m")
-       (float_truncate:DF
+(define_insn "*truncxf<mode>2_i387"
+  [(set (match_operand:X87MODEF12 0 "memory_operand" "=m")
+       (float_truncate:X87MODEF12
          (match_operand:XF 1 "register_operand" "f")))]
   "TARGET_80387"
-{
-  if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-    return "fstp%z0\t%y0";
-  else
-    return "fst%z0\t%y0";
-}
+  "* return output_387_reg_move (insn, operands);"
   [(set_attr "type" "fmov")
-   (set_attr "mode" "DF")])
+   (set_attr "mode" "<MODE>")])
 
 (define_split
-  [(set (match_operand:DF 0 "register_operand" "")
-       (float_truncate:DF
-        (match_operand:XF 1 "register_operand" "")))
-   (clobber (match_operand:DF 2 "memory_operand" ""))]
+  [(set (match_operand:X87MODEF12 0 "register_operand" "")
+       (float_truncate:X87MODEF12
+         (match_operand:XF 1 "register_operand" "")))
+   (clobber (match_operand:X87MODEF12 2 "memory_operand" ""))]
   "TARGET_80387 && reload_completed"
-  [(set (match_dup 2) (float_truncate:DF (match_dup 1)))
+  [(set (match_dup 2) (float_truncate:X87MODEF12 (match_dup 1)))
    (set (match_dup 0) (match_dup 2))]
   "")
 
 (define_split
-  [(set (match_operand:DF 0 "memory_operand" "")
-       (float_truncate:DF
-        (match_operand:XF 1 "register_operand" "")))
-   (clobber (match_operand:DF 2 "memory_operand" ""))]
+  [(set (match_operand:X87MODEF12 0 "memory_operand" "")
+       (float_truncate:X87MODEF12
+         (match_operand:XF 1 "register_operand" "")))
+   (clobber (match_operand:X87MODEF12 2 "memory_operand" ""))]
   "TARGET_80387"
-  [(set (match_dup 0) (float_truncate:DF (match_dup 1)))]
+  [(set (match_dup 0) (float_truncate:X87MODEF12 (match_dup 1)))]
   "")
 \f
 ;; Signed conversion to DImode.