Inline-Lua
view release on metacpan or search on metacpan
ffi/target/release/build/mlua-sys-6a99a2ae50f12319/out/luajit-build/build/src/vm_arm64.dasc view on Meta::CPAN
| ldr TAB:CARG2, TAB:TMP1->metatable
#endif
| ldr CFUNC:CARG4, CFUNC:CARG3->upvalue[0]
| ldr PC, [BASE, FRAME_PC]
#if LJ_52
| cbnz TAB:CARG2, ->fff_fallback
#endif
| mov RC, #(3+1)*8
| stp CFUNC:CARG4, CARG1, [BASE, #-16]
| str TISNUM, [BASE]
| b ->fff_res
|
|//-- Base library: catch errors ----------------------------------------
|
|.ffunc pcall
| ldr TMP1, L->maxstack
| add TMP2, BASE, NARGS8:RC
| cmp TMP1, TMP2
| blo ->fff_fallback
| cmp NARGS8:RC, #8
| ldrb TMP0w, GL->hookmask
| blo ->fff_fallback
| sub NARGS8:RC, NARGS8:RC, #8
| mov RB, BASE
| add BASE, BASE, #16
| ubfx TMP0w, TMP0w, #HOOK_ACTIVE_SHIFT, #1
| add PC, TMP0, #16+FRAME_PCALL
| beq ->vm_call_dispatch
|1:
| add TMP2, BASE, NARGS8:RC
|2:
| ldr TMP0, [TMP2, #-16]
| str TMP0, [TMP2, #-8]!
| cmp TMP2, BASE
| bne <2
| b ->vm_call_dispatch
|
|.ffunc xpcall
| ldr TMP1, L->maxstack
| add TMP2, BASE, NARGS8:RC
| cmp TMP1, TMP2
| blo ->fff_fallback
| ldp CARG1, CARG2, [BASE]
| ldrb TMP0w, GL->hookmask
| subs NARGS8:TMP1, NARGS8:RC, #16
| blo ->fff_fallback
| mov RB, BASE
| asr ITYPE, CARG2, #47
| ubfx TMP0w, TMP0w, #HOOK_ACTIVE_SHIFT, #1
| cmn ITYPE, #-LJ_TFUNC
| add PC, TMP0, #24+FRAME_PCALL
| bne ->fff_fallback // Traceback must be a function.
| mov NARGS8:RC, NARGS8:TMP1
| add BASE, BASE, #24
| stp CARG2, CARG1, [RB] // Swap function and traceback.
| cbz NARGS8:RC, ->vm_call_dispatch
| b <1
|
|//-- Coroutine library --------------------------------------------------
|
|.macro coroutine_resume_wrap, resume
|.if resume
|.ffunc_1 coroutine_resume
| checktp CARG1, LJ_TTHREAD, ->fff_fallback
|.else
|.ffunc coroutine_wrap_aux
| ldr L:CARG1, CFUNC:CARG3->upvalue[0].gcr
| and L:CARG1, CARG1, #LJ_GCVMASK
|.endif
| ldr PC, [BASE, FRAME_PC]
| str BASE, L->base
| ldp RB, CARG2, L:CARG1->base
| ldrb TMP1w, L:CARG1->status
| add TMP0, CARG2, TMP1
| str PC, SAVE_PC
| cmp TMP0, RB
| beq ->fff_fallback
| cmp TMP1, #LUA_YIELD
| add TMP0, CARG2, #8
| csel CARG2, CARG2, TMP0, hs
| ldr CARG4, L:CARG1->maxstack
| add CARG3, CARG2, NARGS8:RC
| ldr RB, L:CARG1->cframe
| ccmp CARG3, CARG4, #2, ls
| ccmp RB, #0, #2, ls
| bhi ->fff_fallback
|.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
| cbz NARGS8:RC, >3
|2: // Move args to coroutine.
| ldr TMP0, [BASE, RB]
| cmp RB, NARGS8:RC
| str TMP0, [CARG2, RB]
| add RB, RB, #8
| bne <2
|3:
| 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:
| ldp CARG3, CARG4, L:RA->base
| cmp CRET1, #LUA_YIELD
| ldr BASE, L->base
| str L, GL->cur_L
| st_vmstate ST_INTERP
| bhi >8
| sub RC, CARG4, CARG3
| ldr CARG1, L->maxstack
| add CARG2, BASE, RC
| cbz RC, >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.
| ldr TMP0, [CARG3, RB]
| cmp RB, CARG4
| str TMP0, [BASE, RB]
| add RB, RB, #8
| bne <5
|6:
|.if resume
| mov_true TMP1
| add RC, RC, #16
|7:
| str TMP1, [BASE, #-8] // 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 RCw, SAVE_MULTRES
| beq ->BC_RET_Z
| b ->vm_return
|
|8: // Coroutine returned with error (at co->top-1).
|.if resume
| ldr TMP0, [CARG4, #-8]!
| mov_false TMP1
| mov RC, #(2+1)*8
| str CARG4, L:RA->top // Remove error from coroutine stack.
| str TMP0, [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 TMP0, L->cframe
| add TMP1, BASE, NARGS8:RC
| mov CRET1, #LUA_YIELD
| stp BASE, TMP1, L->base
| tbz TMP0, #0, ->fff_fallback
| str xzr, L->cframe
| strb CRET1w, L->status
| b ->vm_leave_unw
|
|//-- Math library -------------------------------------------------------
|
|.macro math_round, func, round
| .ffunc math_ .. func
| ldr CARG1, [BASE]
| cmp NARGS8:RC, #8
| ldr d0, [BASE]
| blo ->fff_fallback
| cmp TISNUMhi, CARG1, lsr #32
| beq ->fff_restv
| blo ->fff_fallback
| round d0, d0
| b ->fff_resn
|.endmacro
|
| math_round floor, frintm
| math_round ceil, frintp
|
|.ffunc_1 math_abs
| checknumber CARG1, ->fff_fallback
| and CARG1, CARG1, #U64x(7fffffff,ffffffff)
| bne ->fff_restv
| eor CARG2w, CARG1w, CARG1w, asr #31
| movz CARG3, #0x41e0, lsl #48 // 2^31.
| subs CARG1w, CARG2w, CARG1w, asr #31
| add_TISNUM CARG1, CARG1
| csel CARG1, CARG1, CARG3, pl
| // Fallthrough.
|
|->fff_restv:
| // CARG1 = TValue result.
| ldr PC, [BASE, FRAME_PC]
| str CARG1, [BASE, #-16]
|->fff_res1:
| // PC = return.
| mov RC, #(1+1)*8
|->fff_res:
| // RC = (nresults+1)*8, PC = return.
| ands CARG1, PC, #FRAME_TYPE
| str RCw, SAVE_MULTRES
| sub RA, BASE, #16
| bne ->vm_return
| ldr INSw, [PC, #-4]
| decode_RB RB, INS
|5:
| cmp RC, RB, lsl #3 // More results expected?
| blo >6
| decode_RA TMP1, INS
| // Adjust BASE. KBASE is assumed to be set for the calling frame.
| sub BASE, RA, TMP1, lsl #3
| ins_next
( run in 1.026 second using v1.01-cache-2.11-cpan-39bf76dae61 )