Inline-Lua
view release on metacpan or search on metacpan
ffi/target/release/build/mlua-sys-6a99a2ae50f12319/out/luajit-build/build/src/vm_mips.dasc view on Meta::CPAN
| bnez TAB:TMP2, ->fff_fallback
#else
| lw TMP0, CFUNC:RB->upvalue[0].u32.hi
| lw TMP1, CFUNC:RB->upvalue[0].u32.lo
#endif
|. addiu RA, BASE, -8
| sw TISNUM, 8+HI(BASE)
| sw r0, 8+LO(BASE)
| sw TMP0, HI(RA)
| sw TMP1, LO(RA)
| b ->fff_res
|. li RD, (3+1)*8
|
|//-- Base library: catch errors ----------------------------------------
|
|.ffunc pcall
| lw TMP1, L->maxstack
| addu TMP2, BASE, NARGS8:RC
| lbu TMP3, DISPATCH_GL(hookmask)(DISPATCH)
| beqz NARGS8:RC, ->fff_fallback
|. sltu AT, TMP1, TMP2
| bnez AT, ->fff_fallback
|. move TMP2, BASE
| addiu BASE, BASE, 8
| // Remember active hook before pcall.
| srl TMP3, TMP3, HOOK_ACTIVE_SHIFT
| andi TMP3, TMP3, 1
| addiu PC, TMP3, 8+FRAME_PCALL
| b ->vm_call_dispatch
|. addiu NARGS8:RC, NARGS8:RC, -8
|
|.ffunc xpcall
| lw TMP1, L->maxstack
| addu TMP2, BASE, NARGS8:RC
| sltiu AT, NARGS8:RC, 16
| lw CARG4, 8+HI(BASE)
| sltu TMP1, TMP1, TMP2
| or AT, AT, TMP1
| bnez AT, ->fff_fallback
|. lw CARG3, 8+LO(BASE)
| lw CARG1, LO(BASE)
| lw CARG2, HI(BASE)
| lbu TMP1, DISPATCH_GL(hookmask)(DISPATCH)
| li AT, LJ_TFUNC
| move TMP2, BASE
| bne CARG4, AT, ->fff_fallback // Traceback must be a function.
| addiu BASE, BASE, 16
| // Remember active hook before pcall.
| srl TMP3, TMP3, HOOK_ACTIVE_SHIFT
| sw CARG3, LO(TMP2) // Swap function and traceback.
| sw CARG4, HI(TMP2)
| andi TMP3, TMP3, 1
| sw CARG1, 8+LO(TMP2)
| sw CARG2, 8+HI(TMP2)
| addiu PC, TMP3, 16+FRAME_PCALL
| b ->vm_call_dispatch
|. addiu NARGS8:RC, NARGS8:RC, -16
|
|//-- Coroutine library --------------------------------------------------
|
|.macro coroutine_resume_wrap, resume
|.if resume
|.ffunc coroutine_resume
| lw CARG3, HI(BASE)
| beqz NARGS8:RC, ->fff_fallback
|. lw CARG1, LO(BASE)
| li AT, LJ_TTHREAD
| bne CARG3, AT, ->fff_fallback
|.else
|.ffunc coroutine_wrap_aux
| lw L:CARG1, CFUNC:RB->upvalue[0].gcr
|.endif
| lbu TMP0, L:CARG1->status
| lw TMP1, L:CARG1->cframe
| lw CARG2, L:CARG1->top
| lw TMP2, L:CARG1->base
| addiu TMP3, TMP0, -LUA_YIELD
| bgtz TMP3, ->fff_fallback // st > LUA_YIELD?
|. xor TMP2, TMP2, CARG2
| bnez TMP1, ->fff_fallback // cframe != 0?
|. or AT, TMP2, TMP0
| lw TMP0, L:CARG1->maxstack
| beqz AT, ->fff_fallback // base == top && st == 0?
|. lw PC, FRAME_PC(BASE)
| addu TMP2, CARG2, NARGS8:RC
| sltu AT, TMP0, TMP2
| bnez AT, ->fff_fallback // Stack overflow?
|. sw PC, SAVE_PC
| sw BASE, L->base
|1:
|.if resume
| addiu BASE, BASE, 8 // Keep resumed thread in stack for GC.
| addiu NARGS8:RC, NARGS8:RC, -8
| addiu TMP2, TMP2, -8
|.endif
| sw TMP2, L:CARG1->top
| addu TMP1, BASE, NARGS8:RC
| move CARG3, CARG2
| sw BASE, L->top
|2: // Move args to coroutine.
| lw SFRETHI, HI(BASE)
| lw SFRETLO, LO(BASE)
| sltu AT, BASE, TMP1
| beqz AT, >3
|. addiu BASE, BASE, 8
| sw SFRETHI, HI(CARG3)
| sw SFRETLO, LO(CARG3)
| b <2
|. addiu CARG3, CARG3, 8
|3:
| bal ->vm_resume // (lua_State *L, TValue *base, 0, 0)
|. move L:RA, L:CARG1
| // Returns thread status.
|4:
| lw TMP2, L:RA->base
| sltiu AT, CRET1, LUA_YIELD+1
| lw TMP3, L:RA->top
| li_vmstate INTERP
| lw BASE, L->base
| sw L, DISPATCH_GL(cur_L)(DISPATCH)
| st_vmstate
| beqz AT, >8
|. subu RD, TMP3, TMP2
| lw TMP0, L->maxstack
| beqz RD, >6 // No results?
|. addu TMP1, BASE, RD
| sltu AT, TMP0, TMP1
| bnez AT, >9 // Need to grow stack?
|. addu TMP3, TMP2, RD
| sw TMP2, L:RA->top // Clear coroutine stack.
| move TMP1, BASE
|5: // Move results from coroutine.
| lw SFRETHI, HI(TMP2)
| lw SFRETLO, LO(TMP2)
| addiu TMP2, TMP2, 8
| sltu AT, TMP2, TMP3
| sw SFRETHI, HI(TMP1)
| sw SFRETLO, LO(TMP1)
| bnez AT, <5
|. addiu TMP1, TMP1, 8
|6:
| andi TMP0, PC, FRAME_TYPE
|.if resume
| li TMP1, LJ_TTRUE
| addiu RA, BASE, -8
| sw TMP1, -8+HI(BASE) // Prepend true to results.
| addiu RD, RD, 16
|.else
| move RA, BASE
| addiu RD, RD, 8
|.endif
|7:
| sw 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
| addiu TMP3, TMP3, -8
| li TMP1, LJ_TFALSE
| lw SFRETHI, HI(TMP3)
| lw SFRETLO, LO(TMP3)
| sw TMP3, L:RA->top // Remove error from coroutine stack.
| li RD, (2+1)*8
| sw TMP1, -8+HI(BASE) // Prepend false to results.
| addiu RA, BASE, -8
| sw SFRETHI, HI(BASE) // Copy error message.
| sw SFRETLO, LO(BASE)
| 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
| lw TMP0, L->cframe
| addu TMP1, BASE, NARGS8:RC
| sw BASE, L->base
| andi TMP0, TMP0, CFRAME_RESUME
| sw TMP1, L->top
| beqz TMP0, ->fff_fallback
|. li CRET1, LUA_YIELD
| sw r0, L->cframe
| b ->vm_leave_unw
|. sb CRET1, L->status
|
|//-- Math library -------------------------------------------------------
|
|.ffunc_1 math_abs
| bne SFARG1HI, TISNUM, >1
|. sra TMP0, SFARG1LO, 31
| xor TMP1, SFARG1LO, TMP0
| subu SFARG1LO, TMP1, TMP0
| bgez SFARG1LO, ->fff_restv
|. nop
| lui SFARG1HI, 0x41e0 // 2^31 as a double.
| b ->fff_restv
|. li SFARG1LO, 0
|1:
| sltiu AT, SFARG1HI, LJ_TISNUM
| beqz AT, ->fff_fallback
|. sll SFARG1HI, SFARG1HI, 1
| srl SFARG1HI, SFARG1HI, 1
|// fallthrough
|
|->fff_restv:
| // SFARG1LO/SFARG1HI = TValue result.
| lw PC, FRAME_PC(BASE)
| sw SFARG1HI, -8+HI(BASE)
| addiu RA, BASE, -8
| sw SFARG1LO, -8+LO(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.
| subu BASE, RA, TMP0
| ins_next2
|
|6: // Fill up results with nil.
| addu TMP1, RA, RD
| addiu RD, RD, 8
( run in 1.524 second using v1.01-cache-2.11-cpan-39bf76dae61 )