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 )