diff options
author | Mike Pall <mike> | 2010-08-31 23:52:45 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2010-08-31 23:52:45 +0200 |
commit | fc1866fb6ff84327cea91977f83f2a038d2999ca (patch) | |
tree | d7561346d9556ed2fcac450fb96d5c9e16aaf02c /src | |
parent | 233dc7607831b51237f05bfc5ff6261beb5cf9e2 (diff) | |
download | luajit-fc1866fb6ff84327cea91977f83f2a038d2999ca.tar.gz luajit-fc1866fb6ff84327cea91977f83f2a038d2999ca.tar.bz2 luajit-fc1866fb6ff84327cea91977f83f2a038d2999ca.zip |
PPC: Handle stack growth during function calls.
Diffstat (limited to 'src')
-rw-r--r-- | src/buildvm_ppc.dasc | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc index 764cd391..5d3fc198 100644 --- a/src/buildvm_ppc.dasc +++ b/src/buildvm_ppc.dasc | |||
@@ -346,10 +346,27 @@ static void build_subroutines(BuildCtx *ctx) | |||
346 | |//----------------------------------------------------------------------- | 346 | |//----------------------------------------------------------------------- |
347 | | | 347 | | |
348 | |->vm_growstack_c: // Grow stack for C function. | 348 | |->vm_growstack_c: // Grow stack for C function. |
349 | | NYI | 349 | | li CARG2, LUA_MINSTACK |
350 | | b >2 | ||
350 | | | 351 | | |
351 | |->vm_growstack_l: // Grow stack for Lua function. | 352 | |->vm_growstack_l: // Grow stack for Lua function. |
352 | | NYI | 353 | | // BASE = new base, RA = BASE+framesize*8, RC = nargs*8, PC = first PC |
354 | | add RC, BASE, RC | ||
355 | | sub RA, RA, BASE | ||
356 | | stw BASE, L->base | ||
357 | | addi PC, PC, 4 // Must point after first instruction. | ||
358 | | stw RC, L->top | ||
359 | | srwi CARG2, RA, 3 | ||
360 | |2: | ||
361 | | // L->base = new base, L->top = top | ||
362 | | mr CARG1, L | ||
363 | | bl extern lj_state_growstack // (lua_State *L, int n) | ||
364 | | lwz BASE, L->base | ||
365 | | lwz RC, L->top | ||
366 | | lwz LFUNC:RB, FRAME_FUNC(BASE) | ||
367 | | sub RC, RC, BASE | ||
368 | | // BASE = new base, RB = LFUNC/CFUNC, RC = nargs*8, FRAME_PC(BASE) = PC | ||
369 | | ins_callt // Just retry the call. | ||
353 | | | 370 | | |
354 | |//----------------------------------------------------------------------- | 371 | |//----------------------------------------------------------------------- |
355 | |//-- Entry points into the assembler VM --------------------------------- | 372 | |//-- Entry points into the assembler VM --------------------------------- |