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