i386.c (output_fp_compare): Add generation of ftst instruction.
authorUros Bizjak <uros@kss-loka.si>
Tue, 14 Sep 2004 05:21:51 +0000 (07:21 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Tue, 14 Sep 2004 05:21:51 +0000 (07:21 +0200)
* config/i386/i386.c (output_fp_compare): Add generation
of ftst instruction.
* config/i386/i386.md (*cmpfp_0_sf, cmpfp_0_df, cmpfp_0_xf):
Use output_fp_compare () function.
(cmpfp_i, *cmpfp_i_sse, *cmpfp_i_sse_only): Fix insn constraint.
(fix_truncdi_memory): Remove operands[5] copy.

From-SVN: r87482

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

index 28457ba782419103be72af5718b01acbc975fc19..3cd560d79438d3d56e74cd728d0cf0acfff5f5e8 100644 (file)
@@ -1,3 +1,12 @@
+2004-09-14  Uros Bizjak  <uros@kss-loka.si>
+
+       * config/i386/i386.c (output_fp_compare): Add generation
+       of ftst instruction.
+       * config/i386/i386.md (*cmpfp_0_sf, cmpfp_0_df, cmpfp_0_xf):
+       Use output_fp_compare () function.
+       (cmpfp_i, *cmpfp_i_sse, *cmpfp_i_sse_only): Fix insn constraint.
+       (fix_truncdi_memory): Remove operands[5] copy.
+
 2004-09-14  Kazu Hirata  <kazu@cs.umass.edu>
 
        * config/m32r/m32r.md, config/m68k/m68kelf.h,
index 75935ab75e8535687a7c10e3dcf6b7ab2f3e278b..8f5364fff66e7027d0835a44bc06c0812e72aa8f 100644 (file)
@@ -7228,15 +7228,20 @@ const char *
 output_fp_compare (rtx insn, rtx *operands, int eflags_p, int unordered_p)
 {
   int stack_top_dies;
-  rtx cmp_op0 = operands[0];
-  rtx cmp_op1 = operands[1];
+  rtx cmp_op0, cmp_op1;
   int is_sse = SSE_REG_P (operands[0]) | SSE_REG_P (operands[1]);
 
   if (eflags_p == 2)
     {
-      cmp_op0 = cmp_op1;
+      cmp_op0 = operands[1];
       cmp_op1 = operands[2];
     }
+  else
+    {
+      cmp_op0 = operands[0];
+      cmp_op1 = operands[1];
+    }
+
   if (is_sse)
     {
       if (GET_MODE (operands[0]) == SFmode)
@@ -7256,6 +7261,17 @@ output_fp_compare (rtx insn, rtx *operands, int eflags_p, int unordered_p)
 
   stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
 
+  if (cmp_op1 == CONST0_RTX (GET_MODE (cmp_op1)))
+    {
+      if (stack_top_dies)
+       {
+         output_asm_insn ("ftst\n\tfnstsw\t%0", operands);
+         return TARGET_USE_FFREEP ? "ffreep\t%y1" : "fstp\t%y1";
+       }
+      else
+       return "ftst\n\tfnstsw\t%0";
+    }
+
   if (STACK_REG_P (cmp_op1)
       && stack_top_dies
       && find_regno_note (insn, REG_DEAD, REGNO (cmp_op1))
index f2f3fbedbdfd19e06e9d3d44873dc6e1e3a8da74..168f2f37a1bee70dab0aa7bb2d7ca47da726f0f2 100644 (file)
             (match_operand:SF 2 "const0_operand" "X"))]
        UNSPEC_FNSTSW))]
   "TARGET_80387"
-{
-  if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-    {
-      output_asm_insn ("ftst\;fnstsw\t%0", operands);
-      return TARGET_USE_FFREEP ? "ffreep\t%y1" : "fstp\t%y1";
-    }
-  else
-    return "ftst\;fnstsw\t%0";
-}
+  "* return output_fp_compare (insn, operands, 2, 0);"
   [(set_attr "type" "multi")
    (set_attr "mode" "SF")])
 
             (match_operand:DF 2 "const0_operand" "X"))]
        UNSPEC_FNSTSW))]
   "TARGET_80387"
-{
-  if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-    {
-      output_asm_insn ("ftst\;fnstsw\t%0", operands);
-      return TARGET_USE_FFREEP ? "ffreep\t%y1" : "fstp\t%y1";
-    }
-  else
-    return "ftst\;fnstsw\t%0";
-}
+  "* return output_fp_compare (insn, operands, 2, 0);"
   [(set_attr "type" "multi")
    (set_attr "mode" "DF")])
 
             (match_operand:XF 2 "const0_operand" "X"))]
        UNSPEC_FNSTSW))]
   "TARGET_80387"
-{
-  if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
-    {
-      output_asm_insn ("ftst\;fnstsw\t%0", operands);
-      return TARGET_USE_FFREEP ? "ffreep\t%y1" : "fstp\t%y1";
-    }
-  else
-    return "ftst\;fnstsw\t%0";
-}
+  "* return output_fp_compare (insn, operands, 2, 0);"
   [(set_attr "type" "multi")
    (set_attr "mode" "XF")])
 
   "TARGET_80387 && TARGET_CMOVE
    && !SSE_FLOAT_MODE_P (GET_MODE (operands[0]))
    && FLOAT_MODE_P (GET_MODE (operands[0]))
-   && GET_MODE (operands[0]) == GET_MODE (operands[0])"
+   && GET_MODE (operands[0]) == GET_MODE (operands[1])"
   "* return output_fp_compare (insn, operands, 1, 0);"
   [(set_attr "type" "fcmp")
    (set (attr "mode")
                      (match_operand 1 "nonimmediate_operand" "f#x,xm#f")))]
   "TARGET_80387
    && SSE_FLOAT_MODE_P (GET_MODE (operands[0]))
-   && GET_MODE (operands[0]) == GET_MODE (operands[0])"
+   && GET_MODE (operands[0]) == GET_MODE (operands[1])"
   "* return output_fp_compare (insn, operands, 1, 0);"
   [(set_attr "type" "fcmp,ssecomi")
    (set (attr "mode")
        (compare:CCFP (match_operand 0 "register_operand" "x")
                      (match_operand 1 "nonimmediate_operand" "xm")))]
   "SSE_FLOAT_MODE_P (GET_MODE (operands[0]))
-   && GET_MODE (operands[0]) == GET_MODE (operands[0])"
+   && GET_MODE (operands[0]) == GET_MODE (operands[1])"
   "* return output_fp_compare (insn, operands, 1, 0);"
   [(set_attr "type" "ssecomi")
    (set (attr "mode")
    (clobber (match_scratch:DF 4 "=&1f"))]
   "TARGET_80387 && FLOAT_MODE_P (GET_MODE (operands[1]))
    && (!SSE_FLOAT_MODE_P (GET_MODE (operands[1])) || !TARGET_64BIT)"
-  "* operands[5] = operands[4]; return output_fix_trunc (insn, operands);"
+  "* return output_fix_trunc (insn, operands);"
   [(set_attr "type" "fistp")
    (set_attr "i387_cw" "trunc")
    (set_attr "mode" "DI")])