Mercurial > pub > dyncall > dyncall
comparison dyncallback/dyncall_callback_ppc32.S @ 239:c04be81f4874
- whitespace cleanup in ppc32 asm files
author | Tassilo Philipp |
---|---|
date | Tue, 02 May 2017 03:49:43 +0200 |
parents | 3e629dc19168 |
children | 891e8ba15862 |
comparison
equal
deleted
inserted
replaced
238:05181c5a6edd | 239:c04be81f4874 |
---|---|
23 */ | 23 */ |
24 | 24 |
25 | 25 |
26 #include "../portasm/portasm-ppc.S" | 26 #include "../portasm/portasm-ppc.S" |
27 | 27 |
28 .machine ppc | 28 .machine ppc |
29 .text | 29 .text |
30 .align 2 | 30 .align 2 |
31 | 31 |
32 /* Struct DCCallback */ | 32 /* Struct DCCallback */ |
33 | 33 |
34 DCB_THUNK = 0 | 34 DCB_THUNK = 0 |
35 DCB_HANDLER = 24 | 35 DCB_HANDLER = 24 |
36 DCB_CLEANUP = 28 | 36 DCB_CLEANUP = 28 |
37 DCB_USERDATA = 32 | 37 DCB_USERDATA = 32 |
38 | 38 |
39 /* Struct DCArgs */ | 39 /* Struct DCArgs */ |
40 | 40 |
41 ARGS_IREGS = 0 | 41 ARGS_IREGS = 0 |
42 ARGS_FREGS = ARGS_IREGS + 4*8 | 42 ARGS_FREGS = ARGS_IREGS + 4*8 |
72 ENTRY_C(dcCallbackThunkEntry) | 72 ENTRY_C(dcCallbackThunkEntry) |
73 | 73 |
74 /* -------------------------------------------------------------------------- | 74 /* -------------------------------------------------------------------------- |
75 | 75 |
76 Input: | 76 Input: |
77 r1 Stack Pointer | 77 r1 Stack Pointer |
78 r3-r10 Integer Arguments | 78 r3-r10 Integer Arguments |
79 f1-f8 Floating-point Arguments | 79 f1-f8 Floating-point Arguments |
80 r11 Thunk Pointer | 80 r11 Thunk Pointer |
81 | 81 |
82 */ | 82 */ |
83 | 83 |
84 /* prolog */ | 84 /* prolog */ |
85 | 85 |
86 mflr r0 | 86 mflr r0 |
87 stw r0, SP_LR(r1) /* store return address */ | 87 stw r0, SP_LR(r1) /* store return address */ |
88 addi r12, r1, SP_PAR /* temporary r12: parameter area on callers stack frame */ | 88 addi r12,r1, SP_PAR /* temporary r12: parameter area on callers stack frame */ |
89 stwu r1, -FRAMESIZE(r1) | 89 stwu r1, -FRAMESIZE(r1) |
90 | 90 |
91 stw r3, SP_IREGS + 0*4(r1) /* spill 8 integer parameter registers */ | 91 stw r3, SP_IREGS + 0*4(r1) /* spill 8 integer parameter registers */ |
92 stw r4, SP_IREGS + 1*4(r1) | 92 stw r4, SP_IREGS + 1*4(r1) |
93 stw r5, SP_IREGS + 2*4(r1) | 93 stw r5, SP_IREGS + 2*4(r1) |
94 stw r6, SP_IREGS + 3*4(r1) | 94 stw r6, SP_IREGS + 3*4(r1) |
95 stw r7, SP_IREGS + 4*4(r1) | 95 stw r7, SP_IREGS + 4*4(r1) |
96 stw r8, SP_IREGS + 5*4(r1) | 96 stw r8, SP_IREGS + 5*4(r1) |
97 stw r9, SP_IREGS + 6*4(r1) | 97 stw r9, SP_IREGS + 6*4(r1) |
98 stw r10,SP_IREGS + 7*4(r1) | 98 stw r10,SP_IREGS + 7*4(r1) |
99 | 99 |
100 stfd f1, SP_FREGS + 0*8(r1) /* spill 8 (of 13) float parameter registers */ | 100 stfd f1, SP_FREGS + 0*8(r1) /* spill 8 (of 13) float parameter registers */ |
101 stfd f2, SP_FREGS + 1*8(r1) | 101 stfd f2, SP_FREGS + 1*8(r1) |
102 stfd f3, SP_FREGS + 2*8(r1) | 102 stfd f3, SP_FREGS + 2*8(r1) |
103 stfd f4, SP_FREGS + 3*8(r1) | 103 stfd f4, SP_FREGS + 3*8(r1) |
104 stfd f5, SP_FREGS + 4*8(r1) | 104 stfd f5, SP_FREGS + 4*8(r1) |
105 stfd f6, SP_FREGS + 5*8(r1) | 105 stfd f6, SP_FREGS + 5*8(r1) |
106 stfd f7, SP_FREGS + 6*8(r1) | 106 stfd f7, SP_FREGS + 6*8(r1) |
107 stfd f8, SP_FREGS + 7*8(r1) | 107 stfd f8, SP_FREGS + 7*8(r1) |
108 | 108 |
109 stw r12, SP_SP(r1) /* init stack pointer */ | 109 stw r12,SP_SP(r1) /* init stack pointer */ |
110 xor r0, r0, r0 /* init register counters */ | 110 xor r0, r0, r0 /* init register counters */ |
111 stw r0, SP_ICNT(r1) | 111 stw r0, SP_ICNT(r1) |
112 stw r0, SP_FCNT(r1) | 112 stw r0, SP_FCNT(r1) |
113 stw r0, SP_RESULT(r1) /* init result object */ | 113 stw r0, SP_RESULT(r1) /* init result object */ |
114 stw r0, SP_RESULT + 4(r1) | 114 stw r0, SP_RESULT + 4(r1) |
115 /* invoke callback handler */ | 115 /* invoke callback handler */ |
116 mr r3, r11 /* arg 1: DCCallback* pcb (r11 is thunk pointer) */ | 116 mr r3, r11 /* arg 1: DCCallback* pcb (r11 = thunk ptr) */ |
117 addi r4, r1, SP_ARGS /* arg 2: DCArgs* args */ | 117 addi r4, r1, SP_ARGS /* arg 2: DCArgs* args */ |
118 addi r5, r1, SP_RESULT /* arg 3: DCValue* result */ | 118 addi r5, r1, SP_RESULT /* arg 3: DCValue* result */ |
119 lwz r6, DCB_USERDATA(r11) /* arg 4: void* userdata */ | 119 lwz r6, DCB_USERDATA(r11) /* arg 4: void* userdata */ |
120 | 120 |
121 /* branch-and-link to DCCallback.handler */ | 121 /* branch-and-link to DCCallback.handler */ |
122 lwz r12, DCB_HANDLER(r11) | 122 lwz r12, DCB_HANDLER(r11) |
123 mtctr r12 | 123 mtctr r12 |
124 bctrl | 124 bctrl |
125 /* check result type */ | 125 /* check result type */ |
126 cmpi cr0, r3, 'f | 126 cmpi cr0, r3, 'f |
127 beq .f32 | 127 beq .f32 |
128 cmpi cr0, r3, 'd | 128 cmpi cr0, r3, 'd |
129 beq .f64 | 129 beq .f64 |
130 .i64: | 130 .i64: |
131 lwz r3, SP_RESULT (r1) | 131 lwz r3, SP_RESULT (r1) |
132 lwz r4, SP_RESULT + 4 (r1) | 132 lwz r4, SP_RESULT + 4 (r1) |
133 .end: | 133 .end: |
134 lwz r1, SP_PREV(r1) /* restore stack pointer */ | 134 lwz r1, SP_PREV(r1) /* restore stack pointer */ |
135 lwz r0, SP_LR(r1) /* load link register with return address */ | 135 lwz r0, SP_LR(r1) /* load link register with return address */ |
136 mtlr r0 | 136 mtlr r0 |
137 blr /* branch back to link register */ | 137 blr /* branch back to link register */ |
138 .f32: | 138 .f32: |
139 lfs f1, SP_RESULT(r1) | 139 lfs f1, SP_RESULT(r1) |
140 b .end | 140 b .end |
141 .f64: | 141 .f64: |
142 lfd f1, SP_RESULT(r1) | 142 lfd f1, SP_RESULT(r1) |
143 b .end | 143 b .end |
144 | 144 |