From: Jan Hubicka Date: Sat, 8 Sep 2001 20:01:54 +0000 (+0200) Subject: * reg-stack.c (subst_stack_regs_pat): Fix fcmov reversal code. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b74cf1ce4535e85f2b214cbbe94f688e599f35bd;p=gcc.git * reg-stack.c (subst_stack_regs_pat): Fix fcmov reversal code. From-SVN: r45490 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 033324b050f..7442f6f5855 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 79aabfa95b7..a72f622d4df 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 (); } }