alpha.md (nt_lda): New pattern.

* alpha.md (nt_lda): New pattern.
        * alpha.c (alpha_expand_prologue): Use it for large frames
        under windows nt.

From-SVN: r26565
This commit is contained in:
Richard Henderson 1999-04-20 09:44:09 -07:00 committed by Richard Henderson
parent 0f834f0a3e
commit 37679e0603
3 changed files with 38 additions and 16 deletions

View File

@ -1,3 +1,9 @@
Tue Apr 20 16:38:11 1999 Richard Henderson <rth@cygnus.com>
* alpha.md (nt_lda): New pattern.
* alpha.c (alpha_expand_prologue): Use it for large frames
under windows nt.
Tue Apr 20 17:57:14 1999 Catherine Moore <clm@cygnus.com>
* config/arm/arm.md (movhi): Add check for odd offset.

View File

@ -3421,6 +3421,7 @@ alpha_expand_prologue ()
HOST_WIDE_INT leftover = frame_size + 4096 - blocks * 8192;
rtx ptr = gen_rtx_REG (DImode, 22);
rtx count = gen_rtx_REG (DImode, 23);
rtx seq;
emit_move_insn (count, GEN_INT (blocks));
emit_insn (gen_adddi3 (ptr, stack_pointer_rtx, GEN_INT (4096)));
@ -3441,33 +3442,37 @@ alpha_expand_prologue ()
/* For NT stack unwind (done by 'reverse execution'), it's
not OK to take the result of a loop, even though the value
is already in ptr, so we reload it via a single operation
and add it to sp. */
and subtract it to sp.
Yes, that's correct -- we have to reload the whole constant
into a temporary via ldah+lda then subtract from sp. To
ensure we get ldah+lda, we use a special pattern. */
HOST_WIDE_INT lo, hi;
lo = ((-frame_size & 0xffff) ^ 0x8000) - 0x8000;
hi = -frame_size - lo;
FRP (emit_insn (gen_adddi3 (ptr, stack_pointer_rtx, GEN_INT (hi))));
FRP (emit_insn (gen_adddi3 (stack_pointer_rtx, ptr, GEN_INT (lo))));
emit_move_insn (ptr, GEN_INT (hi));
emit_insn (gen_nt_lda (ptr, GEN_INT (lo)));
seq = emit_insn (gen_subdi3 (stack_pointer_rtx, stack_pointer_rtx,
ptr));
}
else
{
rtx seq;
seq = emit_insn (gen_adddi3 (stack_pointer_rtx, ptr,
GEN_INT (-leftover)));
/* This alternative is special, because the DWARF code cannot
possibly intuit through the loop above. So we invent this
note it looks at instead. */
RTX_FRAME_RELATED_P (seq) = 1;
REG_NOTES (seq)
= gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
gen_rtx_SET (VOIDmode, stack_pointer_rtx,
gen_rtx_PLUS (Pmode, stack_pointer_rtx,
GEN_INT (-frame_size))),
REG_NOTES (seq));
}
/* This alternative is special, because the DWARF code cannot
possibly intuit through the loop above. So we invent this
note it looks at instead. */
RTX_FRAME_RELATED_P (seq) = 1;
REG_NOTES (seq)
= gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
gen_rtx_SET (VOIDmode, stack_pointer_rtx,
gen_rtx_PLUS (Pmode, stack_pointer_rtx,
GEN_INT (-frame_size))),
REG_NOTES (seq));
}
/* Cope with very large offsets to the register save area. */

View File

@ -29,6 +29,7 @@
;; 3 mskxh
;; 4 cvtlq
;; 5 cvtql
;; 6 nt_lda
;;
;; UNSPEC_VOLATILE:
;;
@ -5161,6 +5162,16 @@
}
}")
;; In creating a large stack frame, NT _must_ use ldah+lda to load
;; the frame size into a register. We use this pattern to ensure
;; we get lda instead of addq.
(define_insn "nt_lda"
[(set (match_operand:DI 0 "register_operand" "r")
(unspec:DI [(match_dup 0)
(match_operand:DI 1 "const_int_operand" "n")] 6))]
""
"lda %0,%1(%0)")
(define_expand "builtin_longjmp"
[(unspec_volatile [(match_operand 0 "register_operand" "r")] 3)]
"! TARGET_OPEN_VMS && ! TARGET_WINDOWS_NT"