]> gcc.gnu.org Git - gcc.git/commitdiff
i386.c (output_387_reg_move): New function.
authorRoger Sayle <roger@eyesopen.com>
Mon, 12 Apr 2004 23:23:16 +0000 (23:23 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Mon, 12 Apr 2004 23:23:16 +0000 (23:23 +0000)
* config/i386/i386.c (output_387_reg_move): New function.
* config/i386/i386-protos.h (output_387_reg_move): Prototype here.
* config/i386/i386.md (*movsf_1, *movsf1_nointerunit,
*movdf_nointeger, *movdf_integer, *movxf_nointeger, *movxf_integer,
*extendsfdf2_1,  *extendsfxf2_1, *extenddfxf2_1, truncdfsf2_noop,
truncxfsf2_noop, truncxfdf2_noop): Call output_387_reg_move.

From-SVN: r80631

gcc/ChangeLog
gcc/config/i386/i386-protos.h
gcc/config/i386/i386.c
gcc/config/i386/i386.md

index 72ec5b5eb423baf5b565fce90a0b0ec8d4d6caa3..504da82aea2fcc4b6bb0206dbae851dfcdc4ec5c 100644 (file)
@@ -1,3 +1,12 @@
+2004-04-12  Roger Sayle  <roger@eyesopen.com>
+
+       * config/i386/i386.c (output_387_reg_move): New function.
+       * config/i386/i386-protos.h (output_387_reg_move): Prototype here.
+       * config/i386/i386.md (*movsf_1, *movsf1_nointerunit,
+       *movdf_nointeger, *movdf_integer, *movxf_nointeger, *movxf_integer,
+       *extendsfdf2_1,  *extendsfxf2_1, *extenddfxf2_1, truncdfsf2_noop,
+       truncxfsf2_noop, truncxfdf2_noop): Call output_387_reg_move.
+
 2004-04-12  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
 
        * c-decl.c (finish_decl): Make a decl_stmt for a variable-sized
index 947f15d615cdeeb899bc7150db8fbcae0a3244a3..d95be60e23f03558a5e05a8be8aa86b6e7431c0f 100644 (file)
@@ -117,6 +117,7 @@ extern void split_ti (rtx[], int, rtx[], rtx[]);
 
 extern const char *output_set_got (rtx);
 extern const char *output_387_binary_op (rtx, rtx*);
+extern const char *output_387_reg_move (rtx, rtx*);
 extern const char *output_fix_trunc (rtx, rtx*);
 extern const char *output_fp_compare (rtx, rtx*, int, int);
 
index f2da7e093b7cf77e0261aefdc42a443c5ddb1575..615f2eeec49a58b63558f6e09d7253aa878a08d2 100644 (file)
@@ -15909,4 +15909,23 @@ ix86_reverse_condition (enum rtx_code code, enum machine_mode mode)
          : reverse_condition_maybe_unordered (code));
 }
 
+/* Output code to perform an x87 FP register move, from OPERANDS[1]
+   to OPERANDS[0].  */
+
+const char *
+output_387_reg_move (rtx insn, rtx *operands)
+{
+  if (REG_P (operands[1])
+      && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
+    {
+      if (REGNO (operands[0]) == FIRST_STACK_REG
+         && TARGET_USE_FFREEP)
+       return "ffreep\t%y0";
+      return "fstp\t%y0";
+    }
+  if (STACK_TOP_P (operands[0]))
+    return "fld%z1\t%y1";
+  return "fst\t%y0";
+}
+
 #include "gt-i386.h"
index a9d8eedf1415d1bf6442a78eb1784a865e53cfd4..c8590d55074318270eefdaae8c65f846ec39fe61 100644 (file)
   switch (which_alternative)
     {
     case 0:
-      if (REG_P (operands[1])
-          && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-        return "fstp\t%y0";
-      else if (STACK_TOP_P (operands[0]))
-        return "fld%z1\t%y1";
-      else
-        return "fst\t%y0";
+      return output_387_reg_move (insn, operands);
 
     case 1:
       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
   switch (which_alternative)
     {
     case 0:
-      if (REG_P (operands[1])
-          && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-       {
-         if (REGNO (operands[0]) == FIRST_STACK_REG
-             && TARGET_USE_FFREEP)
-           return "ffreep\t%y0";
-          return "fstp\t%y0";
-       }
-      else if (STACK_TOP_P (operands[0]))
-        return "fld%z1\t%y1";
-      else
-        return "fst\t%y0";
+      return output_387_reg_move (insn, operands);
 
     case 1:
       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
   switch (which_alternative)
     {
     case 0:
-      if (REG_P (operands[1])
-          && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-       {
-         if (REGNO (operands[0]) == FIRST_STACK_REG
-             && TARGET_USE_FFREEP)
-           return "ffreep\t%y0";
-          return "fstp\t%y0";
-       }
-      else if (STACK_TOP_P (operands[0]))
-        return "fld%z1\t%y1";
-      else
-        return "fst\t%y0";
+      return output_387_reg_move (insn, operands);
 
     case 1:
       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
   switch (which_alternative)
     {
     case 0:
-      if (REG_P (operands[1])
-          && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-       {
-         if (REGNO (operands[0]) == FIRST_STACK_REG
-             && TARGET_USE_FFREEP)
-           return "ffreep\t%y0";
-          return "fstp\t%y0";
-       }
-      else if (STACK_TOP_P (operands[0]))
-        return "fld%z1\t%y1";
-      else
-        return "fst\t%y0";
+      return output_387_reg_move (insn, operands);
 
     case 1:
       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
   switch (which_alternative)
     {
     case 0:
-      if (REG_P (operands[1])
-          && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-       {
-         if (REGNO (operands[0]) == FIRST_STACK_REG
-             && TARGET_USE_FFREEP)
-           return "ffreep\t%y0";
-          return "fstp\t%y0";
-       }
-      else if (STACK_TOP_P (operands[0]))
-        return "fld%z1\t%y1";
-      else
-        return "fst\t%y0";
+      return output_387_reg_move (insn, operands);
 
     case 1:
       /* There is no non-popping store to memory for XFmode.  So if
   switch (which_alternative)
     {
     case 0:
-      if (REG_P (operands[1])
-          && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-       {
-         if (REGNO (operands[0]) == FIRST_STACK_REG
-             && TARGET_USE_FFREEP)
-           return "ffreep\t%y0";
-          return "fstp\t%y0";
-       }
-      else if (STACK_TOP_P (operands[0]))
-        return "fld%z1\t%y1";
-      else
-        return "fst\t%y0";
+      return output_387_reg_move (insn, operands);
 
     case 1:
       /* There is no non-popping store to memory for XFmode.  So if
   switch (which_alternative)
     {
     case 0:
-      if (REG_P (operands[1])
-          && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-        return "fstp\t%y0";
-      else if (STACK_TOP_P (operands[0]))
-        return "fld%z1\t%y1";
-      else
-        return "fst\t%y0";
+      return output_387_reg_move (insn, operands);
 
     case 1:
       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
         return "fstp%z0\t%y0";
-
       else
         return "fst%z0\t%y0";
+
     case 2:
       return "cvtss2sd\t{%1, %0|%0, %1}";
 
   switch (which_alternative)
     {
     case 0:
-      if (REG_P (operands[1])
-          && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-        return "fstp\t%y0";
-      else if (STACK_TOP_P (operands[0]))
-        return "fld%z1\t%y1";
-      else
-        return "fst\t%y0";
+      return output_387_reg_move (insn, operands);
 
     case 1:
       /* There is no non-popping store to memory for XFmode.  So if
   switch (which_alternative)
     {
     case 0:
-      if (REG_P (operands[1])
-          && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-        return "fstp\t%y0";
-      else if (STACK_TOP_P (operands[0]))
-        return "fld%z1\t%y1";
-      else
-        return "fst\t%y0";
+      return output_387_reg_move (insn, operands);
 
     case 1:
       /* There is no non-popping store to memory for XFmode.  So if
        (float_truncate:SF (match_operand:DF 1 "register_operand" "f")))]
   "TARGET_80387 && flag_unsafe_math_optimizations"
 {
-  if (REG_P (operands[1])
-      && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-    return "fstp\t%y0";
-  else if (STACK_TOP_P (operands[0]))
-    return "fld%z1\t%y1";
-  else
-    return "fst\t%y0";
+  return output_387_reg_move (insn, operands);
 }
   [(set_attr "type" "fmov")
    (set_attr "mode" "SF")])
        (float_truncate:SF (match_operand:XF 1 "register_operand" "f")))]
   "TARGET_80387 && flag_unsafe_math_optimizations"
 {
-  if (REG_P (operands[1])
-      && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-    return "fstp\t%y0";
-  else if (STACK_TOP_P (operands[0]))
-    return "fld%z1\t%y1";
-  else
-    return "fst\t%y0";
+  return output_387_reg_move (insn, operands);
 }
   [(set_attr "type" "fmov")
    (set_attr "mode" "SF")])
        (float_truncate:DF (match_operand:XF 1 "register_operand" "f")))]
   "TARGET_80387 && flag_unsafe_math_optimizations"
 {
-  if (REG_P (operands[1])
-      && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-    return "fstp\t%y0";
-  else if (STACK_TOP_P (operands[0]))
-    return "fld%z1\t%y1";
-  else
-    return "fst\t%y0";
+  return output_387_reg_move (insn, operands);
 }
   [(set_attr "type" "fmov")
    (set_attr "mode" "DF")])
This page took 0.116549 seconds and 5 git commands to generate.