diff --git a/add-sw-support.patch b/add-sw-support.patch index a455bfc34067d18291d485c304c0c9983d1b6cd7..98c750d7ba594366172edaec1f47ec965f5995c6 100644 --- a/add-sw-support.patch +++ b/add-sw-support.patch @@ -1,10 +1,25 @@ -diff -Naur a/dynasm/dasm_sw64.h b/dynasm/dasm_sw64.h ---- a/dynasm/dasm_sw64.h 1970-01-01 08:00:00.000000000 +0800 -+++ b/dynasm/dasm_sw64.h 2024-11-05 13:30:00.007085745 +0800 -@@ -0,0 +1,425 @@ +diff --git a/Makefile b/Makefile +index 0f93308..86714ae 100644 +--- a/Makefile ++++ b/Makefile +@@ -88,7 +88,7 @@ FILES_INC= lua.h lualib.h lauxlib.h luaconf.h lua.hpp luajit.h + FILES_JITLIB= bc.lua bcsave.lua dump.lua p.lua v.lua zone.lua \ + dis_x86.lua dis_x64.lua dis_arm.lua dis_arm64.lua \ + dis_arm64be.lua dis_ppc.lua dis_mips.lua dis_mipsel.lua \ +- dis_mips64.lua dis_mips64el.lua vmdef.lua ++ dis_mips64.lua dis_mips64el.lua vmdef.lua dis_sw64.lua + + ifeq (,$(findstring Windows,$(OS))) + HOST_SYS:= $(shell uname -s) +diff --git a/dynasm/dasm_sw64.h b/dynasm/dasm_sw64.h +new file mode 100644 +index 0000000..319f79b +--- /dev/null ++++ b/dynasm/dasm_sw64.h +@@ -0,0 +1,419 @@ +/* +** DynASM SW64 encoding engine. -+** Copyright (C) 2023 Sheng Kai. All rights reserved. ++** Copyright (C) 2023 Mike Pall. All rights reserved. +** Released under the MIT license. See dynasm.lua for full copyright notice. +*/ + @@ -354,12 +369,6 @@ diff -Naur a/dynasm/dasm_sw64.h b/dynasm/dasm_sw64.h + break; + case DASM_REL_LG: + CK(n >= 0, UNDEF_LG); -+// if (!(n >= 0)) { -+// D->status = DASM_S_UNDEF_LG|(p-D->actionlist-1); -+// printf("ZHJ222: secnum is %d, status: 0x%x\n", secnum, ctx->D->status); -+// return; -+// } -+ /* fallthrough */ + case DASM_REL_PC: + CK(n >= 0, UNDEF_PC); + n = *DASM_POS2PTR(D, n); @@ -427,14 +436,16 @@ diff -Naur a/dynasm/dasm_sw64.h b/dynasm/dasm_sw64.h +} +#endif + -diff -Naur a/dynasm/dasm_sw64.lua b/dynasm/dasm_sw64.lua ---- a/dynasm/dasm_sw64.lua 1970-01-01 08:00:00.000000000 +0800 -+++ b/dynasm/dasm_sw64.lua 2024-11-05 13:31:27.497019233 +0800 +diff --git a/dynasm/dasm_sw64.lua b/dynasm/dasm_sw64.lua +new file mode 100644 +index 0000000..3787d6c +--- /dev/null ++++ b/dynasm/dasm_sw64.lua @@ -0,0 +1,767 @@ +------------------------------------------------------------------------------ +-- DynASM SW64 module. +-- -+-- Copyright (C) 2023 Sheng Kai. All rights reserved. ++-- Copyright (C) 2023 Mike Pall. All rights reserved. +-- See dynasm.lua for full copyright notice. +------------------------------------------------------------------------------ + @@ -445,7 +456,7 @@ diff -Naur a/dynasm/dasm_sw64.lua b/dynasm/dasm_sw64.lua + version = "1.4.0", + vernum = 10400, + release = "2023-02-03", -+ author = "Sheng Kai", ++ author = "Mike Pall", + license = "MIT", +} + @@ -1198,34 +1209,61 @@ diff -Naur a/dynasm/dasm_sw64.lua b/dynasm/dasm_sw64.lua +return _M + +------------------------------------------------------------------------------ -diff -Naur a/Makefile b/Makefile ---- a/Makefile 2024-11-05 09:58:44.429962466 +0800 -+++ b/Makefile 2024-11-05 14:07:25.739965053 +0800 -@@ -99,7 +99,7 @@ - dis_x86.lua dis_x64.lua dis_arm.lua dis_arm64.lua \ - dis_arm64be.lua dis_ppc.lua dis_mips.lua dis_mipsel.lua \ - dis_mips64.lua dis_mips64el.lua \ -- dis_mips64r6.lua dis_mips64r6el.lua \ -+ dis_mips64r6.lua dis_mips64r6el.lua dis_sw64.lua\ - vmdef.lua +diff --git a/src/Makefile b/src/Makefile +index f56465d..0226e27 100644 +--- a/src/Makefile ++++ b/src/Makefile +@@ -53,6 +53,7 @@ CCOPT_arm= + CCOPT_arm64= + CCOPT_ppc= + CCOPT_mips= ++CCOPT_sw64= -mieee + # + CCDEBUG= + # Uncomment the next line to generate debug information: +@@ -232,6 +233,9 @@ TARGET_ASHLDFLAGS= $(LDOPTIONS) $(TARGET_XSHLDFLAGS) $(TARGET_FLAGS) $(TARGET_SH + TARGET_ALIBS= $(TARGET_XLIBS) $(LIBS) $(TARGET_LIBS) - ifeq (,$(findstring Windows,$(OS))) -diff -Naur a/src/host/buildvm_asm.c b/src/host/buildvm_asm.c ---- a/src/host/buildvm_asm.c 2024-11-05 09:58:44.401962793 +0800 -+++ b/src/host/buildvm_asm.c 2024-11-05 11:04:43.382923361 +0800 -@@ -151,7 +151,7 @@ - ins, sym); - exit(1); - } --#elif LJ_TARGET_MIPS -+#elif LJ_TARGET_MIPS || LJ_TARGET_SW64 - fprintf(stderr, - "Error: unsupported opcode %08x for %s symbol relocation.\n", - ins, sym); -diff -Naur a/src/host/buildvm.c b/src/host/buildvm.c ---- a/src/host/buildvm.c 2024-11-05 09:58:44.397962840 +0800 -+++ b/src/host/buildvm.c 2024-11-05 11:03:43.422758962 +0800 -@@ -67,6 +67,8 @@ + TARGET_TESTARCH=$(shell $(TARGET_CC) $(TARGET_TCFLAGS) -E lj_arch.h -dM) ++ifneq (,$(findstring LJ_TARGET_SW64 ,$(TARGET_TESTARCH))) ++ TARGET_LJARCH= sw64 ++else + ifneq (,$(findstring LJ_TARGET_X64 ,$(TARGET_TESTARCH))) + TARGET_LJARCH= x64 + else +@@ -272,6 +276,7 @@ endif + endif + endif + endif ++endif + + ifneq (,$(findstring LJ_TARGET_PS3 1,$(TARGET_TESTARCH))) + TARGET_SYS= PS3 +@@ -425,6 +430,9 @@ ifneq (,$(findstring LJ_NO_UNWIND 1,$(TARGET_TESTARCH))) + DASM_AFLAGS+= -D NO_UNWIND + TARGET_ARCH+= -DLUAJIT_NO_UNWIND + endif ++ifneq (,$(findstring SW64_DEBUG_WI 1,$(TARGET_TESTARCH))) ++ DASM_AFLAGS+= -D SW64_DEBUG_WI ++endif + DASM_AFLAGS+= -D VER=$(subst LJ_ARCH_VERSION_,,$(filter LJ_ARCH_VERSION_%,$(subst LJ_ARCH_VERSION ,LJ_ARCH_VERSION_,$(TARGET_TESTARCH)))) + ifeq (Windows,$(TARGET_SYS)) + DASM_AFLAGS+= -D WIN +@@ -439,6 +447,9 @@ ifeq (arm,$(TARGET_LJARCH)) + DASM_AFLAGS+= -D IOS + endif + else ++ifeq (,$(findstring LJ_SW64_CORE4 ,$(TARGET_TESTARCH))) ++ DASM_AFLAGS+= -D SW64_CORE4 ++endif + ifeq (ppc,$(TARGET_LJARCH)) + ifneq (,$(findstring LJ_ARCH_SQRT 1,$(TARGET_TESTARCH))) + DASM_AFLAGS+= -D SQRT +diff --git a/src/host/buildvm.c b/src/host/buildvm.c +index de23fab..90a6556 100644 +--- a/src/host/buildvm.c ++++ b/src/host/buildvm.c +@@ -65,6 +65,8 @@ static int collect_reloc(BuildCtx *ctx, uint8_t *addr, int idx, int type); #include "../dynasm/dasm_ppc.h" #elif LJ_TARGET_MIPS #include "../dynasm/dasm_mips.h" @@ -1234,20 +1272,64 @@ diff -Naur a/src/host/buildvm.c b/src/host/buildvm.c #else #error "No support for this architecture (yet)" #endif -diff -Naur a/src/jit/bcsave.lua b/src/jit/bcsave.lua ---- a/src/jit/bcsave.lua 2024-11-05 09:58:44.401962793 +0800 -+++ b/src/jit/bcsave.lua 2024-11-05 11:05:26.331041117 +0800 -@@ -101,6 +101,7 @@ - mips64el = { e = "le", b = 64, m = 8, f = 0x80000007, }, - mips64r6 = { e = "be", b = 64, m = 8, f = 0xa0000407, }, - mips64r6el = { e = "le", b = 64, m = 8, f = 0xa0000407, }, -+ sw64 = { e = "le", b = 64, m = 39190, p = 0x9916, }, +diff --git a/src/host/buildvm_asm.c b/src/host/buildvm_asm.c +index ffd1490..2c01c02 100644 +--- a/src/host/buildvm_asm.c ++++ b/src/host/buildvm_asm.c +@@ -159,7 +159,7 @@ static void emit_asm_wordreloc(BuildCtx *ctx, uint8_t *p, int n, + ins, sym); + exit(1); + } +-#elif LJ_TARGET_MIPS ++#elif LJ_TARGET_MIPS || LJ_TARGET_SW64 + fprintf(stderr, + "Error: unsupported opcode %08x for %s symbol relocation.\n", + ins, sym); +diff --git a/src/jit/bcsave.lua b/src/jit/bcsave.lua +index c17c88e..3c47e25 100644 +--- a/src/jit/bcsave.lua ++++ b/src/jit/bcsave.lua +@@ -64,7 +64,7 @@ local map_type = { + + local map_arch = { + x86 = true, x64 = true, arm = true, arm64 = true, arm64be = true, +- ppc = true, mips = true, mipsel = true, ++ ppc = true, mips = true, mipsel = true, sw64 = true } local map_os = { -diff -Naur a/src/jit/dis_sw64.lua b/src/jit/dis_sw64.lua ---- a/src/jit/dis_sw64.lua 1970-01-01 08:00:00.000000000 +0800 -+++ b/src/jit/dis_sw64.lua 2024-11-05 13:32:17.092605371 +0800 +@@ -200,7 +200,7 @@ typedef struct { + ]] + local symname = LJBC_PREFIX..ctx.modname + local is64, isbe = false, false +- if ctx.arch == "x64" or ctx.arch == "arm64" or ctx.arch == "arm64be" then ++ if ctx.arch == "x64" or ctx.arch == "arm64" or ctx.arch == "arm64be" or ctx.arch == "sw64" then + is64 = true + elseif ctx.arch == "ppc" or ctx.arch == "mips" then + isbe = true +@@ -237,7 +237,7 @@ typedef struct { + hdr.eendian = isbe and 2 or 1 + hdr.eversion = 1 + hdr.type = f16(1) +- hdr.machine = f16(({ x86=3, x64=62, arm=40, arm64=183, arm64be=183, ppc=20, mips=8, mipsel=8 })[ctx.arch]) ++ hdr.machine = f16(({ x86=3, x64=62, arm=40, arm64=183, arm64be=183, ppc=20, mips=8, mipsel=8,sw64=39190 })[ctx.arch]) + if ctx.arch == "mips" or ctx.arch == "mipsel" then + hdr.flags = f32(0x50001006) + end +@@ -355,7 +355,7 @@ typedef struct { + -- Create PE object and fill in header. + local o = ffi.new("PEobj") + local hdr = o.hdr +- hdr.arch = f16(({ x86=0x14c, x64=0x8664, arm=0x1c0, ppc=0x1f2, mips=0x366, mipsel=0x366 })[ctx.arch]) ++ hdr.arch = f16(({ x86=0x14c, x64=0x8664, arm=0x1c0, ppc=0x1f2, mips=0x366, mipsel=0x366,sw64=0x9916 })[ctx.arch]) + hdr.nsects = f16(2) + hdr.symtabofs = f32(ffi.offsetof(o, "sym0")) + hdr.nsyms = f32(6) +diff --git a/src/jit/dis_sw64.lua b/src/jit/dis_sw64.lua +new file mode 100644 +index 0000000..16b60bf +--- /dev/null ++++ b/src/jit/dis_sw64.lua @@ -0,0 +1,649 @@ +---------------------------------------------------------------------------- +-- LuaJIT SW64 disassembler module. @@ -1898,53 +1980,56 @@ diff -Naur a/src/jit/dis_sw64.lua b/src/jit/dis_sw64.lua + regname = regname, + wi_debug = wi_debug, +} -diff -Naur a/src/jit/dump.lua b/src/jit/dump.lua ---- a/src/jit/dump.lua 2024-11-05 09:58:44.401962793 +0800 -+++ b/src/jit/dump.lua 2024-11-05 11:06:09.087158346 +0800 -@@ -618,7 +618,7 @@ - ------------------------------------------------------------------------------ - - local gpr64 = jit.arch:match("64") --local fprmips32 = jit.arch == "mips" or jit.arch == "mipsel" -+local fprmips32 = jit.arch == "mips" or jit.arch == "mipsel" or jit.arch == "sw64" - - -- Dump taken trace exits. - local function dump_texit(tr, ex, ngpr, nfpr, ...) -diff -Naur a/src/lib_jit.c b/src/lib_jit.c ---- a/src/lib_jit.c 2024-11-05 09:58:44.401962793 +0800 -+++ b/src/lib_jit.c 2024-11-05 11:08:11.795494788 +0800 -@@ -701,7 +701,8 @@ - if (x) flags |= JIT_F_MIPSXXR2; /* Either 0x80000000 (R2) or 0 (R1). */ +diff --git a/src/jit/dump.lua b/src/jit/dump.lua +index 2bea652..3f90fe9 100644 +--- a/src/jit/dump.lua ++++ b/src/jit/dump.lua +@@ -623,7 +623,7 @@ local function dump_texit(tr, ex, ngpr, nfpr, ...) + if i % 8 == 0 then out:write("\n") end + end + end +- if jit.arch == "mips" or jit.arch == "mipsel" then ++ if jit.arch == "mips" or jit.arch == "mipsel" or jit.arch == "sw64" then + for i=1,nfpr,2 do + out:write(format(" %+17.14g", regs[ngpr+i])) + if i % 8 == 7 then out:write("\n") end +diff --git a/src/lib_jit.c b/src/lib_jit.c +index 22ca0a1..4be1761 100644 +--- a/src/lib_jit.c ++++ b/src/lib_jit.c +@@ -732,6 +732,8 @@ static uint32_t jit_cpudetect(lua_State *L) } #endif -- + #endif +#elif LJ_TARGET_SW64 + /* Nothing to do. */ #else #error "Missing CPU detection for this architecture" #endif -diff -Naur a/src/lj_arch.h b/src/lj_arch.h ---- a/src/lj_arch.h 2024-11-05 09:58:44.405962746 +0800 -+++ b/src/lj_arch.h 2024-11-05 14:09:09.740423771 +0800 -@@ -31,6 +31,8 @@ +diff --git a/src/lj_arch.h b/src/lj_arch.h +index c8d7138..070bd89 100644 +--- a/src/lj_arch.h ++++ b/src/lj_arch.h +@@ -29,6 +29,9 @@ #define LUAJIT_ARCH_mips32 6 #define LUAJIT_ARCH_MIPS64 7 #define LUAJIT_ARCH_mips64 7 +#define LUAJIT_ARCH_SW64 77 +#define LUAJIT_ARCH_sw64 77 ++ /* Target OS. */ #define LUAJIT_OS_OTHER 0 -@@ -65,6 +67,8 @@ +@@ -55,6 +58,8 @@ #define LUAJIT_TARGET LUAJIT_ARCH_MIPS64 #elif defined(__mips__) || defined(__mips) || defined(__MIPS__) || defined(__MIPS) #define LUAJIT_TARGET LUAJIT_ARCH_MIPS32 +#elif defined(__sw_64__) +#define LUAJIT_TARGET LUAJIT_ARCH_SW64 #else - #error "Architecture not supported (in this version), see: https://luajit.org/status.html#architectures" + #error "No support for this architecture (yet)" #endif -@@ -439,6 +443,23 @@ +@@ -358,6 +363,24 @@ #define LJ_ARCH_VERSION 10 #endif @@ -1964,23 +2049,25 @@ diff -Naur a/src/lj_arch.h b/src/lj_arch.h +#define LJ_ARCH_VERSION 10 // ?? +#define LJ_PAGESIZE 8192 +#define SW64_DEBUG_WI 0 ++#define LJ_SW64_CORE4 0 + #else #error "No target architecture defined" #endif -@@ -674,7 +695,7 @@ - #endif +@@ -553,7 +576,7 @@ + #define LUAJIT_NO_UNWIND 1 #endif --#if defined(LUAJIT_NO_UNWIND) || __GNU_COMPACT_EH__ || defined(__symbian__) || LJ_TARGET_IOS || LJ_TARGET_PS3 || LJ_TARGET_PS4 || LJ_TARGET_PS5 -+#if defined(LUAJIT_NO_UNWIND) || __GNU_COMPACT_EH__ || defined(__symbian__) || LJ_TARGET_IOS || LJ_TARGET_PS3 || LJ_TARGET_PS4 || LJ_TARGET_PS5 || LJ_TARGET_SW64 +-#if defined(LUAJIT_NO_UNWIND) || defined(__symbian__) || LJ_TARGET_IOS || LJ_TARGET_PS3 || LJ_TARGET_PS4 ++#if defined(LUAJIT_NO_UNWIND) || defined(__symbian__) || LJ_TARGET_IOS || LJ_TARGET_PS3 || LJ_TARGET_PS4 || LJ_TARGET_SW64 #define LJ_NO_UNWIND 1 #endif -diff -Naur a/src/lj_asm.c b/src/lj_asm.c ---- a/src/lj_asm.c 2024-11-05 09:58:44.405962746 +0800 -+++ b/src/lj_asm.c 2024-11-05 11:14:40.200559720 +0800 -@@ -227,6 +227,8 @@ +diff --git a/src/lj_asm.c b/src/lj_asm.c +index c2cf5a9..febea55 100644 +--- a/src/lj_asm.c ++++ b/src/lj_asm.c +@@ -177,6 +177,8 @@ IRFLDEF(FLOFS) #include "lj_emit_ppc.h" #elif LJ_TARGET_MIPS #include "lj_emit_mips.h" @@ -1989,7 +2076,7 @@ diff -Naur a/src/lj_asm.c b/src/lj_asm.c #else #error "Missing instruction emitter for target CPU" #endif -@@ -1708,6 +1710,8 @@ +@@ -1597,6 +1599,8 @@ static void asm_loop(ASMState *as) #include "lj_asm_ppc.h" #elif LJ_TARGET_MIPS #include "lj_asm_mips.h" @@ -1998,8 +2085,8 @@ diff -Naur a/src/lj_asm.c b/src/lj_asm.c #else #error "Missing assembler for target CPU" #endif -@@ -2598,7 +2602,9 @@ - asm_snap_prev(as); +@@ -2374,7 +2378,9 @@ void lj_asm_trace(jit_State *J, GCtrace *T) + T->nins = J->curfinal->nins; break; /* Done. */ } - @@ -2009,10 +2096,12 @@ diff -Naur a/src/lj_asm.c b/src/lj_asm.c /* Otherwise try again with a bigger IR. */ lj_trace_free(J2G(J), J->curfinal); J->curfinal = NULL; /* In case lj_trace_alloc() OOMs. */ -diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h ---- a/src/lj_asm_sw64.h 1970-01-01 08:00:00.000000000 +0800 -+++ b/src/lj_asm_sw64.h 2024-11-05 22:08:21.417108255 +0800 -@@ -0,0 +1,2131 @@ +diff --git a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h +new file mode 100644 +index 0000000..6564c77 +--- /dev/null ++++ b/src/lj_asm_sw64.h +@@ -0,0 +1,2072 @@ +/* +** SW64 IR assembler (SSA IR -> machine code). +** Copyright (C) 2019 deepin inc. See Copyright Notice in luajit.h @@ -2043,7 +2132,7 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h +{ + Reg r = IR(ref)->r; + if (ra_noreg(r)) { -+ if (!(allow & RSET_FPR) && irref_isk(ref) && get_kval(as, ref) == 0) ++ if (!(allow & RSET_FPR) && irref_isk(ref) && get_kval(IR(ref)) == 0) + return RID_ZERO; + r = ra_allocref(as, ref, allow); + } else { @@ -2144,9 +2233,6 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + return ra_allock(as, ofs-(int16_t)ofs, allow); + } + } -+ } else if (ir->o == IR_TMPREF) { -+ *ofsp = (int32_t)(offsetof(global_State, tmptv)-32768); -+ return RID_JGL; + } + } + *ofsp = 0; @@ -2196,29 +2282,17 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h +/* Setup spare long-range jump slots per mcarea. */ +static void asm_sparejump_setup(ASMState *as) +{ -+ MCode *mxp = as->mctop; -+ if ((char *)mxp == (char *)as->J->mcarea + as->J->szmcarea) { -+ mxp -= SW64_SPAREJUMP*2; -+ lj_assertA(SW64I_NOP == 0x43ff075f, "bad NOP"); -+ memset(mxp, 0, SW64_SPAREJUMP*2*sizeof(MCode)); -+ as->mctop = mxp; -+ } -+} -+ -+static MCode *asm_sparejump_use(MCode *mcarea, MCode tjump) -+{ -+ MCode *mxp = (MCode *)((char *)mcarea + ((MCLink *)mcarea)->size); -+ int slot = SW64_SPAREJUMP; -+ while (slot--) { -+ mxp -= 2; -+ if (*mxp == tjump) { -+ return mxp; -+ } else if (*mxp == SW64I_NOP) { -+ *mxp = tjump; -+ return mxp; -+ } ++ MCode *mxp = as->mcbot; ++ if (((uintptr_t)mxp & (LJ_PAGESIZE-1)) == 8) { ++ lua_assert(SW64I_NOP == 0x43ff075f); ++ memset(mxp, SW64I_NOP, SW64_SPAREJUMP*2*sizeof(MCode)); ++ mxp += SW64_SPAREJUMP*2; ++ lua_assert(mxp < as->mctop); ++ lj_mcode_sync(as->mcbot, mxp); ++ lj_mcode_commitbot(as->J, mxp); ++ as->mcbot = mxp; ++ as->mclim = as->mcbot + MCLIM_REDZONE; + } -+ return NULL; +} + +/* Setup exit stub after the end of each trace. */ @@ -2315,20 +2389,20 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + if (ra_noreg(ir->r) && canfuse(as, ir)) { + if (ir->o == IR_ADD) { + intptr_t ofs2; -+ if (irref_isk(ir->op2) && (ofs2 = ofs + get_kval(as, ir->op2), ++ if (irref_isk(ir->op2) && (ofs2 = ofs + get_kval(IR(ir->op2)), + checki16(ofs2))) { + ref = ir->op1; + ofs = (int32_t)ofs2; + } + } else if (ir->o == IR_STRREF) { + intptr_t ofs2 = 65536; -+ lj_assertA(ofs == 0, "bad usage"); ++ lua_assert(ofs == 0); + ofs = (int32_t)sizeof(GCstr); + if (irref_isk(ir->op2)) { -+ ofs2 = ofs + get_kval(as, ir->op2); ++ ofs2 = ofs + get_kval(IR(ir->op2)); + ref = ir->op1; + } else if (irref_isk(ir->op1)) { -+ ofs2 = ofs + get_kval(as, ir->op1); ++ ofs2 = ofs + get_kval(IR(ir->op1)); + ref = ir->op2; + } + if (!checki16(ofs2)) { @@ -2365,15 +2439,13 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + IRIns *ir = IR(ref); + if (irt_isfp(ir->t) && fpr <= REGARG_LASTFPR && + !(ci->flags & CCI_VARARG)) { -+ lj_assertA(rset_test(as->freeset, fpr), -+ "reg %d not free", fpr); /* Already evicted. */ ++ lua_assert(rset_test(as->freeset, fpr)); /* Already evicted. */ + ra_leftov(as, fpr, ref); + fpr += 1; + gpr += 1; + } else { + if (gpr <= REGARG_LASTGPR) { -+ lj_assertA(rset_test(as->freeset, gpr), -+ "reg %d not free", gpr); /* Already evicted. */ ++ lua_assert(rset_test(as->freeset, gpr)); /* Already evicted. */ + if (irt_isfp(ir->t)) { + RegSet of = as->freeset; + Reg r; @@ -2429,7 +2501,7 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + rset_clear(drop, ir->r); /* Dest reg handled below. */ + ra_evictset(as, drop); /* Evictions must be performed first. */ + if (ra_used(ir)) { -+ lj_assertA(!irt_ispri(ir->t), "PRI dest"); ++ lua_assert(!irt_ispri(ir->t)); + if (irt_isfp(ir->t)) { + if ((ci->flags & CCI_CASTU64)) { + int32_t ofs = sps_scale(ir->s); @@ -2465,7 +2537,7 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + func = ir->op2; irf = IR(func); + if (irf->o == IR_CARG) { func = irf->op1; irf = IR(func); } + if (irref_isk(func)) { /* Call to constant address. */ -+ ci.func = (ASMFunction)(void *)get_kval(as, func); ++ ci.func = (ASMFunction)(void *)get_kval(irf); + } else { /* Need specific register for indirect calls. */ + Reg r = ra_alloc1(as, func, RID2RSET(RID_CFUNCADDR)); + MCode *p = as->mcp; @@ -2500,22 +2572,6 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + emit_Ao(as, SW64I_AL, RID_TMP, base, -8); +} + -+/* -- Buffer operations --------------------------------------------------- */ -+ -+#if LJ_HASBUFFER -+static void asm_bufhdr_write(ASMState *as, Reg sb) -+{ -+ Reg tmp = ra_scratch(as, rset_exclude(RSET_GPR, sb)); -+ IRIns irgc; -+ irgc.ot = IRT(0, IRT_PGC); /* GC type. */ -+ emit_storeofs(as, &irgc, RID_TMP, sb, offsetof(SBuf, L)); -+ emit_ABD(as, SW64I_BIS, RID_TMP, tmp, RID_TMP); -+ emit_AjD(as, SW64I_ANDI, tmp, SBUF_MASK_FLAG, tmp); -+ emit_getgl(as, RID_TMP, cur_L); -+ emit_loadofs(as, &irgc, tmp, sb, offsetof(SBuf, L)); -+} -+#endif -+ +/* -- Type conversions ---------------------------------------------------- */ + +static void asm_tointg(ASMState *as, IRIns *ir, Reg left) @@ -2558,7 +2614,7 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + + IRRef lref = ir->op1; + -+ lj_assertA(irt_type(ir->t) != st, "inconsistent types for CONV"); ++ lua_assert(irt_type(ir->t) != st); + + if (irt_isfp(ir->t)) { + Reg dest = ra_dest(as, ir, RSET_FPR); @@ -2594,8 +2650,7 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + } else if (stfp) { /* FP to integer conversion. */ + if (irt_isguard(ir->t)) { + /* Checked conversions are only supported from number to int. */ -+ lj_assertA(irt_isint(ir->t) && st == IRT_NUM, -+ "bad type for checked CONV"); ++ lua_assert(irt_isint(ir->t) && st == IRT_NUM); + asm_tointg(as, ir, ra_alloc1(as, lref, RSET_FPR)); + } else { + Reg dest = ra_dest(as, ir, RSET_GPR); @@ -2675,8 +2730,7 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h +{ + RegSet allow = rset_exclude(RSET_GPR, base); + IRIns *ir = IR(ref); -+ lj_assertA(irt_ispri(ir->t) || irt_isaddr(ir->t) || irt_isinteger(ir->t), -+ "store of IR type %d", irt_type(ir->t)); ++ lua_assert(irt_ispri(ir->t) || irt_isaddr(ir->t) || irt_isinteger(ir->t)); + if (irref_isk(ref)) { + TValue k; + lj_ir_kvalue(as->J->L, &k, ir); @@ -2695,7 +2749,7 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + } +} +/* Get pointer to TValue. */ -+static void asm_tvptr(ASMState *as, Reg dest, IRRef ref, MSize mode) ++static void asm_tvptr(ASMState *as, Reg dest, IRRef ref) +{ + IRIns *ir = IR(ref); + if (irt_isnum(ir->t)) { @@ -2780,10 +2834,10 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + } else { + int64_t k; + if (isk && irt_isaddr(kt)) { -+ k = ((int64_t)irt_toitype(kt) << 47) | irkey[1].tv.u64; ++ k = ((int64_t)irt_toitype(irkey->t) << 47) | irkey[1].tv.u64; + } else { -+ lj_assertA(irt_ispri(kt) && !irt_isnil(kt), "bad HREF key type"); -+ k = ~((int64_t)~irt_toitype(kt) << 47); ++ lua_assert(irt_ispri(kt) && !irt_isnil(kt)); ++ k = ~((int64_t)~irt_toitype(ir->t) << 47); + } + cmp64 = ra_allock(as, k, allow); + rset_clear(allow, cmp64); @@ -2831,7 +2885,7 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + } + + /* Load main position relative to tab->node into dest. */ -+ khash = isk ? ir_khash(as, irkey) : 1; ++ khash = isk ? ir_khash(irkey) : 1; + if (khash == 0) { + emit_Ao(as, SW64I_AL, dest, tab, (int32_t)offsetof(GCtab, node)); + } else { @@ -2840,7 +2894,7 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + tmphash = ra_allock(as, khash, allow); + + emit_ABD(as, SW64I_ADDL, dest, tmp1, dest); -+ lj_assertA(sizeof(Node) == 24, "bad Node size"); ++ lua_assert(sizeof(Node) == 24); + emit_ABD(as, SW64I_SUBW, tmp2, tmp1, tmp1); + emit_AjD(as, SW64I_SLLI, tmp1, 3, tmp1); + emit_AjD(as, SW64I_SLLI, tmp1, 5, tmp2); @@ -2852,7 +2906,7 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + if (isk) {//TODO + /* Nothing to do. */ + } else if (irt_isstr(kt)) { -+ emit_Ao(as, SW64I_LDW, tmp1, key, (int32_t)offsetof(GCstr, sid)); ++ emit_Ao(as, SW64I_LDW, tmp1, key, (int32_t)offsetof(GCstr, hash)); + } else { /* Must match with hash*() in lj_tab.c. */ + //hi = tmp1, lo = tmp2 + Reg hi = tmp1; @@ -2903,7 +2957,7 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + Reg idx = node; + Reg key = ra_scratch(as, allow); + int64_t k; -+ lj_assertA(ofs % sizeof(Node) == 0, "unaligned HREFK slot"); ++ lua_assert(ofs % sizeof(Node) == 0); + if (ofs > 32736) { + idx = dest; + rset_clear(allow, dest); @@ -2912,7 +2966,7 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + emit_Ao(as, SW64I_LDI, dest, node, ofs); + } + if (irt_ispri(irkey->t)) { -+ lj_assertA(!irt_isnil(irkey->t), "bad HREFK key type"); ++ lua_assert(!irt_isnil(irkey->t)); + k = ~((int64_t)~irt_toitype(irkey->t) << 47); + } else if (irt_isnum(irkey->t)) { + k = (int64_t)ir_knum(irkey)->u64; @@ -2929,36 +2983,29 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h +static void asm_uref(ASMState *as, IRIns *ir) +{ + Reg dest = ra_dest(as, ir, RSET_GPR); -+ int guarded = (irt_t(ir->t) & (IRT_GUARD|IRT_TYPE)) == (IRT_GUARD|IRT_PGC); -+ if (irref_isk(ir->op1) && !guarded) { ++ if (irref_isk(ir->op1)) { + GCfunc *fn = ir_kfunc(IR(ir->op1)); + MRef *v = &gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.v; + emit_lsptr(as, SW64I_AL, dest, v, RSET_GPR); + } else { -+ if (guarded) -+ asm_guard(as, ir->o == IR_UREFC ? SW64I_BEQ : SW64I_BNE, RID_R28); -+ if (ir->o == IR_UREFC) -+ emit_Ao(as, SW64I_LDI, dest, dest, (int32_t)offsetof(GCupval, tv)); -+ else -+ emit_Ao(as, SW64I_AL, dest, dest, (int32_t)offsetof(GCupval, v)); -+ if (guarded) -+ emit_Ao(as, SW64I_LDBU, RID_R28, dest, (int32_t)offsetof(GCupval, closed)); -+ if (irref_isk(ir->op1)) { -+ GCfunc *fn = ir_kfunc(IR(ir->op1)); -+ GCobj *o = gcref(fn->l.uvptr[(ir->op2 >> 8)]); -+ emit_loada(as, dest, o); ++ Reg uv = ra_scratch(as, RSET_GPR); ++ Reg func = ra_alloc1(as, ir->op1, RSET_GPR); ++ if (ir->o == IR_UREFC) { ++ asm_guard(as, SW64I_BEQ, RID_R28); ++ emit_Ao(as, SW64I_LDI, dest, uv, (int32_t)offsetof(GCupval, tv)); ++ emit_Ao(as, SW64I_LDBU, RID_R28, uv, (int32_t)offsetof(GCupval, closed)); + } else { -+ emit_Ao(as, SW64I_AL, dest, ra_alloc1(as, ir->op1, RSET_GPR), -+ (int32_t)offsetof(GCfuncL, uvptr) + -+ (int32_t)sizeof(MRef) * (int32_t)(ir->op2 >> 8)); ++ emit_Ao(as, SW64I_AL, dest, uv, (int32_t)offsetof(GCupval, v)); + } ++ emit_Ao(as, SW64I_AL, uv, func, (int32_t)offsetof(GCfuncL, uvptr) + ++ (int32_t)sizeof(MRef) * (int32_t)(ir->op2 >> 8)); + } +} + +static void asm_fref(ASMState *as, IRIns *ir) +{ + UNUSED(as); UNUSED(ir); -+ lj_assertA(!ra_used(ir), "unfused FREF"); ++ lua_assert(!ra_used(ir)); +} + +static void asm_strref(ASMState *as, IRIns *ir) @@ -3057,7 +3104,7 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + Reg idx = ra_alloc1(as, irf->op1, rset_exclude(RSET_GPR, src)); + int32_t ofs = field_ofs[irf->op2]; + SW64Ins mi = asm_fxstoreins(ir); -+ lj_assertA(!irt_isfp(ir->t), "bad FP FSTORE"); ++ lua_assert(!irt_isfp(ir->t)); + emit_Ao(as, mi, src, idx, ofs); + } +} @@ -3068,7 +3115,7 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + SW64Ins mi = asm_fxloadins(ir, &mi2); + Reg dest = ra_dest(as, ir, + irt_isfp(ir->t) ? RSET_FPR : RSET_GPR); -+ lj_assertA(!(ir->op2 & IRXLOAD_UNALIGNED), "unaligned XLOAD"); ++ lua_assert(!(ir->op2 & IRXLOAD_UNALIGNED)); + fxloadins_end(as, mi2, dest); + asm_fusexref(as, mi, dest, ir->op1, RSET_GPR, 0); +} @@ -3117,9 +3164,7 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + rset_clear(allow, type); + + if (ra_used(ir)) { -+ lj_assertA(irt_isnum(ir->t) || -+ irt_isint(ir->t) || irt_isaddr(ir->t), -+ "bad load type %d", irt_type(ir->t)); ++ lua_assert(irt_isnum(ir->t) || irt_isint(ir->t) || irt_isaddr(ir->t)); + dest = ra_dest(as, ir, irt_isnum(t) ? RSET_FPR : allow); + rset_clear(allow, dest); + if (irt_isaddr(t)) @@ -3128,7 +3173,6 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + emit_AjD(as, SW64I_ADDWI, dest, 0, dest); + } + idx = asm_fuseahuref(as, ir->op1, &ofs, allow); -+ if (ir->o == IR_VLOAD) ofs += 8 * ir->op2; + rset_clear(allow, idx); + if (irt_isnum(t)) { + asm_guard(as, SW64I_BEQ, RID_R28); @@ -3191,19 +3235,16 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + IRType1 t = ir->t; + int32_t ofs = 8*((int32_t)ir->op1-2); + -+ lj_assertA(!(ir->op2 & IRSLOAD_PARENT), -+ "bad parent SLOAD"); /* Handled by asm_head_side(). */ -+ lj_assertA(irt_isguard(ir->t) || !(ir->op2 & IRSLOAD_TYPECHECK), -+ "inconsistent SLOAD variant"); ++ lua_assert(!(ir->op2 & IRSLOAD_PARENT)); /* Handled by asm_head_side(). */ ++ lua_assert(irt_isguard(ir->t) || !(ir->op2 & IRSLOAD_TYPECHECK)); + + if ((ir->op2 & IRSLOAD_CONVERT) && irt_isguard(t) && irt_isint(t)) { + dest = ra_scratch(as, RSET_FPR); + asm_tointg(as, ir, dest); + t.irt = IRT_NUM; /* Continue with a regular number type check. */ + } else if (ra_used(ir)) { -+ lj_assertA(irt_isnum(ir->t) || -+ irt_isint(ir->t) || irt_isaddr(ir->t), -+ "bad SLOAD type %d", irt_type(ir->t)); ++ lua_assert(irt_isnum(ir->t) || ++ irt_isint(ir->t) || irt_isaddr(ir->t)); + dest = ra_dest(as, ir, irt_isnum(t) ? RSET_FPR : allow); + rset_clear(allow, dest); + base = ra_alloc1(as, REF_BASE, allow); @@ -3278,8 +3319,7 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_mem_newgco]; + IRRef args[4]; + RegSet drop = RSET_SCRATCH; -+ lj_assertA(sz != CTSIZE_INVALID || (ir->o == IR_CNEW && ir->op2 != REF_NIL), -+ "bad CNEW/CNEWI operands"); ++ lua_assert(sz != CTSIZE_INVALID || (ir->o == IR_CNEW && ir->op2 != REF_NIL)); + + as->gcsteps++; + if (ra_hasreg(ir->r)) @@ -3293,7 +3333,7 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + RegSet allow = (RSET_GPR & ~RSET_SCRATCH); + emit_Ao(as, sz == 8 ? SW64I_STL : SW64I_STW, ra_alloc1(as, ir->op2, allow), + RID_RET, sizeof(GCcdata)); -+ lj_assertA(sz == 4 || sz == 8, "bad CNEWI size %d", sz); ++ lua_assert(sz == 4 || sz == 8); + } else if (ir->op2 != REF_NIL) { /* Create VLA/VLS/aligned cdata. */ + ci = &lj_ir_callinfo[IRCALL_lj_cdata_newv]; + args[0] = ASMREF_L; /* lua_State *L */ @@ -3317,6 +3357,8 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + ra_allockreg(as, (int32_t)(sz+sizeof(GCcdata)), + ra_releasetmp(as, ASMREF_TMP1)); +} ++#else ++#define asm_cnew(as, ir) ((void)0) +#endif + +/* -- Write barriers ------------------------------------------------------ */ @@ -3344,7 +3386,7 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + MCLabel l_end; + Reg obj, val, tmp; + /* No need for other object barriers (yet). */ -+ lj_assertA(IR(ir->op1)->o == IR_UREFC, "bad OBAR type"); ++ lua_assert(IR(ir->op1)->o == IR_UREFC); + ra_evictset(as, RSET_SCRATCH); + l_end = emit_label(as); + args[0] = ASMREF_TMP1; /* global_State *g */ @@ -3385,6 +3427,8 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + +static void asm_fpmath(ASMState *as, IRIns *ir) +{ ++ if (ir->op2 == IRFPM_EXP2 && asm_fpjoin_pow(as, ir)) ++ return; + asm_callid(as, ir, IRCALL_lj_vm_floor + ir->op2); +} + @@ -3403,7 +3447,7 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + Reg dest = ra_dest(as, ir, RSET_GPR); + Reg right, left = ra_hintalloc(as, ir->op1, dest, RSET_GPR); + if (irref_isk(ir->op2)) { -+ intptr_t k = get_kval(as, ir->op2); ++ intptr_t k = get_kval(IR(ir->op2)); + if (checku8(k)) { + emit_AjD(as, (LJ_64 && irt_is64(t)) ? SW64I_ADDLI : SW64I_ADDWI, + left, k, dest); @@ -3442,7 +3486,7 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + } +} + -+/*static void asm_mod(ASMState *as, IRIns *ir) ++static void asm_mod(ASMState *as, IRIns *ir) +{ + if (!irt_isint(ir->t)) + asm_callid(as, ir, irt_isi64(ir->t) ? IRCALL_lj_carith_modi64 : @@ -3468,12 +3512,6 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + else + asm_fparith(as, ir, SW64I_FDIVD); +} -+*/ -+ -+static void asm_fpdiv(ASMState *as, IRIns *ir) -+{ -+ asm_fparith(as, ir, SW64I_FDIVD); -+} + +static void asm_neg(ASMState *as, IRIns *ir) +{ @@ -3497,10 +3535,10 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h +static void asm_arithov(ASMState *as, IRIns *ir) +{ + Reg right, left, dest = ra_dest(as, ir, RSET_GPR); -+ lj_assertA(!irt_is64(ir->t), "bad usage"); ++ lua_assert(!irt_is64(ir->t)); + if (irref_isk(ir->op2)) { + int k = IR(ir->op2)->i; -+ if (ir->o == IR_SUBOV) k = (int)(~(unsigned int)k+1u); ++ if (ir->o == IR_SUBOV) k = -k; + if (checki16(k)) { /* (dest < left) == (k >= 0 ? 1 : 0) */ + left = ra_alloc1(as, ir->op1, RSET_GPR); + asm_guard(as, k >= 0 ? SW64I_BNE : SW64I_BEQ, RID_R28); @@ -3617,7 +3655,7 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + } + + if (irref_isk(ir->op2)) { -+ intptr_t k = get_kval(as, ir->op2); ++ intptr_t k = get_kval(IR(ir->op2)); + if (checki8(k)) { + emit_AjD(as, mik, left, k, dest); + return; @@ -3770,13 +3808,13 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + Reg right, left = ra_alloc1(as, ir->op1, RSET_GPR); + if (op == IR_ABC) op = IR_UGT; + -+ if ((op&4) == 0 && irref_isk(ir->op2) && get_kval(as, ir->op2) == 0) { ++ if ((op&4) == 0 && irref_isk(ir->op2) && get_kval(IR(ir->op2)) == 0) { + SW64Ins mi = (op&2) ? ((op&1) ? SW64I_BLE : SW64I_BGT) : + ((op&1) ? SW64I_BLT : SW64I_BGE); + asm_guard(as, mi, left); + } else { + if (irref_isk(ir->op2)) { -+ intptr_t k = get_kval(as, ir->op2); ++ intptr_t k = get_kval(IR(ir->op2)); + if ((op&2)) k++; + if (checki8(k)) { + asm_guard(as, (op&1) ? SW64I_BNE : SW64I_BEQ, RID_R28); @@ -3802,7 +3840,7 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + if (irt_isnum(ir->t)) { + MCLabel l_true = emit_label(as); + -+ if (irref_isk(ir->op2) && get_kval(as, ir->op2) == 0) { ++ if (irref_isk(ir->op2) && get_kval(IR(ir->op2)) == 0) { + asm_guard(as, is_ne ? SW64I_FBEQ : SW64I_FBNE, left); + return; + } @@ -3817,7 +3855,7 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + emit_FGI(as, SW64I_FCMPUN, left, right, RID_F28); + + } else { -+ if (irref_isk(ir->op2) && get_kval(as, ir->op2) == 0) { ++ if (irref_isk(ir->op2) && get_kval(IR(ir->op2)) == 0) { + asm_guard(as, is_ne ? SW64I_BEQ: SW64I_BNE, left); + return; + } @@ -3897,15 +3935,12 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + } + checkmclim(as); + } -+ lj_assertA(map + nent == flinks, "inconsistent frames in snapshot"); ++ lua_assert(map + nent == flinks); + WI_DEBUG_END(); +} + +/* -- GC handling --------------------------------------------------------- */ + -+/* Marker to prevent patching the GC check exit. */ -+#define SW64_NOPATCH_GC_CHECK SW64I_BIS -+ +/* Check GC threshold and do one or more GC steps. */ +static void asm_gc_check(ASMState *as) +{ @@ -3923,7 +3958,6 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + args[0] = ASMREF_TMP1; /* global_State *g */ + args[1] = ASMREF_TMP2; /* MSize steps */ + asm_gencall(as, ci, args); -+ l_end[-3] = SW64_NOPATCH_GC_CHECK; /* Replace the nop after the call. */ + emit_Ao(as, SW64I_LDI, ra_releasetmp(as, ASMREF_TMP1), RID_JGL, -32768); + tmp = ra_releasetmp(as, ASMREF_TMP2); + emit_loadi(as, tmp, as->gcsteps); @@ -3959,12 +3993,6 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + WI_DEBUG_END(); +} + -+/* Fixup the tail of the loop. */ -+static void asm_loop_tail_fixup(ASMState *as) -+{ -+ if (as->loopinv) as->mctop--; -+} -+ +/* -- Head of trace ------------------------------------------------------- */ + +/* Coalesce BASE register for a root trace. */ @@ -3973,6 +4001,7 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h + WI_DEBUG_BEFORE(); + IRIns *ir = IR(REF_BASE); + Reg r = ir->r; ++ if (as->loopinv) as->mctop--; + if (ra_hasreg(r)) { + ra_free(as, r); + if (rset_test(as->modset, r) || irt_ismarked(ir->t)) @@ -3984,26 +4013,27 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h +} + +/* Coalesce BASE register for a side trace. */ -+static Reg asm_head_side_base(ASMState *as, IRIns *irp) ++static RegSet asm_head_side_base(ASMState *as, IRIns *irp, RegSet allow) +{ + WI_DEBUG_BEFORE(); + IRIns *ir = IR(REF_BASE); + Reg r = ir->r; ++ if (as->loopinv) as->mctop--; + if (ra_hasreg(r)) { + ra_free(as, r); + if (rset_test(as->modset, r) || irt_ismarked(ir->t)) + ir->r = RID_INIT; /* No inheritance for modified BASE register. */ + if (irp->r == r) { -+ return r; /* Same BASE register already coalesced. */ ++ rset_clear(allow, r); /* Mark same BASE register as coalesced. */ + } else if (ra_hasreg(irp->r) && rset_test(as->freeset, irp->r)) { ++ rset_clear(allow, irp->r); + emit_move(as, r, irp->r); /* Move from coalesced parent reg. */ -+ return irp->r; + } else { + emit_getgl(as, r, jit_base); /* Otherwise reload BASE. */ + } + } + WI_DEBUG_END(); -+ return RID_NONE; ++ return allow; +} + +/* -- Tail of trace ------------------------------------------------------- */ @@ -4144,376 +4174,11 @@ diff -Naur a/src/lj_asm_sw64.h b/src/lj_asm_sw64.h +} + +#undef TODO -diff -Naur a/src/lj_bcdef.h b/src/lj_bcdef.h ---- a/src/lj_bcdef.h 2017-05-02 03:05:00.000000000 +0800 -+++ b/src/lj_bcdef.h 1970-01-01 08:00:00.000000000 +0800 -@@ -1,226 +0,0 @@ --/* This is a generated file. DO NOT EDIT! */ -- --LJ_DATADEF const uint16_t lj_bc_ofs[] = { --0, --72, --144, --216, --288, --427, --569, --632, --695, --764, --833, --886, --938, --989, --1040, --1081, --1122, --1148, --1180, --1240, --1314, --1368, --1422, --1476, --1530, --1589, --1643, --1697, --1751, --1805, --1841, --1908, --1975, --2042, --2109, --2158, --2230, --2306, --2342, --2378, --2408, --2437, --2462, --2505, --2541, --2628, --2710, --2748, --2782, --2833, --2897, --3006, --3099, --3117, --3135, --3283, --3407, --3506, --3679, --3908, --4032, --4174, --4220, --4262, --4266, --4414, --4482, --4647, --4838, --4926, --4930, --5066, --5158, --5263, --5360, --5465, --5485, --5555, --5622, --5642, --5686, --5725, --5745, --5763, --5810, --5835, --5855, --5918, --5972, --5972, --6097, --6098, --6177, --7841, --7908, --8419, --8522, --8579, --8710, --7974, --8136, --8228, --8280, --8311, --8768, --8809, --9417, --8864, --9167, --9469, --9596, --9620, --9647, --9711, --9744, --9778, --9809, --9840, --9873, --9914, --9957, --9990, --10030, --10070, --10245, --10393, --10110, --10110, --9678, --10149, --10549, --10492, --10196, --10603, --10662, --11596, --11994, --11941, --12063, --12142, --12224, --12306, --12388, --11650, --11747, --11844, --10721, --10752, --10799, --10921, --11090, --11217, --11327, --11442, --11557 --}; -- --LJ_DATADEF const uint16_t lj_bc_mode[] = { --BCDEF(BCMODE) --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF, --BCMODE_FF --}; -- -diff -Naur a/src/lj_ccallback.c b/src/lj_ccallback.c ---- a/src/lj_ccallback.c 2024-11-05 09:58:44.409962699 +0800 -+++ b/src/lj_ccallback.c 2024-11-06 10:36:30.256946917 +0800 -@@ -71,6 +71,10 @@ - - #define CALLBACK_MCODE_HEAD 52 - -+#elif LJ_TARGET_SW64 -+ -+#define CALLBACK_MCODE_HEAD 4*13 -+ - #else - - /* Missing support for this architecture. */ -@@ -238,6 +242,87 @@ - } - return p; - } -+ -+#elif LJ_TARGET_SW64 -+ -+static inline void swSplit32Addr(uint32_t addr, int16_t* hi, int16_t* lo) -+{ -+ *hi = (int16_t)(addr >> 16); -+ *lo = (int16_t)(addr & 0xffff); -+ if (*lo < 0) { -+ *hi = *hi + 1; -+ *lo = (int16_t)(addr - ((int32_t)(*hi) << 16)); -+ } -+} -+static inline void swSplit64AddrHI32(uint64_t addr, int16_t*hi, int16_t*lo) -+{ -+ swSplit32Addr((uint32_t)(addr >> 32), hi, lo); -+} -+static inline void swSplit64AddrLO32(uint64_t addr, int16_t*hi, int16_t*lo) -+{ -+ swSplit32Addr((uint32_t)(addr & 0xffffffff), hi, lo); -+} -+ -+static void *callback_mcode_init(global_State *g, uint32_t *page) -+{ -+ uint32_t *p = page; -+ void *target = (void *)lj_vm_ffi_callback; -+ int16_t hi, lo; -+ -+ MSize slot; -+ { -+ swSplit64AddrHI32((uint64_t)target, &hi, &lo); -+ // ldih PV, h32_hi(zero) -+ *p++ = SW64I_LDIH | SW64F_A(RID_CFUNCADDR)| SW64F_DISP(hi, RID_ZERO); -+ // ldi PV, h32_lo(PV) -+ *p++ = SW64I_LDI | SW64F_A(RID_CFUNCADDR)| SW64F_DISP(lo, RID_CFUNCADDR); -+ // slli PV, 32, PV -+ *p++ = SW64I_SLLI | SW64F_A(RID_CFUNCADDR)| SW64F_IMM(32) | SW64F_D(RID_CFUNCADDR); -+ -+ swSplit64AddrLO32((uint64_t)target, &hi, &lo); -+ // ldih at, lo32_hi(zero) -+ *p++ = SW64I_LDIH | SW64F_A(RID_R28)| SW64F_DISP(hi, RID_ZERO); -+ // ldi at, lo32_lo(at) -+ *p++ = SW64I_LDI | SW64F_A(RID_R28)| SW64F_DISP(lo, RID_R28); -+ // addl PV, at, PV -+ *p++ = SW64I_ADDL | SW64F_A(RID_CFUNCADDR)| SW64F_B(RID_R28) | SW64F_D(RID_CFUNCADDR); -+ } -+ -+ { -+ swSplit64AddrHI32((uint64_t)g, &hi, &lo); -+ // ldih r2, h32_hi(zero) -+ *p++ = SW64I_LDIH | SW64F_A(RID_R2) | SW64F_DISP(hi, RID_ZERO); -+ // ldi r2, h32_lo(r2) -+ *p++ = SW64I_LDI | SW64F_A(RID_R2) | SW64F_DISP(lo, RID_R2); -+ // slli r2, 32, r2 -+ *p++ = SW64I_SLLI | SW64F_A(RID_R2)| SW64F_IMM(32) | SW64F_D(RID_R2); -+ -+ swSplit64AddrLO32((uint64_t)g, &hi, &lo); -+ // ldih at, lo32_hi(zero) -+ *p++ = SW64I_LDIH | SW64F_A(RID_R28)| SW64F_DISP(hi, RID_ZERO); -+ // ldi at, lo32_lo(at) -+ *p++ = SW64I_LDI | SW64F_A(RID_R28)| SW64F_DISP(lo, RID_R28); -+ // addl r2, at, r2 -+ *p++ = SW64I_ADDL | SW64F_A(RID_R2)| SW64F_B(RID_R28) | SW64F_D(RID_R2); -+ } -+ -+ // call zero, 0(PV) -+ *p++ = SW64I_CALL | SW64F_A(RID_ZERO) | SW64F_DISP(0, RID_CFUNCADDR); -+ -+ //lua_assert((p - page) * 4 <= CALLBACK_MCODE_HEAD); -+ -+ for (slot = 0; slot < CALLBACK_MAX_SLOT; slot++) { -+ // ldi r1, slot(zero) -+ *p++ = SW64I_LDI | SW64F_A(RID_R1) | SW64F_DISP(slot, RID_ZERO); -+ -+ // br zero, (page-p-2) -+ *p = SW64I_BR | SW64F_A(RID_ZERO) | SW64F_BRANCH((page-p-2)+1); -+ p++; -+ } -+ -+ return p; -+} -+ - #else - /* Missing support for this architecture. */ - #define callback_mcode_init(g, p) (p) -@@ -516,6 +601,33 @@ - if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \ - ((float *)dp)[1] = *(float *)dp; - -+#elif LJ_TARGET_SW64 -+ -+#define CALLBACK_HANDLE_REGARG \ -+ if (ngpr + n <= maxgpr) { \ -+ if (isfp) { \ -+ FPRCBArg *reg = &(cts->cb.fpr[ngpr]); \ -+ if (cta->size == 4) { \ -+ reg->f[0] = (float)reg->d; \ -+ }\ -+ sp = reg; \ -+ } else {\ -+ intptr_t *reg = &(cts->cb.gpr[ngpr]); \ -+ if (cta->size == 4) { \ -+ *reg = *(int*)reg; \ -+ } \ -+ sp = reg; \ -+ } \ -+ ngpr += n; \ -+ goto done; \ -+ } -+ -+#define CALLBACK_HANDLE_RET \ -+ if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \ -+ *(double *)dp = *(float *)dp; /* FPRs always hold doubles. */ \ -+ if (ctype_isinteger(ctr->info) && ctr->size == 4) \ -+ *((int64_t *)dp) = *(int *)dp; -+ - #else - #error "Missing calling convention definitions for this architecture" - #endif -diff -Naur a/src/lj_ccall.c b/src/lj_ccall.c ---- a/src/lj_ccall.c 2024-11-05 09:58:44.409962699 +0800 -+++ b/src/lj_ccall.c 2024-11-05 14:12:53.253205702 +0800 -@@ -575,6 +575,67 @@ +diff --git a/src/lj_ccall.c b/src/lj_ccall.c +index 5c252e5..19e5a06 100644 +--- a/src/lj_ccall.c ++++ b/src/lj_ccall.c +@@ -562,6 +562,66 @@ goto done; \ } @@ -4558,14 +4223,13 @@ diff -Naur a/src/lj_ccall.c b/src/lj_ccall.c + cc->reg_is_word[ngpr+1] = d->size==8; \ + } \ + if (n > 1) { \ -+ /* int64_t or complex (float). */ \ -+ lj_assertL(n == 2 || n == 4, "bad GPR size %d", n); \ ++ lua_assert(n == 2 || n == 4); /* int64_t or complex (float). */ \ + } \ + if (ngpr < maxgpr) { \ + dp = &cc->gpr[ngpr]; \ + if (ngpr + n > maxgpr) { \ -+ nsp += (ngpr + n - maxgpr) * CTSIZE_PTR; /* Assumes contiguous gpr/stack fields. */ \ -+ if (nsp > CCALL_SIZE_STACK) goto err_nyi; /* Too many arguments. */ \ ++ nsp += ngpr + n - maxgpr; /* Assumes contiguous gpr/stack fields. */ \ ++ if (nsp > CCALL_MAXSTACK) goto err_nyi; /* Too many arguments. */ \ + ngpr = maxgpr; \ + } else { \ + ngpr += n; \ @@ -4581,7 +4245,7 @@ diff -Naur a/src/lj_ccall.c b/src/lj_ccall.c #else #error "Missing calling convention definitions for this architecture" #endif -@@ -939,6 +1000,9 @@ +@@ -921,6 +981,9 @@ static int ccall_set_args(lua_State *L, CTState *cts, CType *ct, /* Clear unused regs to get some determinism in case of misdeclaration. */ memset(cc->gpr, 0, sizeof(cc->gpr)); @@ -4591,7 +4255,7 @@ diff -Naur a/src/lj_ccall.c b/src/lj_ccall.c #if CCALL_NUM_FPR memset(cc->fpr, 0, sizeof(cc->fpr)); #endif -@@ -1077,7 +1141,7 @@ +@@ -1044,7 +1107,7 @@ static int ccall_set_args(lua_State *L, CTState *cts, CType *ct, if (isfp && d->size == sizeof(float)) ((float *)dp)[1] = ((float *)dp)[0]; /* Floats occupy high slot. */ #endif @@ -4600,7 +4264,7 @@ diff -Naur a/src/lj_ccall.c b/src/lj_ccall.c if ((ctype_isinteger_or_bool(d->info) || ctype_isenum(d->info) #if LJ_TARGET_MIPS64 || (isfp && nsp == 0) -@@ -1101,7 +1165,7 @@ +@@ -1068,7 +1131,7 @@ static int ccall_set_args(lua_State *L, CTState *cts, CType *ct, cc->fpr[nfpr-1].d[0] = cc->fpr[nfpr-2].d[1]; /* Split complex double. */ cc->fpr[nfpr-2].d[1] = 0; } @@ -4609,46 +4273,185 @@ diff -Naur a/src/lj_ccall.c b/src/lj_ccall.c if (isfp == 2 && (uint8_t *)dp < (uint8_t *)cc->stack) { /* Split float HFA or complex float into separate registers. */ CTSize i = (sz >> 2) - 1; -diff -Naur a/src/lj_ccall.h b/src/lj_ccall.h ---- a/src/lj_ccall.h 2024-11-05 09:58:44.409962699 +0800 -+++ b/src/lj_ccall.h 2024-11-05 11:22:17.266522101 +0800 -@@ -129,6 +129,22 @@ +diff --git a/src/lj_ccall.h b/src/lj_ccall.h +index 59f6648..a3cb613 100644 +--- a/src/lj_ccall.h ++++ b/src/lj_ccall.h +@@ -126,6 +126,22 @@ typedef union FPRArg { struct { LJ_ENDIAN_LOHI(float f; , float g;) }; } FPRArg; +#elif LJ_TARGET_SW64 + -+#define CCALL_NARG_GPR 6 -+#define CCALL_NARG_FPR 0 /* FP args are positional and overlay the GPR array. */ -+#define CCALL_NRET_GPR 1 -+#define CCALL_NRET_FPR 2 -+ -+#define CCALL_SPS_EXTRA 3 -+#define CCALL_SPS_FREE 1 ++#define CCALL_NARG_GPR 6 ++#define CCALL_NARG_FPR 0 /* FP args are positional and overlay the GPR array. */ ++#define CCALL_NRET_GPR 1 ++#define CCALL_NRET_FPR 2 ++ ++#define CCALL_SPS_EXTRA 3 ++#define CCALL_SPS_FREE 1 ++ ++typedef intptr_t GPRArg; ++typedef union FPRArg { ++ double d; ++ struct { float f; float g; }; ++} FPRArg; ++ + #else + #error "Missing calling convention definitions for this architecture" + #endif +@@ -174,6 +190,9 @@ typedef LJ_ALIGN(CCALL_ALIGN_CALLSTATE) struct CCallState { + #if LJ_32 + int32_t align1; + #endif ++#if LJ_TARGET_SW64 ++ uint8_t reg_is_word[CCALL_NUM_GPR]; ++#endif + #if CCALL_NUM_FPR + FPRArg fpr[CCALL_NUM_FPR]; /* Arguments/results in FPRs. */ + #endif +diff --git a/src/lj_ccallback.c b/src/lj_ccallback.c +index 846827b..434c649 100644 +--- a/src/lj_ccallback.c ++++ b/src/lj_ccallback.c +@@ -71,6 +71,10 @@ static MSize CALLBACK_OFS2SLOT(MSize ofs) + + #define CALLBACK_MCODE_HEAD 52 + ++#elif LJ_TARGET_SW64 ++ ++#define CALLBACK_MCODE_HEAD 4*13 ++ + #else + + /* Missing support for this architecture. */ +@@ -238,6 +242,87 @@ static void callback_mcode_init(global_State *g, uint32_t *page) + } + lua_assert(p - page <= CALLBACK_MCODE_SIZE); + } ++ ++#elif LJ_TARGET_SW64 ++ ++static void split32Addr(uint32_t addr, int16_t* hi, int16_t* lo) ++{ ++ *hi = (int16_t)(addr >> 16); ++ *lo = (int16_t)(addr & 0xffff); ++ if (*lo < 0) { ++ *hi = *hi + 1; ++ *lo = (int16_t)(addr - ((int32_t)(*hi) << 16)); ++ } ++} ++static void split64AddrHI32(uint64_t addr, int16_t*hi, int16_t*lo) ++{ ++ split32Addr((uint32_t)(addr >> 32), hi, lo); ++} ++static void split64AddrLO32(uint64_t addr, int16_t*hi, int16_t*lo) ++{ ++ split32Addr((uint32_t)(addr & 0xffffffff), hi, lo); ++} ++ ++static void callback_mcode_init(global_State *g, uint32_t *page) ++{ ++ uint32_t *p = page; ++ void *target = (void *)lj_vm_ffi_callback; ++ int16_t hi, lo; ++ ++ MSize slot; ++ { ++ split64AddrHI32((uint64_t)target, &hi, &lo); ++ // ldih PV, h32_hi(zero) ++ *p++ = SW64I_LDIH | SW64F_A(RID_CFUNCADDR)| SW64F_DISP(hi, RID_ZERO); ++ // ldi PV, h32_lo(PV) ++ *p++ = SW64I_LDI | SW64F_A(RID_CFUNCADDR)| SW64F_DISP(lo, RID_CFUNCADDR); ++ // slli PV, 32, PV ++ *p++ = SW64I_SLLI | SW64F_A(RID_CFUNCADDR)| SW64F_IMM(32) | SW64F_D(RID_CFUNCADDR); ++ ++ split64AddrLO32((uint64_t)target, &hi, &lo); ++ // ldih at, lo32_hi(zero) ++ *p++ = SW64I_LDIH | SW64F_A(RID_R28)| SW64F_DISP(hi, RID_ZERO); ++ // ldi at, lo32_lo(at) ++ *p++ = SW64I_LDI | SW64F_A(RID_R28)| SW64F_DISP(lo, RID_R28); ++ // addl PV, at, PV ++ *p++ = SW64I_ADDL | SW64F_A(RID_CFUNCADDR)| SW64F_B(RID_R28) | SW64F_D(RID_CFUNCADDR); ++ } ++ ++ { ++ split64AddrHI32((uint64_t)g, &hi, &lo); ++ // ldih r2, h32_hi(zero) ++ *p++ = SW64I_LDIH | SW64F_A(RID_R2) | SW64F_DISP(hi, RID_ZERO); ++ // ldi r2, h32_lo(r2) ++ *p++ = SW64I_LDI | SW64F_A(RID_R2) | SW64F_DISP(lo, RID_R2); ++ // slli r2, 32, r2 ++ *p++ = SW64I_SLLI | SW64F_A(RID_R2)| SW64F_IMM(32) | SW64F_D(RID_R2); ++ ++ split64AddrLO32((uint64_t)g, &hi, &lo); ++ // ldih at, lo32_hi(zero) ++ *p++ = SW64I_LDIH | SW64F_A(RID_R28)| SW64F_DISP(hi, RID_ZERO); ++ // ldi at, lo32_lo(at) ++ *p++ = SW64I_LDI | SW64F_A(RID_R28)| SW64F_DISP(lo, RID_R28); ++ // addl r2, at, r2 ++ *p++ = SW64I_ADDL | SW64F_A(RID_R2)| SW64F_B(RID_R28) | SW64F_D(RID_R2); ++ } ++ ++ // call zero, 0(PV) ++ *p++ = SW64I_CALL | SW64F_A(RID_ZERO) | SW64F_DISP(0, RID_CFUNCADDR); ++ ++ //lua_assert((p - page) * 4 <= CALLBACK_MCODE_HEAD); ++ ++ for (slot = 0; slot < CALLBACK_MAX_SLOT; slot++) { ++ // ldi r1, slot(zero) ++ *p++ = SW64I_LDI | SW64F_A(RID_R1) | SW64F_DISP(slot, RID_ZERO); ++ ++ // br zero, (page-p-2) ++ *p = SW64I_BR | SW64F_A(RID_ZERO) | SW64F_BRANCH((page-p-2)+1); ++ p++; ++ } ++ ++ lua_assert(p - page <= CALLBACK_MCODE_SIZE); ++} ++ + #else + /* Missing support for this architecture. */ + #define callback_mcode_init(g, p) UNUSED(p) +@@ -495,6 +580,33 @@ void lj_ccallback_mcode_free(CTState *cts) + if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \ + ((float *)dp)[1] = *(float *)dp; + ++#elif LJ_TARGET_SW64 ++ ++#define CALLBACK_HANDLE_REGARG \ ++ if (ngpr + n <= maxgpr) { \ ++ if (isfp) { \ ++ FPRCBArg *reg = &(cts->cb.fpr[ngpr]); \ ++ if (cta->size == 4) { \ ++ reg->f[0] = (float)reg->d; \ ++ }\ ++ sp = reg; \ ++ } else {\ ++ intptr_t *reg = &(cts->cb.gpr[ngpr]); \ ++ if (cta->size == 4) { \ ++ *reg = *(int*)reg; \ ++ } \ ++ sp = reg; \ ++ } \ ++ ngpr += n; \ ++ goto done; \ ++ } + -+typedef intptr_t GPRArg; -+typedef union FPRArg { -+ double d; -+ struct { float f; float g; }; -+} FPRArg; ++#define CALLBACK_HANDLE_RET \ ++ if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \ ++ *(double *)dp = *(float *)dp; /* FPRs always hold doubles. */ \ ++ if (ctype_isinteger(ctr->info) && ctr->size == 4) \ ++ *((int64_t *)dp) = *(int *)dp; + #else #error "Missing calling convention definitions for this architecture" #endif -@@ -181,6 +197,9 @@ - #if LJ_32 - int32_t align1; - #endif -+#if LJ_TARGET_SW64 -+ uint8_t reg_is_word[CCALL_NUM_GPR]; -+#endif - #if CCALL_NUM_FPR - FPRArg fpr[CCALL_NUM_FPR]; /* Arguments/results in FPRs. */ - #endif -diff -Naur a/src/lj_crecord.c b/src/lj_crecord.c ---- a/src/lj_crecord.c 2024-11-05 09:58:44.409962699 +0800 -+++ b/src/lj_crecord.c 2024-11-05 11:26:33.379041521 +0800 -@@ -131,7 +131,7 @@ +diff --git a/src/lj_crecord.c b/src/lj_crecord.c +index e32ae23..00de245 100644 +--- a/src/lj_crecord.c ++++ b/src/lj_crecord.c +@@ -130,7 +130,7 @@ static IRType crec_ct2irt(CTState *cts, CType *ct) /* Number of windowed registers used for optimized memory copy. */ #if LJ_TARGET_X86 #define CREC_COPY_REGWIN 2 @@ -4657,28 +4460,11 @@ diff -Naur a/src/lj_crecord.c b/src/lj_crecord.c #define CREC_COPY_REGWIN 8 #else #define CREC_COPY_REGWIN 4 -diff -Naur a/src/lj_def.h b/src/lj_def.h ---- a/src/lj_def.h 2024-11-05 09:58:44.409962699 +0800 -+++ b/src/lj_def.h 2024-11-05 14:00:15.538193672 +0800 -@@ -373,6 +373,14 @@ - #define check_exp(c, e) (e) - #endif - -+/* Runtime assertions. */ -+#ifdef lua_assert //TODO -+#define api_check(l, e) lua_assert(e) -+#else -+#define lua_assert(c) ((void)0) -+#define api_check luai_apicheck -+#endif -+ - /* Static assertions. */ - #define LJ_ASSERT_NAME2(name, line) name ## line - #define LJ_ASSERT_NAME(line) LJ_ASSERT_NAME2(lj_assert_, line) -diff -Naur a/src/lj_dispatch.c b/src/lj_dispatch.c ---- a/src/lj_dispatch.c 2024-11-05 09:58:44.409962699 +0800 -+++ b/src/lj_dispatch.c 2024-11-05 11:28:20.234072199 +0800 -@@ -38,7 +38,7 @@ +diff --git a/src/lj_dispatch.c b/src/lj_dispatch.c +index 5d6795f..d38b860 100644 +--- a/src/lj_dispatch.c ++++ b/src/lj_dispatch.c +@@ -38,7 +38,7 @@ LJ_STATIC_ASSERT(GG_NUM_ASMFF == FF_NUM_ASMFUNC); /* -- Dispatch table management ------------------------------------------- */ @@ -4687,7 +4473,7 @@ diff -Naur a/src/lj_dispatch.c b/src/lj_dispatch.c #include LJ_FUNCA_NORET void LJ_FASTCALL lj_ffh_coroutine_wrap_err(lua_State *L, lua_State *co); -@@ -76,7 +76,7 @@ +@@ -74,7 +74,7 @@ void lj_dispatch_init(GG_State *GG) GG->g.bc_cfunc_ext = GG->g.bc_cfunc_int = BCINS_AD(BC_FUNCC, LUA_MINSTACK, 0); for (i = 0; i < GG_NUM_ASMFF; i++) GG->bcff[i] = BCINS_AD(BC__MAX+i, 0, 0); @@ -4696,9 +4482,10 @@ diff -Naur a/src/lj_dispatch.c b/src/lj_dispatch.c memcpy(GG->got, dispatch_got, LJ_GOT__MAX*sizeof(ASMFunction *)); #endif } -diff -Naur a/src/lj_dispatch.h b/src/lj_dispatch.h ---- a/src/lj_dispatch.h 2024-11-05 09:58:44.409962699 +0800 -+++ b/src/lj_dispatch.h 2024-11-05 11:29:11.602127311 +0800 +diff --git a/src/lj_dispatch.h b/src/lj_dispatch.h +index 5bda51a..9b8559e 100644 +--- a/src/lj_dispatch.h ++++ b/src/lj_dispatch.h @@ -12,7 +12,7 @@ #include "lj_jit.h" #endif @@ -4708,19 +4495,21 @@ diff -Naur a/src/lj_dispatch.h b/src/lj_dispatch.h /* Need our own global offset table for the dreaded MIPS calling conventions. */ #ifndef _LJ_VM_H -@@ -93,7 +93,7 @@ - /* Make g reachable via K12 encoded DISPATCH-relative addressing. */ - uint8_t align1[(16-sizeof(global_State))&15]; - #endif +@@ -89,7 +89,7 @@ typedef uint16_t HotCount; + typedef struct GG_State { + lua_State L; /* Main thread. */ + global_State g; /* Global state. */ -#if LJ_TARGET_MIPS +#if LJ_TARGET_MIPS || LJ_TARGET_SW64 ASMFunction got[LJ_GOT__MAX]; /* Global offset table. */ #endif #if LJ_HASJIT -diff -Naur a/src/lj_emit_sw64.h b/src/lj_emit_sw64.h ---- a/src/lj_emit_sw64.h 1970-01-01 08:00:00.000000000 +0800 -+++ b/src/lj_emit_sw64.h 2024-11-05 13:33:06.872189975 +0800 -@@ -0,0 +1,456 @@ +diff --git a/src/lj_emit_sw64.h b/src/lj_emit_sw64.h +new file mode 100644 +index 0000000..dfd485f +--- /dev/null ++++ b/src/lj_emit_sw64.h +@@ -0,0 +1,454 @@ +/* +** SW64 instruction emitter. +** Copyright (C) 2019 deepin inc. See Copyright Notice in luajit.h @@ -4788,9 +4577,8 @@ diff -Naur a/src/lj_emit_sw64.h b/src/lj_emit_sw64.h +#endif + +#if LJ_64 -+static intptr_t get_k64val(ASMState *as, IRRef ref) ++static intptr_t get_k64val(IRIns *ir) +{ -+ IRIns *ir = IR(ref); + if (ir->o == IR_KINT64) { + return (intptr_t)ir_kint64(ir)->u64; + } else if (ir->o == IR_KGC) { @@ -4800,17 +4588,16 @@ diff -Naur a/src/lj_emit_sw64.h b/src/lj_emit_sw64.h + } else if (ir->o == IR_KNUM) { + return (intptr_t)ir_knum(ir)->u64; + } else { -+ lj_assertA(ir->o == IR_KINT || ir->o == IR_KNULL, -+ "bad 64 bit const IR op %d", ir->o); ++ lua_assert(ir->o == IR_KINT || ir->o == IR_KNULL); + return ir->i; /* Sign-extended. */ + } +} +#endif + +#if LJ_64 -+#define get_kval(as, ref) get_k64val(as, ref) ++#define get_kval(ir) get_k64val(ir) +#else -+#define get_kval(as, ref) (IR((ref))->i) ++#define get_kval(ir) ((ir)->i) +#endif + + @@ -5128,7 +4915,7 @@ diff -Naur a/src/lj_emit_sw64.h b/src/lj_emit_sw64.h +static void emit_addptr(ASMState *as, Reg r, int32_t ofs) +{ + if (ofs) { -+ lj_assertA(checki16(ofs), "offset %d out of range", ofs); ++ lua_assert(checki16(ofs)); + emit_Ao(as, SW64I_LDI, r, r, ofs); + } +} @@ -5177,1318 +4964,34 @@ diff -Naur a/src/lj_emit_sw64.h b/src/lj_emit_sw64.h +#define emit_rotr(as, src, shift, dest, tmp) emit_rotx(as, src, shift, dest, tmp, 2) + +#undef TODO -diff -Naur a/src/lj_ffdef.h b/src/lj_ffdef.h ---- a/src/lj_ffdef.h 2017-05-02 03:05:00.000000000 +0800 -+++ b/src/lj_ffdef.h 1970-01-01 08:00:00.000000000 +0800 -@@ -1,210 +0,0 @@ --/* This is a generated file. DO NOT EDIT! */ -- --FFDEF(assert) --FFDEF(type) --FFDEF(next) --FFDEF(pairs) --FFDEF(ipairs_aux) --FFDEF(ipairs) --FFDEF(getmetatable) --FFDEF(setmetatable) --FFDEF(getfenv) --FFDEF(setfenv) --FFDEF(rawget) --FFDEF(rawset) --FFDEF(rawequal) --FFDEF(unpack) --FFDEF(select) --FFDEF(tonumber) --FFDEF(tostring) --FFDEF(error) --FFDEF(pcall) --FFDEF(xpcall) --FFDEF(loadfile) --FFDEF(load) --FFDEF(loadstring) --FFDEF(dofile) --FFDEF(gcinfo) --FFDEF(collectgarbage) --FFDEF(newproxy) --FFDEF(print) --FFDEF(coroutine_status) --FFDEF(coroutine_running) --FFDEF(coroutine_create) --FFDEF(coroutine_yield) --FFDEF(coroutine_resume) --FFDEF(coroutine_wrap_aux) --FFDEF(coroutine_wrap) --FFDEF(math_abs) --FFDEF(math_floor) --FFDEF(math_ceil) --FFDEF(math_sqrt) --FFDEF(math_log10) --FFDEF(math_exp) --FFDEF(math_sin) --FFDEF(math_cos) --FFDEF(math_tan) --FFDEF(math_asin) --FFDEF(math_acos) --FFDEF(math_atan) --FFDEF(math_sinh) --FFDEF(math_cosh) --FFDEF(math_tanh) --FFDEF(math_frexp) --FFDEF(math_modf) --FFDEF(math_deg) --FFDEF(math_rad) --FFDEF(math_log) --FFDEF(math_atan2) --FFDEF(math_pow) --FFDEF(math_fmod) --FFDEF(math_ldexp) --FFDEF(math_min) --FFDEF(math_max) --FFDEF(math_random) --FFDEF(math_randomseed) --FFDEF(bit_tobit) --FFDEF(bit_bnot) --FFDEF(bit_bswap) --FFDEF(bit_lshift) --FFDEF(bit_rshift) --FFDEF(bit_arshift) --FFDEF(bit_rol) --FFDEF(bit_ror) --FFDEF(bit_band) --FFDEF(bit_bor) --FFDEF(bit_bxor) --FFDEF(bit_tohex) --FFDEF(string_len) --FFDEF(string_byte) --FFDEF(string_char) --FFDEF(string_sub) --FFDEF(string_rep) --FFDEF(string_reverse) --FFDEF(string_lower) --FFDEF(string_upper) --FFDEF(string_dump) --FFDEF(string_find) --FFDEF(string_match) --FFDEF(string_gmatch_aux) --FFDEF(string_gmatch) --FFDEF(string_gsub) --FFDEF(string_format) --FFDEF(table_foreachi) --FFDEF(table_foreach) --FFDEF(table_getn) --FFDEF(table_maxn) --FFDEF(table_insert) --FFDEF(table_remove) --FFDEF(table_concat) --FFDEF(table_sort) --FFDEF(io_method_close) --FFDEF(io_method_read) --FFDEF(io_method_write) --FFDEF(io_method_flush) --FFDEF(io_method_seek) --FFDEF(io_method_setvbuf) --FFDEF(io_method_lines) --FFDEF(io_method___gc) --FFDEF(io_method___tostring) --FFDEF(io_open) --FFDEF(io_popen) --FFDEF(io_tmpfile) --FFDEF(io_close) --FFDEF(io_read) --FFDEF(io_write) --FFDEF(io_flush) --FFDEF(io_input) --FFDEF(io_output) --FFDEF(io_lines) --FFDEF(io_type) --FFDEF(os_execute) --FFDEF(os_remove) --FFDEF(os_rename) --FFDEF(os_tmpname) --FFDEF(os_getenv) --FFDEF(os_exit) --FFDEF(os_clock) --FFDEF(os_date) --FFDEF(os_time) --FFDEF(os_difftime) --FFDEF(os_setlocale) --FFDEF(debug_getregistry) --FFDEF(debug_getmetatable) --FFDEF(debug_setmetatable) --FFDEF(debug_getfenv) --FFDEF(debug_setfenv) --FFDEF(debug_getinfo) --FFDEF(debug_getlocal) --FFDEF(debug_setlocal) --FFDEF(debug_getupvalue) --FFDEF(debug_setupvalue) --FFDEF(debug_upvalueid) --FFDEF(debug_upvaluejoin) --FFDEF(debug_sethook) --FFDEF(debug_gethook) --FFDEF(debug_debug) --FFDEF(debug_traceback) --FFDEF(jit_on) --FFDEF(jit_off) --FFDEF(jit_flush) --FFDEF(jit_status) --FFDEF(jit_attach) --FFDEF(jit_util_funcinfo) --FFDEF(jit_util_funcbc) --FFDEF(jit_util_funck) --FFDEF(jit_util_funcuvname) --FFDEF(jit_util_traceinfo) --FFDEF(jit_util_traceir) --FFDEF(jit_util_tracek) --FFDEF(jit_util_tracesnap) --FFDEF(jit_util_tracemc) --FFDEF(jit_util_traceexitstub) --FFDEF(jit_util_ircalladdr) --FFDEF(jit_opt_start) --FFDEF(ffi_meta___index) --FFDEF(ffi_meta___newindex) --FFDEF(ffi_meta___eq) --FFDEF(ffi_meta___len) --FFDEF(ffi_meta___lt) --FFDEF(ffi_meta___le) --FFDEF(ffi_meta___concat) --FFDEF(ffi_meta___call) --FFDEF(ffi_meta___add) --FFDEF(ffi_meta___sub) --FFDEF(ffi_meta___mul) --FFDEF(ffi_meta___div) --FFDEF(ffi_meta___mod) --FFDEF(ffi_meta___pow) --FFDEF(ffi_meta___unm) --FFDEF(ffi_meta___tostring) --FFDEF(ffi_meta___pairs) --FFDEF(ffi_meta___ipairs) --FFDEF(ffi_clib___index) --FFDEF(ffi_clib___newindex) --FFDEF(ffi_clib___gc) --FFDEF(ffi_callback_free) --FFDEF(ffi_callback_set) --FFDEF(ffi_cdef) --FFDEF(ffi_new) --FFDEF(ffi_cast) --FFDEF(ffi_typeof) --FFDEF(ffi_istype) --FFDEF(ffi_sizeof) --FFDEF(ffi_alignof) --FFDEF(ffi_offsetof) --FFDEF(ffi_errno) --FFDEF(ffi_string) --FFDEF(ffi_copy) --FFDEF(ffi_fill) --FFDEF(ffi_abi) --FFDEF(ffi_metatype) --FFDEF(ffi_gc) --FFDEF(ffi_load) -- --#undef FFDEF -- --#ifndef FF_NUM_ASMFUNC --#define FF_NUM_ASMFUNC 62 --#endif -- -diff -Naur a/src/lj_folddef.h b/src/lj_folddef.h ---- a/src/lj_folddef.h 2017-05-02 03:05:00.000000000 +0800 -+++ b/src/lj_folddef.h 1970-01-01 08:00:00.000000000 +0800 -@@ -1,1068 +0,0 @@ --/* This is a generated file. DO NOT EDIT! */ -- --static const FoldFunc fold_func[] = { -- fold_kfold_numarith, -- fold_kfold_ldexp, -- fold_kfold_fpmath, -- fold_kfold_numpow, -- fold_kfold_numcomp, -- fold_kfold_intarith, -- fold_kfold_intovarith, -- fold_kfold_bnot, -- fold_kfold_bswap, -- fold_kfold_intcomp, -- fold_kfold_intcomp0, -- fold_kfold_int64arith, -- fold_kfold_int64arith2, -- fold_kfold_int64shift, -- fold_kfold_bnot64, -- fold_kfold_bswap64, -- fold_kfold_int64comp, -- fold_kfold_int64comp0, -- fold_kfold_snew_kptr, -- fold_kfold_snew_empty, -- fold_kfold_strref, -- fold_kfold_strref_snew, -- fold_kfold_strcmp, -- fold_kfold_add_kgc, -- fold_kfold_add_kptr, -- fold_kfold_add_kright, -- fold_kfold_tobit, -- fold_kfold_conv_kint_num, -- fold_kfold_conv_kintu32_num, -- fold_kfold_conv_kint_ext, -- fold_kfold_conv_kint_i64, -- fold_kfold_conv_kint64_num_i64, -- fold_kfold_conv_kint64_num_u64, -- fold_kfold_conv_kint64_int_i64, -- fold_kfold_conv_knum_int_num, -- fold_kfold_conv_knum_u32_num, -- fold_kfold_conv_knum_i64_num, -- fold_kfold_conv_knum_u64_num, -- fold_kfold_tostr_knum, -- fold_kfold_tostr_kint, -- fold_kfold_strto, -- lj_opt_cse, -- fold_kfold_kref, -- fold_shortcut_round, -- fold_shortcut_left, -- fold_shortcut_dropleft, -- fold_shortcut_leftleft, -- fold_simplify_numadd_negx, -- fold_simplify_numadd_xneg, -- fold_simplify_numsub_k, -- fold_simplify_numsub_negk, -- fold_simplify_numsub_xneg, -- fold_simplify_nummuldiv_k, -- fold_simplify_nummuldiv_negk, -- fold_simplify_nummuldiv_negneg, -- fold_simplify_numpow_xk, -- fold_simplify_numpow_kx, -- fold_shortcut_conv_num_int, -- fold_simplify_conv_int_num, -- fold_simplify_conv_i64_num, -- fold_simplify_conv_int_i64, -- fold_simplify_conv_flt_num, -- fold_simplify_tobit_conv, -- fold_simplify_floor_conv, -- fold_simplify_conv_sext, -- fold_simplify_conv_narrow, -- fold_cse_conv, -- fold_narrow_convert, -- fold_simplify_intadd_k, -- fold_simplify_intmul_k, -- fold_simplify_intsub_k, -- fold_simplify_intsub_kleft, -- fold_simplify_intadd_k64, -- fold_simplify_intsub_k64, -- fold_simplify_intmul_k32, -- fold_simplify_intmul_k64, -- fold_simplify_intmod_k, -- fold_simplify_intmod_kleft, -- fold_simplify_intsub, -- fold_simplify_intsubadd_leftcancel, -- fold_simplify_intsubsub_leftcancel, -- fold_simplify_intsubsub_rightcancel, -- fold_simplify_intsubadd_rightcancel, -- fold_simplify_intsubaddadd_cancel, -- fold_simplify_band_k, -- fold_simplify_bor_k, -- fold_simplify_bxor_k, -- fold_simplify_shift_ik, -- fold_simplify_shift_andk, -- fold_simplify_shift1_ki, -- fold_simplify_shift2_ki, -- fold_simplify_shiftk_andk, -- fold_simplify_andk_shiftk, -- fold_reassoc_intarith_k, -- fold_reassoc_intarith_k64, -- fold_reassoc_dup, -- fold_reassoc_bxor, -- fold_reassoc_shift, -- fold_reassoc_minmax_k, -- fold_reassoc_minmax_left, -- fold_reassoc_minmax_right, -- fold_abc_fwd, -- fold_abc_k, -- fold_abc_invar, -- fold_comm_swap, -- fold_comm_equal, -- fold_comm_comp, -- fold_comm_dup, -- fold_comm_bxor, -- fold_merge_eqne_snew_kgc, -- lj_opt_fwd_aload, -- fold_kfold_hload_kkptr, -- lj_opt_fwd_hload, -- lj_opt_fwd_uload, -- lj_opt_fwd_tab_len, -- fold_cse_uref, -- lj_opt_fwd_hrefk, -- fold_fwd_href_tnew, -- fold_fwd_href_tdup, -- fold_fload_tab_tnew_asize, -- fold_fload_tab_tnew_hmask, -- fold_fload_tab_tdup_asize, -- fold_fload_tab_tdup_hmask, -- fold_fload_tab_ah, -- fold_fload_str_len_kgc, -- fold_fload_str_len_snew, -- fold_fload_cdata_typeid_kgc, -- fold_fload_cdata_int64_kgc, -- fold_fload_cdata_typeid_cnew, -- fold_fload_cdata_ptr_int64_cnew, -- lj_opt_cse, -- lj_opt_fwd_fload, -- fold_fwd_sload, -- fold_xload_kptr, -- lj_opt_fwd_xload, -- fold_barrier_tab, -- fold_barrier_tnew_tdup, -- lj_opt_dse_ahstore, -- lj_opt_dse_ustore, -- lj_opt_dse_fstore, -- lj_opt_dse_xstore, -- lj_ir_emit --}; -- --static const uint32_t fold_hash[916] = { --0xffffffff, --0xffffffff, --0x5b4c8016, --0x0d4e7016, --0xffffffff, --0x1000701c, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x29110c1a, --0xffffffff, --0xffffffff, --0x5b488016, --0x0d4a7016, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x7b87fc07, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x0d467016, --0xffffffff, --0x5a4c73ff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x5153fc29, --0xffffffff, --0xffffffff, --0xffffffff, --0x5d408016, --0xffffffff, --0x594873ff, --0x8187440f, --0xffffffff, --0xffffffff, --0xffffffff, --0x8287fc0f, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x6715ffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x2a11fc1a, --0xffffffff, --0x1daa5a70, --0xffffffff, --0xffffffff, --0x0a0bfc16, --0x5c408c16, --0x6911ffff, --0x8db7ffff, --0xffffffff, --0xffffffff, --0x1caa59d4, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x6a0dffff, --0x2b68d002, --0xffffffff, --0x3cab5695, --0xffffffff, --0x41aaa675, --0xffffffff, --0xffffffff, --0xffffffff, --0x27ae5800, --0xffffffff, --0x6a09ffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x7f865c0f, --0xffffffff, --0xffffffff, --0xffffffff, --0x6a05ffff, --0x42abffff, --0x5e44881c, --0x5d50a016, --0x066c5816, --0x00646c1b, --0x75753bff, --0x1951fc18, --0x6264c81b, --0x1850641c, --0xffffffff, --0x6a01ffff, --0x87a7ffff, --0x4953fc1c, --0x8da80000, --0x4f52a3ff, --0x00606c1b, --0xffffffff, --0xffffffff, --0xffffffff, --0x5d428416, --0x88a53800, --0xffffffff, --0xffffffff, --0xffffffff, --0x05645816, --0xffffffff, --0x005c6c1b, --0x20aa71d6, --0xffffffff, --0xffffffff, --0xffffffff, --0x1399fc16, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x157f33ff, --0xffffffff, --0xffffffff, --0x584dfc20, --0xffffffff, --0xffffffff, --0xffffffff, --0x8d9bffff, --0xffffffff, --0x055c5816, --0xffffffff, --0x00546c1b, --0xffffffff, --0xffffffff, --0x5849fc20, --0xffffffff, --0xffffffff, --0xffffffff, --0x8c97ffff, --0x5543fc1c, --0x05585816, --0xffffffff, --0x00506c1b, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x8a93ffff, --0x26ae6c00, --0x05545816, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x76753c17, --0x41aaa695, --0xffffffff, --0x898fffff, --0xffffffff, --0x05505816, --0xffffffff, --0xffffffff, --0xffffffff, --0x858867ff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x848bffff, --0xffffffff, --0x054c5816, --0x79873c06, --0x47525bff, --0xffffffff, --0x3f695401, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x8387ffff, --0xffffffff, --0x05485816, --0xffffffff, --0x5a4e5bff, --0xffffffff, --0xffffffff, --0x6264c816, --0x43aaa26e, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x05445816, --0xffffffff, --0x5a4a5bff, --0xffffffff, --0xffffffff, --0xffffffff, --0x3455fc1b, --0x0c5a701c, --0x6366cbff, --0x0e3c7000, --0xffffffff, --0x05405816, --0xffffffff, --0x59465bff, --0xffffffff, --0xffffffff, --0xffffffff, --0x41aaa276, --0x0c56701c, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x21aa7275, --0x0b52701c, --0x61489016, --0x6465fc33, --0x8d77ffff, --0xffffffff, --0x7b87fc05, --0xffffffff, --0xffffffff, --0x2a126bff, --0x385a6fff, --0xffffffff, --0x446dfc16, --0xffffffff, --0x7473ffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x7d873000, --0xffffffff, --0x5c409016, --0x686fffff, --0x8187440d, --0xffffffff, --0xffffffff, --0x3554b81b, --0x8287fc0d, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x686bffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x8d9ffc00, --0x737a5fff, --0x41aaaa75, --0xffffffff, --0xffffffff, --0x5e40801c, --0x0b42701c, --0x6b67ffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x2b68d000, --0xffffffff, --0xffffffff, --0x6d133017, --0xffffffff, --0xffffffff, --0x4c59fc16, --0xffffffff, --0xffffffff, --0x110bfc1c, --0x3aab566e, --0xffffffff, --0x5052a7ff, --0xffffffff, --0xffffffff, --0xffffffff, --0x6515fc28, --0x4a55fc16, --0x7f865c0d, --0x88a53c00, --0x41aaa296, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x4451fc16, --0xffffffff, --0x60448bff, --0x21aa7295, --0xffffffff, --0x3cab5676, --0x04106c1b, --0xffffffff, --0x78873807, --0xffffffff, --0xffffffff, --0x574dfc16, --0xffffffff, --0x4e53ffff, --0xffffffff, --0x09145816, --0xffffffff, --0x040c6c1b, --0x8287fc00, --0x5e50a01c, --0x6467fc32, --0xffffffff, --0x5749fc16, --0xffffffff, --0xffffffff, --0xffffffff, --0x2a105816, --0x2e3e7c00, --0x04086c1b, --0x7083fc00, --0xffffffff, --0xffffffff, --0xffffffff, --0x5645fc16, --0xffffffff, --0x22aa6e6e, --0x5e42841c, --0x614e9c16, --0x090c5816, --0x04046c1b, --0x1eaa5ab3, --0xffffffff, --0xffffffff, --0xffffffff, --0x5441fc16, --0x41aaaa95, --0xffffffff, --0x5352a028, --0x09085816, --0x17505c16, --0x04006c1b, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x6b43ffff, --0xffffffff, --0x09045816, --0xffffffff, --0x43aaa2ae, --0xffffffff, --0xffffffff, --0xffffffff, --0x083e5800, --0x7c865c00, --0xffffffff, --0x76753c15, --0x3051fc2e, --0x09005816, --0xffffffff, --0xffffffff, --0xffffffff, --0x3aab568e, --0xffffffff, --0x43aaa66e, --0xffffffff, --0x1daa5a71, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x2a12701c, --0x5f66cfff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x3cab5696, --0xffffffff, --0x100e701c, --0x41aaa676, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x2a125c17, --0x3654b82e, --0x100a701c, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x1006701c, --0xffffffff, --0x1951fc19, --0xffffffff, --0xffffffff, --0xffffffff, --0x23aa6e8e, --0xffffffff, --0x5b4e8016, --0xffffffff, --0x1eaa5ad3, --0x1002701c, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x29130c1a, --0xffffffff, --0xffffffff, --0x0d4c7016, --0xffffffff, --0x475273ff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x5b468016, --0x0d487016, --0x5a4e73ff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x5d54a816, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x5a4a73ff, --0x6615fc16, --0x3bab56ae, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x594673ff, --0xffffffff, --0x61468c16, --0x8d17ffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x2a13fc1a, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x6913ffff, --0x40abfeb3, --0x8db9ffff, --0x41aaa696, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x6a0fffff, --0x8db5ffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x7a873c07, --0xffffffff, --0xffffffff, --0xffffffff, --0x6a0bffff, --0x3f695402, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x24aa6eae, --0xffffffff, --0xffffffff, --0x6a07ffff, --0xffffffff, --0xffffffff, --0x066e5816, --0xffffffff, --0x00666c1b, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x6a03ffff, --0xffffffff, --0x4b55fc1c, --0x066a5816, --0xffffffff, --0x00626c1b, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x4851fc1c, --0x05665816, --0x18506016, --0x005e6c1b, --0x12986416, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x8da1ffff, --0xffffffff, --0x3bab56ce, --0xffffffff, --0x43aaa6ae, --0xffffffff, --0xffffffff, --0x584ffc20, --0x7b87fc06, --0xffffffff, --0x5f4287ff, --0x8d9dffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x00566c1b, --0xffffffff, --0xffffffff, --0x584bfc20, --0x5253fc28, --0xffffffff, --0xffffffff, --0xffffffff, --0x5645fc1c, --0xffffffff, --0x40abfed3, --0x00526c1b, --0x8187440e, --0xffffffff, --0x5847fc20, --0x8287fc0e, --0xffffffff, --0xffffffff, --0x8b95ffff, --0x2e3c7800, --0x5441fc1c, --0xffffffff, --0xffffffff, --0xffffffff, --0x17505c1c, --0xffffffff, --0xffffffff, --0x41aaaa76, --0xffffffff, --0x614c9816, --0x8991ffff, --0x1daa5a6f, --0x05525816, --0x4d585bff, --0xffffffff, --0x8087400c, --0xffffffff, --0xffffffff, --0xffffffff, --0x1baa59d3, --0x828dffff, --0x25aa6ece, --0x054e5816, --0x76753c1b, --0xffffffff, --0xffffffff, --0xffffffff, --0x2b68d001, --0xffffffff, --0xffffffff, --0xffffffff, --0x8689ffff, --0xffffffff, --0x054a5816, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x43aca01b, --0x05465816, --0x7f865c0e, --0x5a4c5bff, --0x39ab55d3, --0x01626c16, --0x02686fff, --0x3457fc1b, --0xffffffff, --0xffffffff, --0x0f3e7000, --0x3dab55ae, --0x05425816, --0x1951fc17, --0x59485bff, --0xffffffff, --0xffffffff, --0xffffffff, --0x3153fc1b, --0x0c58701c, --0x5f64cbff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x035a6c16, --0xffffffff, --0xffffffff, --0xffffffff, --0x0b54701c, --0xffffffff, --0x8779ffff, --0x1faa71d5, --0xffffffff, --0xffffffff, --0x2d5eb81b, --0x72b5fc08, --0xffffffff, --0xffffffff, --0xffffffff, --0x0b50701c, --0x456ffc16, --0x7b75ffff, --0xffffffff, --0xffffffff, --0x147e5c16, --0xffffffff, --0xffffffff, --0x2a106bff, --0xffffffff, --0x1eaa5ab4, --0x446bfc16, --0xffffffff, --0xffffffff, --0xffffffff, --0x41aaaa96, --0xffffffff, --0x3556b81b, --0x87a5fc00, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x4e6dffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x3252b81b, --0xffffffff, --0x5e54a81c, --0xffffffff, --0xffffffff, --0x0b44701c, --0x28b05c00, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x73785fff, --0xffffffff, --0xffffffff, --0xffffffff, --0x0b40701c, --0xffffffff, --0x6b65ffff, --0xffffffff, --0xffffffff, --0x1daa5a72, --0xffffffff, --0xffffffff, --0xffffffff, --0x6266cc1b, --0xffffffff, --0x375bfc16, --0xffffffff, --0xffffffff, --0xffffffff, --0x3f695400, --0xffffffff, --0xffffffff, --0xffffffff, --0x6d113017, --0x3ead541b, --0xffffffff, --0x5d448816, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x18506416, --0xffffffff, --0xffffffff, --0x16b37400, --0xffffffff, --0x4653fc16, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x04126c1b, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x574ffc16, --0xffffffff, --0x6855ffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x040e6c1b, --0x41aaa275, --0xffffffff, --0xffffffff, --0xffffffff, --0x574bfc16, --0x6f826400, --0x6851ffff, --0x1eaa5ad4, --0x2a125816, --0xffffffff, --0x040a6c1b, --0x7185fc00, --0xffffffff, --0xffffffff, --0xffffffff, --0x5747fc16, --0x7b87fc04, --0xffffffff, --0xffffffff, --0x090e5816, --0xffffffff, --0x04066c1b, --0x6e81fc00, --0x1aac6c1b, --0x1850601c, --0x2e5cbbff, --0x5543fc16, --0xffffffff, --0xffffffff, --0xffffffff, --0x090a5816, --0xffffffff, --0x04026c1b, --0xffffffff, --0xffffffff, --0x8087440c, --0xffffffff, --0xffffffff, --0xffffffff, --0x6c45ffff, --0x8287fc0c, --0x09065816, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x6b41ffff, --0x3353fc2e, --0x09025816, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x2f50bbff, --0x073c5800, --0x6266cc16, --0x5f4083ff, --0xffffffff, --0xffffffff, --0x43aca41b, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x2a10701c, --0x6364cfff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x7e865c0c, --0xffffffff, --0xffffffff, --0x3656b82e, --0x41aaa295, --0x100c701c, --0x614a9416, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x2c5ebc1b, --0xffffffff, --0x2a105c17, --0xffffffff, --0x1008701c, --0x3cab5675, --0xffffffff, --0xffffffff, --0x77873806, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0x1004701c, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff, --0xffffffff --}; -- --#define fold_hashkey(k) (lj_rol(lj_rol((k),17)-(k),16)%915) -- -diff -Naur a/src/lj_frame.h b/src/lj_frame.h ---- a/src/lj_frame.h 2024-11-05 09:58:44.413962653 +0800 -+++ b/src/lj_frame.h 2024-11-05 11:30:10.422190418 +0800 -@@ -264,6 +264,18 @@ +diff --git a/src/lj_frame.h b/src/lj_frame.h +index 19c49a4..a6e805e 100644 +--- a/src/lj_frame.h ++++ b/src/lj_frame.h +@@ -264,6 +264,18 @@ enum { LJ_CONT_TAILCALL, LJ_CONT_FFI_CALLBACK }; /* Special continuations. */ #endif #define CFRAME_OFS_MULTRES 0 #define CFRAME_SHIFT_MULTRES 3 + +#elif LJ_TARGET_SW64 -+#define CFRAME_OFS_ERRF 172 -+#define CFRAME_OFS_NRES 168 -+#define CFRAME_OFS_PREV 160 -+#define CFRAME_OFS_L 152 -+#define CFRAME_OFS_PC 144 ++#define CFRAME_OFS_ERRF 172 ++#define CFRAME_OFS_NRES 168 ++#define CFRAME_OFS_PREV 160 ++#define CFRAME_OFS_L 152 ++#define CFRAME_OFS_PC 144 +#define CFRAME_SIZE 176 + -+#define CFRAME_OFS_MULTRES 0 ++#define CFRAME_OFS_MULTRES 0 +#define CFRAME_SHIFT_MULTRES 3 + #else #error "Missing CFRAME_* definitions for this architecture" #endif -diff -Naur a/src/lj_gdbjit.c b/src/lj_gdbjit.c ---- a/src/lj_gdbjit.c 2024-11-05 09:58:44.413962653 +0800 -+++ b/src/lj_gdbjit.c 2024-11-05 11:33:25.420046275 +0800 -@@ -306,6 +306,9 @@ +diff --git a/src/lj_gdbjit.c b/src/lj_gdbjit.c +index c219ffa..c89b60b 100644 +--- a/src/lj_gdbjit.c ++++ b/src/lj_gdbjit.c +@@ -306,6 +306,9 @@ enum { #elif LJ_TARGET_MIPS DW_REG_SP = 29, DW_REG_RA = 31, @@ -6498,7 +5001,7 @@ diff -Naur a/src/lj_gdbjit.c b/src/lj_gdbjit.c #else #error "Unsupported target architecture" #endif -@@ -383,6 +386,8 @@ +@@ -383,6 +386,8 @@ static const ELFheader elfhdr_template = { .machine = 20, #elif LJ_TARGET_MIPS .machine = 8, @@ -6507,7 +5010,7 @@ diff -Naur a/src/lj_gdbjit.c b/src/lj_gdbjit.c #else #error "Unsupported target architecture" #endif -@@ -591,6 +596,10 @@ +@@ -591,6 +596,10 @@ static void LJ_FASTCALL gdbjit_ehframe(GDBJITctx *ctx) for (i = 23; i >= 16; i--) { DB(DW_CFA_offset|i); DUV(26-i); } for (i = 30; i >= 20; i -= 2) { DB(DW_CFA_offset|32|i); DUV(42-i); } } @@ -6518,693 +5021,27 @@ diff -Naur a/src/lj_gdbjit.c b/src/lj_gdbjit.c #else #error "Unsupported target architecture" #endif -diff -Naur a/src/lj_jit.h b/src/lj_jit.h ---- a/src/lj_jit.h 2024-11-05 09:58:44.413962653 +0800 -+++ b/src/lj_jit.h 2024-11-05 13:44:35.053442889 +0800 -@@ -67,10 +67,13 @@ - #endif +diff --git a/src/lj_jit.h b/src/lj_jit.h +index 92054e3..c2a9f70 100644 +--- a/src/lj_jit.h ++++ b/src/lj_jit.h +@@ -55,6 +55,11 @@ + #else + #define JIT_F_CPUSTRING "\010MIPS64R2" #endif - ++ +#elif LJ_TARGET_SW64 +#define JIT_F_SW1621 0x00000010 +#define JIT_F_CPU_FIRST JIT_F_SW1621 +#define JIT_F_CPUSTRING "\4SW6A" #else -- -+#define JIT_F_CPU_FIRST 0 + #define JIT_F_CPU_FIRST 0 #define JIT_F_CPUSTRING "" -- - #endif - - /* Optimization flags. 12 bits. */ -diff -Naur a/src/lj_libdef.h b/src/lj_libdef.h ---- a/src/lj_libdef.h 2017-05-02 03:05:00.000000000 +0800 -+++ b/src/lj_libdef.h 1970-01-01 08:00:00.000000000 +0800 -@@ -1,393 +0,0 @@ --/* This is a generated file. DO NOT EDIT! */ -- --#ifdef LJLIB_MODULE_base --#undef LJLIB_MODULE_base --static const lua_CFunction lj_lib_cf_base[] = { -- lj_ffh_assert, -- lj_ffh_next, -- lj_ffh_pairs, -- lj_ffh_ipairs_aux, -- lj_ffh_ipairs, -- lj_ffh_setmetatable, -- lj_cf_getfenv, -- lj_cf_setfenv, -- lj_ffh_rawget, -- lj_cf_rawset, -- lj_cf_rawequal, -- lj_cf_unpack, -- lj_cf_select, -- lj_ffh_tonumber, -- lj_ffh_tostring, -- lj_cf_error, -- lj_ffh_pcall, -- lj_cf_loadfile, -- lj_cf_load, -- lj_cf_loadstring, -- lj_cf_dofile, -- lj_cf_gcinfo, -- lj_cf_collectgarbage, -- lj_cf_newproxy, -- lj_cf_print --}; --static const uint8_t lj_lib_init_base[] = { --2,0,28,70,97,115,115,101,114,116,195,110,105,108,199,98,111,111,108,101,97, --110,252,1,200,117,115,101,114,100,97,116,97,198,115,116,114,105,110,103,197, --117,112,118,97,108,198,116,104,114,101,97,100,197,112,114,111,116,111,200,102, --117,110,99,116,105,111,110,197,116,114,97,99,101,197,99,100,97,116,97,197,116, --97,98,108,101,252,9,198,110,117,109,98,101,114,132,116,121,112,101,68,110,101, --120,116,253,69,112,97,105,114,115,64,253,70,105,112,97,105,114,115,140,103, --101,116,109,101,116,97,116,97,98,108,101,76,115,101,116,109,101,116,97,116, --97,98,108,101,7,103,101,116,102,101,110,118,7,115,101,116,102,101,110,118,70, --114,97,119,103,101,116,6,114,97,119,115,101,116,8,114,97,119,101,113,117,97, --108,6,117,110,112,97,99,107,6,115,101,108,101,99,116,72,116,111,110,117,109, --98,101,114,195,110,105,108,197,102,97,108,115,101,196,116,114,117,101,72,116, --111,115,116,114,105,110,103,5,101,114,114,111,114,69,112,99,97,108,108,134, --120,112,99,97,108,108,8,108,111,97,100,102,105,108,101,4,108,111,97,100,10, --108,111,97,100,115,116,114,105,110,103,6,100,111,102,105,108,101,6,103,99,105, --110,102,111,14,99,111,108,108,101,99,116,103,97,114,98,97,103,101,252,2,8,110, --101,119,112,114,111,120,121,200,116,111,115,116,114,105,110,103,5,112,114,105, --110,116,252,3,200,95,86,69,82,83,73,79,78,250,255 --}; --#endif -- --#ifdef LJLIB_MODULE_coroutine --#undef LJLIB_MODULE_coroutine --static const lua_CFunction lj_lib_cf_coroutine[] = { -- lj_cf_coroutine_status, -- lj_cf_coroutine_running, -- lj_cf_coroutine_create, -- lj_ffh_coroutine_yield, -- lj_ffh_coroutine_resume, -- lj_cf_coroutine_wrap --}; --static const uint8_t lj_lib_init_coroutine[] = { --30,13,6,6,115,116,97,116,117,115,7,114,117,110,110,105,110,103,6,99,114,101, --97,116,101,69,121,105,101,108,100,70,114,101,115,117,109,101,254,4,119,114, --97,112,255 --}; --#endif -- --#ifdef LJLIB_MODULE_math --#undef LJLIB_MODULE_math --static const lua_CFunction lj_lib_cf_math[] = { -- lj_ffh_math_abs, -- lj_ffh_math_sqrt, -- lj_ffh_math_log, -- lj_ffh_math_atan2, -- lj_ffh_math_ldexp, -- lj_ffh_math_min, -- lj_cf_math_random, -- lj_cf_math_randomseed --}; --static const uint8_t lj_lib_init_math[] = { --37,16,30,67,97,98,115,133,102,108,111,111,114,132,99,101,105,108,68,115,113, --114,116,133,108,111,103,49,48,131,101,120,112,131,115,105,110,131,99,111,115, --131,116,97,110,132,97,115,105,110,132,97,99,111,115,132,97,116,97,110,132,115, --105,110,104,132,99,111,115,104,132,116,97,110,104,133,102,114,101,120,112,132, --109,111,100,102,251,248,193,99,26,220,165,76,64,131,100,101,103,251,57,157, --82,162,70,223,145,63,131,114,97,100,67,108,111,103,69,97,116,97,110,50,131, --112,111,119,132,102,109,111,100,69,108,100,101,120,112,67,109,105,110,131,109, --97,120,251,24,45,68,84,251,33,9,64,194,112,105,250,251,0,0,0,0,0,0,240,127, --196,104,117,103,101,250,252,2,6,114,97,110,100,111,109,252,2,10,114,97,110, --100,111,109,115,101,101,100,255 --}; --#endif -- --#ifdef LJLIB_MODULE_bit --#undef LJLIB_MODULE_bit --static const lua_CFunction lj_lib_cf_bit[] = { -- lj_ffh_bit_tobit, -- lj_ffh_bit_lshift, -- lj_ffh_bit_band, -- lj_cf_bit_tohex --}; --static const uint8_t lj_lib_init_bit[] = { --65,42,12,69,116,111,98,105,116,132,98,110,111,116,133,98,115,119,97,112,70, --108,115,104,105,102,116,134,114,115,104,105,102,116,135,97,114,115,104,105, --102,116,131,114,111,108,131,114,111,114,68,98,97,110,100,131,98,111,114,132, --98,120,111,114,5,116,111,104,101,120,255 --}; --#endif -- --#ifdef LJLIB_MODULE_string --#undef LJLIB_MODULE_string --static const lua_CFunction lj_lib_cf_string[] = { -- lj_ffh_string_len, -- lj_ffh_string_byte, -- lj_ffh_string_char, -- lj_ffh_string_sub, -- lj_ffh_string_rep, -- lj_ffh_string_reverse, -- lj_cf_string_dump, -- lj_cf_string_find, -- lj_cf_string_match, -- lj_cf_string_gmatch, -- lj_cf_string_gsub, -- lj_cf_string_format --}; --static const uint8_t lj_lib_init_string[] = { --77,53,14,67,108,101,110,68,98,121,116,101,68,99,104,97,114,67,115,117,98,67, --114,101,112,71,114,101,118,101,114,115,101,133,108,111,119,101,114,133,117, --112,112,101,114,4,100,117,109,112,4,102,105,110,100,5,109,97,116,99,104,254, --6,103,109,97,116,99,104,4,103,115,117,98,6,102,111,114,109,97,116,255 --}; --#endif -- --#ifdef LJLIB_MODULE_table --#undef LJLIB_MODULE_table --static const lua_CFunction lj_lib_cf_table[] = { -- lj_cf_table_foreachi, -- lj_cf_table_foreach, -- lj_ffh_table_getn, -- lj_cf_table_maxn, -- lj_cf_table_insert, -- lj_cf_table_remove, -- lj_cf_table_concat, -- lj_cf_table_sort --}; --static const uint8_t lj_lib_init_table[] = { --92,61,8,8,102,111,114,101,97,99,104,105,7,102,111,114,101,97,99,104,68,103, --101,116,110,4,109,97,120,110,6,105,110,115,101,114,116,6,114,101,109,111,118, --101,6,99,111,110,99,97,116,4,115,111,114,116,255 --}; --#endif -- --#ifdef LJLIB_MODULE_io_method --#undef LJLIB_MODULE_io_method --static const lua_CFunction lj_lib_cf_io_method[] = { -- lj_cf_io_method_close, -- lj_cf_io_method_read, -- lj_cf_io_method_write, -- lj_cf_io_method_flush, -- lj_cf_io_method_seek, -- lj_cf_io_method_setvbuf, -- lj_cf_io_method_lines, -- lj_cf_io_method___gc, -- lj_cf_io_method___tostring --}; --static const uint8_t lj_lib_init_io_method[] = { --100,62,10,5,99,108,111,115,101,4,114,101,97,100,5,119,114,105,116,101,5,102, --108,117,115,104,4,115,101,101,107,7,115,101,116,118,98,117,102,5,108,105,110, --101,115,4,95,95,103,99,10,95,95,116,111,115,116,114,105,110,103,252,1,199,95, --95,105,110,100,101,120,250,255 --}; --#endif -- --#ifdef LJLIB_MODULE_io --#undef LJLIB_MODULE_io --static const lua_CFunction lj_lib_cf_io[] = { -- lj_cf_io_open, -- lj_cf_io_popen, -- lj_cf_io_tmpfile, -- lj_cf_io_close, -- lj_cf_io_read, -- lj_cf_io_write, -- lj_cf_io_flush, -- lj_cf_io_input, -- lj_cf_io_output, -- lj_cf_io_lines, -- lj_cf_io_type --}; --static const uint8_t lj_lib_init_io[] = { --109,62,12,252,2,192,250,4,111,112,101,110,5,112,111,112,101,110,7,116,109,112, --102,105,108,101,5,99,108,111,115,101,4,114,101,97,100,5,119,114,105,116,101, --5,102,108,117,115,104,5,105,110,112,117,116,6,111,117,116,112,117,116,5,108, --105,110,101,115,4,116,121,112,101,255 --}; --#endif -- --#ifdef LJLIB_MODULE_os --#undef LJLIB_MODULE_os --static const lua_CFunction lj_lib_cf_os[] = { -- lj_cf_os_execute, -- lj_cf_os_remove, -- lj_cf_os_rename, -- lj_cf_os_tmpname, -- lj_cf_os_getenv, -- lj_cf_os_exit, -- lj_cf_os_clock, -- lj_cf_os_date, -- lj_cf_os_time, -- lj_cf_os_difftime, -- lj_cf_os_setlocale --}; --static const uint8_t lj_lib_init_os[] = { --120,62,11,7,101,120,101,99,117,116,101,6,114,101,109,111,118,101,6,114,101, --110,97,109,101,7,116,109,112,110,97,109,101,6,103,101,116,101,110,118,4,101, --120,105,116,5,99,108,111,99,107,4,100,97,116,101,4,116,105,109,101,8,100,105, --102,102,116,105,109,101,9,115,101,116,108,111,99,97,108,101,255 --}; --#endif -- --#ifdef LJLIB_MODULE_debug --#undef LJLIB_MODULE_debug --static const lua_CFunction lj_lib_cf_debug[] = { -- lj_cf_debug_getregistry, -- lj_cf_debug_getmetatable, -- lj_cf_debug_setmetatable, -- lj_cf_debug_getfenv, -- lj_cf_debug_setfenv, -- lj_cf_debug_getinfo, -- lj_cf_debug_getlocal, -- lj_cf_debug_setlocal, -- lj_cf_debug_getupvalue, -- lj_cf_debug_setupvalue, -- lj_cf_debug_upvalueid, -- lj_cf_debug_upvaluejoin, -- lj_cf_debug_sethook, -- lj_cf_debug_gethook, -- lj_cf_debug_debug, -- lj_cf_debug_traceback --}; --static const uint8_t lj_lib_init_debug[] = { --131,62,16,11,103,101,116,114,101,103,105,115,116,114,121,12,103,101,116,109, --101,116,97,116,97,98,108,101,12,115,101,116,109,101,116,97,116,97,98,108,101, --7,103,101,116,102,101,110,118,7,115,101,116,102,101,110,118,7,103,101,116,105, --110,102,111,8,103,101,116,108,111,99,97,108,8,115,101,116,108,111,99,97,108, --10,103,101,116,117,112,118,97,108,117,101,10,115,101,116,117,112,118,97,108, --117,101,9,117,112,118,97,108,117,101,105,100,11,117,112,118,97,108,117,101, --106,111,105,110,7,115,101,116,104,111,111,107,7,103,101,116,104,111,111,107, --5,100,101,98,117,103,9,116,114,97,99,101,98,97,99,107,255 --}; --#endif -- --#ifdef LJLIB_MODULE_jit --#undef LJLIB_MODULE_jit --static const lua_CFunction lj_lib_cf_jit[] = { -- lj_cf_jit_on, -- lj_cf_jit_off, -- lj_cf_jit_flush, -- lj_cf_jit_status, -- lj_cf_jit_attach --}; --static const uint8_t lj_lib_init_jit[] = { --147,62,9,2,111,110,3,111,102,102,5,102,108,117,115,104,6,115,116,97,116,117, --115,6,97,116,116,97,99,104,252,5,194,111,115,250,252,4,196,97,114,99,104,250, --252,3,203,118,101,114,115,105,111,110,95,110,117,109,250,252,2,199,118,101, --114,115,105,111,110,250,255 --}; --#endif -- --#ifdef LJLIB_MODULE_jit_util --#undef LJLIB_MODULE_jit_util --static const lua_CFunction lj_lib_cf_jit_util[] = { -- lj_cf_jit_util_funcinfo, -- lj_cf_jit_util_funcbc, -- lj_cf_jit_util_funck, -- lj_cf_jit_util_funcuvname, -- lj_cf_jit_util_traceinfo, -- lj_cf_jit_util_traceir, -- lj_cf_jit_util_tracek, -- lj_cf_jit_util_tracesnap, -- lj_cf_jit_util_tracemc, -- lj_cf_jit_util_traceexitstub, -- lj_cf_jit_util_ircalladdr --}; --static const uint8_t lj_lib_init_jit_util[] = { --152,62,11,8,102,117,110,99,105,110,102,111,6,102,117,110,99,98,99,5,102,117, --110,99,107,10,102,117,110,99,117,118,110,97,109,101,9,116,114,97,99,101,105, --110,102,111,7,116,114,97,99,101,105,114,6,116,114,97,99,101,107,9,116,114,97, --99,101,115,110,97,112,7,116,114,97,99,101,109,99,13,116,114,97,99,101,101,120, --105,116,115,116,117,98,10,105,114,99,97,108,108,97,100,100,114,255 --}; --#endif -- --#ifdef LJLIB_MODULE_jit_opt --#undef LJLIB_MODULE_jit_opt --static const lua_CFunction lj_lib_cf_jit_opt[] = { -- lj_cf_jit_opt_start --}; --static const uint8_t lj_lib_init_jit_opt[] = { --163,62,1,5,115,116,97,114,116,255 --}; --#endif -- --#ifdef LJLIB_MODULE_ffi_meta --#undef LJLIB_MODULE_ffi_meta --static const lua_CFunction lj_lib_cf_ffi_meta[] = { -- lj_cf_ffi_meta___index, -- lj_cf_ffi_meta___newindex, -- lj_cf_ffi_meta___eq, -- lj_cf_ffi_meta___len, -- lj_cf_ffi_meta___lt, -- lj_cf_ffi_meta___le, -- lj_cf_ffi_meta___concat, -- lj_cf_ffi_meta___call, -- lj_cf_ffi_meta___add, -- lj_cf_ffi_meta___sub, -- lj_cf_ffi_meta___mul, -- lj_cf_ffi_meta___div, -- lj_cf_ffi_meta___mod, -- lj_cf_ffi_meta___pow, -- lj_cf_ffi_meta___unm, -- lj_cf_ffi_meta___tostring, -- lj_cf_ffi_meta___pairs, -- lj_cf_ffi_meta___ipairs --}; --static const uint8_t lj_lib_init_ffi_meta[] = { --164,62,19,7,95,95,105,110,100,101,120,10,95,95,110,101,119,105,110,100,101, --120,4,95,95,101,113,5,95,95,108,101,110,4,95,95,108,116,4,95,95,108,101,8,95, --95,99,111,110,99,97,116,6,95,95,99,97,108,108,5,95,95,97,100,100,5,95,95,115, --117,98,5,95,95,109,117,108,5,95,95,100,105,118,5,95,95,109,111,100,5,95,95, --112,111,119,5,95,95,117,110,109,10,95,95,116,111,115,116,114,105,110,103,7, --95,95,112,97,105,114,115,8,95,95,105,112,97,105,114,115,195,102,102,105,203, --95,95,109,101,116,97,116,97,98,108,101,250,255 --}; --#endif -- --#ifdef LJLIB_MODULE_ffi_clib --#undef LJLIB_MODULE_ffi_clib --static const lua_CFunction lj_lib_cf_ffi_clib[] = { -- lj_cf_ffi_clib___index, -- lj_cf_ffi_clib___newindex, -- lj_cf_ffi_clib___gc --}; --static const uint8_t lj_lib_init_ffi_clib[] = { --182,62,3,7,95,95,105,110,100,101,120,10,95,95,110,101,119,105,110,100,101,120, --4,95,95,103,99,255 --}; --#endif -- --#ifdef LJLIB_MODULE_ffi_callback --#undef LJLIB_MODULE_ffi_callback --static const lua_CFunction lj_lib_cf_ffi_callback[] = { -- lj_cf_ffi_callback_free, -- lj_cf_ffi_callback_set --}; --static const uint8_t lj_lib_init_ffi_callback[] = { --185,62,3,4,102,114,101,101,3,115,101,116,252,1,199,95,95,105,110,100,101,120, --250,255 --}; --#endif -- --#ifdef LJLIB_MODULE_ffi --#undef LJLIB_MODULE_ffi --static const lua_CFunction lj_lib_cf_ffi[] = { -- lj_cf_ffi_cdef, -- lj_cf_ffi_new, -- lj_cf_ffi_cast, -- lj_cf_ffi_typeof, -- lj_cf_ffi_istype, -- lj_cf_ffi_sizeof, -- lj_cf_ffi_alignof, -- lj_cf_ffi_offsetof, -- lj_cf_ffi_errno, -- lj_cf_ffi_string, -- lj_cf_ffi_copy, -- lj_cf_ffi_fill, -- lj_cf_ffi_abi, -- lj_cf_ffi_metatype, -- lj_cf_ffi_gc, -- lj_cf_ffi_load --}; --static const uint8_t lj_lib_init_ffi[] = { --187,62,22,4,99,100,101,102,3,110,101,119,4,99,97,115,116,6,116,121,112,101, --111,102,6,105,115,116,121,112,101,6,115,105,122,101,111,102,7,97,108,105,103, --110,111,102,8,111,102,102,115,101,116,111,102,5,101,114,114,110,111,6,115,116, --114,105,110,103,4,99,111,112,121,4,102,105,108,108,3,97,98,105,252,8,192,250, --8,109,101,116,97,116,121,112,101,252,7,192,250,2,103,99,252,5,192,250,4,108, --111,97,100,252,4,193,67,250,252,3,194,111,115,250,252,2,196,97,114,99,104,250, --255 --}; --#endif -- -diff -Naur a/src/lj_recdef.h b/src/lj_recdef.h ---- a/src/lj_recdef.h 2017-05-02 03:05:00.000000000 +0800 -+++ b/src/lj_recdef.h 1970-01-01 08:00:00.000000000 +0800 -@@ -1,263 +0,0 @@ --/* This is a generated file. DO NOT EDIT! */ -- --static const uint16_t recff_idmap[] = { --0, --0x0100, --0x0200, --0x0300, --0, --0, --0x0400, --0x0500, --0x0600, --0x0700, --0, --0, --0x0800, --0x0900, --0x0a00, --0, --0x0b00, --0x0c00, --0x0d00, --0, --0x0e00, --0x0f00, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0x1000, --0x1100+(IRFPM_FLOOR), --0x1100+(IRFPM_CEIL), --0x1200+(IRFPM_SQRT), --0x1200+(IRFPM_LOG10), --0x1200+(IRFPM_EXP), --0x1200+(IRFPM_SIN), --0x1200+(IRFPM_COS), --0x1200+(IRFPM_TAN), --0x1300+(FF_math_asin), --0x1300+(FF_math_acos), --0x1300+(FF_math_atan), --0x1400+(IRCALL_sinh), --0x1400+(IRCALL_cosh), --0x1400+(IRCALL_tanh), --0, --0x1500, --0x1600, --0x1600, --0x1700, --0x1800, --0x1900, --0, --0x1a00, --0x1b00+(IR_MIN), --0x1b00+(IR_MAX), --0x1c00, --0, --0x1d00+(IR_TOBIT), --0x1d00+(IR_BNOT), --0x1d00+(IR_BSWAP), --0x1e00+(IR_BSHL), --0x1e00+(IR_BSHR), --0x1e00+(IR_BSAR), --0x1e00+(IR_BROL), --0x1e00+(IR_BROR), --0x1f00+(IR_BAND), --0x1f00+(IR_BOR), --0x1f00+(IR_BXOR), --0, --0x2000, --0x2100+(0), --0, --0x2100+(1), --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0x2200, --0, --0x2300, --0x2400, --0, --0, --0, --0, --0x2500+(0), --0x2600+(0), --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0x2500+(GCROOT_IO_OUTPUT), --0x2600+(GCROOT_IO_OUTPUT), --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0, --0x2700+(0), --0x2700+(1), --0x2800+(MM_eq), --0x2800+(MM_len), --0x2800+(MM_lt), --0x2800+(MM_le), --0x2800+(MM_concat), --0x2900, --0x2800+(MM_add), --0x2800+(MM_sub), --0x2800+(MM_mul), --0x2800+(MM_div), --0x2800+(MM_mod), --0x2800+(MM_pow), --0x2800+(MM_unm), --0, --0, --0, --0x2a00+(1), --0x2a00+(0), --0, --0, --0, --0, --0x2b00, --0x2b00, --0x2c00, --0x2d00, --0x2e00+(FF_ffi_sizeof), --0x2e00+(FF_ffi_alignof), --0x2e00+(FF_ffi_offsetof), --0x2f00, --0x3000, --0x3100, --0x3200, --0x3300, --0, --0x3400 --}; -- --static const RecordFunc recff_func[] = { --recff_nyi, --recff_c, --recff_assert, --recff_type, --recff_ipairs_aux, --recff_ipairs, --recff_getmetatable, --recff_setmetatable, --recff_rawget, --recff_rawset, --recff_rawequal, --recff_select, --recff_tonumber, --recff_tostring, --recff_pcall, --recff_xpcall, --recff_math_abs, --recff_math_round, --recff_math_unary, --recff_math_atrig, --recff_math_htrig, --recff_math_modf, --recff_math_degrad, --recff_math_log, --recff_math_atan2, --recff_math_pow, --recff_math_ldexp, --recff_math_minmax, --recff_math_random, --recff_bit_unary, --recff_bit_shift, --recff_bit_nary, --recff_string_len, --recff_string_range, --recff_table_getn, --recff_table_insert, --recff_table_remove, --recff_io_write, --recff_io_flush, --recff_cdata_index, --recff_cdata_arith, --recff_cdata_call, --recff_clib_index, --recff_ffi_new, --recff_ffi_typeof, --recff_ffi_istype, --recff_ffi_xof, --recff_ffi_errno, --recff_ffi_string, --recff_ffi_copy, --recff_ffi_fill, --recff_ffi_abi, --recff_ffi_gc --}; -- -diff -Naur a/src/lj_snap.c b/src/lj_snap.c ---- a/src/lj_snap.c 2024-11-05 09:58:44.417962606 +0800 -+++ b/src/lj_snap.c 2024-11-05 11:35:45.895160951 +0800 -@@ -805,7 +805,7 @@ +diff --git a/src/lj_snap.c b/src/lj_snap.c +index bb063c2..33beb5c 100644 +--- a/src/lj_snap.c ++++ b/src/lj_snap.c +@@ -715,7 +715,7 @@ static void snap_restoredata(GCtrace *T, ExitState *ex, #if !LJ_SOFTFP if (r >= RID_MAX_GPR) { src = (int32_t *)&ex->fpr[r-RID_MIN_FPR]; @@ -7213,19 +5050,29 @@ diff -Naur a/src/lj_snap.c b/src/lj_snap.c if (sz == 4) { /* PPC FPRs are always doubles. */ *(float *)dst = (float)*(double *)src; return; -diff -Naur a/src/lj_target.h b/src/lj_target.h ---- a/src/lj_target.h 2024-11-05 09:58:44.417962606 +0800 -+++ b/src/lj_target.h 2024-11-05 13:21:35.409474173 +0800 -@@ -55,7 +55,7 @@ +diff --git a/src/lj_target.h b/src/lj_target.h +index 8dcae95..c7bed12 100644 +--- a/src/lj_target.h ++++ b/src/lj_target.h +@@ -55,7 +55,7 @@ typedef uint32_t RegSP; /* Bitset for registers. 32 registers suffice for most architectures. ** Note that one set holds bits for both GPRs and FPRs. */ -#if LJ_TARGET_PPC || LJ_TARGET_MIPS || LJ_TARGET_ARM64 +#if LJ_TARGET_PPC || LJ_TARGET_MIPS || LJ_TARGET_ARM64 || LJ_TARGET_SW64 typedef uint64_t RegSet; - #define RSET_BITS 6 - #define rset_picktop_(rs) ((Reg)lj_fls64(rs)) -@@ -143,6 +143,8 @@ + #else + typedef uint32_t RegSet; +@@ -69,7 +69,7 @@ typedef uint32_t RegSet; + #define rset_set(rs, r) (rs |= RID2RSET(r)) + #define rset_clear(rs, r) (rs &= ~RID2RSET(r)) + #define rset_exclude(rs, r) (rs & ~RID2RSET(r)) +-#if LJ_TARGET_PPC || LJ_TARGET_MIPS || LJ_TARGET_ARM64 ++#if LJ_TARGET_PPC || LJ_TARGET_MIPS || LJ_TARGET_ARM64 || LJ_TARGET_SW64 + #define rset_picktop(rs) ((Reg)(__builtin_clzll(rs)^63)) + #define rset_pickbot(rs) ((Reg)__builtin_ctzll(rs)) + #else +@@ -144,6 +144,8 @@ typedef uint32_t RegCost; #include "lj_target_ppc.h" #elif LJ_TARGET_MIPS #include "lj_target_mips.h" @@ -7234,10 +5081,12 @@ diff -Naur a/src/lj_target.h b/src/lj_target.h #else #error "Missing include for target CPU" #endif -diff -Naur a/src/lj_target_sw64.h b/src/lj_target_sw64.h ---- a/src/lj_target_sw64.h 1970-01-01 08:00:00.000000000 +0800 -+++ b/src/lj_target_sw64.h 2024-11-05 13:33:32.703974745 +0800 -@@ -0,0 +1,304 @@ +diff --git a/src/lj_target_sw64.h b/src/lj_target_sw64.h +new file mode 100644 +index 0000000..cb2f611 +--- /dev/null ++++ b/src/lj_target_sw64.h +@@ -0,0 +1,283 @@ +/* +** Definitions for SW64 CPUs. +** Copyright (C) 2019-2019 deepin inc. See Copyright Notice in luajit.h @@ -7273,8 +5122,6 @@ diff -Naur a/src/lj_target_sw64.h b/src/lj_target_sw64.h + + /* Calling conventions. */ + RID_RET = RID_R0, -+ RID_RETHI = RID_R0, -+ RID_RETLO = RID_R5, + RID_FPRET = RID_F0, + RID_CFUNCADDR = RID_R27, + @@ -7412,7 +5259,6 @@ diff -Naur a/src/lj_target_sw64.h b/src/lj_target_sw64.h + SW64I_LDI = 0xf8000000, + SW64I_CALL= 0x04000000, + SW64I_BR = 0x10000000, -+ SW64I_LBR = 0x74000000, + + SW64I_S4ADDL = 0x40000140, + SW64I_S4ADDLI = 0x48000140, @@ -7431,14 +5277,6 @@ diff -Naur a/src/lj_target_sw64.h b/src/lj_target_sw64.h + SW64I_MULWI =0x48000200, + SW64I_UMULH = 0x40000320, + SW64I_UMULHI =0x48000320, -+ SW64I_DIVW = 0x40000220, -+ SW64I_UDIVW = 0x40000240, -+ SW64I_REMW = 0x40000260, -+ SW64I_UREMW = 0x40000280, -+ SW64I_DIVL = 0x40000340, -+ SW64I_UDIVL = 0x40000360, -+ SW64I_REML = 0x40000380, -+ SW64I_UREML = 0x400003a0, + + SW64I_FADDS = 0x60000000, + SW64I_FADDD = 0x60000020, @@ -7452,16 +5290,6 @@ diff -Naur a/src/lj_target_sw64.h b/src/lj_target_sw64.h + SW64I_SRL = 0x40000920, + SW64I_SRAI = 0x48000940, + SW64I_SRA = 0x40000940, -+ SW64I_ROLL = 0x40000960, -+ SW64I_ROLLI = 0x48000960, -+ SW64I_SLLW = 0x40000980, -+ SW64I_SLLWI = 0x48000980, -+ SW64I_SRLW = 0x400009a0, -+ SW64I_SRLWI = 0x480009a0, -+ SW64I_SRAW = 0x400009c0, -+ SW64I_SRAWI = 0x480009c0, -+ SW64I_ROLW = 0x400009e0, -+ SW64I_ROLWI = 0x480009e0, + + SW64I_AND = 0x40000700, + SW64I_ANDI = 0x48000700, @@ -7542,10 +5370,11 @@ diff -Naur a/src/lj_target_sw64.h b/src/lj_target_sw64.h +} SW64Ins; + +#endif -diff -Naur a/src/lj_trace.c b/src/lj_trace.c ---- a/src/lj_trace.c 2024-11-05 09:58:44.421962559 +0800 -+++ b/src/lj_trace.c 2024-11-05 13:25:40.383186199 +0800 -@@ -870,8 +870,57 @@ +diff --git a/src/lj_trace.c b/src/lj_trace.c +index d85b47f..954d388 100644 +--- a/src/lj_trace.c ++++ b/src/lj_trace.c +@@ -827,8 +827,57 @@ static TraceNo trace_exit_find(jit_State *J, MCode *pc) } #endif @@ -7603,10 +5432,10 @@ diff -Naur a/src/lj_trace.c b/src/lj_trace.c { ERRNO_SAVE lua_State *L = J->L; -@@ -902,6 +951,10 @@ +@@ -851,6 +900,10 @@ int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr) } #endif - lj_assertJ(T != NULL && J->exitno < T->nsnap, "bad trace or exit number"); + lua_assert(T != NULL && J->exitno < T->nsnap); +#if SW64_DEBUG_WI + printf("-----------%s exitno:%d nsnap:%d traceno:%d exit_addr:0x%lx\n", __FUNCTION__, + J->exitno, T->nsnap, T->traceno, exit_addr); @@ -7614,10 +5443,11 @@ diff -Naur a/src/lj_trace.c b/src/lj_trace.c exd.J = J; exd.exptr = exptr; errcode = lj_vm_cpcall(L, NULL, &exd, trace_exit_cp); -diff -Naur a/src/lj_trace.h b/src/lj_trace.h ---- a/src/lj_trace.h 2024-11-05 09:58:44.421962559 +0800 -+++ b/src/lj_trace.h 2024-11-05 13:27:58.232172910 +0800 -@@ -36,7 +36,11 @@ +diff --git a/src/lj_trace.h b/src/lj_trace.h +index 22cae74..4c20367 100644 +--- a/src/lj_trace.h ++++ b/src/lj_trace.h +@@ -36,7 +36,11 @@ LJ_FUNC void lj_trace_freestate(global_State *g); LJ_FUNC void lj_trace_ins(jit_State *J, const BCIns *pc); LJ_FUNCA void LJ_FASTCALL lj_trace_hot(jit_State *J, const BCIns *pc); LJ_FUNCA void LJ_FASTCALL lj_trace_stitch(jit_State *J, const BCIns *pc); @@ -7626,90 +5456,31 @@ diff -Naur a/src/lj_trace.h b/src/lj_trace.h +#else LJ_FUNCA int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr); +#endif - #if LJ_UNWIND_EXT - LJ_FUNC uintptr_t LJ_FASTCALL lj_trace_unwind(jit_State *J, uintptr_t addr, ExitNo *ep); - #endif -diff -Naur a/src/lj_vmmath.c b/src/lj_vmmath.c ---- a/src/lj_vmmath.c 2024-11-05 09:58:44.421962559 +0800 -+++ b/src/lj_vmmath.c 2024-11-05 13:28:57.781255159 +0800 -@@ -69,7 +69,7 @@ - /* -- Helper functions for generated machine code ------------------------- */ + /* Signal asynchronous abort of trace or end of trace. */ + #define lj_trace_abort(g) (G2J(g)->state &= ~LJ_TRACE_ACTIVE) +diff --git a/src/lj_vmmath.c b/src/lj_vmmath.c +index b231d3e..4d4d744 100644 +--- a/src/lj_vmmath.c ++++ b/src/lj_vmmath.c +@@ -57,7 +57,7 @@ double lj_vm_foldarith(double x, double y, int op) + } + } -#if (LJ_HASJIT && !(LJ_TARGET_ARM || LJ_TARGET_ARM64 || LJ_TARGET_PPC)) || LJ_TARGET_MIPS +#if (LJ_HASJIT && !(LJ_TARGET_ARM || LJ_TARGET_ARM64 || LJ_TARGET_PPC)) || LJ_TARGET_MIPS || LJ_TARGET_SW64 int32_t LJ_FASTCALL lj_vm_modi(int32_t a, int32_t b) { uint32_t y, ua, ub; -diff -Naur a/src/luajit_rolling.h b/src/luajit_rolling.h ---- a/src/luajit_rolling.h 2024-11-05 09:58:44.421962559 +0800 -+++ b/src/luajit_rolling.h 2024-11-05 14:37:08.052947283 +0800 -@@ -30,11 +30,19 @@ - - #include "lua.h" - -+#if defined(__sw_64__) -+#define LUAJIT_VERSION "LuaJIT 2.1.0_9 sw1.0.0" -+#define LUAJIT_VERSION_NUM 20199 -+#define LUAJIT_VERSION_SYM luaJIT_version_2_1_0_9_sw_1_0_0 -+#define LUAJIT_COPYRIGHT "Copyright (C) 2024 Sheng Kai" -+#define LUAJIT_URL "https://luajit.org/" -+#else - #define LUAJIT_VERSION "LuaJIT 2.1.ROLLING" - #define LUAJIT_VERSION_NUM 20199 /* Deprecated. */ - #define LUAJIT_VERSION_SYM luaJIT_version_2_1_ROLLING - #define LUAJIT_COPYRIGHT "Copyright (C) 2005-2023 Mike Pall" - #define LUAJIT_URL "https://luajit.org/" -+#endif - - /* Modes for luaJIT_setmode. */ - #define LUAJIT_MODE_MASK 0x00ff -diff -Naur a/src/Makefile b/src/Makefile ---- a/src/Makefile 2024-11-05 09:58:44.429962466 +0800 -+++ b/src/Makefile 2024-11-05 13:40:30.527913542 +0800 -@@ -52,6 +52,7 @@ - CCOPT_arm64= - CCOPT_ppc= - CCOPT_mips= -+CCOPT_sw64= -mieee - # - CCDEBUG= - # Uncomment the next line to generate debug information: -@@ -234,6 +235,9 @@ - TARGET_ALIBS= $(TARGET_XLIBS) $(LIBS) $(TARGET_LIBS) - - TARGET_TESTARCH:=$(shell $(TARGET_CC) $(TARGET_TCFLAGS) -E lj_arch.h -dM) -+ifneq (,$(findstring LJ_TARGET_SW64 ,$(TARGET_TESTARCH))) -+ TARGET_LJARCH= sw64 -+else - ifneq (,$(findstring LJ_TARGET_X64 ,$(TARGET_TESTARCH))) - TARGET_LJARCH= x64 - else -@@ -274,6 +278,7 @@ - endif - endif - endif -+endif - - ifneq (,$(findstring LJ_TARGET_PS3 1,$(TARGET_TESTARCH))) - TARGET_SYS= PS3 -@@ -437,6 +442,9 @@ - DASM_AFLAGS+= -D PAUTH - TARGET_ARCH+= -DLJ_ABI_PAUTH=1 - endif -+ifneq (,$(findstring SW64_DEBUG_WI 1,$(TARGET_TESTARCH))) -+ DASM_AFLAGS+= -D SW64_DEBUG_WI -+endif - DASM_AFLAGS+= -D VER=$(subst LJ_ARCH_VERSION_,,$(filter LJ_ARCH_VERSION_%,$(subst LJ_ARCH_VERSION ,LJ_ARCH_VERSION_,$(TARGET_TESTARCH)))) - ifeq (Windows,$(TARGET_SYS)) - DASM_AFLAGS+= -D WIN -diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc ---- a/src/vm_sw64.dasc 1970-01-01 08:00:00.000000000 +0800 -+++ b/src/vm_sw64.dasc 2024-11-05 13:33:50.971868037 +0800 -@@ -0,0 +1,4938 @@ +diff --git a/src/vm_sw64.dasc b/src/vm_sw64.dasc +new file mode 100644 +index 0000000..38a103f +--- /dev/null ++++ b/src/vm_sw64.dasc +@@ -0,0 +1,4761 @@ +|// Low-level VM code for SW64 CPUs. +|// Bytecode interpreter, fast functions and helper functions. -+|// Copyright (C) 2023 Sheng Kai. See Copyright Notice in luajit.h ++|// Copyright (C) 2023 Mike Pall. See Copyright Notice in luajit.h +| +|.arch sw64 +|.section code_op, code_sub @@ -7879,22 +5650,8 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc +|.define OFS_OP, 0 +| +|// Instruction decode. -+|.macro decode_BC4b, dst -+|.if SW64_CORE4 -+| sllwi dst, 2, dst -+|.else -+| slli dst, 2, dst -+| addwi dst, 0, dst -+|.endif -+|.endmacro -+|.macro decode_BC8b, dst -+|.if SW64_CORE4 -+| sllwi dst, 3, dst -+|.else -+| slli dst, 3, dst -+| addwi dst, 0, dst -+|.endif -+|.endmacro ++|.macro decode_BC4b, dst; slli dst, 2, dst; addwi dst, 0, dst; .endmacro ++|.macro decode_BC8b, dst; slli dst, 3, dst; addwi dst, 0, dst; .endmacro +|.macro decode_OP, dst, ins; andi ins, 0xff, dst; .endmacro +|.macro decode_RA, dst, ins; extlb ins, 0x1, dst; decode_BC8b dst; .endmacro +|.macro decode_RB, dst, ins; extlb ins, 0x3, dst; decode_BC8b dst; .endmacro @@ -7970,12 +5727,7 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc +|//----------------------------------------------------------------------- +| +|.macro branch_RD -+|.if SW64_CORE4 -+| srlwi RD, 1, TMP0 -+|.else -+| zapi RD, 0xf0, RD -+| srli RD, 1, TMP0 -+|.endif ++| zapi RD, 0xf0, RD; srli RD, 1, TMP0 +| ldih TMP4, -0x2(zero) // -BCBIAS_J*4 +| addw TMP0, TMP4, TMP0 // (jump - 0x8000)<<2 +| addl PC, TMP0, PC @@ -8205,12 +5957,7 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + | load_got lj_state_growstack + | stl BASE, L->top + | bis RD, zero, MULTRES -+ |.if SW64_CORE4 -+ | srlwi TMP2, 3, CARG2 -+ |.else -+ | zapi TMP2, 0xf0, CARG2 -+ | srli CARG2, 3, CARG2 -+ |.endif ++ | zapi TMP2, 0xf0, CARG2; srli CARG2, 3, CARG2 + | bis L, zero, CARG1 + | call_intern lj_state_growstack // (lua_State *L, int n) + | ldw TMP2, SAVE_NRES(sp) @@ -8254,10 +6001,6 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + | ldi RD, 16(zero) // 2 results: false + error message. + | br zero, ->vm_returnc + | -+ |->vm_unwind_stub: // Jump to exit stub from unwinder. -+ | bis CARG2, zero, ra -+ | jmp zero, 0(CARG1) -+ | + |//----------------------------------------------------------------------- + |//-- Grow stack for calls ----------------------------------------------- + |//----------------------------------------------------------------------- @@ -8273,12 +6016,7 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + | stl BASE, L->base + | ldi PC, 4(PC) // Must point after first instruction. + | stl RC, L->top -+ |.if SW64_CORE4 -+ | srlwi RA, 3, CARG2 -+ |.else -+ | zapi RA, 0xf0, CARG2 -+ | srli CARG2, 3, CARG2 -+ |.endif ++ | zapi RA, 0xf0, CARG2; srli CARG2, 3, CARG2 + |2: + | // L->base = new base, L->top = top + | load_got lj_state_growstack @@ -8429,11 +6167,11 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + | ldl PC, -24(RB) // Restore PC from [cont|PC]. + | cleartp LFUNC:TMP1 + | addl RA, RD, TMP2 ++ | ldl TMP1, LFUNC:TMP1->pc + | stl TISNIL, -8(TMP2) // Ensure one valid arg. + |.if FFI + | bne AT, >1 + |.endif -+ | ldl TMP1, LFUNC:TMP1->pc + | // BASE = base, RA = resultptr, RB = meta base + | ldl KBASE, PC2PROTO(k)(TMP1) + | jmp zero, 0(TMP0) // Jump to continuation. @@ -8670,15 +6408,10 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + | ldi PC, -4(PC) + | stl BASE, L->base + | bis L, zero, CARG1 -+ |.if SW64_CORE4 -+ | srlwi RA, 3, CARG2 -+ | srlwi RD, 3, CARG3 -+ |.else + | zapi RA, 0xf0, CARG2 + | srli CARG2, 3, CARG2 + | zapi RD, 0xf0, CARG3 + | srli CARG3, 3, CARG3 -+ |.endif + | stl PC, SAVE_PC(sp) + | call_intern lj_meta_istype // (lua_State *L, BCReg ra, BCReg tp) + | br zero, ->cont_nop @@ -8897,9 +6630,9 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + | ldi CARG1, LJ_TNIL(zero) + | beq TAB:RB, ->fff_restv + | ldw TMP0, TAB:RB->hmask -+ | ldw TMP1, STR:RC->sid ++ | ldw TMP1, STR:RC->hash + | ldl NODE:TMP2, TAB:RB->node -+ | and TMP1, TMP0, TMP1 // idx = str->sid & tab->hmask ++ | and TMP1, TMP0, TMP1 // idx = str->hash & tab->hmask + | slli TMP1, 5, TMP0 + | slli TMP1, 3, TMP1 + | subl TMP0, TMP1, TMP1 @@ -9006,24 +6739,27 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + |//-- Base library: iterators ------------------------------------------- + | + |.ffunc_1 next -+ | checktp CARG1, -LJ_TTAB, ->fff_fallback ++ | checktp CARG2, CARG1, -LJ_TTAB, ->fff_fallback + | addl BASE, NARGS8:RC, TMP2 ++ | ldl PC, FRAME_PC(BASE) + | stl TISNIL, 0(TMP2) // Set missing 2nd arg to nil. + | load_got lj_tab_next -+ | ldl PC, FRAME_PC(BASE) -+ | ldi CARG2, 8(BASE) -+ | ldi CARG3, -16(BASE) ++ | stl BASE, L->base // Add frame since C call can throw. ++ | stl BASE, L->top // Dummy frame length is ok. ++ | ldi CARG3, 8(BASE) ++ | stl PC, SAVE_PC(sp) ++ | bis L, zero, CARG1 + | call_intern lj_tab_next // (GCtab *t, cTValue *key, TValue *o) + | // Returns 1=found, 0=end, -1=error. -+ | ldi RA, -16(BASE) -+ | ldi RD, (2+1)*8(zero) -+ | bgt CRET1, ->fff_res + | bis TISNIL, zero, CARG1 + | beq CRET1, ->fff_restv // End of traversal: return nil. -+ | ldl CFUNC:RB, FRAME_FUNC(BASE) -+ | ldi RC, 2*8(zero) -+ | cleartp CFUNC:RB -+ | br zero, ->fff_fallback ++ | ldl TMP0, 8(BASE) ++ | ldi RA, -16(BASE) ++ | ldl TMP2, 16(BASE) ++ | stl TMP0, 0(RA) ++ | stl TMP2, 8(RA) ++ | ldi RD, (2+1)*8(zero) ++ | br zero, ->fff_res + | + |.ffunc_1 pairs + | checktp TAB:TMP1, CARG1, -LJ_TTAB, ->fff_fallback @@ -9102,23 +6838,15 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + |//-- Base library: catch errors ---------------------------------------- + | + |.ffunc pcall -+ | ldl TMP1, L->maxstack -+ | addl BASE, NARGS8:RC, TMP2 -+ | cmpult TMP1, TMP2, AT -+ | ldbu TMP3, DISPATCH_GL(hookmask)(DISPATCH) -+ | bne AT, ->fff_fallback + | ldi NARGS8:RC, -8(NARGS8:RC) ++ | ldbu TMP3, DISPATCH_GL(hookmask)(DISPATCH) + | bis BASE, zero, TMP2 + | cmplt NARGS8:RC, zero, AT + | bne AT, ->fff_fallback + | ldi BASE, 16(BASE) + | // Remember active hook before pcall. -+ |.if SW64_CORE4 -+ | srlwi TMP3, HOOK_ACTIVE_SHIFT, TMP3 -+ |.else + | zapi TMP3, 0xf0, TMP3 + | srli TMP3, HOOK_ACTIVE_SHIFT, TMP3 -+ |.endif + | andi TMP3, 1, TMP3 + | ldi PC, 16+FRAME_PCALL(TMP3) + | beq NARGS8:RC, ->vm_call_dispatch @@ -9133,12 +6861,8 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + | br zero, ->vm_call_dispatch + | + |.ffunc xpcall -+ | ldl TMP1, L->maxstack -+ | addl BASE, NARGS8:RC, TMP2 -+ | cmpult TMP1, TMP2, AT -+ | ldl CARG1, 0(BASE) -+ | bne AT, ->fff_fallback + | ldi NARGS8:TMP0, -16(NARGS8:RC) ++ | ldl CARG1, 0(BASE) + | ldl CARG2, 8(BASE) + | ldbu TMP1, DISPATCH_GL(hookmask)(DISPATCH) + | cmplt NARGS8:TMP0, zero, AT @@ -9150,12 +6874,8 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + | bis NARGS8:TMP0, zero, NARGS8:RC + | ldi BASE, 24(BASE) + | // Remember active hook before pcall. -+ |.if SW64_CORE4 -+ | srlwi TMP3, HOOK_ACTIVE_SHIFT, TMP3 -+ |.else + | zapi TMP3, 0xf0, TMP3 + | srli TMP3, HOOK_ACTIVE_SHIFT, TMP3 -+ |.endif + | stl CARG2, 0(TMP2) // Swap function and traceback. + | andi TMP3, 1, TMP3 + | stl CARG1, 8(TMP2) @@ -9280,12 +7000,8 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + |9: // Handle stack expansion on return from yield. + | load_got lj_state_growstack + | bis L, zero, CARG1 -+ |.if SW64_CORE4 -+ | srlwi RD, 3, CARG2 -+ |.else + | zapi RD, 0xf0, CARG2 + | srli CARG2, 3, CARG2 -+ |.endif + | call_intern lj_state_growstack // (lua_State *L, int n) + | ldi CRET1, 0(zero) + | br zero, <4 @@ -9332,12 +7048,8 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + | ldi TMP2, -LJ_TISNUM(CARG2) + | addwi CARG1, 0, TMP1 + | bne TMP2, >1 -+ |.if SW64_CORE4 -+ | srawi TMP1, 31, TMP0 -+ |.else + | addwi TMP1, 0, TMP0 + | srai TMP0, 31, TMP0 // Extract sign. int -+ |.endif + | xor TMP1, TMP0, TMP1 + | subl TMP1, TMP0, CARG1 + | slli CARG1, 32, TMP3 @@ -9346,12 +7058,8 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + | cmplt TMP3, zero, AT + | beq AT, ->fff_restv + | ldi CARG1, 0x41e(zero) // 2^31 as a double. -+ |.if SW64_CORE4 -+ | sllwi CARG1, 4, CARG1 // 0x41e0 -+ |.else + | slli CARG1, 4, CARG1 // 0x41e0 + | addwi CARG1, 0, CARG1 -+ |.endif + | slli CARG1, 48, CARG1 + | br zero, ->fff_restv + |1: @@ -9637,7 +7345,7 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + | ldl TMP0, SBUF:CARG1->b + | stl L, SBUF:CARG1->L + | stl BASE, L->base -+ | stl TMP0, SBUF:CARG1->w ++ | stl TMP0, SBUF:CARG1->p + | stl PC, SAVE_PC(sp) + | call_intern extern lj_buf_putstr_ .. name + |// or SBUF:CARG1, SBUF:CRET1, zero @@ -9760,34 +7468,22 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + |.endmacro + | + |.macro .SLLW, rd, rs, rt -+ |.if SW64_CORE4 -+ | sllw rs, rt, rd -+ |.else + | andi rt, 0x1f, AT + | sll rs, AT, rd + | addwi rd, 0x0, rd -+ |.endif + |.endmacro + | + |.macro .SRLW, rd, rs, rt -+ |.if SW64_CORE4 -+ | srlw rs, rt, rd -+ |.else + | andi rt, 0x1f, AT + | zapi rs, 0xf0, rd + | srl rd, AT, rd + | addwi rd, 0, rd -+ |.endif + |.endmacro + | + |.macro .SRAW, rd, rs, rt -+ |.if SW64_CORE4 -+ | sraw rs, rt, rd -+ |.else + | andi rt, 0x1f, AT + | addwi rs, 0x0, rd + | sra rd, AT, rd -+ |.endif + |.endmacro + | + |.macro .RORW, rd, rs, rt //TODO CHECK @@ -9796,19 +7492,11 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + | subw TMP1, TMP0, TMP1 + | andi TMP0, 0x1f, TMP2 + | zapi rs, 0xf0, TMP0 -+ |.if SW64_CORE4 -+ | srlw TMP0, TMP2, TMP0 -+ |.else + | srl TMP0, TMP2, TMP0 + | addwi TMP0, 0, TMP0 -+ |.endif + | andi TMP1, 0x1f, TMP2 -+ |.if SW64_CORE4 -+ | sllw rs, TMP2, rd -+ |.else + | sll rs, TMP2, rd + | addwi rd, 0x0, rd -+ |.endif + | bis TMP0, rd, rd + | addwi rd, 0x0, rd + |.endmacro @@ -10135,9 +7823,8 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + | stl BASE, L->base + |1: + | ldl LFUNC:RB, FRAME_FUNC(BASE) -+ | ldi TMP0, -LUA_ERRERR(zero) -+ | cmpult CRET1, TMP0, TMP0 -+ | beq TMP0, >9 // Check for error from exit. ++ | cmplt CRET1, zero, AT ++ | bne AT, >9 // Check for error from exit. + | ldih TMP3, 0x59c0(zero) // TOBIT = 2^52 + 2^51 (float). + | slli CRET1, 3, MULTRES + | cleartp LFUNC:RB @@ -10151,25 +7838,23 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + | fcvtsd TOBIT, TOBIT + | // Modified copy of ins_next which handles function header dispatch, too. + | ldw INS, 0(PC) -+ | ldi CRET1, 17(CRET1) ++ | ldi PC, 4(PC) + | // Assumes TISNIL == ~LJ_VMST_INTERP == -1 + | stw TISNIL, DISPATCH_GL(vmstate)(DISPATCH) -+ | decode_RD RD, INS -+ | ldi PC, 4(PC) -+ | beq CRET1, >5 + | decode_OP TMP1, INS + | decode_BC8b TMP1 + | // cmpulti TMP1, BC_FUNCF*8, TMP2 -+ | addl DISPATCH, TMP1, TMP0 + | ldi TMP2, BC_FUNCF*8(zero) + | cmpult TMP1, TMP2, TMP2 ++ | addl DISPATCH, TMP1, TMP0 ++ | decode_RD RD, INS + | ldl TMP3, 0(TMP0) + | decode_RA RA, INS + | beq TMP2, >2 + | jmp zero, 0(TMP3) + |2: + | // cmpulti TMP1, (BC_FUNCC+2)*8, TMP2 // Fast function? -+ | ldi TMP2, (BC_FUNCC+2)*8(zero) ++ | ldi TMP2, (BC_FUNCF+2)*8(zero) + | cmpult TMP1, TMP2, TMP2 + | ldl TMP1, FRAME_PC(BASE) + | bne TMP2, >3 @@ -10189,25 +7874,11 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + | addl RA, BASE, RA + | jmp zero, 0(TMP3) + | -+ |5: // Dispatch to static entry of original ins replaced by BC_JLOOP. -+ | ldl TMP0, DISPATCH_J(trace)(DISPATCH) -+ | decode_BC8b RD -+ | addl TMP0, RD, TMP0 -+ | ldl TRACE:TMP2, 0(TMP0) -+ | ldw INS, TRACE:TMP2->startins -+ | decode_OP TMP1, INS -+ | decode_BC8b TMP1 -+ | addl DISPATCH, TMP1, TMP0 -+ | decode_RD RD, INS -+ | ldl TMP3, GG_DISP2STATIC(TMP0) -+ | decode_RA RA, INS -+ | jmp zero, 0(TMP3) -+ | + |9: // Rethrow error from the right C frame. -+ | load_got lj_err_trace ++ | load_got lj_err_throw + | subw zero, CRET1, CARG2 //TODO LA: sub.w no trap + | bis L, zero, CARG1 -+ | call_intern lj_err_trace // (lua_State *L, int errcode) ++ | call_intern lj_err_throw // (lua_State *L, int errcode) + |.endif + | + |//----------------------------------------------------------------------- @@ -10269,67 +7940,58 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + | + |// TValue *lj_vm_next(GCtab *t, uint32_t idx) + |// Next idx returned in CRET2. -+ |->vm_next: -+ |.if JIT -+ | ldw NEXT_ASIZE, NEXT_TAB->asize -+ | ldl NEXT_TMP0, NEXT_TAB->array -+ | ldi NEXT_NIL, LJ_TNIL(zero) -+ |1: // Traverse array part. -+ | cmpult NEXT_IDX, NEXT_ASIZE, TMP3 -+ |.if SW64_CORE4 -+ | sllwi NEXT_IDX, 3, NEXT_TMP1 -+ |.else -+ | slli NEXT_IDX, 3, NEXT_TMP1 -+ | addwi NEXT_TMP1, 0, NEXT_TMP1 -+ |.endif -+ | addl NEXT_TMP0, NEXT_TMP1, NEXT_TMP1 -+ | beq TMP3, >5 -+ | ldi TMP3, LJ_TISNUM(zero) -+ | ldl NEXT_TMP2, 0(NEXT_TMP1) -+ | slli TMP3, 47, TMP3 -+ | bis NEXT_IDX, TMP3, NEXT_TMP1 -+ | addwi NEXT_IDX, 1, NEXT_IDX -+ | cmpeq NEXT_TMP2, NEXT_NIL, NEXT_TMP2 -+ | bne NEXT_TMP2, <1 -+ | stl NEXT_TMP2, NEXT_RES_VAL -+ | stl NEXT_TMP1, NEXT_RES_KEY -+ | bis NEXT_RES_PTR, zero, NEXT_RES_VK -+ | bis NEXT_IDX, zero, NEXT_RES_IDX -+ | ret zero, 0(ra) -+ | -+ |5: // Traverse hash part. -+ | subw NEXT_IDX, NEXT_ASIZE, NEXT_RES_IDX -+ | ldw NEXT_TMP0, NEXT_TAB->hmask -+ | ldl NODE:NEXT_RES_VK, NEXT_TAB->node -+ |.if SW64_CORE4 -+ | sllwi NEXT_RES_IDX, 5, NEXT_TMP2 -+ | sllwi NEXT_RES_IDX, 3, TMP3 -+ |.else -+ | slli NEXT_RES_IDX, 5, NEXT_TMP2 -+ | addwi NEXT_TMP2, 0, NEXT_TMP2 -+ | slli NEXT_RES_IDX, 3, TMP3 -+ | addwi TMP3, 0, TMP3 -+ |.endif -+ | subw NEXT_TMP2, TMP3, TMP3 -+ | addl NODE:NEXT_RES_VK, TMP3, NODE:NEXT_RES_VK -+ |6: -+ | cmpult NEXT_TMP0, NEXT_RES_IDX, TMP3 -+ | bne TMP3, >8 -+ | ldl NEXT_TMP2, NODE:NEXT_RES_VK->val -+ | addwi NEXT_RES_IDX, 1, NEXT_RES_IDX -+ | cmpeq NEXT_TMP2, NEXT_NIL, NEXT_TMP2 -+ | beq NEXT_TMP2, >9 ++ |//->vm_next: ++ |//.if JIT ++ |// ldw NEXT_ASIZE, NEXT_TAB->asize ++ |// ldl NEXT_TMP0, NEXT_TAB->array ++ |// ldi NEXT_NIL, LJ_TNIL(zero) ++ |//1: // Traverse array part. ++ |// cmpult NEXT_IDX, NEXT_ASIZE, TMP3 ++ |// slli NEXT_IDX, 3, NEXT_TMP1 ++ |// addwi NEXT_TMP1, 0, NEXT_TMP1 ++ |// addl NEXT_TMP1, NEXT_TMP0, NEXT_TMP1 ++ |// beq TMP3, >5 ++ |// ldi TMP3, LJ_TISNUM(zero) ++ |// ldl NEXT_TMP2, 0(NEXT_TMP1) ++ |// slli TMP3, 47, TMP3 ++ |// bis NEXT_IDX, TMP3, NEXT_TMP1 ++ |// addwi NEXT_IDX, 1, NEXT_IDX ++ |// cmpeq NEXT_TMP2, NEXT_NIL, NEXT_TMP2 ++ |// bne NEXT_TMP2, <1 ++ |// stl NEXT_TMP2, NEXT_RES_VAL ++ |// stl NEXT_TMP1, NEXT_RES_KEY ++ |// bis NEXT_RES_PTR, zero, NEXT_RES_VK ++ |// bis NEXT_IDX, zero, NEXT_RES_IDX ++ |// ret zero, 0(ra) ++ | ++ |//5: // Traverse hash part. ++ |// subw NEXT_IDX, NEXT_ASIZE, NEXT_RES_IDX ++ |// ldw NEXT_TMP0, NEXT_TAB->hmask ++ |// ldl NODE:NEXT_RES_VK, NEXT_TAB->node ++ |// slli NEXT_RES_IDX, 5, NEXT_TMP2 ++ |// addwi NEXT_TMP2, 0, NEXT_TMP2 ++ |// slli NEXT_RES_IDX, 3, TMP3 ++ |// addwi TMP3, 0, TMP3 ++ |// subw NEXT_TMP2, TMP3, TMP3 ++ |// addl NODE:NEXT_RES_VK, TMP3, NODE:NEXT_RES_VK ++ |//6: ++ |// cmpult NEXT_TMP0, NEXT_RES_IDX, TMP3 ++ |// bne TMP3, >8 ++ |// ldl NEXT_TMP2, NODE:NEXT_RES_VK->val ++ |// addwi NEXT_RES_IDX, 1, NEXT_RES_IDX ++ |// cmpeq NEXT_TMP2, NEXT_NIL, NEXT_TMP2 ++ |// beq NEXT_TMP2, >9 + | // Skip holes in hash part. -+ | ldi NODE:NEXT_RES_VK, sizeof(Node)(NODE:NEXT_RES_VK) -+ | br zero, <6 ++ |// ldi NODE:NEXT_RES_VK, sizeof(Node)(NODE:NEXT_RES_VK) ++ |// br zero, <6 + | -+ |8: // End of iteration. Set the key to nil (not the value). -+ | stl NEXT_NIL, NEXT_RES_KEY -+ | bis NEXT_RES_PTR, zero, NEXT_RES_VK -+ |9: -+ | addw NEXT_RES_IDX, NEXT_ASIZE, NEXT_RES_IDX -+ | ret zero, 0(ra) -+ |.endif ++ |//8: // End of iteration. Set the key to nil (not the value). ++ |// stl NEXT_NIL, NEXT_RES_KEY ++ |// bis NEXT_RES_PTR, zero, NEXT_RES_VK ++ |//9: ++ |// addw NEXT_RES_IDX, NEXT_ASIZE, NEXT_RES_IDX ++ |// ret zero, 0(ra) ++ |//.endif + | + |//----------------------------------------------------------------------- + |//-- FFI helper functions ----------------------------------------------- @@ -10405,7 +8067,7 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + | bis sp, zero, TMP2 + | subl sp, TMP1, sp + | stl ra, -8(TMP2) -+ |// s8addwi CARG2, 0, CARG2 ++ | s8addwi CARG2, 0, CARG2 + | stl r9, -16(TMP2) + | stl CCSTATE, -24(TMP2) + | bis TMP2, zero, r9 @@ -10796,12 +8458,8 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + vk = op == BC_ISEQP; + | // RA = src*8, RD = primitive_type*8 (~), JMP with RD = target + | addl RA, BASE, RA -+ |.if SW64_CORE4 -+ | srlwi RD, 3, TMP0 -+ |.else + | zapi RD, 0xf0, TMP0 + | srli TMP0, 3, TMP0 -+ |.endif + | ldl TMP1, 0(RA) + | ornot zero, TMP0, TMP0 // ~TMP0: ~0 ~1 ~2 + | ldhu TMP2, OFS_RD(PC) // TMP2: RD in next INS, branch target @@ -10862,12 +8520,8 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + case BC_ISTYPE: + | // RA = src*8, RD = -type*8 + | addl BASE, RA, TMP0 -+ |.if SW64_CORE4 -+ | srlwi RD, 3, TMP1 -+ |.else + | zapi RD, 0xf0, TMP1 + | srli TMP1, 3, TMP1 -+ |.endif + | ldl TMP0, 0(TMP0) + | gettp TMP0, TMP0 + | addl TMP0, TMP1, TMP0 // if itype of RA == type, then TMP0=0 @@ -11058,12 +8712,8 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + | mulw CARG3, CARG4, CRET1 + | mull CARG3, CARG4, TMP2 + | zapi TMP2, 0xf, TMP2 -+ |.if SW64_CORE4 -+ | srawi CRET1, 31, TMP1 // 63-32bit not all 0 or 1: overflow. -+ |.else + | addwi CRET1, 0, CRET1 + | srai CRET1, 31, TMP1 // 63-32bit not all 0 or 1: overflow. -+ |.endif + | addl RA, BASE, RA + | cmpeq TMP1, TMP2, AT + | beq AT, ->vmeta_arith @@ -11154,12 +8804,8 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + | bis RB, zero, MULTRES + |->BC_CAT_Z: + | load_got lj_meta_cat -+ |.if SW64_CORE4 -+ | srlwi CARG3, 3, CARG3 -+ |.else + | zapi CARG3, 0xf0, CARG3 + | srli CARG3, 3, CARG3 -+ |.endif + | stl PC, SAVE_PC(sp) + | bis L, zero, CARG1 + | call_intern lj_meta_cat // (lua_State *L, TValue *top, int left) @@ -11201,12 +8847,8 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + break; + case BC_KSHORT: + | // RA = dst*8, RD = int16_literal*8 -+ |.if SW64_CORE4 -+ | srawi INS, 16, RD -+ |.else + | addwi INS, 0, RD + | srai RD, 16, RD -+ |.endif + | addl RA, BASE, RA + | zapi RD, 0xf0, RD + | ldi TISNUM, LJ_TISNUM(zero) @@ -11401,22 +9043,14 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + |1: + if (op == BC_TNEW) { + | load_got lj_tab_new -+ |.if SW64_CORE4 -+ | srlwi RD, 3, CARG2 -+ |.else + | zapi RD, 0xf0, CARG2 + | srli CARG2, 3, CARG2 -+ |.endif + | ldi AT, 0x7ff(zero) + | and CARG2, AT, CARG2 + | ldi TMP0, 0x801(zero) + | subw CARG2, AT, TMP2 -+ |.if SW64_CORE4 -+ | srlwi RD, 14, CARG3 -+ |.else + | zapi RD, 0xf0, CARG3 + | srli CARG3, 14, CARG3 -+ |.endif + | seleq TMP2, TMP0, CARG2, CARG2 + | // (lua_State *L, int32_t asize, uint32_t hbits) + | bis L, zero, CARG1 @@ -11521,17 +9155,12 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + |->BC_TGETS_Z: + | // TAB:RB = GCtab *, STR:RC = GCstr *, RA = dst*8 + | ldw TMP0, TAB:RB->hmask -+ | ldw TMP1, STR:RC->sid ++ | ldw TMP1, STR:RC->hash + | ldl NODE:TMP2, TAB:RB->node -+ | and TMP1, TMP0, TMP1 // idx = str->sid & tab->hmask -+ |.if SW64_CORE4 -+ | sllwi TMP1, 5, TMP0 -+ | sllwi TMP1, 3, TMP1 -+ |.else ++ | and TMP1, TMP0, TMP1 // idx = str->hash & tab->hmask + | slli TMP1, 5, TMP0 + | addwi TMP0, 0, TMP0 + | s8addwi TMP1, 0, TMP1 -+ |.endif + | subw TMP0, TMP1, TMP1 + | ldi TMP3, LJ_TSTR(zero) + | addl NODE:TMP2, TMP1, NODE:TMP2 // node = tab->node + (idx*32-idx*8) @@ -11570,12 +9199,8 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + | decode_RDtoRC8 RC, RD + | ldl TAB:RB, 0(CARG2) + | addl RA, BASE, RA -+ |.if SW64_CORE4 -+ | srlwi RC, 3, TMP0 -+ |.else + | zapi RC, 0xf0, TMP0 + | srli TMP0, 3, TMP0 -+ |.endif + | checktab TAB:RB, ->vmeta_tgetb + | ldw TMP1, TAB:RB->asize + | ldl TMP2, TAB:RB->array @@ -11682,18 +9307,13 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + |->BC_TSETS_Z: + | // TAB:RB = GCtab *, STR:RC = GCstr *, RA = BASE+src*8 + | ldw TMP0, TAB:RB->hmask -+ | ldw TMP1, STR:RC->sid ++ | ldw TMP1, STR:RC->hash + | ldl NODE:TMP2, TAB:RB->node + | stb zero, TAB:RB->nomm // Clear metamethod cache. -+ | and TMP1, TMP0, TMP1 // idx = str->sid & tab->hmask -+ |.if SW64_CORE4 -+ | sllwi TMP1, 5, TMP0 -+ | sllwi TMP1, 3, TMP1 -+ |.else ++ | and TMP1, TMP0, TMP1 // idx = str->hash & tab->hmask + | slli TMP1, 5, TMP0 + | addwi TMP0, 0, TMP0 + | s8addwi TMP1, 0, TMP1 -+ |.endif + | subw TMP0, TMP1, TMP1 + | ldi TMP3, LJ_TSTR(zero) + | addl NODE:TMP2, TMP1, NODE:TMP2 // node = tab->node + (idx*32-idx*8) @@ -11758,12 +9378,8 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + | addl BASE, RB, CARG2 + | addl RA, BASE, RA + | ldl TAB:RB, 0(CARG2) -+ |.if SW64_CORE4 -+ | srlwi RC, 3, TMP0 -+ |.else + | zapi RC, 0xf0, TMP0 + | srli TMP0, 3, TMP0 -+ |.endif + | checktab RB, ->vmeta_tsetb + | ldw TMP1, TAB:RB->asize + | ldl TMP2, TAB:RB->array @@ -11831,12 +9447,8 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + | ldl TAB:CARG2, -8(RA) // Guaranteed to be a table. + | subwi MULTRES, 8, TMP0 + | ldw TMP3, 0(TMP3) // Integer constant is in lo-word. -+ |.if SW64_CORE4 -+ | srlwi TMP0, 3, CARG3 -+ |.else + | zapi TMP0, 0xf0, CARG3 + | srli CARG3, 3, CARG3 -+ |.endif + | beq TMP0, >4 // Nothing to copy? + | cleartp TAB:CARG2 + | addw CARG3, TMP3, CARG3 @@ -11974,7 +9586,6 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + break; + + case BC_ITERN: -+ |->vm_IITERN: + | // RA = base*8, (RB = (nresults+1)*8, RC = (nargs+1)*8 (2+1)*8) + | addl RA, BASE, RA + | ldl TAB:RB, -16(RA) @@ -12012,12 +9623,8 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + | ldl TMP2, TAB:RB->node + |6: + | cmpult TMP1, RC, CARG1 // End of iteration? Branch to ITERL+1. -+ |.if SW64_CORE4 -+ | sllwi RC, 5, TMP3 -+ |.else + | slli RC, 5, TMP3 + | addwi TMP3, 0, TMP3 -+ |.endif + | bne CARG1, <3 + | s8addwi RC, 0, RB + | subw TMP3, RB, TMP3 @@ -12042,12 +9649,8 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + case BC_ISNEXT: + | // RA = base*8, RD = target (points to ITERN) + | addl RA, BASE, RA -+ |.if SW64_CORE4 -+ | srlwi RD, 1, TMP0 -+ |.else + | zapi RD, 0xf0, TMP0 + | srli TMP0, 1, TMP0 -+ |.endif + | ldl CFUNC:CARG1, -24(RA) + | addl TMP0, PC, TMP0 + | ldl CARG2, -16(RA) @@ -12132,12 +9735,8 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + | stl BASE, L->base + | subl RC, BASE, BASE // Need delta, because BASE may change. + | stl PC, SAVE_PC(sp) -+ |.if SW64_CORE4 -+ | srlwi TMP1, 3, CARG2 -+ |.else + | zapi TMP1, 0xf0, CARG2 + | srli CARG2, 3, CARG2 -+ |.endif + | bis L, zero, CARG1 + | call_intern lj_state_growstack // (lua_State *L, int n) + | bis BASE, zero, RC @@ -12275,12 +9874,8 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + | gettp CARG5, CARG2 + | gettp CRET2, CARG3 + if (op != BC_JFORL) { -+ |.if SW64_CORE4 -+ | srlwi RD, 1, RD -+ |.else + | zapi RD, 0xf0, RD + | srli RD, 1, RD -+ |.endif + | ldih TMP2, -0x2(zero) // -BCBIAS_J<<2 + | addl TMP2, RD, TMP2 + } @@ -12498,7 +10093,6 @@ diff -Naur a/src/vm_sw64.dasc b/src/vm_sw64.dasc + | settp LFUNC:RB, TMP0 + | addl RA, RC, TMP0 + | stl LFUNC:RB, 0(TMP1) // Store (tagged) copy of LFUNC. -+ | ldi TMP2, -8(TMP2) + | ldi TMP3, 16+FRAME_VARG(RC) + | cmpult TMP0, TMP2, TMP0 + | ldl KBASE, -4+PC2PROTO(k)(PC) diff --git a/luajit.spec b/luajit.spec index eea799081779b7573e6a0ceabfb6f2c4f124a712..29144742135895c4e5efb1524777e52e1809d866 100644 --- a/luajit.spec +++ b/luajit.spec @@ -2,7 +2,7 @@ Name: luajit Version: 2.1.0 -Release: 12 +Release: 13 Summary: Just-In-Time Compiler for Lua License: MIT URL: http://luajit.org/ @@ -100,6 +100,9 @@ cp -a doc _tmp_html/html %{_mandir}/man1/%{name}.1* %changelog +* Wed Jul 23 2025 swcompiler - 2.1.0-13 +- update sw64 support + * Mon Jun 9 2025 Huang Qiqi - 2.1.0-12 - fix multiple bugs and optimize partial modules on loongarch64