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