From 33e1caadbbceb70c8f5affe7805c52a3e0cd2d20 Mon Sep 17 00:00:00 2001 From: hubicka Date: Sat, 8 Sep 2001 20:01:54 +0000 Subject: [PATCH] * reg-stack.c (subst_stack_regs_pat): Fix fcmov reversal code. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@45490 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 4 ++++ gcc/reg-stack.c | 34 +++++++++++++++------------------- 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 + + * reg-stack.c (subst_stack_regs_pat): Fix fcmov reversal code. + 2001-09-08 Andreas Jaeger * 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 (); } } -- 2.7.4