diff options
author | Jan Hubicka <jh@suse.cz> | 2001-09-08 22:01:54 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2001-09-08 20:01:54 +0000 |
commit | b74cf1ce4535e85f2b214cbbe94f688e599f35bd (patch) | |
tree | d04cf706b0cd12d1eec53ac85ad4a5bf95646b35 /gcc/reg-stack.c | |
parent | 718fd87ea192c3e038c178aff18ee52cac40aabf (diff) | |
download | gcc-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/reg-stack.c')
-rw-r--r-- | gcc/reg-stack.c | 34 |
1 files changed, 15 insertions, 19 deletions
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 (); } } |