Inline-Lua
view release on metacpan or search on metacpan
ffi/target/release/build/mlua-sys-6a99a2ae50f12319/out/luajit-build/build/src/vm_mips64.dasc view on Meta::CPAN
| b ->fff_res
|. li RD, (3+1)*8
|
|//-- Base library: catch errors ----------------------------------------
|
|.ffunc pcall
| ld TMP1, L->maxstack
| daddu TMP2, BASE, NARGS8:RC
| sltu AT, TMP1, TMP2
| bnez AT, ->fff_fallback
|. lbu TMP3, DISPATCH_GL(hookmask)(DISPATCH)
| daddiu NARGS8:TMP0, NARGS8:RC, -8
| bltz NARGS8:TMP0, ->fff_fallback
|. move TMP2, BASE
| move NARGS8:RC, NARGS8:TMP0
| daddiu BASE, BASE, 16
| // Remember active hook before pcall.
| srl TMP3, TMP3, HOOK_ACTIVE_SHIFT
| andi TMP3, TMP3, 1
| daddiu PC, TMP3, 16+FRAME_PCALL
| beqz NARGS8:RC, ->vm_call_dispatch
|1:
|. daddu TMP0, BASE, NARGS8:RC
|2:
| ld TMP1, -16(TMP0)
| sd TMP1, -8(TMP0)
| daddiu TMP0, TMP0, -8
| bne TMP0, BASE, <2
|. nop
| b ->vm_call_dispatch
|. nop
|
|.ffunc xpcall
| ld TMP1, L->maxstack
| daddu TMP2, BASE, NARGS8:RC
| sltu AT, TMP1, TMP2
| bnez AT, ->fff_fallback
|. ld CARG1, 0(BASE)
| daddiu NARGS8:TMP0, NARGS8:RC, -16
| ld CARG2, 8(BASE)
| bltz NARGS8:TMP0, ->fff_fallback
|. lbu TMP1, DISPATCH_GL(hookmask)(DISPATCH)
| gettp AT, CARG2
| daddiu AT, AT, -LJ_TFUNC
| bnez AT, ->fff_fallback // Traceback must be a function.
|. move TMP2, BASE
| move NARGS8:RC, NARGS8:TMP0
| daddiu BASE, BASE, 24
| // Remember active hook before pcall.
| srl TMP3, TMP3, HOOK_ACTIVE_SHIFT
| sd CARG2, 0(TMP2) // Swap function and traceback.
| andi TMP3, TMP3, 1
| sd CARG1, 8(TMP2)
| beqz NARGS8:RC, ->vm_call_dispatch
|. daddiu PC, TMP3, 24+FRAME_PCALL
| b <1
|. nop
|
|//-- Coroutine library --------------------------------------------------
|
|.macro coroutine_resume_wrap, resume
|.if resume
|.ffunc_1 coroutine_resume
| checktp CARG1, CARG1, -LJ_TTHREAD, ->fff_fallback
|.else
|.ffunc coroutine_wrap_aux
| ld L:CARG1, CFUNC:RB->upvalue[0].gcr
| cleartp L:CARG1
|.endif
| lbu TMP0, L:CARG1->status
| ld TMP1, L:CARG1->cframe
| ld CARG2, L:CARG1->top
| ld TMP2, L:CARG1->base
| addiu AT, TMP0, -LUA_YIELD
| daddu CARG3, CARG2, TMP0
| daddiu TMP3, CARG2, 8
|.if MIPSR6
| seleqz CARG2, CARG2, AT
| selnez TMP3, TMP3, AT
| bgtz AT, ->fff_fallback // st > LUA_YIELD?
|. or CARG2, TMP3, CARG2
|.else
| bgtz AT, ->fff_fallback // st > LUA_YIELD?
|. movn CARG2, TMP3, AT
|.endif
| xor TMP2, TMP2, CARG3
| bnez TMP1, ->fff_fallback // cframe != 0?
|. or AT, TMP2, TMP0
| ld TMP0, L:CARG1->maxstack
| beqz AT, ->fff_fallback // base == top && st == 0?
|. ld PC, FRAME_PC(BASE)
| daddu TMP2, CARG2, NARGS8:RC
| sltu AT, TMP0, TMP2
| bnez AT, ->fff_fallback // Stack overflow?
|. sd PC, SAVE_PC
| sd BASE, L->base
|1:
|.if resume
| daddiu BASE, BASE, 8 // Keep resumed thread in stack for GC.
| daddiu NARGS8:RC, NARGS8:RC, -8
| daddiu TMP2, TMP2, -8
|.endif
| sd TMP2, L:CARG1->top
| daddu TMP1, BASE, NARGS8:RC
| move CARG3, CARG2
| sd BASE, L->top
|2: // Move args to coroutine.
| ld CRET1, 0(BASE)
| sltu AT, BASE, TMP1
| beqz AT, >3
|. daddiu BASE, BASE, 8
| sd CRET1, 0(CARG3)
| b <2
|. daddiu CARG3, CARG3, 8
|3:
| bal ->vm_resume // (lua_State *L, TValue *base, 0, 0)
|. move L:RA, L:CARG1
| // Returns thread status.
|4:
| ld TMP2, L:RA->base
| sltiu AT, CRET1, LUA_YIELD+1
| ld TMP3, L:RA->top
| li_vmstate INTERP
| ld BASE, L->base
| sd L, DISPATCH_GL(cur_L)(DISPATCH)
| st_vmstate
| beqz AT, >8
|. dsubu RD, TMP3, TMP2
| ld TMP0, L->maxstack
| beqz RD, >6 // No results?
|. daddu TMP1, BASE, RD
| sltu AT, TMP0, TMP1
| bnez AT, >9 // Need to grow stack?
|. daddu TMP3, TMP2, RD
| sd TMP2, L:RA->top // Clear coroutine stack.
| move TMP1, BASE
|5: // Move results from coroutine.
| ld CRET1, 0(TMP2)
| daddiu TMP2, TMP2, 8
| sltu AT, TMP2, TMP3
| sd CRET1, 0(TMP1)
| bnez AT, <5
|. daddiu TMP1, TMP1, 8
|6:
| andi TMP0, PC, FRAME_TYPE
|.if resume
| mov_true TMP1
| daddiu RA, BASE, -8
| sd TMP1, -8(BASE) // Prepend true to results.
| daddiu RD, RD, 16
|.else
| move RA, BASE
| daddiu RD, RD, 8
|.endif
|7:
| sd PC, SAVE_PC
| beqz TMP0, ->BC_RET_Z
|. move MULTRES, RD
| b ->vm_return
|. nop
|
|8: // Coroutine returned with error (at co->top-1).
|.if resume
| daddiu TMP3, TMP3, -8
| mov_false TMP1
| ld CRET1, 0(TMP3)
| sd TMP3, L:RA->top // Remove error from coroutine stack.
| li RD, (2+1)*8
| sd TMP1, -8(BASE) // Prepend false to results.
| daddiu RA, BASE, -8
| sd CRET1, 0(BASE) // Copy error message.
| b <7
|. andi TMP0, PC, FRAME_TYPE
|.else
| load_got lj_ffh_coroutine_wrap_err
| move CARG2, L:RA
| call_intern lj_ffh_coroutine_wrap_err // (lua_State *L, lua_State *co)
|. move CARG1, L
|.endif
|
|9: // Handle stack expansion on return from yield.
| load_got lj_state_growstack
| srl CARG2, RD, 3
| call_intern lj_state_growstack // (lua_State *L, int n)
|. move CARG1, L
| b <4
|. li CRET1, 0
|.endmacro
|
| coroutine_resume_wrap 1 // coroutine.resume
| coroutine_resume_wrap 0 // coroutine.wrap
|
|.ffunc coroutine_yield
| ld TMP0, L->cframe
| daddu TMP1, BASE, NARGS8:RC
| sd BASE, L->base
| andi TMP0, TMP0, CFRAME_RESUME
| sd TMP1, L->top
| beqz TMP0, ->fff_fallback
|. li CRET1, LUA_YIELD
| sd r0, L->cframe
| b ->vm_leave_unw
|. sb CRET1, L->status
|
|//-- Math library -------------------------------------------------------
|
|.ffunc_1 math_abs
| gettp CARG2, CARG1
| daddiu AT, CARG2, -LJ_TISNUM
| bnez AT, >1
|. sextw TMP1, CARG1
| sra TMP0, TMP1, 31 // Extract sign.
| xor TMP1, TMP1, TMP0
| dsubu CARG1, TMP1, TMP0
| dsll TMP3, CARG1, 32
| bgez TMP3, ->fff_restv
|. settp CARG1, TISNUM
| li CARG1, 0x41e0 // 2^31 as a double.
| b ->fff_restv
|. dsll CARG1, CARG1, 48
|1:
| sltiu AT, CARG2, LJ_TISNUM
| beqz AT, ->fff_fallback
|. dextm CARG1, CARG1, 0, 30
|// fallthrough
|
|->fff_restv:
| // CARG1 = TValue result.
| ld PC, FRAME_PC(BASE)
| daddiu RA, BASE, -16
| sd CARG1, -16(BASE)
|->fff_res1:
| // RA = results, PC = return.
| li RD, (1+1)*8
|->fff_res:
| // RA = results, RD = (nresults+1)*8, PC = return.
| andi TMP0, PC, FRAME_TYPE
| bnez TMP0, ->vm_return
|. move MULTRES, RD
| lw INS, -4(PC)
| decode_RB8a RB, INS
| decode_RB8b RB
|5:
| sltu AT, RD, RB
| bnez AT, >6 // More results expected?
|. decode_RA8a TMP0, INS
| decode_RA8b TMP0
| ins_next1
| // Adjust BASE. KBASE is assumed to be set for the calling frame.
| dsubu BASE, RA, TMP0
| ins_next2
|
|6: // Fill up results with nil.
( run in 3.058 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )