diff options
author | Stan Cox <scox@equinox.cygnus.com> | 1998-03-20 08:28:06 +0000 |
---|---|---|
committer | Stan Cox <scox@gcc.gnu.org> | 1998-03-20 08:28:06 +0000 |
commit | 7aa74e4c2f4ca8b4a819099127b6263b4e0257c7 (patch) | |
tree | c4112c62a48f37e443683918129eaac35c46595d /gcc/reg-stack.c | |
parent | 3cd730af0b5066d735f75406180d2e89b45a1bab (diff) | |
download | gcc-7aa74e4c2f4ca8b4a819099127b6263b4e0257c7.zip gcc-7aa74e4c2f4ca8b4a819099127b6263b4e0257c7.tar.gz gcc-7aa74e4c2f4ca8b4a819099127b6263b4e0257c7.tar.bz2 |
(pop_stack): Define. Pops any register on stack and adjusts the stack.
From-SVN: r18723
Diffstat (limited to 'gcc/reg-stack.c')
-rw-r--r-- | gcc/reg-stack.c | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c index 79a16cd..af94021 100644 --- a/gcc/reg-stack.c +++ b/gcc/reg-stack.c @@ -315,6 +315,32 @@ straighten_stack (insn, regstack) change_stack (insn, regstack, &temp_stack, emit_insn_after); } + +/* Pop a register from the stack */ + +static void +pop_stack (regstack, regno) + stack regstack; + int regno; +{ + int top = regstack->top; + + CLEAR_HARD_REG_BIT (regstack->reg_set, regno); + regstack->top--; + /* If regno was not at the top of stack then adjust stack */ + if (regstack->reg [top] != regno) + { + int i; + for (i = regstack->top; i >= 0; i--) + if (regstack->reg [i] == regno) + { + int j; + for (j = i; j < top; j++) + regstack->reg [j] = regstack->reg [j + 1]; + break; + } + } +} /* Return non-zero if any stack register is mentioned somewhere within PAT. */ @@ -2067,9 +2093,8 @@ compare_for_stack_reg (insn, regstack, pat) if (src1_note) { - CLEAR_HARD_REG_BIT (regstack->reg_set, REGNO (XEXP (src1_note, 0))); + pop_stack (regstack, REGNO (XEXP (src1_note, 0))); replace_reg (&XEXP (src1_note, 0), FIRST_STACK_REG); - regstack->top--; } /* If the second operand dies, handle that. But if the operands are @@ -2088,9 +2113,8 @@ compare_for_stack_reg (insn, regstack, pat) if (get_hard_regnum (regstack, XEXP (src2_note, 0)) == FIRST_STACK_REG && src1_note) { - CLEAR_HARD_REG_BIT (regstack->reg_set, REGNO (XEXP (src2_note, 0))); + pop_stack (regstack, REGNO (XEXP (src2_note, 0))); replace_reg (&XEXP (src2_note, 0), FIRST_STACK_REG + 1); - regstack->top--; } else { |