s390.md ("builtin_setjmp_setup"): Insn deleted.
2003-09-26 Andreas Krebbel <krebbel1@de.ibm.com> * config/s390/s390.md ("builtin_setjmp_setup"): Insn deleted. ("builtin_longjmp"): Insn deleted. ("save_stack_nonlocal"): Save literal pool base pointer behind backchain and stack pointer. ("restore_stack_nonlocal"): Restore literal pool base pointer. * config/s390/s390.h (STACK_SAVEAREA_MODE): Double size of the stack save area for the nonlocal goto case. From-SVN: r71826
This commit is contained in:
parent
853ca657f0
commit
43ab026f2a
3 changed files with 29 additions and 44 deletions
|
@ -1,3 +1,13 @@
|
|||
2003-09-26 Andreas Krebbel <krebbel1@de.ibm.com>
|
||||
|
||||
* config/s390/s390.md ("builtin_setjmp_setup"): Insn deleted.
|
||||
("builtin_longjmp"): Insn deleted.
|
||||
("save_stack_nonlocal"): Save literal pool base pointer behind
|
||||
backchain and stack pointer.
|
||||
("restore_stack_nonlocal"): Restore literal pool base pointer.
|
||||
* config/s390/s390.h (STACK_SAVEAREA_MODE): Double size of
|
||||
the stack save area for the nonlocal goto case.
|
||||
|
||||
2003-09-26 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
|
||||
|
||||
PR bootstrap/12358
|
||||
|
|
|
@ -240,7 +240,7 @@ if (INTEGRAL_MODE_P (MODE) && \
|
|||
NONLOCAL needs twice Pmode to maintain both backchain and SP. */
|
||||
#define STACK_SAVEAREA_MODE(LEVEL) \
|
||||
(LEVEL == SAVE_FUNCTION ? VOIDmode \
|
||||
: LEVEL == SAVE_NONLOCAL ? (TARGET_64BIT ? TImode : DImode) : Pmode)
|
||||
: LEVEL == SAVE_NONLOCAL ? (TARGET_64BIT ? OImode : TImode) : Pmode)
|
||||
|
||||
/* Define target floating point format. */
|
||||
#define TARGET_FLOAT_FORMAT \
|
||||
|
|
|
@ -7057,20 +7057,9 @@
|
|||
|
||||
|
||||
;
|
||||
; setjmp/longjmp instruction pattern(s).
|
||||
; setjmp instruction pattern.
|
||||
;
|
||||
|
||||
(define_expand "builtin_setjmp_setup"
|
||||
[(match_operand 0 "register_operand" "")]
|
||||
""
|
||||
{
|
||||
rtx base = gen_rtx_MEM (Pmode, plus_constant (operands[0], 4 * GET_MODE_SIZE (Pmode)));
|
||||
rtx basereg = gen_rtx_REG (Pmode, BASE_REGISTER);
|
||||
|
||||
emit_move_insn (base, basereg);
|
||||
DONE;
|
||||
})
|
||||
|
||||
(define_expand "builtin_setjmp_receiver"
|
||||
[(match_operand 0 "" "")]
|
||||
"flag_pic"
|
||||
|
@ -7080,31 +7069,6 @@
|
|||
DONE;
|
||||
})
|
||||
|
||||
(define_expand "builtin_longjmp"
|
||||
[(match_operand 0 "register_operand" "")]
|
||||
""
|
||||
{
|
||||
/* The elements of the buffer are, in order: */
|
||||
rtx fp = gen_rtx_MEM (Pmode, operands[0]);
|
||||
rtx lab = gen_rtx_MEM (Pmode, plus_constant (operands[0], GET_MODE_SIZE (Pmode)));
|
||||
rtx stack = gen_rtx_MEM (Pmode, plus_constant (operands[0], 2 * GET_MODE_SIZE (Pmode)));
|
||||
rtx base = gen_rtx_MEM (Pmode, plus_constant (operands[0], 4 * GET_MODE_SIZE (Pmode)));
|
||||
rtx basereg = gen_rtx_REG (Pmode, BASE_REGISTER);
|
||||
rtx jmp = gen_reg_rtx (Pmode);
|
||||
|
||||
emit_move_insn (jmp, lab);
|
||||
emit_move_insn (basereg, base);
|
||||
emit_stack_restore (SAVE_NONLOCAL, stack, NULL_RTX);
|
||||
emit_move_insn (hard_frame_pointer_rtx, fp);
|
||||
|
||||
emit_insn (gen_rtx_USE (VOIDmode, hard_frame_pointer_rtx));
|
||||
emit_insn (gen_rtx_USE (VOIDmode, stack_pointer_rtx));
|
||||
emit_insn (gen_rtx_USE (VOIDmode, basereg));
|
||||
emit_indirect_jump (jmp);
|
||||
DONE;
|
||||
})
|
||||
|
||||
|
||||
;; These patterns say how to save and restore the stack pointer. We need not
|
||||
;; save the stack pointer at function level since we are careful to
|
||||
;; preserve the backchain. At block level, we have to restore the backchain
|
||||
|
@ -7144,13 +7108,17 @@
|
|||
{
|
||||
rtx temp = gen_reg_rtx (Pmode);
|
||||
|
||||
/* Copy the backchain to the first word, sp to the second. */
|
||||
/* Copy the backchain to the first word, sp to the second and the literal pool
|
||||
base to the third. */
|
||||
emit_move_insn (operand_subword (operands[0], 2, 0,
|
||||
TARGET_64BIT ? OImode : TImode),
|
||||
gen_rtx_REG (Pmode, BASE_REGISTER));
|
||||
emit_move_insn (temp, gen_rtx_MEM (Pmode, operands[1]));
|
||||
emit_move_insn (operand_subword (operands[0], 0, 0,
|
||||
TARGET_64BIT ? TImode : DImode),
|
||||
TARGET_64BIT ? OImode : TImode),
|
||||
temp);
|
||||
emit_move_insn (operand_subword (operands[0], 1, 0,
|
||||
TARGET_64BIT ? TImode : DImode),
|
||||
TARGET_64BIT ? OImode : TImode),
|
||||
operands[1]);
|
||||
DONE;
|
||||
})
|
||||
|
@ -7161,15 +7129,22 @@
|
|||
""
|
||||
{
|
||||
rtx temp = gen_reg_rtx (Pmode);
|
||||
rtx base = gen_rtx_REG (Pmode, BASE_REGISTER);
|
||||
|
||||
/* Restore the backchain from the first word, sp from the second. */
|
||||
/* Restore the backchain from the first word, sp from the second and the
|
||||
literal pool base from the third. */
|
||||
emit_move_insn (temp,
|
||||
operand_subword (operands[1], 0, 0,
|
||||
TARGET_64BIT ? TImode : DImode));
|
||||
TARGET_64BIT ? OImode : TImode));
|
||||
emit_move_insn (operands[0],
|
||||
operand_subword (operands[1], 1, 0,
|
||||
TARGET_64BIT ? TImode : DImode));
|
||||
TARGET_64BIT ? OImode : TImode));
|
||||
emit_move_insn (gen_rtx_MEM (Pmode, operands[0]), temp);
|
||||
emit_move_insn (base,
|
||||
operand_subword (operands[1], 2, 0,
|
||||
TARGET_64BIT ? OImode : TImode));
|
||||
emit_insn (gen_rtx_USE (VOIDmode, base));
|
||||
|
||||
DONE;
|
||||
})
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue