i386.md (floatsisf2, [...]): Remove unused register constraints from the splitters.
authorJohn Wehle <john@feith.com>
Sat, 10 Apr 1999 17:18:08 +0000 (17:18 +0000)
committerJohn Wehle <wehle@gcc.gnu.org>
Sat, 10 Apr 1999 17:18:08 +0000 (17:18 +0000)
* i386.md (floatsisf2, floatdisf2, floatsidf2, floatdidf2,
floatsixf2, floatdixf2, movsicc, movhicc, movsfcc, movdfcc,
movxfcc, movdicc): Remove unused register constraints from
the splitters.
* i386.md (fixuns_truncsfsi2, fixuns_truncdfsi2,
fixuns_truncxfsi2): Delete.
* reg-stack.c (delete_insn_for_stacker): Ensure that
the only side effects of a PARALLEL are clobbers.
(subst_stack_regs): Handle subst_stack_regs_pat deleting
a PARALLEL.
* i386.md (extendsfdf2, extenddfxf2,
extendsfxf2): Rewrite using a splitter.
* i386.c (output_op_from_reg): Remove.
* i386.h: Likewise.

From-SVN: r26338

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/config/i386/i386.h
gcc/config/i386/i386.md
gcc/reg-stack.c

index f50a947..bb6d884 100644 (file)
@@ -1,3 +1,22 @@
+Sat Apr 10 20:09:55 EDT 1999  John Wehle  (john@feith.com)
+
+       * i386.md (floatsisf2, floatdisf2, floatsidf2, floatdidf2,
+       floatsixf2, floatdixf2, movsicc, movhicc, movsfcc, movdfcc,
+       movxfcc, movdicc): Remove unused register constraints from
+       the splitters.
+
+       * i386.md (fixuns_truncsfsi2, fixuns_truncdfsi2,
+       fixuns_truncxfsi2): Delete.
+
+       * reg-stack.c (delete_insn_for_stacker): Ensure that
+       the only side effects of a PARALLEL are clobbers.
+       (subst_stack_regs): Handle subst_stack_regs_pat deleting
+       a PARALLEL.
+       * i386.md (extendsfdf2, extenddfxf2,
+       extendsfxf2): Rewrite using a splitter.
+       * i386.c (output_op_from_reg): Remove.
+       * i386.h: Likewise.
+
 Sat Apr 10 13:09:18 1999  Nick Clifton  <nickc@cygnus.com>
 
        * config/arm/arm.c (di_operand): Allow SUBREGs as well.
index adec5a2..ab54235 100644 (file)
@@ -854,54 +854,6 @@ function_arg_partial_nregs (cum, mode, type, named)
   return 0;
 }
 \f
-/* Output an insn whose source is a 386 integer register.  SRC is the
-   rtx for the register, and TEMPLATE is the op-code template.  SRC may
-   be either SImode or DImode.
-
-   The template will be output with operands[0] as SRC, and operands[1]
-   as a pointer to the top of the 386 stack.  So a call from floatsidf2
-   would look like this:
-
-      output_op_from_reg (operands[1], AS1 (fild%z0,%1));
-
-   where %z0 corresponds to the caller's operands[1], and is used to
-   emit the proper size suffix.
-
-   ??? Extend this to handle HImode - a 387 can load and store HImode
-   values directly. */
-
-void
-output_op_from_reg (src, template)
-     rtx src;
-     char *template;
-{
-  rtx xops[4];
-  int size = GET_MODE_SIZE (GET_MODE (src));
-
-  xops[0] = src;
-  xops[1] = AT_SP (Pmode);
-  xops[2] = GEN_INT (size);
-  xops[3] = stack_pointer_rtx;
-
-  if (size > UNITS_PER_WORD)
-    {
-      rtx high;
-
-      if (size > 2 * UNITS_PER_WORD)
-       {
-         high = gen_rtx_REG (SImode, REGNO (src) + 2);
-         output_asm_insn (AS1 (push%L0,%0), &high);
-       }
-
-      high = gen_rtx_REG (SImode, REGNO (src) + 1);
-      output_asm_insn (AS1 (push%L0,%0), &high);
-    }
-
-  output_asm_insn (AS1 (push%L0,%0), &src);
-  output_asm_insn (template, xops);
-  output_asm_insn (AS2 (add%L3,%2,%3), xops);
-}
-\f
 /* Output an insn to pop an value from the 387 top-of-stack to 386
    register DEST. The 387 register stack is popped if DIES is true.  If
    the mode of DEST is an integer mode, a `fist' integer store is done,
index 994d157..2bbf94e 100644 (file)
@@ -2713,7 +2713,6 @@ extern void function_arg_advance ();
 extern struct rtx_def *function_arg ();
 extern int function_arg_partial_nregs ();
 extern char *output_strlen_unroll ();
-extern void output_op_from_reg ();
 extern void output_to_reg ();
 extern char *singlemove_string ();
 extern char *output_move_double ();
index 3ec8875..8eade3e 100644 (file)
 \f
 ;; Conversions between float and double.
 
-(define_insn "extendsfdf2"
-  [(set (match_operand:DF 0 "nonimmediate_operand" "=fm,f")
-       (float_extend:DF
-        (match_operand:SF 1 "nonimmediate_operand" "f,fm")))]
+(define_expand "extendsfdf2"
+  [(parallel [(set (match_operand:DF 0 "nonimmediate_operand" "")
+                  (float_extend:DF
+                    (match_operand:SF 1 "nonimmediate_operand" "")))
+     (clobber (match_dup 2))
+     (clobber (match_dup 3))])]
   "TARGET_80387"
+  "
+{
+  if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == MEM)
+    operands[1] = force_reg (SFmode, operands[1]);
+
+  operands[2] = assign_386_stack_local (SFmode, 0);
+  operands[3] = assign_386_stack_local (DFmode, 0);
+}")
+
+(define_insn ""
+  [(set (match_operand:DF 0 "nonimmediate_operand" "=f,m,!f,!*r")
+       (float_extend:DF
+         (match_operand:SF 1 "nonimmediate_operand" "fm,f,*r,f")))
+   (clobber (match_operand:SF 2 "memory_operand" "m,m,m,m"))
+   (clobber (match_operand:DF 3 "memory_operand" "m,m,m,o"))]
+  "TARGET_80387 && (GET_CODE (operands[0]) != MEM
+                   || GET_CODE (operands[1]) != MEM)"
+  "#")
+
+(define_split
+  [(set (match_operand:DF 0 "register_operand" "")
+       (float_extend:DF (match_operand:SF 1 "register_operand" "")))
+   (clobber (match_operand:SF 2 "memory_operand" ""))
+   (clobber (match_operand:DF 3 "memory_operand" ""))]
+  "TARGET_80387 && reload_completed && NON_STACK_REG_P (operands[1])"
+  [(set (match_dup 2)
+       (match_dup 1))
+   (set (match_dup 0)
+       (float_extend:DF (match_dup 2)))]
+  "")
+
+(define_split
+  [(set (match_operand:DF 0 "register_operand" "")
+       (float_extend:DF (match_operand:SF 1 "register_operand" "")))
+   (clobber (match_operand:SF 2 "memory_operand" ""))
+   (clobber (match_operand:DF 3 "memory_operand" ""))]
+  "TARGET_80387 && reload_completed && NON_STACK_REG_P (operands[0])"
+  [(set (match_dup 3)
+       (float_extend:DF (match_dup 1)))
+   (set (match_dup 0)
+       (match_dup 3))]
+  "")
+
+(define_split
+  [(set (match_operand:DF 0 "nonimmediate_operand" "")
+       (float_extend:DF (match_operand:SF 1 "nonimmediate_operand" "")))
+   (clobber (match_operand:SF 2 "memory_operand" ""))
+   (clobber (match_operand:DF 3 "memory_operand" ""))]
+  "TARGET_80387 && reload_completed"
+  [(set (match_dup 0)
+       (float_extend:DF (match_dup 1)))]
+  "")
+
+(define_insn ""
+  [(set (match_operand:DF 0 "nonimmediate_operand" "=f,m")
+       (float_extend:DF (match_operand:SF 1 "nonimmediate_operand" "fm,f")))]
+  "TARGET_80387 && (GET_CODE (operands[0]) != MEM
+                   || GET_CODE (operands[1]) != MEM)"
   "*
 {
   int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
 
-  if (NON_STACK_REG_P (operands[1]))
-    {
-      output_op_from_reg (operands[1], AS1 (fld%z0,%y1));
-      RET;
-    }
+  if (! STACK_TOP_P (operands[0]) && ! STACK_TOP_P (operands[1]))
+    abort ();
 
-  if (NON_STACK_REG_P (operands[0]))
-    {
-      output_to_reg (operands[0], stack_top_dies, 0);
-      RET;
-    }
+  if (STACK_TOP_P (operands[0]) && STACK_TOP_P (operands[1]))
+    return \"\";
 
   if (STACK_TOP_P (operands[0]))
     return AS1 (fld%z1,%y1);
 
-  if (GET_CODE (operands[0]) == MEM)
-    {
-      if (stack_top_dies)
-       return AS1 (fstp%z0,%y0);
-      else
-        return AS1 (fst%z0,%y0);
-    }
+  if (stack_top_dies)
+    return AS1 (fstp%z0,%y0);
+  else
+    return AS1 (fst%z0,%y0);
+}"
+  [(set_attr "type" "fld,fpop")])
+
+(define_expand "extenddfxf2"
+  [(parallel [(set (match_operand:XF 0 "nonimmediate_operand" "")
+                  (float_extend:XF
+                    (match_operand:DF 1 "nonimmediate_operand" "")))
+     (clobber (match_dup 2))
+     (clobber (match_dup 3))])]
+  "TARGET_80387"
+  "
+{
+  if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == MEM)
+    operands[1] = force_reg (DFmode, operands[1]);
 
-  abort ();
+  operands[2] = assign_386_stack_local (DFmode, 0);
+  operands[3] = assign_386_stack_local (XFmode, 0);
 }")
 
-(define_insn "extenddfxf2"
-  [(set (match_operand:XF 0 "nonimmediate_operand" "=fm,f,f,!*r")
+(define_insn ""
+  [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m,!f,!*r")
        (float_extend:XF
-        (match_operand:DF 1 "nonimmediate_operand" "f,fm,!*r,f")))]
-  "TARGET_80387"
+         (match_operand:DF 1 "nonimmediate_operand" "fm,f,*r,f")))
+   (clobber (match_operand:DF 2 "memory_operand" "m,m,o,m"))
+   (clobber (match_operand:XF 3 "memory_operand" "m,m,m,o"))]
+  "TARGET_80387 && (GET_CODE (operands[0]) != MEM
+                   || GET_CODE (operands[1]) != MEM)"
+  "#")
+
+(define_split
+  [(set (match_operand:XF 0 "register_operand" "")
+       (float_extend:XF (match_operand:DF 1 "register_operand" "")))
+   (clobber (match_operand:DF 2 "memory_operand" ""))
+   (clobber (match_operand:XF 3 "memory_operand" ""))]
+  "TARGET_80387 && reload_completed && NON_STACK_REG_P (operands[1])"
+  [(set (match_dup 2)
+       (match_dup 1))
+   (set (match_dup 0)
+       (float_extend:XF (match_dup 2)))]
+  "")
+
+(define_split
+  [(set (match_operand:XF 0 "register_operand" "")
+       (float_extend:XF (match_operand:DF 1 "register_operand" "")))
+   (clobber (match_operand:DF 2 "memory_operand" ""))
+   (clobber (match_operand:XF 3 "memory_operand" ""))]
+  "TARGET_80387 && reload_completed && NON_STACK_REG_P (operands[0])"
+  [(set (match_dup 3)
+       (float_extend:XF (match_dup 1)))
+   (set (match_dup 0)
+       (match_dup 3))]
+  "")
+
+(define_split
+  [(set (match_operand:XF 0 "nonimmediate_operand" "")
+       (float_extend:XF (match_operand:DF 1 "nonimmediate_operand" "")))
+   (clobber (match_operand:DF 2 "memory_operand" ""))
+   (clobber (match_operand:XF 3 "memory_operand" ""))]
+  "TARGET_80387 && reload_completed"
+  [(set (match_dup 0)
+       (float_extend:XF (match_dup 1)))]
+  "")
+
+(define_insn ""
+  [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m")
+       (float_extend:XF (match_operand:DF 1 "nonimmediate_operand" "fm,f")))]
+  "TARGET_80387 && (GET_CODE (operands[0]) != MEM
+                   || GET_CODE (operands[1]) != MEM)"
   "*
 {
   int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
 
-  if (NON_STACK_REG_P (operands[1]))
-    {
-      output_op_from_reg (operands[1], AS1 (fld%z0,%y1));
-      RET;
-    }
+  if (! STACK_TOP_P (operands[0]) && ! STACK_TOP_P (operands[1]))
+    abort ();
 
-  if (NON_STACK_REG_P (operands[0]))
-    {
-      output_to_reg (operands[0], stack_top_dies, 0);
-      RET;
-    }
+  if (STACK_TOP_P (operands[0]) && STACK_TOP_P (operands[1]))
+    return \"\";
 
   if (STACK_TOP_P (operands[0]))
     return AS1 (fld%z1,%y1);
 
-  if (GET_CODE (operands[0]) == MEM)
-    {
-      output_asm_insn (AS1 (fstp%z0,%y0), operands);
-      if (! stack_top_dies)
-       return AS1 (fld%z0,%y0);
-      RET;
-    }
+  if (stack_top_dies || GET_CODE (operands[0]) == MEM)
+    output_asm_insn (AS1 (fstp%z0,%y0), operands);
+  else
+    return AS1 (fst%z0,%y0);
 
-  abort ();
+  if (! stack_top_dies)
+    return AS1 (fld%z0,%y0);
+
+  return \"\";
+}"
+  [(set_attr "type" "fld,fpop")])
+
+(define_expand "extendsfxf2"
+  [(parallel [(set (match_operand:XF 0 "nonimmediate_operand" "")
+                  (float_extend:XF
+                    (match_operand:SF 1 "nonimmediate_operand" "")))
+     (clobber (match_dup 2))
+     (clobber (match_dup 3))])]
+  "TARGET_80387"
+  "
+{
+  if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == MEM)
+    operands[1] = force_reg (SFmode, operands[1]);
+
+  operands[2] = assign_386_stack_local (SFmode, 0);
+  operands[3] = assign_386_stack_local (XFmode, 0);
 }")
 
-(define_insn "extendsfxf2"
-  [(set (match_operand:XF 0 "nonimmediate_operand" "=fm,f,f,!*r")
+(define_insn ""
+  [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m,!f,!*r")
        (float_extend:XF
-        (match_operand:SF 1 "nonimmediate_operand" "f,fm,!*r,f")))]
-  "TARGET_80387"
+         (match_operand:SF 1 "nonimmediate_operand" "fm,f,*r,f")))
+   (clobber (match_operand:SF 2 "memory_operand" "m,m,m,m"))
+   (clobber (match_operand:XF 3 "memory_operand" "m,m,m,o"))]
+  "TARGET_80387 && (GET_CODE (operands[0]) != MEM
+                   || GET_CODE (operands[1]) != MEM)"
+  "#")
+
+(define_split
+  [(set (match_operand:XF 0 "register_operand" "")
+       (float_extend:XF (match_operand:SF 1 "register_operand" "")))
+   (clobber (match_operand:SF 2 "memory_operand" ""))
+   (clobber (match_operand:XF 3 "memory_operand" ""))]
+  "TARGET_80387 && reload_completed && NON_STACK_REG_P (operands[1])"
+  [(set (match_dup 2)
+       (match_dup 1))
+   (set (match_dup 0)
+       (float_extend:XF (match_dup 2)))]
+  "")
+
+(define_split
+  [(set (match_operand:XF 0 "register_operand" "")
+       (float_extend:XF (match_operand:SF 1 "register_operand" "")))
+   (clobber (match_operand:SF 2 "memory_operand" ""))
+   (clobber (match_operand:XF 3 "memory_operand" ""))]
+  "TARGET_80387 && reload_completed && NON_STACK_REG_P (operands[0])"
+  [(set (match_dup 3)
+       (float_extend:XF (match_dup 1)))
+   (set (match_dup 0)
+       (match_dup 3))]
+  "")
+
+(define_split
+  [(set (match_operand:XF 0 "nonimmediate_operand" "")
+       (float_extend:XF (match_operand:SF 1 "nonimmediate_operand" "")))
+   (clobber (match_operand:SF 2 "memory_operand" ""))
+   (clobber (match_operand:XF 3 "memory_operand" ""))]
+  "TARGET_80387 && reload_completed"
+  [(set (match_dup 0)
+       (float_extend:XF (match_dup 1)))]
+  "")
+
+(define_insn ""
+  [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m")
+       (float_extend:XF
+        (match_operand:SF 1 "nonimmediate_operand" "fm,f")))]
+  "TARGET_80387 && (GET_CODE (operands[0]) != MEM
+                   || GET_CODE (operands[1]) != MEM)"
   "*
 {
   int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
 
-  if (NON_STACK_REG_P (operands[1]))
-    {
-      output_op_from_reg (operands[1], AS1 (fld%z0,%y1));
-      RET;
-    }
+  if (! STACK_TOP_P (operands[0]) && ! STACK_TOP_P (operands[1]))
+    abort ();
 
-  if (NON_STACK_REG_P (operands[0]))
-    {
-      output_to_reg (operands[0], stack_top_dies, 0);
-      RET;
-    }
+  if (STACK_TOP_P (operands[0]) && STACK_TOP_P (operands[1]))
+    return \"\";
 
   if (STACK_TOP_P (operands[0]))
     return AS1 (fld%z1,%y1);
 
-  if (GET_CODE (operands[0]) == MEM)
-    {
-      output_asm_insn (AS1 (fstp%z0,%y0), operands);
-      if (! stack_top_dies)
-       return AS1 (fld%z0,%y0);
-      RET;
-    }
+  if (stack_top_dies || GET_CODE (operands[0]) == MEM)
+    output_asm_insn (AS1 (fstp%z0,%y0), operands);
+  else
+    return AS1 (fst%z0,%y0);
 
-  abort ();
-}")
+  if (! stack_top_dies)
+    return AS1 (fld%z0,%y0);
+
+  return \"\";
+}"
+  [(set_attr "type" "fld,fpop")])
 
 (define_expand "truncdfsf2"
   [(parallel [(set (match_operand:SF 0 "nonimmediate_operand" "")
 }"
   [(set_attr "type" "fpop")])
 \f
-;; The 387 requires that the stack top dies after converting to DImode.
-
-;; Represent an unsigned conversion from SImode to MODE_FLOAT by first
-;; doing a signed conversion to DImode, and then taking just the low
-;; part.
-
-(define_expand "fixuns_truncxfsi2"
-  [(set (match_dup 4)
-       (match_operand:XF 1 "register_operand" ""))
-   (parallel [(set (match_dup 2)
-                  (fix:DI (fix:XF (match_dup 4))))
-             (clobber (match_dup 4))
-             (clobber (match_dup 5))
-             (clobber (match_dup 6))
-             (clobber (match_scratch:SI 7 ""))])
-   (set (match_operand:SI 0 "general_operand" "")
-       (match_dup 3))]
-  "TARGET_80387"
-  "
-{
-  operands[2] = gen_reg_rtx (DImode);
-  operands[3] = gen_lowpart (SImode, operands[2]);
-  operands[4] = gen_reg_rtx (XFmode);
-  operands[5] = (rtx) assign_386_stack_local (SImode, 0);
-  operands[6] = (rtx) assign_386_stack_local (DImode, 1);
-}")
-
-(define_expand "fixuns_truncdfsi2"
-  [(set (match_dup 4)
-       (match_operand:DF 1 "register_operand" ""))
-   (parallel [(set (match_dup 2)
-                  (fix:DI (fix:DF (match_dup 4))))
-             (clobber (match_dup 4))
-             (clobber (match_dup 5))
-             (clobber (match_dup 6))
-             (clobber (match_scratch:SI 7 ""))])
-   (set (match_operand:SI 0 "general_operand" "")
-       (match_dup 3))]
-  "TARGET_80387"
-  "
-{
-  operands[2] = gen_reg_rtx (DImode);
-  operands[3] = gen_lowpart (SImode, operands[2]);
-  operands[4] = gen_reg_rtx (DFmode);
-  operands[5] = (rtx) assign_386_stack_local (SImode, 0);
-  operands[6] = (rtx) assign_386_stack_local (DImode, 1);
-}")
-
-(define_expand "fixuns_truncsfsi2"
-  [(set (match_dup 4)
-       (match_operand:SF 1 "register_operand" ""))
-   (parallel [(set (match_dup 2)
-                  (fix:DI (fix:SF (match_dup 4))))
-             (clobber (match_dup 4))
-             (clobber (match_dup 5))
-             (clobber (match_dup 6))
-             (clobber (match_scratch:SI 7 ""))])
-   (set (match_operand:SI 0 "general_operand" "")
-       (match_dup 3))]
-  "TARGET_80387"
-  "
-{
-  operands[2] = gen_reg_rtx (DImode);
-  operands[3] = gen_lowpart (SImode, operands[2]);
-  operands[4] = gen_reg_rtx (SFmode);
-  operands[5] = (rtx) assign_386_stack_local (SImode, 0);
-  operands[6] = (rtx) assign_386_stack_local (DImode, 1);
-}")
-
 ;; Signed conversion to DImode.
 
 (define_expand "fix_truncxfdi2"
   "#")
 
 (define_split
-  [(set (match_operand:SF 0 "register_operand" "=f")
-       (float:SF (match_operand:SI 1 "memory_operand" "m")))
-   (clobber (match_operand:SI 2 "memory_operand" "m"))]
+  [(set (match_operand:SF 0 "register_operand" "")
+       (float:SF (match_operand:SI 1 "memory_operand" "")))
+   (clobber (match_operand:SI 2 "memory_operand" ""))]
   "TARGET_80387 && reload_completed"
   [(set (match_dup 0)
        (float:SF (match_dup 1)))]
   "")
 
 (define_split
-  [(set (match_operand:SF 0 "register_operand" "=f")
-       (float:SF (match_operand:SI 1 "register_operand" "r")))
-   (clobber (match_operand:SI 2 "memory_operand" "m"))]
+  [(set (match_operand:SF 0 "register_operand" "")
+       (float:SF (match_operand:SI 1 "register_operand" "")))
+   (clobber (match_operand:SI 2 "memory_operand" ""))]
   "TARGET_80387 && reload_completed"
   [(set (match_dup 2)
        (match_dup 1))
   "#")
 
 (define_split
-  [(set (match_operand:SF 0 "register_operand" "=f")
-       (float:SF (match_operand:DI 1 "memory_operand" "m")))
-   (clobber (match_operand:DI 2 "memory_operand" "m"))]
+  [(set (match_operand:SF 0 "register_operand" "")
+       (float:SF (match_operand:DI 1 "memory_operand" "")))
+   (clobber (match_operand:DI 2 "memory_operand" ""))]
   "TARGET_80387 && reload_completed"
   [(set (match_dup 0)
        (float:SF (match_dup 1)))]
   "")
 
 (define_split
-  [(set (match_operand:SF 0 "register_operand" "=f")
-       (float:SF (match_operand:DI 1 "register_operand" "r")))
-   (clobber (match_operand:DI 2 "memory_operand" "o"))]
+  [(set (match_operand:SF 0 "register_operand" "")
+       (float:SF (match_operand:DI 1 "register_operand" "")))
+   (clobber (match_operand:DI 2 "memory_operand" ""))]
   "TARGET_80387 && reload_completed"
   [(set (match_dup 2)
        (match_dup 1))
   "#")
 
 (define_split
-  [(set (match_operand:DF 0 "register_operand" "=f")
-       (float:DF (match_operand:SI 1 "memory_operand" "m")))
-   (clobber (match_operand:SI 2 "memory_operand" "m"))]
+  [(set (match_operand:DF 0 "register_operand" "")
+       (float:DF (match_operand:SI 1 "memory_operand" "")))
+   (clobber (match_operand:SI 2 "memory_operand" ""))]
   "TARGET_80387 && reload_completed"
   [(set (match_dup 0)
        (float:DF (match_dup 1)))]
   "")
 
 (define_split
-  [(set (match_operand:DF 0 "register_operand" "=f")
-       (float:DF (match_operand:SI 1 "register_operand" "r")))
-   (clobber (match_operand:SI 2 "memory_operand" "m"))]
+  [(set (match_operand:DF 0 "register_operand" "")
+       (float:DF (match_operand:SI 1 "register_operand" "")))
+   (clobber (match_operand:SI 2 "memory_operand" ""))]
   "TARGET_80387 && reload_completed"
   [(set (match_dup 2)
        (match_dup 1))
   "#")
 
 (define_split
-  [(set (match_operand:DF 0 "register_operand" "=f")
-       (float:DF (match_operand:DI 1 "memory_operand" "m")))
-   (clobber (match_operand:DI 2 "memory_operand" "m"))]
+  [(set (match_operand:DF 0 "register_operand" "")
+       (float:DF (match_operand:DI 1 "memory_operand" "")))
+   (clobber (match_operand:DI 2 "memory_operand" ""))]
   "TARGET_80387 && reload_completed"
   [(set (match_dup 0)
        (float:DF (match_dup 1)))]
   "")
 
 (define_split
-  [(set (match_operand:DF 0 "register_operand" "=f")
-       (float:DF (match_operand:DI 1 "register_operand" "r")))
-   (clobber (match_operand:DI 2 "memory_operand" "o"))]
+  [(set (match_operand:DF 0 "register_operand" "")
+       (float:DF (match_operand:DI 1 "register_operand" "")))
+   (clobber (match_operand:DI 2 "memory_operand" ""))]
   "TARGET_80387 && reload_completed"
   [(set (match_dup 2)
        (match_dup 1))
   "#")
 
 (define_split
-  [(set (match_operand:XF 0 "register_operand" "=f")
-       (float:XF (match_operand:SI 1 "memory_operand" "m")))
-   (clobber (match_operand:SI 2 "memory_operand" "m"))]
+  [(set (match_operand:XF 0 "register_operand" "")
+       (float:XF (match_operand:SI 1 "memory_operand" "")))
+   (clobber (match_operand:SI 2 "memory_operand" ""))]
   "TARGET_80387 && reload_completed"
   [(set (match_dup 0)
        (float:XF (match_dup 1)))]
   "")
 
 (define_split
-  [(set (match_operand:XF 0 "register_operand" "=f")
-       (float:XF (match_operand:SI 1 "register_operand" "r")))
-   (clobber (match_operand:SI 2 "memory_operand" "m"))]
+  [(set (match_operand:XF 0 "register_operand" "")
+       (float:XF (match_operand:SI 1 "register_operand" "")))
+   (clobber (match_operand:SI 2 "memory_operand" ""))]
   "TARGET_80387 && reload_completed"
   [(set (match_dup 2)
        (match_dup 1))
   "#")
 
 (define_split
-  [(set (match_operand:XF 0 "register_operand" "=f")
-       (float:XF (match_operand:DI 1 "memory_operand" "m")))
-   (clobber (match_operand:DI 2 "memory_operand" "m"))]
+  [(set (match_operand:XF 0 "register_operand" "")
+       (float:XF (match_operand:DI 1 "memory_operand" "")))
+   (clobber (match_operand:DI 2 "memory_operand" ""))]
   "TARGET_80387 && reload_completed"
   [(set (match_dup 0)
        (float:XF (match_dup 1)))]
   "")
 
 (define_split
-  [(set (match_operand:XF 0 "register_operand" "=f")
-       (float:XF (match_operand:DI 1 "register_operand" "r")))
-   (clobber (match_operand:DI 2 "memory_operand" "o"))]
+  [(set (match_operand:XF 0 "register_operand" "")
+       (float:XF (match_operand:DI 1 "register_operand" "")))
+   (clobber (match_operand:DI 2 "memory_operand" ""))]
   "TARGET_80387 && reload_completed"
   [(set (match_dup 2)
        (match_dup 1))
@@ -7208,12 +7300,12 @@ byte_xor_operation:
   "#")
 
 (define_split
-  [(set (match_operand:SI 0 "register_operand" "=r,r")
+  [(set (match_operand:SI 0 "register_operand" "")
        (if_then_else:SI (match_operator 1 "comparison_operator" 
                                [(match_operand 2 "nonimmediate_operand" "")
                                 (const_int 0)])
-                     (match_operand:SI 3 "nonimmediate_operand" "rm,0")
-                     (match_operand:SI 4 "nonimmediate_operand" "0,rm")))]
+                     (match_operand:SI 3 "nonimmediate_operand" "")
+                     (match_operand:SI 4 "nonimmediate_operand" "")))]
   "TARGET_CMOVE && reload_completed"
   [(set (cc0)
        (match_dup 2))
@@ -7223,12 +7315,12 @@ byte_xor_operation:
   "")
 
 (define_split
-  [(set (match_operand:SI 0 "register_operand" "=r,r")
+  [(set (match_operand:SI 0 "register_operand" "")
        (if_then_else:SI (match_operator 1 "comparison_operator" 
                                [(match_operand 2 "nonimmediate_operand" "")
                                 (match_operand 3 "general_operand" "")])
-                     (match_operand:SI 4 "nonimmediate_operand" "rm,0")
-                     (match_operand:SI 5 "nonimmediate_operand" "0,rm")))]
+                     (match_operand:SI 4 "nonimmediate_operand" "")
+                     (match_operand:SI 5 "nonimmediate_operand" "")))]
   "TARGET_CMOVE && reload_completed"
   [(set (cc0) (compare (match_dup 2) (match_dup 3)))
    (set (match_dup 0)
@@ -7282,12 +7374,12 @@ byte_xor_operation:
   "#")
 
 (define_split
-  [(set (match_operand:HI 0 "register_operand" "=r,r")
+  [(set (match_operand:HI 0 "register_operand" "")
        (if_then_else:HI (match_operator 1 "comparison_operator" 
                                [(match_operand 2 "nonimmediate_operand" "")
                                 (const_int 0)])
-                     (match_operand:HI 3 "nonimmediate_operand" "rm,0")
-                     (match_operand:HI 4 "nonimmediate_operand" "0,rm")))]
+                     (match_operand:HI 3 "nonimmediate_operand" "")
+                     (match_operand:HI 4 "nonimmediate_operand" "")))]
   "TARGET_CMOVE && reload_completed"
   [(set (cc0)
        (match_dup 2))
@@ -7297,12 +7389,12 @@ byte_xor_operation:
   "")
 
 (define_split
-  [(set (match_operand:HI 0 "register_operand" "=r,r")
+  [(set (match_operand:HI 0 "register_operand" "")
        (if_then_else:HI (match_operator 1 "comparison_operator" 
                                [(match_operand 2 "nonimmediate_operand" "")
                                 (match_operand 3 "general_operand" "")])
-                     (match_operand:HI 4 "nonimmediate_operand" "rm,0")
-                     (match_operand:HI 5 "nonimmediate_operand" "0,rm")))]
+                     (match_operand:HI 4 "nonimmediate_operand" "")
+                     (match_operand:HI 5 "nonimmediate_operand" "")))]
   "TARGET_CMOVE && reload_completed"
   [(set (cc0)
        (compare (match_dup 2) (match_dup 3)))
@@ -7385,12 +7477,12 @@ byte_xor_operation:
   "#")
 
 (define_split
-  [(set (match_operand:SF 0 "register_operand" "=f,f")
+  [(set (match_operand:SF 0 "register_operand" "")
        (if_then_else:SF (match_operator 1 "comparison_operator" 
                                [(match_operand 2 "nonimmediate_operand" "")
                                 (const_int 0)])
-                     (match_operand:SF 3 "register_operand" "f,0")
-                     (match_operand:SF 4 "register_operand" "0,f")))]
+                     (match_operand:SF 3 "register_operand" "")
+                     (match_operand:SF 4 "register_operand" "")))]
   "TARGET_CMOVE && reload_completed"
   [(set (cc0)
        (match_dup 2))
@@ -7400,12 +7492,12 @@ byte_xor_operation:
   "")
 
 (define_split
-  [(set (match_operand:SF 0 "register_operand" "=f,f")
+  [(set (match_operand:SF 0 "register_operand" "")
        (if_then_else:SF (match_operator 1 "comparison_operator" 
                                [(match_operand 2 "nonimmediate_operand" "")
                                 (match_operand 3 "general_operand" "")])
-                     (match_operand:SF 4 "register_operand" "f,0")
-                     (match_operand:SF 5 "register_operand" "0,f")))]
+                     (match_operand:SF 4 "register_operand" "")
+                     (match_operand:SF 5 "register_operand" "")))]
   "TARGET_CMOVE && reload_completed"
   [(set (cc0) (compare (match_dup 2) (match_dup 3)))
    (set (match_dup 0)
@@ -7487,12 +7579,12 @@ byte_xor_operation:
   "#")
 
 (define_split
-  [(set (match_operand:DF 0 "register_operand" "=f,f")
+  [(set (match_operand:DF 0 "register_operand" "")
        (if_then_else:DF (match_operator 1 "comparison_operator" 
                                [(match_operand 2 "nonimmediate_operand" "")
                                 (const_int 0)])
-                     (match_operand:DF 3 "register_operand" "f,0")
-                     (match_operand:DF 4 "register_operand" "0,f")))]
+                     (match_operand:DF 3 "register_operand" "")
+                     (match_operand:DF 4 "register_operand" "")))]
   "TARGET_CMOVE && reload_completed"
   [(set (cc0)
        (match_dup 2))
@@ -7502,12 +7594,12 @@ byte_xor_operation:
   "")
 
 (define_split
-  [(set (match_operand:DF 0 "register_operand" "=f,f")
+  [(set (match_operand:DF 0 "register_operand" "")
        (if_then_else:DF (match_operator 1 "comparison_operator" 
                                [(match_operand 2 "nonimmediate_operand" "")
                                 (match_operand 3 "general_operand" "")])
-                     (match_operand:DF 4 "register_operand" "f,0")
-                     (match_operand:DF 5 "register_operand" "0,f")))]
+                     (match_operand:DF 4 "register_operand" "")
+                     (match_operand:DF 5 "register_operand" "")))]
   "TARGET_CMOVE && reload_completed"
   [(set (cc0) (compare (match_dup 2) (match_dup 3)))
    (set (match_dup 0)
@@ -7589,12 +7681,12 @@ byte_xor_operation:
   "#")
 
 (define_split
-  [(set (match_operand:XF 0 "register_operand" "=f,f")
+  [(set (match_operand:XF 0 "register_operand" "")
        (if_then_else:XF (match_operator 1 "comparison_operator" 
                                [(match_operand 2 "nonimmediate_operand" "")
                                 (const_int 0)])
-                     (match_operand:XF 3 "register_operand" "f,0")
-                     (match_operand:XF 4 "register_operand" "0,f")))]
+                     (match_operand:XF 3 "register_operand" "")
+                     (match_operand:XF 4 "register_operand" "")))]
   "TARGET_CMOVE && reload_completed"
   [(set (cc0)
        (match_dup 2))
@@ -7604,12 +7696,12 @@ byte_xor_operation:
   "")
 
 (define_split
-  [(set (match_operand:XF 0 "register_operand" "=f,f")
+  [(set (match_operand:XF 0 "register_operand" "")
        (if_then_else:XF (match_operator 1 "comparison_operator" 
                                [(match_operand 2 "nonimmediate_operand" "")
                                 (match_operand 3 "general_operand" "")])
-                     (match_operand:XF 4 "register_operand" "f,0")
-                     (match_operand:XF 5 "register_operand" "0,f")))]
+                     (match_operand:XF 4 "register_operand" "")
+                     (match_operand:XF 5 "register_operand" "")))]
   "TARGET_CMOVE && reload_completed"
   [(set (cc0) (compare (match_dup 2) (match_dup 3)))
    (set (match_dup 0)
@@ -7663,12 +7755,12 @@ byte_xor_operation:
   "#")
 
 (define_split
-  [(set (match_operand:DI 0 "register_operand" "=&r,&r")
+  [(set (match_operand:DI 0 "register_operand" "")
        (if_then_else:DI (match_operator 1 "comparison_operator" 
                                [(match_operand 2 "nonimmediate_operand" "")
                                 (const_int 0)])
-                     (match_operand:DI 3 "nonimmediate_operand" "ro,0")
-                     (match_operand:DI 4 "nonimmediate_operand" "0,ro")))]
+                     (match_operand:DI 3 "nonimmediate_operand" "")
+                     (match_operand:DI 4 "nonimmediate_operand" "")))]
   "TARGET_CMOVE && reload_completed"
   [(set (cc0)
        (match_dup 2))
@@ -7683,12 +7775,12 @@ byte_xor_operation:
    split_di (&operands[4], 1, &operands[9], &operands[10]);")
 
 (define_split
-  [(set (match_operand:DI 0 "register_operand" "=&r,&r")
+  [(set (match_operand:DI 0 "register_operand" "")
        (if_then_else:DI (match_operator 1 "comparison_operator" 
                                [(match_operand 2 "nonimmediate_operand" "")
                                 (match_operand 3 "general_operand" "")])
-                     (match_operand:DI 4 "nonimmediate_operand" "ro,0")
-                     (match_operand:DI 5 "nonimmediate_operand" "0,ro")))]
+                     (match_operand:DI 4 "nonimmediate_operand" "")
+                     (match_operand:DI 5 "nonimmediate_operand" "")))]
   "TARGET_CMOVE && reload_completed"
   [(set (cc0) (compare (match_dup 2) (match_dup 3)))
    (set (match_dup 6)
index 014f952..fe554a0 100644 (file)
@@ -1405,6 +1405,14 @@ static void
 delete_insn_for_stacker (insn)
      rtx insn;
 {
+  int i;
+
+  /* Ensure that the side effects were clobbers when deleting a PARALLEL.  */
+  if (GET_CODE (PATTERN (insn)) == PARALLEL)
+    for (i = 1; i < XVECLEN (PATTERN (insn), 0); i++)
+      if (GET_CODE (XVECEXP (PATTERN (insn), 0, i)) != CLOBBER)
+       abort ();
+
   PUT_CODE (insn, NOTE);
   NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
   NOTE_SOURCE_FILE (insn) = 0;
@@ -2478,8 +2486,14 @@ subst_stack_regs (insn, regstack)
        for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
          {
            if (stack_regs_mentioned_p (XVECEXP (PATTERN (insn), 0, i)))
-             subst_stack_regs_pat (insn, regstack,
-                                   XVECEXP (PATTERN (insn), 0, i));
+             {
+               subst_stack_regs_pat (insn, regstack,
+                                     XVECEXP (PATTERN (insn), 0, i));
+
+               /* subst_stack_regs_pat may have deleted a no-op insn.  */
+               if (GET_CODE (insn) == NOTE)
+                 break;
+             }
          }
       else
        subst_stack_regs_pat (insn, regstack, PATTERN (insn));