Commit 37679e06 by Richard Henderson Committed by Richard Henderson

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
parent 0f834f0a
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> Tue Apr 20 17:57:14 1999 Catherine Moore <clm@cygnus.com>
* config/arm/arm.md (movhi): Add check for odd offset. * config/arm/arm.md (movhi): Add check for odd offset.
......
...@@ -3421,6 +3421,7 @@ alpha_expand_prologue () ...@@ -3421,6 +3421,7 @@ alpha_expand_prologue ()
HOST_WIDE_INT leftover = frame_size + 4096 - blocks * 8192; HOST_WIDE_INT leftover = frame_size + 4096 - blocks * 8192;
rtx ptr = gen_rtx_REG (DImode, 22); rtx ptr = gen_rtx_REG (DImode, 22);
rtx count = gen_rtx_REG (DImode, 23); rtx count = gen_rtx_REG (DImode, 23);
rtx seq;
emit_move_insn (count, GEN_INT (blocks)); emit_move_insn (count, GEN_INT (blocks));
emit_insn (gen_adddi3 (ptr, stack_pointer_rtx, GEN_INT (4096))); emit_insn (gen_adddi3 (ptr, stack_pointer_rtx, GEN_INT (4096)));
...@@ -3441,33 +3442,37 @@ alpha_expand_prologue () ...@@ -3441,33 +3442,37 @@ alpha_expand_prologue ()
/* For NT stack unwind (done by 'reverse execution'), it's /* For NT stack unwind (done by 'reverse execution'), it's
not OK to take the result of a loop, even though the value 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 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; HOST_WIDE_INT lo, hi;
lo = ((-frame_size & 0xffff) ^ 0x8000) - 0x8000; lo = ((-frame_size & 0xffff) ^ 0x8000) - 0x8000;
hi = -frame_size - lo; hi = -frame_size - lo;
FRP (emit_insn (gen_adddi3 (ptr, stack_pointer_rtx, GEN_INT (hi)))); emit_move_insn (ptr, GEN_INT (hi));
FRP (emit_insn (gen_adddi3 (stack_pointer_rtx, ptr, GEN_INT (lo)))); emit_insn (gen_nt_lda (ptr, GEN_INT (lo)));
seq = emit_insn (gen_subdi3 (stack_pointer_rtx, stack_pointer_rtx,
ptr));
} }
else else
{ {
rtx seq;
seq = emit_insn (gen_adddi3 (stack_pointer_rtx, ptr, seq = emit_insn (gen_adddi3 (stack_pointer_rtx, ptr,
GEN_INT (-leftover))); 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. */ /* Cope with very large offsets to the register save area. */
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
;; 3 mskxh ;; 3 mskxh
;; 4 cvtlq ;; 4 cvtlq
;; 5 cvtql ;; 5 cvtql
;; 6 nt_lda
;; ;;
;; UNSPEC_VOLATILE: ;; UNSPEC_VOLATILE:
;; ;;
...@@ -5161,6 +5162,16 @@ ...@@ -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" (define_expand "builtin_longjmp"
[(unspec_volatile [(match_operand 0 "register_operand" "r")] 3)] [(unspec_volatile [(match_operand 0 "register_operand" "r")] 3)]
"! TARGET_OPEN_VMS && ! TARGET_WINDOWS_NT" "! TARGET_OPEN_VMS && ! TARGET_WINDOWS_NT"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment