Mercurial > pub > dyncall > dyncall
comparison dyncallback/dyncall_callback_ppc32_apple.s @ 235:df556fd8ea37
Darwin/PPC:
- fix callback return values (unsure when it broke)
- simplified callback code removing unnecessary instructions and macros
author | Tassilo Philipp |
---|---|
date | Tue, 02 May 2017 02:47:34 +0200 |
parents | 3e629dc19168 |
children | c04be81f4874 |
comparison
equal
deleted
inserted
replaced
234:808045066f12 | 235:df556fd8ea37 |
---|---|
79 DCA_FARRAY = SIZEOF_INT*INT_REGS | 79 DCA_FARRAY = SIZEOF_INT*INT_REGS |
80 DCA_SP = DCA_FARRAY + SIZEOF_DOUBLE*FLOAT_REGS | 80 DCA_SP = DCA_FARRAY + SIZEOF_DOUBLE*FLOAT_REGS |
81 DCA_ICOUNT = DCA_SP + 4 | 81 DCA_ICOUNT = DCA_SP + 4 |
82 DCA_FCOUNT = DCA_ICOUNT + 4 | 82 DCA_FCOUNT = DCA_ICOUNT + 4 |
83 | 83 |
84 /* struct DCValue */ | |
85 DCV_INT = 0 | |
86 DCV_FLOAT = 0 | |
87 DCV_DOUBLE = 0 | |
88 DCV_LONG_HI32 = 0 | |
89 DCV_LONG_LO32 = 4 | |
90 DCV_SIZE = 8 | |
91 | |
92 iregfile = ARGS_OFFSET+DCA_IARRAY | 84 iregfile = ARGS_OFFSET+DCA_IARRAY |
93 fregfile = ARGS_OFFSET+DCA_FARRAY | 85 fregfile = ARGS_OFFSET+DCA_FARRAY |
94 save_sp = ARGS_OFFSET+DCA_SP | 86 save_sp = ARGS_OFFSET+DCA_SP |
95 icount = ARGS_OFFSET+DCA_ICOUNT | 87 icount = ARGS_OFFSET+DCA_ICOUNT |
96 fcount = ARGS_OFFSET+DCA_FCOUNT | 88 fcount = ARGS_OFFSET+DCA_FCOUNT |
97 .globl _dcCallbackThunkEntry | 89 .globl _dcCallbackThunkEntry |
98 | 90 |
99 /* | 91 /* |
100 Thunk entry: | 92 Thunk entry: |
101 R2 = DCCallback* | 93 r2 = DCCallback* |
102 */ | 94 */ |
103 _dcCallbackThunkEntry: | 95 _dcCallbackThunkEntry: |
104 | 96 |
105 mflr r0 | 97 mflr r0 |
106 stw r0, 8(r1) /* store return address */ | 98 stw r0, 8(r1) /* store return address */ |
107 /* stmw r30, -8(r1) */ /* store preserved registers (r30/r31) */ | 99 addi r12, r1, PAR_OFFSET /* temporary r12 = parameter area on callers stack frame */ |
108 addi r12, r1, PAR_OFFSET /* temporary r12 = parameter area on callers stack frame */ | 100 stwu r1, -FRAME_SIZE(r1) /* save callers stack pointer and make new stack frame. */ |
109 stwu r1, -FRAME_SIZE(r1) /* save callers stack pointer and make new stack frame. */ | 101 stw r3, iregfile+0*4(r1) /* spill 8 integer parameter registers */ |
110 stw r3, iregfile+0*4(r1) /* spill 8 integer parameter registers */ | 102 stw r4, iregfile+1*4(r1) |
111 stw r4, iregfile+1*4(r1) | 103 stw r5, iregfile+2*4(r1) |
112 stw r5, iregfile+2*4(r1) | |
113 stw r6, iregfile+3*4(r1) | 104 stw r6, iregfile+3*4(r1) |
114 stw r7, iregfile+4*4(r1) | 105 stw r7, iregfile+4*4(r1) |
115 stw r8, iregfile+5*4(r1) | 106 stw r8, iregfile+5*4(r1) |
116 stw r9, iregfile+6*4(r1) | 107 stw r9, iregfile+6*4(r1) |
117 stw r10,iregfile+7*4(r1) | 108 stw r10,iregfile+7*4(r1) |
141 | 132 |
142 /* branch-and-link to DCCallback.handler */ | 133 /* branch-and-link to DCCallback.handler */ |
143 lwz r12, DCB_HANDLER(r2) | 134 lwz r12, DCB_HANDLER(r2) |
144 mtctr r12 | 135 mtctr r12 |
145 bctrl | 136 bctrl |
146 addi r0, r1, RESULT_OFFSET /* r0 = DCValue* */ | |
147 /* switch on base result type */ | 137 /* switch on base result type */ |
148 cmpi cr0, r3, 'B | |
149 beq .i32 | |
150 cmpi cr0, r3, 'i | |
151 beq .i32 | |
152 cmpi cr0, r3, 'l | |
153 beq .i64 | |
154 cmpi cr0, r3, 'f | 138 cmpi cr0, r3, 'f |
155 beq .f32 | 139 beq .f32 |
156 cmpi cr0, r3, 'd | 140 cmpi cr0, r3, 'd |
157 beq .f64 | 141 beq .f64 |
158 cmpi cr0, r3, 'p | |
159 beq .i32 | |
160 .void: /* ignore result (void call) */ | |
161 b .end | |
162 .i32: /* result is integer <= 32-bit result */ | |
163 lwz r3, RESULT_OFFSET + DCV_INT(r1) | |
164 b .end | |
165 .f32: /* result is C float result */ | |
166 lfs f1, RESULT_OFFSET + DCV_FLOAT(r1) | |
167 b .end | |
168 .f64: | |
169 lfd f1, RESULT_OFFSET + DCV_FLOAT(r1) | |
170 b .end | |
171 .i64: /* result is C double result */ | 142 .i64: /* result is C double result */ |
172 lwz r3, RESULT_OFFSET + DCV_LONG_HI32(r1) | 143 lwz r3, RESULT_OFFSET (r1) |
173 lwz r4, RESULT_OFFSET + DCV_LONG_LO32(r1) | 144 lwz r4, RESULT_OFFSET + 4 (r1) |
174 b .end | |
175 .end: | 145 .end: |
176 lwz r1, 0(r1) /* restore stack pointer */ | 146 lwz r1, 0(r1) /* restore stack pointer */ |
177 /* lmw r30, -8(r1) */ /* restore preserved registers */ | |
178 lwz r0, 8(r1) /* load link register with return address */ | 147 lwz r0, 8(r1) /* load link register with return address */ |
179 mtlr r0 | 148 mtlr r0 |
180 blr /* branch back to link register */ | 149 blr /* branch back to link register */ |
150 .f32: /* result is C float result */ | |
151 lfs f1, RESULT_OFFSET(r1) | |
152 b .end | |
153 .f64: | |
154 lfd f1, RESULT_OFFSET(r1) | |
155 b .end | |
181 | 156 |