OSDN Git Service

* reg-stack.c (subst_stack_regs_pat): Fix fcmov reversal code.
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 8 Sep 2001 20:01:54 +0000 (20:01 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 8 Sep 2001 20:01:54 +0000 (20:01 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@45490 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/reg-stack.c

index 033324b..7442f6f 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 79aabfa..a72f622 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 ();
                  }
            }