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