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 | |
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
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/reg-stack.c | 32 |
2 files changed, 34 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dd82ed6..d745315 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +Fri Mar 20 11:19:40 1998 Stan Cox <scox@equinox.cygnus.com> + + * reg-stack.c (pop_stack): Define. Pops any register on the + regstack and adjusts regstack. + (compare_for_stack_reg): Use pop_stack. + Thu Mar 19 23:51:01 1998 Jeffrey A Law (law@cygnus.com) * configure.in (hppa1.0-hp-hpux10): Handle threads for this 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 { |