diff options
Diffstat (limited to 'src/vm_ppc.dasc')
-rw-r--r-- | src/vm_ppc.dasc | 46 |
1 files changed, 42 insertions, 4 deletions
diff --git a/src/vm_ppc.dasc b/src/vm_ppc.dasc index ac572ec5..19692638 100644 --- a/src/vm_ppc.dasc +++ b/src/vm_ppc.dasc | |||
@@ -21,6 +21,7 @@ | |||
21 | |// Note: a full PPC64 _LP64 port is not planned. | 21 | |// Note: a full PPC64 _LP64 port is not planned. |
22 | |// GPR64 64 bit registers (but possibly 32 bit pointers, e.g. PS3). | 22 | |// GPR64 64 bit registers (but possibly 32 bit pointers, e.g. PS3). |
23 | |// Affects reg saves, stack layout, carry/overflow/dot flags etc. | 23 | |// Affects reg saves, stack layout, carry/overflow/dot flags etc. |
24 | |// FRAME32 Use 32 bit frame layout, even with GPR64 (XBox 360). | ||
24 | |// TOC Need table of contents (64 bit or 32 bit variant, e.g. PS3). | 25 | |// TOC Need table of contents (64 bit or 32 bit variant, e.g. PS3). |
25 | |// Function pointers are really a struct: code, TOC, env (optional). | 26 | |// Function pointers are really a struct: code, TOC, env (optional). |
26 | |// TOCENV Function pointers have an environment pointer, too (not on PS3). | 27 | |// TOCENV Function pointers have an environment pointer, too (not on PS3). |
@@ -128,6 +129,37 @@ | |||
128 | | | 129 | | |
129 | |// Stack layout while in interpreter. Must match with lj_frame.h. | 130 | |// Stack layout while in interpreter. Must match with lj_frame.h. |
130 | |.if GPR64 | 131 | |.if GPR64 |
132 | |.if FRAME32 | ||
133 | | | ||
134 | |// 456(sp) // \ 32/64 bit C frame info | ||
135 | |.define TONUM_LO, 452(sp) // | | ||
136 | |.define TONUM_HI, 448(sp) // | | ||
137 | |.define TMPD_LO, 444(sp) // | | ||
138 | |.define TMPD_HI, 440(sp) // | | ||
139 | |.define SAVE_CR, 432(sp) // | 64 bit CR save. | ||
140 | |.define SAVE_ERRF, 424(sp) // > Parameter save area. | ||
141 | |.define SAVE_NRES, 420(sp) // | | ||
142 | |.define SAVE_L, 416(sp) // | | ||
143 | |.define SAVE_PC, 412(sp) // | | ||
144 | |.define SAVE_MULTRES, 408(sp) // | | ||
145 | |.define SAVE_CFRAME, 400(sp) // / 64 bit C frame chain. | ||
146 | |// 392(sp) // Reserved. | ||
147 | |.define CFRAME_SPACE, 384 // Delta for sp. | ||
148 | |// Back chain for sp: 384(sp) <-- sp entering interpreter | ||
149 | |.define SAVE_LR, 376(sp) // 32 bit LR stored in hi-part. | ||
150 | |.define SAVE_GPR_, 232 // .. 232+18*8: 64 bit GPR saves. | ||
151 | |.define SAVE_FPR_, 88 // .. 88+18*8: 64 bit FPR saves. | ||
152 | |// 80(sp) // Needed for 16 byte stack frame alignment. | ||
153 | |// 16(sp) // Callee parameter save area (ABI mandated). | ||
154 | |// 8(sp) // Reserved | ||
155 | |// Back chain for sp: 0(sp) <-- sp while in interpreter | ||
156 | |// 32 bit sp stored in hi-part of 0(sp). | ||
157 | | | ||
158 | |.define TMPD_BLO, 447(sp) | ||
159 | |.define TMPD, TMPD_HI | ||
160 | |.define TONUM_D, TONUM_HI | ||
161 | | | ||
162 | |.else | ||
131 | | | 163 | | |
132 | |// 508(sp) // \ 32 bit C frame info. | 164 | |// 508(sp) // \ 32 bit C frame info. |
133 | |.define SAVE_ERRF, 472(sp) // | | 165 | |.define SAVE_ERRF, 472(sp) // | |
@@ -155,6 +187,7 @@ | |||
155 | |.define TMPD, TMPD_HI | 187 | |.define TMPD, TMPD_HI |
156 | |.define TONUM_D, TONUM_HI | 188 | |.define TONUM_D, TONUM_HI |
157 | | | 189 | | |
190 | |.endif | ||
158 | |.else | 191 | |.else |
159 | | | 192 | | |
160 | |.define SAVE_LR, 276(sp) | 193 | |.define SAVE_LR, 276(sp) |
@@ -201,7 +234,7 @@ | |||
201 | |.endmacro | 234 | |.endmacro |
202 | | | 235 | | |
203 | |.macro saveregs | 236 | |.macro saveregs |
204 | |.if GPR64 | 237 | |.if GPR64 and not FRAME32 |
205 | | stdu sp, -CFRAME_SPACE(sp) | 238 | | stdu sp, -CFRAME_SPACE(sp) |
206 | |.else | 239 | |.else |
207 | | stwu sp, -CFRAME_SPACE(sp) | 240 | | stwu sp, -CFRAME_SPACE(sp) |
@@ -209,7 +242,7 @@ | |||
209 | | save_ 14; save_ 15; save_ 16 | 242 | | save_ 14; save_ 15; save_ 16 |
210 | | mflr r0 | 243 | | mflr r0 |
211 | | save_ 17; save_ 18; save_ 19; save_ 20; save_ 21; save_ 22 | 244 | | save_ 17; save_ 18; save_ 19; save_ 20; save_ 21; save_ 22 |
212 | |.if GPR64 | 245 | |.if GPR64 and not FRAME32 |
213 | | std r0, SAVE_LR | 246 | | std r0, SAVE_LR |
214 | |.else | 247 | |.else |
215 | | stw r0, SAVE_LR | 248 | | stw r0, SAVE_LR |
@@ -226,10 +259,15 @@ | |||
226 | |.endmacro | 259 | |.endmacro |
227 | | | 260 | | |
228 | |.macro restoreregs | 261 | |.macro restoreregs |
262 | |.if GPR64 and not FRAME32 | ||
263 | | ld r0, SAVE_LR | ||
264 | |.else | ||
265 | | lwz r0, SAVE_LR | ||
266 | |.endif | ||
229 | |.if GPR64 | 267 | |.if GPR64 |
230 | | ld r0, SAVE_LR; ld r12, SAVE_CR | 268 | | ld r12, SAVE_CR |
231 | |.else | 269 | |.else |
232 | | lwz r0, SAVE_LR; lwz r12, SAVE_CR | 270 | | lwz r12, SAVE_CR |
233 | |.endif | 271 | |.endif |
234 | | rest_ 14; rest_ 15; rest_ 16; rest_ 17; rest_ 18; rest_ 19 | 272 | | rest_ 14; rest_ 15; rest_ 16; rest_ 17; rest_ 18; rest_ 19 |
235 | | mtlr r0; | 273 | | mtlr r0; |