aboutsummaryrefslogtreecommitdiffstats
path: root/gc/powerpc_macosx_mach_dep.s
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--gc/powerpc_macosx_mach_dep.s95
1 files changed, 95 insertions, 0 deletions
diff --git a/gc/powerpc_macosx_mach_dep.s b/gc/powerpc_macosx_mach_dep.s
new file mode 100644
index 0000000..92f0628
--- /dev/null
+++ b/gc/powerpc_macosx_mach_dep.s
@@ -0,0 +1,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
+
+
+
+