* reg-stack.c (subst_stack_regs_pat): Fix fcmov reversal code.
authorJan Hubicka <jh@suse.cz>
Sat, 8 Sep 2001 20:01:54 +0000 (22:01 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Sat, 8 Sep 2001 20:01:54 +0000 (20:01 +0000)
From-SVN: r45490

gcc/ChangeLog
gcc/reg-stack.c

index 033324b050f2c7daeb8564933ba9ba9c72730fc9..7442f6f5855ef1d39d8047a6f3a752781a2828fe 100644 (file)
@@ -1,3 +1,7 @@
+Sat Sep  8 22:00:55 CEST 2001  Jan Hubicka  <jh@suse.cz>
+
+       * reg-stack.c (subst_stack_regs_pat): Fix fcmov reversal code.
+
 2001-09-08  Andreas Jaeger  <aj@suse.de>
 
        * i386.h (TARGET_SWITCHES): Fix description.
index 79aabfa95b745d60418d1ae70d25d082433260e5..a72f622d4df053f8c5edcc5c20ab74f503b0e8e6 100644 (file)
@@ -1797,20 +1797,18 @@ subst_stack_regs_pat (insn, regstack, pat)
                    || (REGNO (*src2) == regstack->reg[regstack->top]
                        && src2_note))
                  {
-
-                   /* We know that both sources "dies", as one dies and other
-                      is overwriten by the destination.  Claim both sources
-                      to be dead, as the code bellow will properly pop the
-                      non-top-of-stack note and replace top-of-stack by the
-                      result by popping source first and then pushing result. */
-                   if (!src1_note)
-                     src1_note = REG_NOTES (insn)
-                       = gen_rtx_EXPR_LIST (REG_DEAD, *src1, REG_NOTES (insn));
-                   if (!src2_note)
-                     src2_note = REG_NOTES (insn)
-                       = gen_rtx_EXPR_LIST (REG_DEAD, *src2, REG_NOTES (insn));
-
-                   /* i386 do have comparison always reversible.  */
+                   int idx1 = (get_hard_regnum (regstack, *src1)
+                               - FIRST_STACK_REG);
+                   int idx2 = (get_hard_regnum (regstack, *src2)
+                               - FIRST_STACK_REG);
+
+                   /* Make reg-stack believe that the operands are already
+                      swapped on the stack */
+                   regstack->reg[regstack->top - idx1] = REGNO (*src2);
+                   regstack->reg[regstack->top - idx2] = REGNO (*src1);
+
+                   /* Reverse condition to compensate the operand swap.
+                      i386 do have comparison always reversible.  */
                    PUT_CODE (XEXP (pat_src, 0),
                              reversed_comparison_code (XEXP (pat_src, 0), insn));
                  }
@@ -1845,11 +1843,9 @@ subst_stack_regs_pat (insn, regstack, pat)
                                       EMIT_AFTER);
                      }
                    else
-                     {
-                       CLEAR_HARD_REG_BIT (regstack->reg_set, regno);
-                       replace_reg (&XEXP (src_note[i], 0), FIRST_STACK_REG);
-                       regstack->top--;
-                     }
+                     /* Top of stack never dies, as it is the
+                        destination.  */
+                     abort ();
                  }
            }