aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2001-09-08 22:01:54 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2001-09-08 20:01:54 +0000
commitb74cf1ce4535e85f2b214cbbe94f688e599f35bd (patch)
treed04cf706b0cd12d1eec53ac85ad4a5bf95646b35 /gcc
parent718fd87ea192c3e038c178aff18ee52cac40aabf (diff)
downloadgcc-b74cf1ce4535e85f2b214cbbe94f688e599f35bd.zip
gcc-b74cf1ce4535e85f2b214cbbe94f688e599f35bd.tar.gz
gcc-b74cf1ce4535e85f2b214cbbe94f688e599f35bd.tar.bz2
* reg-stack.c (subst_stack_regs_pat): Fix fcmov reversal code.
From-SVN: r45490
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/reg-stack.c34
2 files changed, 19 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 033324b..7442f6f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c
index 79aabfa..a72f622 100644
--- a/gcc/reg-stack.c
+++ b/gcc/reg-stack.c
@@ -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 ();
}
}