diff options
| author | Mike Pall <mike> | 2011-04-08 02:44:56 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2011-04-08 02:44:56 +0200 |
| commit | 0046f955eb42125e5c1ddd485d1ee86f1e6a2208 (patch) | |
| tree | 31763b518fefdaf3788a61cd7b25fa35af9fd270 /src | |
| parent | 3f8fed53587e406415945389243dd18284a20939 (diff) | |
| download | luajit-0046f955eb42125e5c1ddd485d1ee86f1e6a2208.tar.gz luajit-0046f955eb42125e5c1ddd485d1ee86f1e6a2208.tar.bz2 luajit-0046f955eb42125e5c1ddd485d1ee86f1e6a2208.zip | |
ARM: Handle stack growth during function calls.
Diffstat (limited to 'src')
| -rw-r--r-- | src/buildvm_arm.dasc | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/src/buildvm_arm.dasc b/src/buildvm_arm.dasc index e6c66de3..81b03fea 100644 --- a/src/buildvm_arm.dasc +++ b/src/buildvm_arm.dasc | |||
| @@ -338,10 +338,29 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 338 | |//----------------------------------------------------------------------- | 338 | |//----------------------------------------------------------------------- |
| 339 | | | 339 | | |
| 340 | |->vm_growstack_c: // Grow stack for C function. | 340 | |->vm_growstack_c: // Grow stack for C function. |
| 341 | | NYI | 341 | | // CARG1 = L |
| 342 | | mov CARG2, #LUA_MINSTACK | ||
| 343 | | b >2 | ||
| 342 | | | 344 | | |
| 343 | |->vm_growstack_l: // Grow stack for Lua function. | 345 | |->vm_growstack_l: // Grow stack for Lua function. |
| 344 | | NYI | 346 | | // BASE = new base, RA = BASE+framesize*8, RC = nargs*8, PC = first PC |
| 347 | | add RC, BASE, RC | ||
| 348 | | sub RA, RA, BASE | ||
| 349 | | mov CARG1, L | ||
| 350 | | str BASE, L->base | ||
| 351 | | add PC, PC, #4 // Must point after first instruction. | ||
| 352 | | str RC, L->top | ||
| 353 | | lsr CARG3, RA, #3 | ||
| 354 | |2: | ||
| 355 | | // L->base = new base, L->top = top | ||
| 356 | | str PC, SAVE_PC | ||
| 357 | | bl extern lj_state_growstack // (lua_State *L, int n) | ||
| 358 | | ldr BASE, L->base | ||
| 359 | | ldr RC, L->top | ||
| 360 | | ldr LFUNC:CARG3, [BASE, FRAME_FUNC] | ||
| 361 | | sub NARGS8:RC, RC, BASE | ||
| 362 | | // BASE = new base, RB = LFUNC/CFUNC, RC = nargs*8, FRAME_PC(BASE) = PC | ||
| 363 | | ins_callt // Just retry the call. | ||
| 345 | | | 364 | | |
| 346 | |//----------------------------------------------------------------------- | 365 | |//----------------------------------------------------------------------- |
| 347 | |//-- Entry points into the assembler VM --------------------------------- | 366 | |//-- Entry points into the assembler VM --------------------------------- |
