Inline-Lua

 view release on metacpan or  search on metacpan

ffi/target/release/build/mlua-sys-6a99a2ae50f12319/out/luajit-build/build/src/vm_ppc.dasc  view on Meta::CPAN

  |  stw TMP1, 4(RA)
  |.endif
  |  b ->fff_res
  |
  |//-- Base library: catch errors ----------------------------------------
  |
  |.ffunc pcall
  |    lwz TMP1, L->maxstack
  |    add TMP2, BASE, NARGS8:RC
  |  cmplwi NARGS8:RC, 8
  |   lbz TMP3, DISPATCH_GL(hookmask)(DISPATCH)
  |    cmplw cr1, TMP1, TMP2
  |  cror 4*cr0+lt, 4*cr0+lt, 4*cr1+lt
  |  blt ->fff_fallback
  |   mr TMP2, BASE
  |   la BASE, 8(BASE)
  |  // Remember active hook before pcall.
  |  rlwinm TMP3, TMP3, 32-HOOK_ACTIVE_SHIFT, 31, 31
  |   subi NARGS8:RC, NARGS8:RC, 8
  |  addi PC, TMP3, 8+FRAME_PCALL
  |  b ->vm_call_dispatch
  |
  |.ffunc xpcall
  |     lwz TMP1, L->maxstack
  |     add TMP2, BASE, NARGS8:RC
  |  cmplwi NARGS8:RC, 16
  |   lwz CARG3, 8(BASE)
  |     cmplw cr1, TMP1, TMP2
  |.if FPU
  |    lfd FARG2, 8(BASE)
  |  cror 4*cr0+lt, 4*cr0+lt, 4*cr1+lt
  |    lfd FARG1, 0(BASE)
  |.else
  |    lwz CARG1, 0(BASE)
  |    lwz CARG2, 4(BASE)
  |  cror 4*cr0+lt, 4*cr0+lt, 4*cr1+lt
  |    lwz CARG4, 12(BASE)
  |.endif
  |  blt ->fff_fallback
  |  lbz TMP1, DISPATCH_GL(hookmask)(DISPATCH)
  |   mr TMP2, BASE
  |  checkfunc CARG3; bne ->fff_fallback  // Traceback must be a function.
  |   la BASE, 16(BASE)
  |  // Remember active hook before pcall.
  |  rlwinm TMP1, TMP1, 32-HOOK_ACTIVE_SHIFT, 31, 31
  |.if FPU
  |    stfd FARG2, 0(TMP2)		// Swap function and traceback.
  |    stfd FARG1, 8(TMP2)
  |.else
  |    stw CARG3, 0(TMP2)
  |    stw CARG4, 4(TMP2)
  |    stw CARG1, 8(TMP2)
  |    stw CARG2, 12(TMP2)
  |.endif
  |  subi NARGS8:RC, NARGS8:RC, 16
  |  addi PC, TMP1, 16+FRAME_PCALL
  |  b ->vm_call_dispatch
  |
  |//-- Coroutine library --------------------------------------------------
  |
  |.macro coroutine_resume_wrap, resume
  |.if resume
  |.ffunc_1 coroutine_resume
  |  cmpwi CARG3, LJ_TTHREAD; bne ->fff_fallback
  |.else
  |.ffunc coroutine_wrap_aux
  |  lwz L:CARG1, CFUNC:RB->upvalue[0].gcr
  |.endif
  |  lbz TMP0, L:CARG1->status
  |   lp TMP1, L:CARG1->cframe
  |    lp CARG2, L:CARG1->top
  |  cmplwi cr0, TMP0, LUA_YIELD
  |    lp TMP2, L:CARG1->base
  |   cmplwi cr1, TMP1, 0
  |   lwz TMP0, L:CARG1->maxstack
  |    cmplw cr7, CARG2, TMP2
  |   lwz PC, FRAME_PC(BASE)
  |  crorc 4*cr6+lt, 4*cr0+gt, 4*cr1+eq		// st>LUA_YIELD || cframe!=0
  |   add TMP2, CARG2, NARGS8:RC
  |  crandc 4*cr6+gt, 4*cr7+eq, 4*cr0+eq	// base==top && st!=LUA_YIELD
  |   cmplw cr1, TMP2, TMP0
  |  cror 4*cr6+lt, 4*cr6+lt, 4*cr6+gt
  |   stw PC, SAVE_PC
  |  cror 4*cr6+lt, 4*cr6+lt, 4*cr1+gt		// cond1 || cond2 || stackov
  |   stp BASE, L->base
  |  blt cr6, ->fff_fallback
  |1:
  |.if resume
  |  addi BASE, BASE, 8			// Keep resumed thread in stack for GC.
  |  subi NARGS8:RC, NARGS8:RC, 8
  |  subi TMP2, TMP2, 8
  |.endif
  |  stp TMP2, L:CARG1->top
  |  li TMP1, 0
  |  stp BASE, L->top
  |2:  // Move args to coroutine.
  |  cmpw TMP1, NARGS8:RC
  |.if FPU
  |   lfdx f0, BASE, TMP1
  |.else
  |   add CARG3, BASE, TMP1
  |   lwz TMP2, 0(CARG3)
  |   lwz TMP3, 4(CARG3)
  |.endif
  |  beq >3
  |.if FPU
  |   stfdx f0, CARG2, TMP1
  |.else
  |   add CARG3, CARG2, TMP1
  |   stw TMP2, 0(CARG3)
  |   stw TMP3, 4(CARG3)
  |.endif
  |  addi TMP1, TMP1, 8
  |  b <2
  |3:
  |  li CARG3, 0
  |   mr L:SAVE0, L:CARG1
  |  li CARG4, 0
  |  bl ->vm_resume			// (lua_State *L, TValue *base, 0, 0)
  |  // Returns thread status.
  |4:
  |  lp TMP2, L:SAVE0->base
  |   cmplwi CRET1, LUA_YIELD
  |  lp TMP3, L:SAVE0->top
  |    li_vmstate INTERP
  |  lp BASE, L->base
  |    stw L, DISPATCH_GL(cur_L)(DISPATCH)
  |    st_vmstate
  |   bgt >8
  |  sub RD, TMP3, TMP2
  |   lwz TMP0, L->maxstack
  |  cmplwi RD, 0
  |   add TMP1, BASE, RD
  |  beq >6				// No results?
  |  cmplw TMP1, TMP0
  |   li TMP1, 0
  |  bgt >9				// Need to grow stack?
  |
  |  subi TMP3, RD, 8
  |   stp TMP2, L:SAVE0->top		// Clear coroutine stack.
  |5:  // Move results from coroutine.
  |  cmplw TMP1, TMP3
  |.if FPU
  |   lfdx f0, TMP2, TMP1
  |   stfdx f0, BASE, TMP1
  |.else
  |   add CARG3, TMP2, TMP1
  |   lwz CARG1, 0(CARG3)
  |   lwz CARG2, 4(CARG3)
  |   add CARG3, BASE, TMP1
  |   stw CARG1, 0(CARG3)
  |   stw CARG2, 4(CARG3)
  |.endif
  |    addi TMP1, TMP1, 8
  |  bne <5
  |6:
  |  andix. TMP0, PC, FRAME_TYPE
  |.if resume
  |  li TMP1, LJ_TTRUE
  |   la RA, -8(BASE)
  |  stw TMP1, -8(BASE)			// Prepend true to results.
  |  addi RD, RD, 16
  |.else
  |  mr RA, BASE
  |  addi RD, RD, 8
  |.endif
  |7:
  |    stw PC, SAVE_PC
  |   mr MULTRES, RD
  |  beq ->BC_RET_Z
  |  b ->vm_return
  |
  |8:  // Coroutine returned with error (at co->top-1).
  |.if resume
  |  andix. TMP0, PC, FRAME_TYPE
  |  la TMP3, -8(TMP3)
  |   li TMP1, LJ_TFALSE
  |.if FPU
  |  lfd f0, 0(TMP3)
  |.else
  |  lwz CARG1, 0(TMP3)
  |  lwz CARG2, 4(TMP3)
  |.endif
  |   stp TMP3, L:SAVE0->top		// Remove error from coroutine stack.
  |    li RD, (2+1)*8
  |   stw TMP1, -8(BASE)		// Prepend false to results.
  |    la RA, -8(BASE)
  |.if FPU
  |  stfd f0, 0(BASE)			// Copy error message.
  |.else
  |  stw CARG1, 0(BASE)			// Copy error message.
  |  stw CARG2, 4(BASE)
  |.endif
  |  b <7
  |.else
  |  mr CARG1, L
  |  mr CARG2, L:SAVE0
  |  bl extern lj_ffh_coroutine_wrap_err  // (lua_State *L, lua_State *co)
  |.endif
  |
  |9:  // Handle stack expansion on return from yield.
  |  mr CARG1, L
  |  srwi CARG2, RD, 3
  |  bl extern lj_state_growstack	// (lua_State *L, int n)
  |  li CRET1, 0
  |  b <4
  |.endmacro
  |
  |  coroutine_resume_wrap 1		// coroutine.resume
  |  coroutine_resume_wrap 0		// coroutine.wrap
  |
  |.ffunc coroutine_yield
  |  lp TMP0, L->cframe
  |   add TMP1, BASE, NARGS8:RC
  |   stp BASE, L->base
  |  andix. TMP0, TMP0, CFRAME_RESUME
  |   stp TMP1, L->top
  |    li CRET1, LUA_YIELD
  |  beq ->fff_fallback
  |   stp ZERO, L->cframe
  |    stb CRET1, L->status
  |  b ->vm_leave_unw
  |
  |//-- Math library -------------------------------------------------------
  |
  |.ffunc_1 math_abs
  |  checknum CARG3
  |.if DUALNUM
  |  bne >2
  |  srawi TMP1, CARG1, 31
  |  xor TMP2, TMP1, CARG1
  |.if GPR64
  |  lus TMP0, 0x8000
  |  sub CARG1, TMP2, TMP1
  |  cmplw CARG1, TMP0
  |  beq >1
  |.else
  |  sub. CARG1, TMP2, TMP1
  |  blt >1
  |.endif
  |->fff_resi:
  |  lwz PC, FRAME_PC(BASE)
  |  la RA, -8(BASE)
  |  stw TISNUM, -8(BASE)
  |  stw CRET1, -4(BASE)
  |  b ->fff_res1
  |1:
  |  lus CARG3, 0x41e0	// 2^31.
  |  li CARG1, 0
  |  b ->fff_restv
  |2:
  |.endif
  |  bge ->fff_fallback
  |  rlwinm CARG3, CARG3, 0, 1, 31
  |  // Fallthrough.
  |
  |->fff_restv:
  |  // CARG3/CARG1 = TValue result.
  |  lwz PC, FRAME_PC(BASE)
  |   stw CARG3, -8(BASE)
  |  la RA, -8(BASE)
  |   stw CARG1, -4(BASE)
  |->fff_res1:
  |  // RA = results, PC = return.
  |  li RD, (1+1)*8
  |->fff_res:
  |  // RA = results, RD = (nresults+1)*8, PC = return.
  |  andix. TMP0, PC, FRAME_TYPE
  |   mr MULTRES, RD
  |  bney ->vm_return
  |  lwz INS, -4(PC)
  |  decode_RB8 RB, INS



( run in 0.611 second using v1.01-cache-2.11-cpan-39bf76dae61 )