1! SPARCompiler 3.0 and later apparently no longer handles 2! asm outside functions. So we need a separate .s file 3! This is only set up for SunOS 5, not SunOS 4. 4! Assumes this is called before the stack contents are 5! examined. 6 7 .seg "text" 8 .globl GC_save_regs_in_stack 9 .globl GC_push_regs 10GC_save_regs_in_stack: 11#if defined(__arch64__) || defined(__sparcv9) 12 save %sp,-128,%sp 13 flushw 14 ret 15 restore %sp,2047+128,%o0 16#else /* 32 bit SPARC */ 17 ta 0x3 ! ST_FLUSH_WINDOWS 18 mov %sp,%o0 19 retl 20 nop 21#endif /* 32 bit SPARC */ 22.GC_save_regs_in_stack_end: 23 .size GC_save_regs_in_stack,.GC_save_regs_in_stack_end-GC_save_regs_in_stack 24 25 26! GC_clear_stack_inner(arg, limit) clears stack area up to limit and 27! returns arg. Stack clearing is crucial on SPARC, so we supply 28! an assembly version that s more careful. Assumes limit is hotter 29! than sp, and limit is 8 byte aligned. 30 .globl GC_clear_stack_inner 31GC_clear_stack_inner: 32#if defined(__arch64__) || defined(__sparcv9) 33 mov %sp,%o2 ! Save sp 34 add %sp,2047-8,%o3 ! p = sp+bias-8 35 add %o1,-2047-192,%sp ! Move sp out of the way, 36 ! so that traps still work. 37 ! Includes some extra words 38 ! so we can be sloppy below. 39loop: 40 stx %g0,[%o3] ! *(long *)p = 0 41 cmp %o3,%o1 42 bgu,pt %xcc, loop ! if (p > limit) goto loop 43 add %o3,-8,%o3 ! p -= 8 (delay slot) 44 retl 45 mov %o2,%sp ! Restore sp., delay slot 46#else /* 32 bit SPARC */ 47 mov %sp,%o2 ! Save sp 48 add %sp,-8,%o3 ! p = sp-8 49 clr %g1 ! [g0,g1] = 0 50 add %o1,-0x60,%sp ! Move sp out of the way, 51 ! so that traps still work. 52 ! Includes some extra words 53 ! so we can be sloppy below. 54loop: 55 std %g0,[%o3] ! *(long long *)p = 0 56 cmp %o3,%o1 57 bgu loop ! if (p > limit) goto loop 58 add %o3,-8,%o3 ! p -= 8 (delay slot) 59 retl 60 mov %o2,%sp ! Restore sp., delay slot 61#endif /* 32 bit SPARC */ 62.GC_clear_stack_inner_end: 63 .size GC_clear_stack_inner,.GC_clear_stack_inner_end-GC_clear_stack_inner 64 65 66 67 68 69 70 71