96 lines
2.5 KiB
ArmAsm
96 lines
2.5 KiB
ArmAsm
|
|
.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
|
|
|
|
|
|
|
|
|