diff options
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/ia64/ia64.md | 18 | ||||
-rw-r--r-- | gcc/config/ia64/lib1funcs.asm | 45 | ||||
-rw-r--r-- | gcc/config/ia64/t-ia64 | 2 |
4 files changed, 66 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8c0b1afc2d6..47287d795cc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +Wed Mar 15 11:34:27 2000 Jim Wilson <wilson@cygnus.com> + + * config/ia64/ia64.md (restore_stack_nonlocal): New. + * config/ia64/lib1funcs.asm (__ia64_nonlocal_goto): Delete padding nop. + (__ia64_restore_stack_nonlocal): New. + * config/ia64/t-ia64 (LIB1ASMFUNCS): Add __restore_stack_nonlocal. + 2000-03-15 Alexandre Oliva <oliva@lsd.ic.unicamp.br> * cpphash.c (collect_formal_parameters): Do not complain about diff --git a/gcc/config/ia64/ia64.md b/gcc/config/ia64/ia64.md index fcbe4715750..877948911df 100644 --- a/gcc/config/ia64/ia64.md +++ b/gcc/config/ia64/ia64.md @@ -3173,6 +3173,24 @@ "" "fc %0\;;;\;adds %0=31,%0\;;;\;fc %0\;;;\;sync.i\;srlz.i" [(set_attr "type" "unknown")]) + +;; Builtin apply support. + +(define_expand "restore_stack_nonlocal" + [(use (match_operand:DI 0 "register_operand" "")) + (use (match_operand:OI 1 "memory_operand" ""))] + "" + " +{ + emit_library_call (gen_rtx_SYMBOL_REF (Pmode, + \"__ia64_restore_stack_nonlocal\"), + 0, VOIDmode, 1, + copy_to_reg (XEXP (operands[1], 0)), Pmode); + DONE; +}") + + +;;; Intrinsics support. (define_insn "ccv_restore_si" [(unspec [(const_int 0)] 11) diff --git a/gcc/config/ia64/lib1funcs.asm b/gcc/config/ia64/lib1funcs.asm index d8af8dbd83c..c69eda286c8 100644 --- a/gcc/config/ia64/lib1funcs.asm +++ b/gcc/config/ia64/lib1funcs.asm @@ -602,11 +602,6 @@ __ia64_nonlocal_goto: adds r2=8,in2 ld8 r12=[in2],16 mov.ret.sptk.few.dc.dc rp = r33, .L0 -// ??? flushrs must be first instruction of a group. Gas is unfortunately -// putting the stop bit before the padding nop instead of after it, making -// flushrs the first instruction of its bundle, but the second instruction -// of its group. We explicitly add the nop to avoid this problem. - nop.i 0 ;; flushrs ld8 r16=[r2],16 @@ -633,3 +628,43 @@ __ia64_nonlocal_goto: ;; .endp __ia64_nonlocal_goto #endif + +#ifdef L__restore_stack_nonlocal +// This is mostly the same as nonlocal_goto above. +// ??? This has not been tested yet. + +// void __ia64_restore_stack_nonlocal(void *save_area) + + .text + .align 16 + .global __ia64_restore_stack_nonlocal + .proc __ia64_restore_stack_nonlocal +__ia64_restore_stack_nonlocal: + alloc r20=ar.pfs,4,0,0,0 + mov r19=ar.rsc + adds r2=8,in0 + ld8 r12=[in0],16 + ;; + flushrs + ld8 r16=[r2],16 + and r19=0x1c,r19 + ld8 r17=[in0] + ;; + ld8 r18=[r2] + mov ar.rsc=r19 + ;; + mov ar.bspstore=r16 + ;; + mov ar.rnat=r17 + mov ar.pfs=r18 + or r19=0x3,r19 + ;; + loadrs + invala +.L0: { + mov ar.rsc=r19 + br.ret.sptk.few rp + } + ;; + .endp __ia64_restore_stack_nonlocal +#endif diff --git a/gcc/config/ia64/t-ia64 b/gcc/config/ia64/t-ia64 index bf14c0a94a4..cb23c5237a7 100644 --- a/gcc/config/ia64/t-ia64 +++ b/gcc/config/ia64/t-ia64 @@ -11,7 +11,7 @@ LIB1ASMSRC = ia64/lib1funcs.asm LIB1ASMFUNCS = __divdf3 __divsf3 \ __divdi3 __moddi3 __udivdi3 __umoddi3 \ __divsi3 __modsi3 __udivsi3 __umodsi3 __save_stack_nonlocal \ - __nonlocal_goto + __nonlocal_goto __restore_stack_nonlocal # ??? Hack to get -P option used when compiling lib1funcs.asm, because Intel # assembler does not accept # line number as a comment. |