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
 | 
						|
	
 | 
						|
 | 
						|
 | 
						|
 |