diff options
author | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 1998-04-20 00:01:15 +0000 |
---|---|---|
committer | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 1998-04-20 00:01:15 +0000 |
commit | 6f3ee61dff786c0c96c98b7c6b06d758bcfc0a3f (patch) | |
tree | bfc9519a6966822770663a8f9ffb24fa192df9c2 /gcc/reg-stack.c | |
parent | 240a97c814882bc9588a97914f5f24b66dadbdee (diff) | |
download | gcc-6f3ee61dff786c0c96c98b7c6b06d758bcfc0a3f.tar.gz |
* reg-stack.c (subst_asm_stack_regs): Change to return the last
new insn generated by this function.
(subst_stack_regs): Likewise.
(convert_regs): Record the last newly generated insn and use
it for change_stack () instead of INSN.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@19328 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/reg-stack.c')
-rw-r--r-- | gcc/reg-stack.c | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c index 45a533edb8b..d4ef06bd4a1 100644 --- a/gcc/reg-stack.c +++ b/gcc/reg-stack.c @@ -262,9 +262,9 @@ static void move_for_stack_reg PROTO((rtx, stack, rtx)); static void swap_rtx_condition PROTO((rtx)); static void compare_for_stack_reg PROTO((rtx, stack, rtx)); static void subst_stack_regs_pat PROTO((rtx, stack, rtx)); -static void subst_asm_stack_regs PROTO((rtx, stack, rtx *, rtx **, +static rtx subst_asm_stack_regs PROTO((rtx, stack, rtx *, rtx **, char **, int, int)); -static void subst_stack_regs PROTO((rtx, stack)); +static rtx subst_stack_regs PROTO((rtx, stack)); static void change_stack PROTO((rtx, stack, stack, rtx (*) ())); static void goto_block_pat PROTO((rtx, stack, rtx)); @@ -2411,9 +2411,11 @@ subst_stack_regs_pat (insn, regstack, pat) stack-like regs in asm statements. These rules are enforced by record_asm_stack_regs; see comments there for details. Any asm_operands left in the RTL at this point may be assume to meet the - requirements, since record_asm_stack_regs removes any problem asm. */ + requirements, since record_asm_stack_regs removes any problem asm. -static void + It returns the last new insn generated by this function. */ + +static rtx subst_asm_stack_regs (insn, regstack, operands, operands_loc, constraints, n_inputs, n_outputs) rtx insn; @@ -2692,14 +2694,18 @@ subst_asm_stack_regs (insn, regstack, operands, operands_loc, constraints, break; } } + + return insn; } /* Substitute stack hard reg numbers for stack virtual registers in INSN. Non-stack register numbers are not changed. REGSTACK is the current stack content. Insns may be emitted as needed to arrange the - stack for the 387 based on the contents of the insn. */ + stack for the 387 based on the contents of the insn. -static void + It returns the last new insn generated by this function. */ + +static rtx subst_stack_regs (insn, regstack) rtx insn; stack regstack; @@ -2755,9 +2761,9 @@ subst_stack_regs (insn, regstack) decode_asm_operands (body, operands, operands_loc, constraints, NULL_PTR); get_asm_operand_lengths (body, n_operands, &n_inputs, &n_outputs); - subst_asm_stack_regs (insn, regstack, operands, operands_loc, - constraints, n_inputs, n_outputs); - return; + return subst_asm_stack_regs (insn, regstack, operands, + operands_loc, constraints, + n_inputs, n_outputs); } if (GET_CODE (PATTERN (insn)) == PARALLEL) @@ -2775,7 +2781,7 @@ subst_stack_regs (insn, regstack) REG_UNUSED will already have been dealt with, so just return. */ if (GET_CODE (insn) == NOTE) - return; + return insn; /* If there is a REG_UNUSED note on a stack register on this insn, the indicated reg must be popped. The REG_UNUSED note is removed, @@ -2791,6 +2797,8 @@ subst_stack_regs (insn, regstack) } else note_link = &XEXP (note, 1); + + return insn; } /* Change the organization of the stack so that it fits a new basic @@ -3031,7 +3039,7 @@ static void convert_regs () { register int block, reg; - register rtx insn, next; + register rtx insn, next, new; struct stack_def regstack; for (block = 0; block < blocks; block++) @@ -3057,6 +3065,7 @@ convert_regs () do { insn = next; + new = insn; next = NEXT_INSN (insn); /* Don't bother processing unless there is a stack reg @@ -3064,7 +3073,8 @@ convert_regs () floating point values). */ if (GET_MODE (insn) == QImode || GET_CODE (insn) == CALL_INSN) - subst_stack_regs (insn, ®stack); + /* We may have generated some new instructions here. */ + new = subst_stack_regs (insn, ®stack); } while (insn != block_end[block]); @@ -3087,7 +3097,7 @@ convert_regs () /* Likewise handle the case where we fall into the next block. */ if ((block < blocks - 1) && block_drops_in[block+1]) - change_stack (insn, ®stack, &block_stack_in[block+1], + change_stack (new, ®stack, &block_stack_in[block+1], emit_insn_after); } |