aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2011-04-05 00:23:05 +0200
committerMike Pall <mike>2011-04-05 00:23:05 +0200
commit43d7db62d11e5bdc466cb02e9dd67c7cf00d75db (patch)
treeadc89c5c8bd28202309c9085de3ea3d101c9e6fe /src
parent959683c77cea015b21e79d25d510ce3af3a7d0df (diff)
downloadluajit-43d7db62d11e5bdc466cb02e9dd67c7cf00d75db.tar.gz
luajit-43d7db62d11e5bdc466cb02e9dd67c7cf00d75db.tar.bz2
luajit-43d7db62d11e5bdc466cb02e9dd67c7cf00d75db.zip
ARM: Add pcall() and xpcall() fast functions and unwinders.
Diffstat (limited to 'src')
-rw-r--r--src/buildvm_arm.dasc51
1 files changed, 45 insertions, 6 deletions
diff --git a/src/buildvm_arm.dasc b/src/buildvm_arm.dasc
index f3d32473..d2c3e5ca 100644
--- a/src/buildvm_arm.dasc
+++ b/src/buildvm_arm.dasc
@@ -290,14 +290,34 @@ static void build_subroutines(BuildCtx *ctx)
290 | b <2 290 | b <2
291 | 291 |
292 |->vm_unwind_c: // Unwind C stack, return from vm_pcall. 292 |->vm_unwind_c: // Unwind C stack, return from vm_pcall.
293 | NYI 293 | // (void *cframe, int errcode)
294 | mov sp, CARG1
295 | mov CRET1, CARG2
294 |->vm_unwind_c_eh: // Landing pad for external unwinder. 296 |->vm_unwind_c_eh: // Landing pad for external unwinder.
295 | NYI 297 | ldr L, SAVE_L
298 | mv_vmstate CARG4, C
299 | ldr GL:CARG3, L->glref
300 | str CARG4, GL:CARG3->vmstate
301 | b ->vm_leave_unw
296 | 302 |
297 |->vm_unwind_ff: // Unwind C stack, return from ff pcall. 303 |->vm_unwind_ff: // Unwind C stack, return from ff pcall.
298 | NYI 304 | // (void *cframe)
305 | bic sp, CARG1, #~CFRAME_RAWMASK
299 |->vm_unwind_ff_eh: // Landing pad for external unwinder. 306 |->vm_unwind_ff_eh: // Landing pad for external unwinder.
300 | NYI 307 | ldr L, SAVE_L
308 | mov MASKR8, #255
309 | mov RC, #16 // 2 results: false + error message.
310 | lsl MASKR8, MASKR8, #3 // MASKR8 = 255*8.
311 | ldr BASE, L->base
312 | ldr DISPATCH, L->glref // Setup pointer to dispatch table.
313 | mvn CARG1, #~LJ_TFALSE
314 | sub RA, BASE, #8 // Results start at BASE-8.
315 | ldr PC, [BASE, FRAME_PC] // Fetch PC of previous frame.
316 | add DISPATCH, DISPATCH, #GG_G2DISP
317 | mv_vmstate CARG2, INTERP
318 | str CARG1, [BASE, #-4] // Prepend false to error message.
319 | st_vmstate CARG2
320 | b ->vm_returnc
301 | 321 |
302 |//----------------------------------------------------------------------- 322 |//-----------------------------------------------------------------------
303 |//-- Grow stack for calls ----------------------------------------------- 323 |//-- Grow stack for calls -----------------------------------------------
@@ -688,10 +708,29 @@ static void build_subroutines(BuildCtx *ctx)
688 |//-- Base library: catch errors ---------------------------------------- 708 |//-- Base library: catch errors ----------------------------------------
689 | 709 |
690 |.ffunc pcall 710 |.ffunc pcall
691 | NYI 711 | ldrb RA, [DISPATCH, #DISPATCH_GL(hookmask)]
712 | cmp NARGS8:RC, #8
713 | blo ->fff_fallback
714 | tst RA, #HOOK_ACTIVE // Remember active hook before pcall.
715 | mov RB, BASE
716 | add BASE, BASE, #8
717 | moveq PC, #8+FRAME_PCALL
718 | movne PC, #8+FRAME_PCALLH
719 | sub NARGS8:RC, NARGS8:RC, #8
720 | b ->vm_call_dispatch
692 | 721 |
693 |.ffunc_2 xpcall 722 |.ffunc_2 xpcall
694 | NYI 723 | ldrb RA, [DISPATCH, #DISPATCH_GL(hookmask)]
724 | checkfunc CARG4, ->fff_fallback // Traceback must be a function.
725 | mov RB, BASE
726 | strd CARG12, [BASE, #8] // Swap function and traceback.
727 | strd CARG34, [BASE]
728 | tst RA, #HOOK_ACTIVE // Remember active hook before pcall.
729 | add BASE, BASE, #16
730 | moveq PC, #16+FRAME_PCALL
731 | movne PC, #16+FRAME_PCALLH
732 | sub NARGS8:RC, NARGS8:RC, #16
733 | b ->vm_call_dispatch
695 | 734 |
696 |//-- Coroutine library -------------------------------------------------- 735 |//-- Coroutine library --------------------------------------------------
697 | 736 |