e8ad6556f9dc9f7fb9c4543d9fdca190f2010b7b
[cacao.git] / src / mm / boehm-gc / sparc_mach_dep.S
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
10 GC_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
31 GC_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.
39 loop:
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.
54 loop:
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