From 2776ed7da8398236cc179efe9058ebcb53ab7e31 Mon Sep 17 00:00:00 2001 From: davidmaamoaix Date: Mon, 19 Jan 2026 22:08:06 -0500 Subject: [PATCH 1/4] [misc] Cleaned up `V3Offsets` allocation in interpreter --- src/engine/x86-64/X86_64Interpreter.v3 | 2 +- src/engine/x86-64/X86_64SinglePassCompiler.v3 | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/engine/x86-64/X86_64Interpreter.v3 b/src/engine/x86-64/X86_64Interpreter.v3 index 57a4417e4..30b4090da 100644 --- a/src/engine/x86-64/X86_64Interpreter.v3 +++ b/src/engine/x86-64/X86_64Interpreter.v3 @@ -249,7 +249,7 @@ class X86_64InterpreterGen(ic: X86_64InterpreterCode, w: DataWriter) { def asm = masm.asm; def xenv: IntExecEnv = X86_64MasmRegs.INT_EXEC_ENV; - def offsets = V3Offsets.new(); + def offsets = masm.getOffsets(); def valuerep = Target.tagging; def initialSize = w.data.length; diff --git a/src/engine/x86-64/X86_64SinglePassCompiler.v3 b/src/engine/x86-64/X86_64SinglePassCompiler.v3 index 5022106be..e66905950 100644 --- a/src/engine/x86-64/X86_64SinglePassCompiler.v3 +++ b/src/engine/x86-64/X86_64SinglePassCompiler.v3 @@ -998,7 +998,7 @@ class X86_64SinglePassCompiler extends SinglePassCompiler { mmasm.load_v128_mask(r_xmm0, mmasm.mask_i16x8_splat_0x0001, t); asm.pmaddwd_s_s(r_xmm0, r_xmm1); asm.paddd_s_s(r_xmm0, r_xmm2); - + state.push(a.kindFlagsMatching(ValueKind.V128, IN_REG), a.reg, 0); } @@ -1406,9 +1406,8 @@ def genTierUpCompileStub(ic: X86_64InterpreterCode, w: DataWriter) { var func_arg = G(regs.func_arg); // Decrement execution counter by 1 and compile if <= 0 var scratch = X86_64MasmRegs.R15; // XXX: regs.func_arg == scratch! - var offsets = V3Offsets.new(); masm.emit_v3_WasmFunction_decl_r_r(scratch, regs.func_arg); - asm.q.sub_m_i(G(scratch).plus(offsets.FuncDecl_tierup_trigger), FastIntTuning.entryTierUpDecrement); + asm.q.sub_m_i(G(scratch).plus(masm.getOffsets().FuncDecl_tierup_trigger), FastIntTuning.entryTierUpDecrement); var interpreter_entry = X86_64Label.new(); interpreter_entry.pos = ic.header.intSpcEntryOffset; asm.jc_rel_near(C.A, interpreter_entry); // jump to interpreter if >= 0 From ec2e8ee48ec93cc69035a8f280361d088c3708ee Mon Sep 17 00:00:00 2001 From: davidmaamoaix Date: Mon, 19 Jan 2026 22:12:54 -0500 Subject: [PATCH 2/4] [misc] Cleaned up `V3Offsets` allocation in masm --- src/engine/compiler/SinglePassCompiler.v3 | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/engine/compiler/SinglePassCompiler.v3 b/src/engine/compiler/SinglePassCompiler.v3 index 6bde3ef4a..1815afe48 100644 --- a/src/engine/compiler/SinglePassCompiler.v3 +++ b/src/engine/compiler/SinglePassCompiler.v3 @@ -1381,7 +1381,6 @@ class SinglePassCompiler(xenv: SpcExecEnv, masm: MacroAssembler, regAlloc: RegAl } } - var offsets = V3Offsets.new(); var stub_resume = masm.newLabel(it.pc), end = masm.newLabel(it.pc); var cont_decl = ContDecl.!(module.heaptypes[cont_id]); if (checkForConstNull(state.peek())) return; @@ -1435,7 +1434,6 @@ class SinglePassCompiler(xenv: SpcExecEnv, masm: MacroAssembler, regAlloc: RegAl masm.bindLabel(end); } def visit_SUSPEND(tag_index: u31) { - var offsets = V3Offsets.new(); var stub_suspend = masm.newLabel(it.pc), end = masm.newLabel(it.pc); state.emitSaveAll(resolver, SpillMode.SAVE_AND_FREE_REGS); @@ -1476,7 +1474,6 @@ class SinglePassCompiler(xenv: SpcExecEnv, masm: MacroAssembler, regAlloc: RegAl masm.bindLabel(end); } def visit_SWITCH(target_cont_idx: u31, tag_index: u31) { - var offsets = V3Offsets.new(); var stub_switch = masm.newLabel(it.pc), end = masm.newLabel(it.pc); state.emitSaveAll(resolver, SpillMode.SAVE_AND_FREE_REGS); @@ -1534,7 +1531,6 @@ class SinglePassCompiler(xenv: SpcExecEnv, masm: MacroAssembler, regAlloc: RegAl } } - var offsets = V3Offsets.new(); var stub_resume = masm.newLabel(it.pc), end = masm.newLabel(it.pc); var cont_decl = ContDecl.!(module.heaptypes[cont_id]); var tag = module.tags[tag_id]; @@ -1611,7 +1607,6 @@ class SinglePassCompiler(xenv: SpcExecEnv, masm: MacroAssembler, regAlloc: RegAl } } - var offsets = V3Offsets.new(); var stub_resume = masm.newLabel(it.pc), end = masm.newLabel(it.pc); var cont_decl = ContDecl.!(module.heaptypes[cont_id]); if (checkForConstNull(state.peek())) return; From 7c5fec006a3d96af3f66612c004c5317bcd05edb Mon Sep 17 00:00:00 2001 From: davidmaamoaix Date: Mon, 19 Jan 2026 22:14:44 -0500 Subject: [PATCH 3/4] [misc] Removed duplicate `offsets` field in masm --- src/engine/compiler/MacroAssembler.v3 | 2 +- src/engine/x86-64/X86_64MacroAssembler.v3 | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/engine/compiler/MacroAssembler.v3 b/src/engine/compiler/MacroAssembler.v3 index 8c002b8ee..743b16abd 100644 --- a/src/engine/compiler/MacroAssembler.v3 +++ b/src/engine/compiler/MacroAssembler.v3 @@ -25,7 +25,7 @@ class MacroAssembler(valuerep: Tagging, regConfig: RegConfig) { var source_loc: int = -1; // current source location, if any var newTrapLabel: TrapReason -> MasmLabel; var embeddedRefOffsets: Vector; - private var offsets: V3Offsets; + var offsets: V3Offsets; new() { unimplemented = fatalUnimplemented; diff --git a/src/engine/x86-64/X86_64MacroAssembler.v3 b/src/engine/x86-64/X86_64MacroAssembler.v3 index 86f2b4673..5325e353f 100644 --- a/src/engine/x86-64/X86_64MacroAssembler.v3 +++ b/src/engine/x86-64/X86_64MacroAssembler.v3 @@ -20,7 +20,6 @@ class X86_64MacroAssembler extends MacroAssembler { def asm = X86_64Assemblers.create64(w); var scratch: X86_64Gpr; var jump_tables: Vector<(int, Array)>; - var offsets: V3Offsets; var trap_stubs: X86_64SpcTrapsStub; new(w, regConfig: RegConfig) super(Target.tagging, regConfig) { @@ -1550,10 +1549,6 @@ class X86_64MacroAssembler extends MacroAssembler { def absPointer(ptr: Pointer) -> X86_64Addr { return X86_64Addr.new(null, null, 1, int.view(u32.!(ptr - Pointer.NULL))); } - def getOffsets() -> V3Offsets { - if (offsets == null) offsets = V3Offsets.new(); - return offsets; - } def emit_set_stack_state(stk: Reg, state: StackState) { emit_mov_m_i(MasmAddr(stk, offsets.X86_64Stack_state), state.tag); From a1980bb1652a871f55c9de419e249d6fccfc12c0 Mon Sep 17 00:00:00 2001 From: davidmaamoaix Date: Mon, 19 Jan 2026 22:18:43 -0500 Subject: [PATCH 4/4] [misc] Moved the only `V3Offsets` instantiation to `X86_64Target` --- src/engine/compiler/MacroAssembler.v3 | 3 +-- src/engine/x86-64/X86_64Target.v3 | 12 +++++++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/engine/compiler/MacroAssembler.v3 b/src/engine/compiler/MacroAssembler.v3 index 743b16abd..d3868cf1e 100644 --- a/src/engine/compiler/MacroAssembler.v3 +++ b/src/engine/compiler/MacroAssembler.v3 @@ -25,7 +25,7 @@ class MacroAssembler(valuerep: Tagging, regConfig: RegConfig) { var source_loc: int = -1; // current source location, if any var newTrapLabel: TrapReason -> MasmLabel; var embeddedRefOffsets: Vector; - var offsets: V3Offsets; + var offsets = Target.getOffsets(); new() { unimplemented = fatalUnimplemented; @@ -33,7 +33,6 @@ class MacroAssembler(valuerep: Tagging, regConfig: RegConfig) { } def getOffsets() -> V3Offsets { - if (offsets == null) offsets = V3Offsets.new(); return offsets; } def curCodeBytes() -> u64 { diff --git a/src/engine/x86-64/X86_64Target.v3 b/src/engine/x86-64/X86_64Target.v3 index 036d0bcd3..0dd1fb6e9 100644 --- a/src/engine/x86-64/X86_64Target.v3 +++ b/src/engine/x86-64/X86_64Target.v3 @@ -13,13 +13,15 @@ component Target { def limit_memory_size = 0x1_0000uL * 0x1_0000uL; def limit_memory_size_64 = 0x4_0000uL * 0x1_0000uL; - + def newMemory = NativeWasmMemory.new; def forceGC = RiGc.forceGC; def newWasmStack = X86_64StackManager.getFreshStack; def recycleWasmStack = X86_64StackManager.recycleStack; def tagging = Tagging.new(!FeatureDisable.valueTags, !FeatureDisable.simd); + private var offsets: V3Offsets; + new() { if (!SpcTuning.disable) { ExecuteOptions.registerMode("spc", X86_64SpcAotStrategy.new(false), "pre-compile modules with SPC, no fallback"); @@ -33,6 +35,11 @@ component Target { Instrumentation.probes.onDisable = X86_64Interpreter.onProbeDisable; } + def getOffsets() -> V3Offsets { + if (offsets == null) offsets = V3Offsets.new(); + return offsets; + } + def getTestTiers() -> List<(string, ExecutionStrategy)> { var spc_mode = ("jit:", X86_64SpcAotStrategy.new(true)); var int_mode = ("int:", X86_64InterpreterOnlyStrategy.new()); @@ -374,12 +381,11 @@ class X86_64DynamicStrategy extends X86_64SpcStrategy { installStubForModule(module, X86_64Spc.setTierUpFor); disableLazyNameDecodingDuringGC(module); if (Debug.runtime) { - var offsets = V3Offsets.new(); for (i < module.functions.length) { var func = module.functions[i]; Trace.OUT.put2( "Compiled function #%d: addr(target_code) = 0x%x", i, - Pointer.atObject(func) + offsets.FuncDecl_target_code - Pointer.NULL + Pointer.atObject(func) + Target.getOffsets().FuncDecl_target_code - Pointer.NULL ).ln(); } }