Inline-Lua
view release on metacpan or search on metacpan
ffi/target/release/build/mlua-sys-6a99a2ae50f12319/out/luajit-build/build/src/vm_x86.dasc view on Meta::CPAN
|->fff_res0:
| mov RD, 1+0
| jmp ->fff_res
|
|.ffunc_1 ipairs
| mov TAB:RB, [BASE]
| cmp dword [BASE+4], LJ_TTAB; jne ->fff_fallback
#if LJ_52
| cmp dword TAB:RB->metatable, 0; jne ->fff_fallback
#endif
| mov CFUNC:RB, [BASE-8]
| mov CFUNC:RD, CFUNC:RB->upvalue[0]
| mov PC, [BASE-4]
| mov dword [BASE-4], LJ_TFUNC
| mov [BASE-8], CFUNC:RD
|.if DUALNUM
| mov dword [BASE+12], LJ_TISNUM
| mov dword [BASE+8], 0
|.else
| xorps xmm0, xmm0
| movsd qword [BASE+8], xmm0
|.endif
| mov RD, 1+3
| jmp ->fff_res
|
|//-- Base library: catch errors ----------------------------------------
|
|.ffunc_1 pcall
| mov L:RB, SAVE_L
| lea RA, [BASE+NARGS:RD*8]
| cmp RA, L:RB->maxstack; ja ->fff_fallback
| lea RA, [BASE+8]
| sub NARGS:RD, 1
| mov PC, 8+FRAME_PCALL
|1:
| movzx RB, byte [DISPATCH+DISPATCH_GL(hookmask)]
| shr RB, HOOK_ACTIVE_SHIFT
| and RB, 1
| add PC, RB // Remember active hook before pcall.
| jmp ->vm_call_dispatch
|
|.ffunc_2 xpcall
| mov L:RB, SAVE_L
| lea RA, [BASE+NARGS:RD*8]
| cmp RA, L:RB->maxstack; ja ->fff_fallback
| cmp dword [BASE+12], LJ_TFUNC; jne ->fff_fallback
| mov RB, [BASE+4] // Swap function and traceback.
| mov [BASE+12], RB
| mov dword [BASE+4], LJ_TFUNC
| mov LFUNC:RB, [BASE]
| mov PC, [BASE+8]
| mov [BASE+8], LFUNC:RB
| mov [BASE], PC
| lea RA, [BASE+16]
| sub NARGS:RD, 2
| mov PC, 16+FRAME_PCALL
| jmp <1
|
|//-- Coroutine library --------------------------------------------------
|
|.macro coroutine_resume_wrap, resume
|.if resume
|.ffunc_1 coroutine_resume
| mov L:RB, [BASE]
|.else
|.ffunc coroutine_wrap_aux
| mov CFUNC:RB, [BASE-8]
| mov L:RB, CFUNC:RB->upvalue[0].gcr
|.endif
| mov PC, [BASE-4]
| mov SAVE_PC, PC
|.if X64
| mov TMP1, L:RB
|.else
| mov ARG1, L:RB
|.endif
|.if resume
| cmp dword [BASE+4], LJ_TTHREAD; jne ->fff_fallback
|.endif
| cmp aword L:RB->cframe, 0; jne ->fff_fallback
| cmp byte L:RB->status, LUA_YIELD; ja ->fff_fallback
| mov RA, L:RB->top
| je >1 // Status != LUA_YIELD (i.e. 0)?
| cmp RA, L:RB->base // Check for presence of initial func.
| je ->fff_fallback
|1:
|.if resume
| lea PC, [RA+NARGS:RD*8-16] // Check stack space (-1-thread).
|.else
| lea PC, [RA+NARGS:RD*8-8] // Check stack space (-1).
|.endif
| cmp PC, L:RB->maxstack; ja ->fff_fallback
| mov L:RB->top, PC
|
| mov L:RB, SAVE_L
| mov L:RB->base, BASE
|.if resume
| add BASE, 8 // Keep resumed thread in stack for GC.
|.endif
| mov L:RB->top, BASE
|.if resume
| lea RB, [BASE+NARGS:RD*8-24] // RB = end of source for stack move.
|.else
| lea RB, [BASE+NARGS:RD*8-16] // RB = end of source for stack move.
|.endif
| sub RBa, PCa // Relative to PC.
|
| cmp PC, RA
| je >3
|2: // Move args to coroutine.
|.if X64
| mov RCa, [PC+RB]
| mov [PC-8], RCa
|.else
| mov RC, [PC+RB+4]
| mov [PC-4], RC
| mov RC, [PC+RB]
| mov [PC-8], RC
|.endif
| sub PC, 8
| cmp PC, RA
| jne <2
|3:
|.if X64
| mov CARG2d, RA
| mov CARG1d, TMP1
|.else
| mov ARG2, RA
| xor RA, RA
| mov ARG4, RA
| mov ARG3, RA
|.endif
| call ->vm_resume // (lua_State *L, TValue *base, 0, 0)
|
| mov L:RB, SAVE_L
|.if X64
| mov L:PC, TMP1
|.else
| mov L:PC, ARG1 // The callee doesn't modify SAVE_L.
|.endif
| mov BASE, L:RB->base
| mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB
| set_vmstate INTERP
|
| cmp eax, LUA_YIELD
| ja >8
|4:
| mov RA, L:PC->base
| mov KBASE, L:PC->top
| mov L:PC->top, RA // Clear coroutine stack.
| mov PC, KBASE
| sub PC, RA
| je >6 // No results?
| lea RD, [BASE+PC]
| shr PC, 3
| cmp RD, L:RB->maxstack
| ja >9 // Need to grow stack?
|
| mov RB, BASE
| sub RBa, RAa
|5: // Move results from coroutine.
|.if X64
| mov RDa, [RA]
| mov [RA+RB], RDa
|.else
| mov RD, [RA]
| mov [RA+RB], RD
| mov RD, [RA+4]
| mov [RA+RB+4], RD
|.endif
| add RA, 8
| cmp RA, KBASE
| jne <5
|6:
|.if resume
| lea RD, [PC+2] // nresults+1 = 1 + true + results.
| mov dword [BASE-4], LJ_TTRUE // Prepend true to results.
|.else
| lea RD, [PC+1] // nresults+1 = 1 + results.
|.endif
|7:
| mov PC, SAVE_PC
| mov MULTRES, RD
|.if resume
| mov RAa, -8
|.else
| xor RA, RA
|.endif
| test PC, FRAME_TYPE
| jz ->BC_RET_Z
| jmp ->vm_return
|
|8: // Coroutine returned with error (at co->top-1).
|.if resume
| mov dword [BASE-4], LJ_TFALSE // Prepend false to results.
| mov RA, L:PC->top
| sub RA, 8
| mov L:PC->top, RA // Clear error from coroutine stack.
| // Copy error message.
|.if X64
| mov RDa, [RA]
| mov [BASE], RDa
|.else
| mov RD, [RA]
| mov [BASE], RD
| mov RD, [RA+4]
| mov [BASE+4], RD
|.endif
| mov RD, 1+2 // nresults+1 = 1 + false + error.
| jmp <7
|.else
| mov FCARG2, L:PC
| mov FCARG1, L:RB
| call extern lj_ffh_coroutine_wrap_err@8 // (lua_State *L, lua_State *co)
| // Error function does not return.
|.endif
|
|9: // Handle stack expansion on return from yield.
|.if X64
| mov L:RA, TMP1
|.else
| mov L:RA, ARG1 // The callee doesn't modify SAVE_L.
|.endif
| mov L:RA->top, KBASE // Undo coroutine stack clearing.
| mov FCARG2, PC
| mov FCARG1, L:RB
| call extern lj_state_growstack@8 // (lua_State *L, int n)
|.if X64
| mov L:PC, TMP1
|.else
| mov L:PC, ARG1
|.endif
| mov BASE, L:RB->base
| jmp <4 // Retry the stack move.
|.endmacro
|
| coroutine_resume_wrap 1 // coroutine.resume
| coroutine_resume_wrap 0 // coroutine.wrap
|
|.ffunc coroutine_yield
| mov L:RB, SAVE_L
| test aword L:RB->cframe, CFRAME_RESUME
| jz ->fff_fallback
| mov L:RB->base, BASE
| lea RD, [BASE+NARGS:RD*8-8]
| mov L:RB->top, RD
| xor RD, RD
| mov aword L:RB->cframe, RDa
| mov al, LUA_YIELD
| mov byte L:RB->status, al
| jmp ->vm_leave_unw
|
|//-- Math library -------------------------------------------------------
|
|.if not DUALNUM
|->fff_resi: // Dummy.
|.endif
|
|->fff_resn:
| mov PC, [BASE-4]
| fstp qword [BASE-8]
| jmp ->fff_res1
|
| .ffunc_1 math_abs
|.if DUALNUM
| cmp dword [BASE+4], LJ_TISNUM; jne >2
| mov RB, dword [BASE]
| cmp RB, 0; jns ->fff_resi
| neg RB; js >1
|->fff_resbit:
|->fff_resi:
| mov PC, [BASE-4]
| mov dword [BASE-4], LJ_TISNUM
| mov dword [BASE-8], RB
| jmp ->fff_res1
|1:
| mov PC, [BASE-4]
| mov dword [BASE-4], 0x41e00000 // 2^31.
| mov dword [BASE-8], 0
| jmp ->fff_res1
|2:
| ja ->fff_fallback
|.else
| cmp dword [BASE+4], LJ_TISNUM; jae ->fff_fallback
|.endif
| movsd xmm0, qword [BASE]
| sseconst_abs xmm1, RDa
| andps xmm0, xmm1
|->fff_resxmm0:
| mov PC, [BASE-4]
| movsd qword [BASE-8], xmm0
| // fallthrough
|
|->fff_res1:
| mov RD, 1+1
|->fff_res:
| mov MULTRES, RD
|->fff_res_:
| test PC, FRAME_TYPE
| jnz >7
( run in 1.042 second using v1.01-cache-2.11-cpan-39bf76dae61 )