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 )