aboutsummaryrefslogtreecommitdiff
path: root/src/vm_ppc.dasc
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm_ppc.dasc')
-rw-r--r--src/vm_ppc.dasc46
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;