aboutsummaryrefslogtreecommitdiffstats
path: root/gc/powerpc_macosx_mach_dep.s
blob: 92f06286e73edab1a276862110d5b90766754033 (plain) (blame)
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
	
.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 Im not really sure
                          ; that this is necessary or even the right
                          ; thing to do - at least it doesnt harm...
                          ; According to Apples docs it points to
                          ; the direct data area, whatever that is...
    bl 	    L_GC_push_one$stub
    mr      r3,r13        ; mark from r13-r31
    bl 	    L_GC_push_one$stub
    mr      r3,r14
    bl 	    L_GC_push_one$stub
    mr      r3,r15
    bl 	    L_GC_push_one$stub
    mr      r3,r16
    bl 	    L_GC_push_one$stub
    mr      r3,r17
    bl 	    L_GC_push_one$stub
    mr      r3,r18
    bl 	    L_GC_push_one$stub
    mr      r3,r19
    bl 	    L_GC_push_one$stub
    mr      r3,r20
    bl 	    L_GC_push_one$stub
    mr      r3,r21
    bl 	    L_GC_push_one$stub
    mr      r3,r22
    bl 	    L_GC_push_one$stub
    mr      r3,r23
    bl 	    L_GC_push_one$stub
    mr      r3,r24
    bl 	    L_GC_push_one$stub
    mr      r3,r25
    bl 	    L_GC_push_one$stub
    mr      r3,r26
    bl 	    L_GC_push_one$stub
    mr      r3,r27
    bl 	    L_GC_push_one$stub
    mr      r3,r28
    bl 	    L_GC_push_one$stub
    mr      r3,r29
    bl 	    L_GC_push_one$stub
    mr      r3,r30
    bl 	    L_GC_push_one$stub
    mr      r3,r31
    bl 	    L_GC_push_one$stub
    ; EPILOG
    lwz     r0,spaceToSave8(r1)   ; get return address back
    mtlr    r0    ; reset link register
    addic   r1,r1,spaceToSave   ; restore stack pointer
    blr

.data
.picsymbol_stub
L_GC_push_one$stub:
	.indirect_symbol _GC_push_one
	mflr r0
	bcl 20,31,L0$_GC_push_one
L0$_GC_push_one:
	mflr r11
	addis r11,r11,ha16(L_GC_push_one$lazy_ptr-L0$_GC_push_one)
	mtlr r0
	lwz r12,lo16(L_GC_push_one$lazy_ptr-L0$_GC_push_one)(r11)
	mtctr r12
	addi r11,r11,lo16(L_GC_push_one$lazy_ptr-L0$_GC_push_one)
	bctr
.data
.lazy_symbol_pointer
L_GC_push_one$lazy_ptr:
	.indirect_symbol _GC_push_one
	.long dyld_stub_binding_helper
.non_lazy_symbol_pointer
L_GC_push_one$non_lazy_ptr:
	.indirect_symbol _GC_push_one
	.long 0