Inline-Lua
view release on metacpan or search on metacpan
ffi/target/release/build/mlua-sys-6a99a2ae50f12319/out/luajit-build/build/src/vm_arm.dasc view on Meta::CPAN
| .IOS mov BASE, RA
| cmp CRET1, #0
| beq ->fff_res
| ldrd CARG12, [CRET1]
| b <1
|
|.ffunc_1 ipairs
| checktab CARG2, ->fff_fallback
#if LJ_52
| ldr TAB:RB, TAB:CARG1->metatable
#endif
| ldrd CFUNC:CARG34, CFUNC:CARG3->upvalue[0]
| ldr PC, [BASE, FRAME_PC]
#if LJ_52
| cmp TAB:RB, #0
| bne ->fff_fallback
#endif
| mov CARG1, #0
| mvn CARG2, #~LJ_TISNUM
| mov RC, #(3+1)*8
| strd CFUNC:CARG34, [BASE, #-8]
| strd CARG12, [BASE, #8]
| b ->fff_res
|
|//-- Base library: catch errors ----------------------------------------
|
|.ffunc pcall
| ldr RB, L->maxstack
| add INS, BASE, NARGS8:RC
| ldrb RA, [DISPATCH, #DISPATCH_GL(hookmask)]
| cmp NARGS8:RC, #8
| cmphs RB, INS
| blo ->fff_fallback
| tst RA, #HOOK_ACTIVE // Remember active hook before pcall.
| mov RB, BASE
| add BASE, BASE, #8
| moveq PC, #8+FRAME_PCALL
| movne PC, #8+FRAME_PCALLH
| sub NARGS8:RC, NARGS8:RC, #8
| b ->vm_call_dispatch
|
|.ffunc_2 xpcall
| ldr RB, L->maxstack
| add INS, BASE, NARGS8:RC
| ldrb RA, [DISPATCH, #DISPATCH_GL(hookmask)]
| cmp RB, INS
| blo ->fff_fallback
| checkfunc CARG4, ->fff_fallback // Traceback must be a function.
| mov RB, BASE
| strd CARG12, [BASE, #8] // Swap function and traceback.
| strd CARG34, [BASE]
| tst RA, #HOOK_ACTIVE // Remember active hook before pcall.
| add BASE, BASE, #16
| moveq PC, #16+FRAME_PCALL
| movne PC, #16+FRAME_PCALLH
| sub NARGS8:RC, NARGS8:RC, #16
| b ->vm_call_dispatch
|
|//-- Coroutine library --------------------------------------------------
|
|.macro coroutine_resume_wrap, resume
|.if resume
|.ffunc_1 coroutine_resume
| checktp CARG2, LJ_TTHREAD
| bne ->fff_fallback
|.else
|.ffunc coroutine_wrap_aux
| ldr L:CARG1, CFUNC:CARG3->upvalue[0].gcr
|.endif
| ldr PC, [BASE, FRAME_PC]
| str BASE, L->base
| ldr CARG2, L:CARG1->top
| ldrb RA, L:CARG1->status
| ldr RB, L:CARG1->base
| add CARG3, CARG2, NARGS8:RC
| add CARG4, CARG2, RA
| str PC, SAVE_PC
| cmp CARG4, RB
| beq ->fff_fallback
| ldr CARG4, L:CARG1->maxstack
| ldr RB, L:CARG1->cframe
| cmp RA, #LUA_YIELD
| cmpls CARG3, CARG4
| cmpls RB, #0
| bhi ->fff_fallback
|1:
|.if resume
| sub CARG3, CARG3, #8 // Keep resumed thread in stack for GC.
| add BASE, BASE, #8
| sub NARGS8:RC, NARGS8:RC, #8
|.endif
| str CARG3, L:CARG1->top
| str BASE, L->top
|2: // Move args to coroutine.
| ldrd CARG34, [BASE, RB]
| cmp RB, NARGS8:RC
| strdne CARG34, [CARG2, RB]
| add RB, RB, #8
| bne <2
|
| mov CARG3, #0
| mov L:RA, L:CARG1
| mov CARG4, #0
| bl ->vm_resume // (lua_State *L, TValue *base, 0, 0)
| // Returns thread status.
|4:
| ldr CARG3, L:RA->base
| mv_vmstate CARG2, INTERP
| ldr CARG4, L:RA->top
| cmp CRET1, #LUA_YIELD
| ldr BASE, L->base
| str L, [DISPATCH, #DISPATCH_GL(cur_L)]
| st_vmstate CARG2
| bhi >8
| subs RC, CARG4, CARG3
| ldr CARG1, L->maxstack
| add CARG2, BASE, RC
| beq >6 // No results?
| cmp CARG2, CARG1
| mov RB, #0
| bhi >9 // Need to grow stack?
|
| sub CARG4, RC, #8
| str CARG3, L:RA->top // Clear coroutine stack.
|5: // Move results from coroutine.
| ldrd CARG12, [CARG3, RB]
| cmp RB, CARG4
| strd CARG12, [BASE, RB]
| add RB, RB, #8
| bne <5
|6:
|.if resume
| mvn CARG3, #~LJ_TTRUE
| add RC, RC, #16
|7:
| str CARG3, [BASE, #-4] // Prepend true/false to results.
| sub RA, BASE, #8
|.else
| mov RA, BASE
| add RC, RC, #8
|.endif
| ands CARG1, PC, #FRAME_TYPE
| str PC, SAVE_PC
| str RC, SAVE_MULTRES
| beq ->BC_RET_Z
| b ->vm_return
|
|8: // Coroutine returned with error (at co->top-1).
|.if resume
| ldrd CARG12, [CARG4, #-8]!
| mvn CARG3, #~LJ_TFALSE
| mov RC, #(2+1)*8
| str CARG4, L:RA->top // Remove error from coroutine stack.
| strd CARG12, [BASE] // Copy error message.
| b <7
|.else
| mov CARG1, L
| mov CARG2, L:RA
| bl extern lj_ffh_coroutine_wrap_err // (lua_State *L, lua_State *co)
| // Never returns.
|.endif
|
|9: // Handle stack expansion on return from yield.
| mov CARG1, L
| lsr CARG2, RC, #3
| bl extern lj_state_growstack // (lua_State *L, int n)
| mov CRET1, #0
| b <4
|.endmacro
|
| coroutine_resume_wrap 1 // coroutine.resume
| coroutine_resume_wrap 0 // coroutine.wrap
|
|.ffunc coroutine_yield
| ldr CARG1, L->cframe
| add CARG2, BASE, NARGS8:RC
| str BASE, L->base
| tst CARG1, #CFRAME_RESUME
| str CARG2, L->top
| mov CRET1, #LUA_YIELD
| mov CARG3, #0
| beq ->fff_fallback
| str CARG3, L->cframe
| strb CRET1, L->status
| b ->vm_leave_unw
|
|//-- Math library -------------------------------------------------------
|
|.macro math_round, func
| .ffunc_1 math_ .. func
| checktp CARG2, LJ_TISNUM
| beq ->fff_restv
| bhi ->fff_fallback
| // Round FP value and normalize result.
| lsl CARG3, CARG2, #1
| adds RB, CARG3, #0x00200000
| bpl >2 // |x| < 1?
| mvn CARG4, #0x3e0
| subs RB, CARG4, RB, asr #21
| lsl CARG4, CARG2, #11
| lsl CARG3, CARG1, #11
| orr CARG4, CARG4, #0x80000000
| rsb INS, RB, #32
| orr CARG4, CARG4, CARG1, lsr #21
| bls >3 // |x| >= 2^31?
| orr CARG3, CARG3, CARG4, lsl INS
| lsr CARG1, CARG4, RB
|.if "func" == "floor"
| tst CARG3, CARG2, asr #31
| addne CARG1, CARG1, #1
|.else
| bics CARG3, CARG3, CARG2, asr #31
| addsne CARG1, CARG1, #1
| ldrdvs CARG12, >9
| bvs ->fff_restv
|.endif
| cmp CARG2, #0
| rsblt CARG1, CARG1, #0
|1:
| mvn CARG2, #~LJ_TISNUM
| b ->fff_restv
|
|2: // |x| < 1
| bcs ->fff_restv // |x| is not finite.
| orr CARG3, CARG3, CARG1 // ztest = abs(hi) | lo
|.if "func" == "floor"
| tst CARG3, CARG2, asr #31 // return (ztest & sign) == 0 ? 0 : -1
| moveq CARG1, #0
| mvnne CARG1, #0
|.else
| bics CARG3, CARG3, CARG2, asr #31 // return (ztest & ~sign) == 0 ? 0 : 1
| moveq CARG1, #0
| movne CARG1, #1
|.endif
( run in 0.605 second using v1.01-cache-2.11-cpan-39bf76dae61 )