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:
Andreas Krebbel 2003-09-26 16:41:58 +00:00 committed by Ulrich Weigand
parent 853ca657f0
commit 43ab026f2a
3 changed files with 29 additions and 44 deletions

View File

@ -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

View File

@ -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 \

View File

@ -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;
})