mirror of
https://github.com/love2d/megasource.git
synced 2026-08-18 19:54:37 +02:00
Update LuaJIT to the latest 2.1.0 source (f3c8569)
This commit is contained in:
+117
-33
@@ -1,6 +1,6 @@
|
||||
|// Low-level VM code for MIPS CPUs.
|
||||
|// Bytecode interpreter, fast functions and helper functions.
|
||||
|// Copyright (C) 2005-2020 Mike Pall. See Copyright Notice in luajit.h
|
||||
|// Copyright (C) 2005-2021 Mike Pall. See Copyright Notice in luajit.h
|
||||
|//
|
||||
|// MIPS soft-float support contributed by Djordje Kovacevic and
|
||||
|// Stefan Pejic from RT-RK.com, sponsored by Cisco Systems, Inc.
|
||||
@@ -190,7 +190,7 @@
|
||||
|//-----------------------------------------------------------------------
|
||||
|
|
||||
|// Trap for not-yet-implemented parts.
|
||||
|.macro NYI; .long 0xf0f0f0f0; .endmacro
|
||||
|.macro NYI; .long 0xec1cf0f0; .endmacro
|
||||
|
|
||||
|// Macros to mark delay slots.
|
||||
|.macro ., a; a; .endmacro
|
||||
@@ -501,6 +501,10 @@ static void build_subroutines(BuildCtx *ctx)
|
||||
| b ->vm_returnc
|
||||
|. li RD, 16 // 2 results: false + error message.
|
||||
|
|
||||
|->vm_unwind_stub: // Jump to exit stub from unwinder.
|
||||
| jr CARG1
|
||||
|. move ra, CARG2
|
||||
|
|
||||
|//-----------------------------------------------------------------------
|
||||
|//-- Grow stack for calls -----------------------------------------------
|
||||
|//-----------------------------------------------------------------------
|
||||
@@ -669,11 +673,11 @@ static void build_subroutines(BuildCtx *ctx)
|
||||
|.endif
|
||||
| lw PC, -16+HI(RB) // Restore PC from [cont|PC].
|
||||
| addu TMP2, RA, RD
|
||||
| lw TMP1, LFUNC:TMP1->pc
|
||||
|.if FFI
|
||||
| bnez AT, >1
|
||||
|.endif
|
||||
|. sw TISNIL, -8+HI(TMP2) // Ensure one valid arg.
|
||||
| lw TMP1, LFUNC:TMP1->pc
|
||||
| // BASE = base, RA = resultptr, RB = meta base
|
||||
| jr TMP0 // Jump to continuation.
|
||||
|. lw KBASE, PC2PROTO(k)(TMP1)
|
||||
@@ -1258,35 +1262,27 @@ static void build_subroutines(BuildCtx *ctx)
|
||||
|//-- Base library: iterators -------------------------------------------
|
||||
|
|
||||
|.ffunc next
|
||||
| lw CARG1, HI(BASE)
|
||||
| lw TAB:CARG2, LO(BASE)
|
||||
| lw CARG2, HI(BASE)
|
||||
| lw TAB:CARG1, LO(BASE)
|
||||
| beqz NARGS8:RC, ->fff_fallback
|
||||
|. addu TMP2, BASE, NARGS8:RC
|
||||
| li AT, LJ_TTAB
|
||||
| sw TISNIL, HI(TMP2) // Set missing 2nd arg to nil.
|
||||
| bne CARG1, AT, ->fff_fallback
|
||||
| bne CARG2, AT, ->fff_fallback
|
||||
|. lw PC, FRAME_PC(BASE)
|
||||
| load_got lj_tab_next
|
||||
| sw BASE, L->base // Add frame since C call can throw.
|
||||
| sw BASE, L->top // Dummy frame length is ok.
|
||||
| addiu CARG3, BASE, 8
|
||||
| sw PC, SAVE_PC
|
||||
| call_intern lj_tab_next // (lua_State *L, GCtab *t, TValue *key)
|
||||
|. move CARG1, L
|
||||
| // Returns 0 at end of traversal.
|
||||
| addiu CARG2, BASE, 8
|
||||
| call_intern lj_tab_next // (GCtab *t, cTValue *key, TValue *o)
|
||||
|. addiu CARG3, BASE, -8
|
||||
| // Returns 1=found, 0=end, -1=error.
|
||||
| addiu RA, BASE, -8
|
||||
| bgtz CRET1, ->fff_res // Found key/value.
|
||||
|. li RD, (2+1)*8
|
||||
| beqz CRET1, ->fff_restv // End of traversal: return nil.
|
||||
|. li SFARG1HI, LJ_TNIL
|
||||
| lw TMP0, 8+HI(BASE)
|
||||
| lw TMP1, 8+LO(BASE)
|
||||
| addiu RA, BASE, -8
|
||||
| lw TMP2, 16+HI(BASE)
|
||||
| lw TMP3, 16+LO(BASE)
|
||||
| sw TMP0, HI(RA)
|
||||
| sw TMP1, LO(RA)
|
||||
| sw TMP2, 8+HI(RA)
|
||||
| sw TMP3, 8+LO(RA)
|
||||
| b ->fff_res
|
||||
|. li RD, (2+1)*8
|
||||
| lw CFUNC:RB, FRAME_FUNC(BASE)
|
||||
| b ->fff_fallback // Invalid key.
|
||||
|. li RC, 2*8
|
||||
|
|
||||
|.ffunc_1 pairs
|
||||
| li AT, LJ_TTAB
|
||||
@@ -1967,7 +1963,7 @@ static void build_subroutines(BuildCtx *ctx)
|
||||
| lw TMP0, SBUF:CARG1->b
|
||||
| sw L, SBUF:CARG1->L
|
||||
| sw BASE, L->base
|
||||
| sw TMP0, SBUF:CARG1->p
|
||||
| sw TMP0, SBUF:CARG1->w
|
||||
| call_intern extern lj_buf_putstr_ .. name
|
||||
|. sw PC, SAVE_PC
|
||||
| load_got lj_buf_tostr
|
||||
@@ -2520,8 +2516,9 @@ static void build_subroutines(BuildCtx *ctx)
|
||||
|. addu RA, RA, BASE
|
||||
|
|
||||
|9: // Rethrow error from the right C frame.
|
||||
| load_got lj_err_run
|
||||
| call_intern lj_err_run // (lua_State *L)
|
||||
| load_got lj_err_trace
|
||||
| sub CARG2, r0, CRET1
|
||||
| call_intern lj_err_trace // (lua_State *L, int errcode)
|
||||
|. move CARG1, L
|
||||
|.endif
|
||||
|
|
||||
@@ -2801,6 +2798,73 @@ static void build_subroutines(BuildCtx *ctx)
|
||||
|//-- Miscellaneous functions --------------------------------------------
|
||||
|//-----------------------------------------------------------------------
|
||||
|
|
||||
|.define NEXT_TAB, TAB:CARG1
|
||||
|.define NEXT_IDX, CARG2
|
||||
|.define NEXT_ASIZE, CARG3
|
||||
|.define NEXT_NIL, CARG4
|
||||
|.define NEXT_TMP0, r12
|
||||
|.define NEXT_TMP1, r13
|
||||
|.define NEXT_TMP2, r14
|
||||
|.define NEXT_RES_VK, CRET1
|
||||
|.define NEXT_RES_IDX, CRET2
|
||||
|.define NEXT_RES_PTR, sp
|
||||
|.define NEXT_RES_VAL_I, 0(sp)
|
||||
|.define NEXT_RES_VAL_IT, 4(sp)
|
||||
|.define NEXT_RES_KEY_I, 8(sp)
|
||||
|.define NEXT_RES_KEY_IT, 12(sp)
|
||||
|
|
||||
|// TValue *lj_vm_next(GCtab *t, uint32_t idx)
|
||||
|// Next idx returned in CRET2.
|
||||
|->vm_next:
|
||||
|.if JIT and ENDIAN_LE
|
||||
| lw NEXT_ASIZE, NEXT_TAB->asize
|
||||
| lw NEXT_TMP0, NEXT_TAB->array
|
||||
| li NEXT_NIL, LJ_TNIL
|
||||
|1: // Traverse array part.
|
||||
| sltu AT, NEXT_IDX, NEXT_ASIZE
|
||||
| sll NEXT_TMP1, NEXT_IDX, 3
|
||||
| beqz AT, >5
|
||||
|. addu NEXT_TMP1, NEXT_TMP0, NEXT_TMP1
|
||||
| lw NEXT_TMP2, 4(NEXT_TMP1)
|
||||
| sw NEXT_IDX, NEXT_RES_KEY_I
|
||||
| beq NEXT_TMP2, NEXT_NIL, <1
|
||||
|. addiu NEXT_IDX, NEXT_IDX, 1
|
||||
| lw NEXT_TMP0, 0(NEXT_TMP1)
|
||||
| li AT, LJ_TISNUM
|
||||
| sw NEXT_TMP2, NEXT_RES_VAL_IT
|
||||
| sw AT, NEXT_RES_KEY_IT
|
||||
| sw NEXT_TMP0, NEXT_RES_VAL_I
|
||||
| move NEXT_RES_VK, NEXT_RES_PTR
|
||||
| jr ra
|
||||
|. move NEXT_RES_IDX, NEXT_IDX
|
||||
|
|
||||
|5: // Traverse hash part.
|
||||
| subu NEXT_RES_IDX, NEXT_IDX, NEXT_ASIZE
|
||||
| lw NODE:NEXT_RES_VK, NEXT_TAB->node
|
||||
| sll NEXT_TMP2, NEXT_RES_IDX, 5
|
||||
| lw NEXT_TMP0, NEXT_TAB->hmask
|
||||
| sll AT, NEXT_RES_IDX, 3
|
||||
| subu AT, NEXT_TMP2, AT
|
||||
| addu NODE:NEXT_RES_VK, NODE:NEXT_RES_VK, AT
|
||||
|6:
|
||||
| sltu AT, NEXT_TMP0, NEXT_RES_IDX
|
||||
| bnez AT, >8
|
||||
|. nop
|
||||
| lw NEXT_TMP2, NODE:NEXT_RES_VK->val.it
|
||||
| bne NEXT_TMP2, NEXT_NIL, >9
|
||||
|. addiu NEXT_RES_IDX, NEXT_RES_IDX, 1
|
||||
| // Skip holes in hash part.
|
||||
| b <6
|
||||
|. addiu NODE:NEXT_RES_VK, NODE:NEXT_RES_VK, sizeof(Node)
|
||||
|
|
||||
|8: // End of iteration. Set the key to nil (not the value).
|
||||
| sw NEXT_NIL, NEXT_RES_KEY_IT
|
||||
| move NEXT_RES_VK, NEXT_RES_PTR
|
||||
|9:
|
||||
| jr ra
|
||||
|. addu NEXT_RES_IDX, NEXT_RES_IDX, NEXT_ASIZE
|
||||
|.endif
|
||||
|
|
||||
|//-----------------------------------------------------------------------
|
||||
|//-- FFI helper functions -----------------------------------------------
|
||||
|//-----------------------------------------------------------------------
|
||||
@@ -4524,10 +4588,11 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
|
||||
break;
|
||||
|
||||
case BC_ITERN:
|
||||
| // RA = base*8, (RB = (nresults+1)*8, RC = (nargs+1)*8 (2+1)*8)
|
||||
|.if JIT
|
||||
| // NYI: add hotloop, record BC_ITERN.
|
||||
|.if JIT and ENDIAN_LE
|
||||
| hotloop
|
||||
|.endif
|
||||
|->vm_IITERN:
|
||||
| // RA = base*8, (RB = (nresults+1)*8, RC = (nargs+1)*8 (2+1)*8)
|
||||
| addu RA, BASE, RA
|
||||
| lw TAB:RB, -16+LO(RA)
|
||||
| lw RC, -8+LO(RA) // Get index from control var.
|
||||
@@ -4606,9 +4671,9 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
|
||||
| addiu CARG2, CARG2, -FF_next_N
|
||||
| or CARG2, CARG2, CARG3
|
||||
| bnez CARG2, >5
|
||||
|. lui TMP1, 0xfffe
|
||||
|. lui TMP1, (LJ_KEYINDEX >> 16)
|
||||
| addu PC, TMP0, TMP2
|
||||
| ori TMP1, TMP1, 0x7fff
|
||||
| ori TMP1, TMP1, (LJ_KEYINDEX & 0xffff)
|
||||
| sw r0, -8+LO(RA) // Initialize control var.
|
||||
| sw TMP1, -8+HI(RA)
|
||||
|1:
|
||||
@@ -4617,9 +4682,28 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
|
||||
| li TMP3, BC_JMP
|
||||
| li TMP1, BC_ITERC
|
||||
| sb TMP3, -4+OFS_OP(PC)
|
||||
| addu PC, TMP0, TMP2
|
||||
| addu PC, TMP0, TMP2
|
||||
|.if JIT
|
||||
| lb TMP0, OFS_OP(PC)
|
||||
| li AT, BC_ITERN
|
||||
| bne TMP0, AT, >6
|
||||
|. lhu TMP2, OFS_RD(PC)
|
||||
|.endif
|
||||
| b <1
|
||||
|. sb TMP1, OFS_OP(PC)
|
||||
|.if JIT
|
||||
|6: // Unpatch JLOOP.
|
||||
| lw TMP0, DISPATCH_J(trace)(DISPATCH)
|
||||
| sll TMP2, TMP2, 2
|
||||
| addu TMP0, TMP0, TMP2
|
||||
| lw TRACE:TMP2, 0(TMP0)
|
||||
| lw TMP0, TRACE:TMP2->startins
|
||||
| li AT, -256
|
||||
| and TMP0, TMP0, AT
|
||||
| or TMP0, TMP0, TMP1
|
||||
| b <1
|
||||
|. sw TMP0, 0(PC)
|
||||
|.endif
|
||||
break;
|
||||
|
||||
case BC_VARG:
|
||||
|
||||
Reference in New Issue
Block a user