diff gc/powerpc_macosx_mach_dep.s @ 51488:5de98dce4bd1

*** empty log message ***
author Dave Love <fx@gnu.org>
date Thu, 05 Jun 2003 17:49:22 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gc/powerpc_macosx_mach_dep.s	Thu Jun 05 17:49:22 2003 +0000
@@ -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
+	
+
+
+