]> gcc.gnu.org Git - gcc.git/commitdiff
i386.md (truncdfsf2, [...]): Rewrite using a splitter.
authorJohn Wehle <john@feith.com>
Thu, 8 Apr 1999 03:19:00 +0000 (03:19 +0000)
committerJohn Wehle <wehle@gcc.gnu.org>
Thu, 8 Apr 1999 03:19:00 +0000 (03:19 +0000)
* i386.md (truncdfsf2, truncxfsf2,
truncxfdf2): Rewrite using a splitter.

From-SVN: r26288

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

index 89b426373c31be05011f4d3f2789fd80e06e9433..8bcadbe73e61074b4bc7b6ca10ad9b052d5131ff 100644 (file)
@@ -1,3 +1,8 @@
+Thu Apr  8 06:16:14 EDT 1999  John Wehle  (john@feith.com)
+
+       * i386.md (truncdfsf2, truncxfsf2,
+       truncxfdf2): Rewrite using a splitter.
+
 Thu Apr  8 01:26:05 1999  Arg Haas (ahaas@neosoft.com)
                          Jeffrey A Law  (law@cygnus.com)
 
index df87d5cf1b2ad7f156c4ada59a576d59c0295443..3ec8875e71158b12ce865d199a4642ce6a43de9c 100644 (file)
   operands[2] = (rtx) assign_386_stack_local (SFmode, 0);
 }")
 
+(define_insn ""
+  [(set (match_operand:SF 0 "nonimmediate_operand" "=f,m,!*r")
+       (float_truncate:SF
+         (match_operand:DF 1 "register_operand" "0,f,f")))
+   (clobber (match_operand:SF 2 "memory_operand" "m,m,m"))]
+  "TARGET_80387"
+  "*
+{
+  int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
+  rtx xops[1];
+
+  xops[0] = GET_CODE (operands[0]) == MEM ? operands[0] : operands[2];
+
+  if (stack_top_dies || STACK_REG_P (operands[0]))
+    output_asm_insn (AS1 (fstp%z0,%0), xops);
+  else
+    output_asm_insn (AS1 (fst%z0,%0), xops);
+
+  if (STACK_REG_P (operands[0]))
+    return AS1 (fld%z2,%2);
+  else if (NON_STACK_REG_P (operands[0]))
+    return AS2 (mov%L0,%2,%0);
+
+  return \"\";
+}"
+  [(set_attr "type" "fpop")])
+
+(define_split
+  [(set (match_operand:SF 0 "register_operand" "")
+       (float_truncate:SF (match_operand:DF 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:DF 1 "register_operand" "")))
+   (clobber (match_operand:SF 2 "memory_operand" ""))]
+  "TARGET_80387 && reload_completed"
+  [(set (match_dup 0)
+       (float_truncate:SF (match_dup 1)))]
+  "")
+
 ;; This cannot output into an f-reg because there is no way to be sure
-;; of truncating in that case.  Otherwise this is just like a simple move
-;; insn.  So we pretend we can output to a reg in order to get better
-;; register preferencing, but we really use a stack slot.
+;; of truncating in that case.
 
 (define_insn ""
-  [(set (match_operand:SF 0 "nonimmediate_operand" "=f,m")
-       (float_truncate:SF
-        (match_operand:DF 1 "register_operand" "0,f")))
-   (clobber (match_operand:SF 2 "memory_operand" "m,m"))]
+  [(set (match_operand:SF 0 "memory_operand" "=m")
+       (float_truncate:SF (match_operand:DF 1 "register_operand" "f")))]
   "TARGET_80387"
   "*
 {
   int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
 
-  if (GET_CODE (operands[0]) == MEM)
-    {
-      if (stack_top_dies)
-       return AS1 (fstp%z0,%0);
-      else
-        return AS1 (fst%z0,%0);
-    }
-  else if (STACK_TOP_P (operands[0]))
-    {
-      output_asm_insn (AS1 (fstp%z2,%y2), operands);
-      return AS1 (fld%z2,%y2);
-    }
+  if (stack_top_dies)
+    return AS1 (fstp%z0,%0);
   else
-    abort ();
+    return AS1 (fst%z0,%0);
+}"
+  [(set_attr "type" "fpop")])
+
+(define_expand "truncxfsf2"
+  [(parallel [(set (match_operand:SF 0 "nonimmediate_operand" "")
+                  (float_truncate:SF
+                   (match_operand:XF 1 "register_operand" "")))
+             (clobber (match_dup 2))])]
+  "TARGET_80387"
+  "
+{
+  operands[2] = (rtx) assign_386_stack_local (SFmode, 0);
 }")
 
-(define_insn "truncxfsf2"
-  [(set (match_operand:SF 0 "nonimmediate_operand" "=m,!*r")
+(define_insn ""
+  [(set (match_operand:SF 0 "nonimmediate_operand" "=f,m,!*r")
        (float_truncate:SF
-        (match_operand:XF 1 "register_operand" "f,f")))]
+         (match_operand:XF 1 "register_operand" "0,f,f")))
+   (clobber (match_operand:SF 2 "memory_operand" "m,m,m"))]
   "TARGET_80387"
   "*
 {
   int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
+  rtx xops[1];
 
-  if (NON_STACK_REG_P (operands[0]))
-    {
-      if (stack_top_dies == 0)
-       {
-         output_asm_insn (AS1 (fld,%y1), operands);
-         stack_top_dies = 1;
-       }
-      output_to_reg (operands[0], stack_top_dies, 0);
-      RET;
-    }
-  else if (GET_CODE (operands[0]) == MEM)
-    {
-      if (stack_top_dies)
-       return AS1 (fstp%z0,%0);
-      else
-       {
-         output_asm_insn (AS1 (fld,%y1), operands);
-         return AS1 (fstp%z0,%0);
-       }
-    }
+  xops[0] = GET_CODE (operands[0]) == MEM ? operands[0] : operands[2];
+
+  if (stack_top_dies || STACK_REG_P (operands[0]))
+    output_asm_insn (AS1 (fstp%z0,%0), xops);
   else
-    abort ();
+    output_asm_insn (AS1 (fst%z0,%0), xops);
+
+  if (STACK_REG_P (operands[0]))
+    return AS1 (fld%z2,%2);
+  else if (NON_STACK_REG_P (operands[0]))
+    return AS2 (mov%L0,%2,%0);
+
+  return \"\";
+}"
+  [(set_attr "type" "fpop")])
+
+(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 && reload_completed"
+  [(set (match_dup 0)
+       (float_truncate:SF (match_dup 1)))]
+  "")
+
+(define_insn ""
+  [(set (match_operand:SF 0 "memory_operand" "=m")
+       (float_truncate:SF (match_operand:XF 1 "register_operand" "f")))]
+  "TARGET_80387"
+  "*
+{
+  int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
+
+  if (stack_top_dies)
+    return AS1 (fstp%z0,%0);
+  else
+    return AS1 (fst%z0,%0);
+}"
+  [(set_attr "type" "fpop")])
+
+(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"
+  "
+{
+  operands[2] = (rtx) assign_386_stack_local (DFmode, 0);
 }")
 
-(define_insn "truncxfdf2"
-  [(set (match_operand:DF 0 "nonimmediate_operand" "=m,!*r")
+(define_insn ""
+  [(set (match_operand:DF 0 "nonimmediate_operand" "=f,m,!*r")
        (float_truncate:DF
-        (match_operand:XF 1 "register_operand" "f,f")))]
+         (match_operand:XF 1 "register_operand" "0,f,f")))
+   (clobber (match_operand:DF 2 "memory_operand" "m,m,o"))]
   "TARGET_80387"
   "*
 {
   int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
+  rtx xops[2];
 
-  if (NON_STACK_REG_P (operands[0]))
-    {
-      if (stack_top_dies == 0)
-       {
-         output_asm_insn (AS1 (fld,%y1), operands);
-         stack_top_dies = 1;
-       }
-      output_to_reg (operands[0], stack_top_dies, 0);
-      RET;
-    }
-  else if (GET_CODE (operands[0]) == MEM)
+  xops[0] = GET_CODE (operands[0]) == MEM ? operands[0] : operands[2];
+
+  if (stack_top_dies || STACK_REG_P (operands[0]))
+    output_asm_insn (AS1 (fstp%z0,%0), xops);
+  else
+    output_asm_insn (AS1 (fst%z0,%0), xops);
+
+  if (STACK_REG_P (operands[0]))
+    return AS1 (fld%z2,%2);
+  else if (NON_STACK_REG_P (operands[0]))
     {
-      if (stack_top_dies)
-       return AS1 (fstp%z0,%0);
-      else
-       {
-         output_asm_insn (AS1 (fld,%y1), operands);
-         return AS1 (fstp%z0,%0);
-       }
+    xops[0] = operands[0];
+    xops[1] = operands[2];
+    return output_move_double (xops);
     }
-  else
-    abort ();
-}")
 
+  return \"\";
+}"
+  [(set_attr "type" "fpop")])
+
+(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" ""))]
+  "TARGET_80387 && reload_completed"
+  [(set (match_dup 2)
+       (float_truncate:DF (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" ""))]
+  "TARGET_80387 && reload_completed"
+  [(set (match_dup 0)
+       (float_truncate:DF (match_dup 1)))]
+  "")
+
+(define_insn ""
+  [(set (match_operand:DF 0 "memory_operand" "=m")
+       (float_truncate:DF (match_operand:XF 1 "register_operand" "f")))]
+  "TARGET_80387"
+  "*
+{
+  int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
+
+  if (stack_top_dies)
+    return AS1 (fstp%z0,%0);
+  else
+    return AS1 (fst%z0,%0);
+}"
+  [(set_attr "type" "fpop")])
 \f
 ;; The 387 requires that the stack top dies after converting to DImode.
 
This page took 0.084397 seconds and 5 git commands to generate.