| 1 |
|
|---|
| 2 | .text
|
|---|
| 3 |
|
|---|
| 4 | .set linkageArea,24
|
|---|
| 5 | .set params,4
|
|---|
| 6 | .set alignment,4
|
|---|
| 7 |
|
|---|
| 8 | .set spaceToSave,linkageArea+params+alignment
|
|---|
| 9 | .set spaceToSave8,spaceToSave+8
|
|---|
| 10 |
|
|---|
| 11 | ; Mark from machine registers that are saved by C compiler
|
|---|
| 12 | .globl _GC_push_regs
|
|---|
| 13 | _GC_push_regs:
|
|---|
| 14 | ; PROLOG
|
|---|
| 15 | mflr r0 ; get return address
|
|---|
| 16 | stw r0,8(r1) ; save return address
|
|---|
| 17 | stwu r1,-spaceToSave(r1) ; skip over caller save area
|
|---|
| 18 | ;
|
|---|
| 19 | mr r3,r2 ; mark from r2. Well Im not really sure
|
|---|
| 20 | ; that this is necessary or even the right
|
|---|
| 21 | ; thing to do - at least it doesnt harm...
|
|---|
| 22 | ; According to Apples docs it points to
|
|---|
| 23 | ; the direct data area, whatever that is...
|
|---|
| 24 | bl L_GC_push_one$stub
|
|---|
| 25 | mr r3,r13 ; mark from r13-r31
|
|---|
| 26 | bl L_GC_push_one$stub
|
|---|
| 27 | mr r3,r14
|
|---|
| 28 | bl L_GC_push_one$stub
|
|---|
| 29 | mr r3,r15
|
|---|
| 30 | bl L_GC_push_one$stub
|
|---|
| 31 | mr r3,r16
|
|---|
| 32 | bl L_GC_push_one$stub
|
|---|
| 33 | mr r3,r17
|
|---|
| 34 | bl L_GC_push_one$stub
|
|---|
| 35 | mr r3,r18
|
|---|
| 36 | bl L_GC_push_one$stub
|
|---|
| 37 | mr r3,r19
|
|---|
| 38 | bl L_GC_push_one$stub
|
|---|
| 39 | mr r3,r20
|
|---|
| 40 | bl L_GC_push_one$stub
|
|---|
| 41 | mr r3,r21
|
|---|
| 42 | bl L_GC_push_one$stub
|
|---|
| 43 | mr r3,r22
|
|---|
| 44 | bl L_GC_push_one$stub
|
|---|
| 45 | mr r3,r23
|
|---|
| 46 | bl L_GC_push_one$stub
|
|---|
| 47 | mr r3,r24
|
|---|
| 48 | bl L_GC_push_one$stub
|
|---|
| 49 | mr r3,r25
|
|---|
| 50 | bl L_GC_push_one$stub
|
|---|
| 51 | mr r3,r26
|
|---|
| 52 | bl L_GC_push_one$stub
|
|---|
| 53 | mr r3,r27
|
|---|
| 54 | bl L_GC_push_one$stub
|
|---|
| 55 | mr r3,r28
|
|---|
| 56 | bl L_GC_push_one$stub
|
|---|
| 57 | mr r3,r29
|
|---|
| 58 | bl L_GC_push_one$stub
|
|---|
| 59 | mr r3,r30
|
|---|
| 60 | bl L_GC_push_one$stub
|
|---|
| 61 | mr r3,r31
|
|---|
| 62 | bl L_GC_push_one$stub
|
|---|
| 63 | ; EPILOG
|
|---|
| 64 | lwz r0,spaceToSave8(r1) ; get return address back
|
|---|
| 65 | mtlr r0 ; reset link register
|
|---|
| 66 | addic r1,r1,spaceToSave ; restore stack pointer
|
|---|
| 67 | blr
|
|---|
| 68 |
|
|---|
| 69 | .data
|
|---|
| 70 | .picsymbol_stub
|
|---|
| 71 | L_GC_push_one$stub:
|
|---|
| 72 | .indirect_symbol _GC_push_one
|
|---|
| 73 | mflr r0
|
|---|
| 74 | bcl 20,31,L0$_GC_push_one
|
|---|
| 75 | L0$_GC_push_one:
|
|---|
| 76 | mflr r11
|
|---|
| 77 | addis r11,r11,ha16(L_GC_push_one$lazy_ptr-L0$_GC_push_one)
|
|---|
| 78 | mtlr r0
|
|---|
| 79 | lwz r12,lo16(L_GC_push_one$lazy_ptr-L0$_GC_push_one)(r11)
|
|---|
| 80 | mtctr r12
|
|---|
| 81 | addi r11,r11,lo16(L_GC_push_one$lazy_ptr-L0$_GC_push_one)
|
|---|
| 82 | bctr
|
|---|
| 83 | .data
|
|---|
| 84 | .lazy_symbol_pointer
|
|---|
| 85 | L_GC_push_one$lazy_ptr:
|
|---|
| 86 | .indirect_symbol _GC_push_one
|
|---|
| 87 | .long dyld_stub_binding_helper
|
|---|
| 88 | .non_lazy_symbol_pointer
|
|---|
| 89 | L_GC_push_one$non_lazy_ptr:
|
|---|
| 90 | .indirect_symbol _GC_push_one
|
|---|
| 91 | .long 0
|
|---|
| 92 |
|
|---|
| 93 |
|
|---|
| 94 |
|
|---|
| 95 |
|
|---|