mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-19 00:01:21 +08:00
Fix for x86 FP problem.
* reg-stack.c: Revert last patch (Apr 20). (convert_regs): Set insn to PREV_INSN (next) after do while loop. From-SVN: r19437
This commit is contained in:
parent
1688d6d2c7
commit
561cf7b130
@ -1,5 +1,8 @@
|
||||
Mon Apr 27 18:36:28 1998 Jim Wilson <wilson@cygnus.com>
|
||||
|
||||
* reg-stack.c: Revert last patch (Apr 20).
|
||||
(convert_regs): Set insn to PREV_INSN (next) after do while loop.
|
||||
|
||||
* m68k/lb1sf68.asm (Laddsf$3): Fix typos in mcf5200 exg code.
|
||||
|
||||
* loop.c (check_dbra_loop): New locals jump, first_compare, and
|
||||
|
@ -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 rtx subst_asm_stack_regs PROTO((rtx, stack, rtx *, rtx **,
|
||||
static void subst_asm_stack_regs PROTO((rtx, stack, rtx *, rtx **,
|
||||
char **, int, int));
|
||||
static rtx subst_stack_regs PROTO((rtx, stack));
|
||||
static void 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,11 +2411,9 @@ 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. */
|
||||
|
||||
It returns the last new insn generated by this function. */
|
||||
|
||||
static rtx
|
||||
static void
|
||||
subst_asm_stack_regs (insn, regstack, operands, operands_loc, constraints,
|
||||
n_inputs, n_outputs)
|
||||
rtx insn;
|
||||
@ -2694,18 +2692,14 @@ 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. */
|
||||
|
||||
It returns the last new insn generated by this function. */
|
||||
|
||||
static rtx
|
||||
static void
|
||||
subst_stack_regs (insn, regstack)
|
||||
rtx insn;
|
||||
stack regstack;
|
||||
@ -2761,9 +2755,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);
|
||||
return subst_asm_stack_regs (insn, regstack, operands,
|
||||
operands_loc, constraints,
|
||||
n_inputs, n_outputs);
|
||||
subst_asm_stack_regs (insn, regstack, operands, operands_loc,
|
||||
constraints, n_inputs, n_outputs);
|
||||
return;
|
||||
}
|
||||
|
||||
if (GET_CODE (PATTERN (insn)) == PARALLEL)
|
||||
@ -2781,7 +2775,7 @@ subst_stack_regs (insn, regstack)
|
||||
REG_UNUSED will already have been dealt with, so just return. */
|
||||
|
||||
if (GET_CODE (insn) == NOTE)
|
||||
return insn;
|
||||
return;
|
||||
|
||||
/* 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,
|
||||
@ -2797,8 +2791,6 @@ 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
|
||||
@ -3039,7 +3031,7 @@ static void
|
||||
convert_regs ()
|
||||
{
|
||||
register int block, reg;
|
||||
register rtx insn, next, new;
|
||||
register rtx insn, next;
|
||||
struct stack_def regstack;
|
||||
|
||||
for (block = 0; block < blocks; block++)
|
||||
@ -3065,7 +3057,6 @@ convert_regs ()
|
||||
do
|
||||
{
|
||||
insn = next;
|
||||
new = insn;
|
||||
next = NEXT_INSN (insn);
|
||||
|
||||
/* Don't bother processing unless there is a stack reg
|
||||
@ -3073,10 +3064,21 @@ convert_regs ()
|
||||
floating point values). */
|
||||
|
||||
if (GET_MODE (insn) == QImode || GET_CODE (insn) == CALL_INSN)
|
||||
/* We may have generated some new instructions here. */
|
||||
new = subst_stack_regs (insn, ®stack);
|
||||
subst_stack_regs (insn, ®stack);
|
||||
|
||||
} while (insn != block_end[block]);
|
||||
|
||||
/* For all further actions, INSN needs to be the last insn in
|
||||
this basic block. If subst_stack_regs inserted additional
|
||||
instructions after INSN, it is no longer the last one at
|
||||
this point. */
|
||||
next = PREV_INSN (next);
|
||||
|
||||
/* If subst_stack_regs inserted something after a JUMP_INSN, that
|
||||
is almost certainly a bug. */
|
||||
if (GET_CODE (insn) == JUMP_INSN && insn != next)
|
||||
abort ();
|
||||
insn = next;
|
||||
|
||||
/* Something failed if the stack life doesn't match. */
|
||||
|
||||
@ -3097,7 +3099,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 (new, ®stack, &block_stack_in[block+1],
|
||||
change_stack (insn, ®stack, &block_stack_in[block+1],
|
||||
emit_insn_after);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user