1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
.text
.set linkageArea,24
.set params,4
.set alignment,4
.set spaceToSave,linkageArea+params+alignment
.set spaceToSave8,spaceToSave+8
; Mark from machine registers that are saved by C compiler
.globl _GC_push_regs
_GC_push_regs:
; PROLOG
mflr r0 ; get return address
stw r0,8(r1) ; save return address
stwu r1,-spaceToSave(r1) ; skip over caller save area
;
mr r3,r2 ; mark from r2. Well I'm not really sure
; that this is necessary or even the right
; thing to do - at least it doesn't harm...
; According to Apple's docs it points to
; the direct data area, whatever that is...
bl _GC_push_one
mr r3,r13 ; mark from r13-r31
bl _GC_push_one
mr r3,r14
bl _GC_push_one
mr r3,r15
bl _GC_push_one
mr r3,r16
bl _GC_push_one
mr r3,r17
bl _GC_push_one
mr r3,r18
bl _GC_push_one
mr r3,r19
bl _GC_push_one
mr r3,r20
bl _GC_push_one
mr r3,r21
bl _GC_push_one
mr r3,r22
bl _GC_push_one
mr r3,r23
bl _GC_push_one
mr r3,r24
bl _GC_push_one
mr r3,r25
bl _GC_push_one
mr r3,r26
bl _GC_push_one
mr r3,r27
bl _GC_push_one
mr r3,r28
bl _GC_push_one
mr r3,r29
bl _GC_push_one
mr r3,r30
bl _GC_push_one
mr r3,r31
bl _GC_push_one
; EPILOG
lwz r0,spaceToSave8(r1) ; get return address back
mtlr r0 ; reset link register
addic r1,r1,spaceToSave ; restore stack pointer
blr
|