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 )