diff options
| author | scox <scox@138bc75d-0d04-0410-961f-82ee72b054a4> | 1998-03-20 08:28:06 +0000 |
|---|---|---|
| committer | scox <scox@138bc75d-0d04-0410-961f-82ee72b054a4> | 1998-03-20 08:28:06 +0000 |
| commit | a97edd5be305dbab3440d6dd1fb086bf5a8f72ca (patch) | |
| tree | c4112c62a48f37e443683918129eaac35c46595d /gcc | |
| parent | 80a9e3eb9cb382ef8d24110073950521ec0f814d (diff) | |
| download | ppe42-gcc-a97edd5be305dbab3440d6dd1fb086bf5a8f72ca.tar.gz ppe42-gcc-a97edd5be305dbab3440d6dd1fb086bf5a8f72ca.zip | |
(pop_stack): Define. Pops any register on stack and adjusts the stack.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@18723 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
| -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 dd82ed6c0aa..d745315f29c 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 79a16cd4c69..af94021e9cb 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 { |

