From f96c8a0a9cdfaeb90ab6063347368a0819b24f56 Mon Sep 17 00:00:00 2001 From: Matthew Schneider Date: Wed, 17 Jun 2026 15:32:10 -0400 Subject: [PATCH 1/2] Move restoreDispatchTableReg and computePc to MacroAssembler --- src/engine/compiler/MacroAssembler.v3 | 1 + src/engine/x86-64/X86_64Interpreter.v3 | 32 ++++++++--------------- src/engine/x86-64/X86_64MacroAssembler.v3 | 9 +++++++ 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/engine/compiler/MacroAssembler.v3 b/src/engine/compiler/MacroAssembler.v3 index 0a33e8ad8..2258ac7ba 100644 --- a/src/engine/compiler/MacroAssembler.v3 +++ b/src/engine/compiler/MacroAssembler.v3 @@ -315,6 +315,7 @@ class MacroAssembler(valuerep: Tagging, regConfig: RegConfig) { def emit_save_ivar(reg: Reg); def emit_spill_ivar(reg: Reg); def emit_restore_ivar(reg: Reg); + def emit_compute_pc(delta: int); def emit_pop_r(kind: ValueKind, reg: Reg); def emit_ret(); diff --git a/src/engine/x86-64/X86_64Interpreter.v3 b/src/engine/x86-64/X86_64Interpreter.v3 index 57ddc58be..eaa12a64e 100644 --- a/src/engine/x86-64/X86_64Interpreter.v3 +++ b/src/engine/x86-64/X86_64Interpreter.v3 @@ -561,7 +561,7 @@ class X86_64InterpreterGen(ic: X86_64InterpreterCode, w: DataWriter) { masm.emit_v3_X86_64Stack_rsp_r_r(xenv.sp, xenv.scratch); // Restore interpreter registers restoreCallerIVars(); - restoreDispatchTableReg(); + if (!FeatureDisable.globalProbes) masm.emit_restore_dispatch_table_reg(xenv.dispatch); // Continue to dispatch table endHandler(); } @@ -736,7 +736,7 @@ class X86_64InterpreterGen(ic: X86_64InterpreterCode, w: DataWriter) { ic.header.deoptReentryOffset = w.atEnd().pos; restoreCallerIVars(); masm.emit_restore_ivar(xenv.vsp); - restoreDispatchTableReg(); + if (!FeatureDisable.globalProbes) masm.emit_restore_dispatch_table_reg(xenv.dispatch); genJumpToDispatch(); genDeferred(); } @@ -1232,7 +1232,7 @@ class X86_64InterpreterGen(ic: X86_64InterpreterCode, w: DataWriter) { endHandler(); // TierUp triggered; call runtime asm.bind(tierup); - computePc(-1); + masm.emit_compute_pc(-1); masm.emit_get_curstack(xenv.tmp3); saveCallerIVars(); asm.movq_r_m(r_tmp1, m_wasm_func); @@ -1328,14 +1328,14 @@ class X86_64InterpreterGen(ic: X86_64InterpreterCode, w: DataWriter) { asm.call_rel_far(callReentryLabel); } restoreCallerIVars(); - if (!FeatureDisable.multiTier && !SpcTuning.disable) restoreDispatchTableReg(); + if (!FeatureDisable.multiTier && !SpcTuning.disable && !FeatureDisable.globalProbes) masm.emit_restore_dispatch_table_reg(xenv.dispatch); genDispatchOrJumpToDispatch(); // HostFunction: call into runtime asm.bind(call_host.label); asm.call_rel_far(hostCallStubLabel.label); restoreCallerIVars(); - restoreDispatchTableReg(); + if (!FeatureDisable.globalProbes) masm.emit_restore_dispatch_table_reg(xenv.dispatch); genJumpToDispatch(); } @@ -2605,7 +2605,7 @@ class X86_64InterpreterGen(ic: X86_64InterpreterCode, w: DataWriter) { restoreCallerIVars(); // skip pass {suspend} instruction after restoring pc genSkipLeb(); - restoreDispatchTableReg(); + if (!FeatureDisable.globalProbes) masm.emit_restore_dispatch_table_reg(xenv.dispatch); endHandler(); asm.bind(stub_suspend); { @@ -2639,7 +2639,7 @@ class X86_64InterpreterGen(ic: X86_64InterpreterCode, w: DataWriter) { restoreCallerIVars(); genSkipLeb(); genSkipLeb(); - restoreDispatchTableReg(); + if (!FeatureDisable.globalProbes) masm.emit_restore_dispatch_table_reg(xenv.dispatch); endHandler(); asm.bind(switchStub); { @@ -2647,7 +2647,7 @@ class X86_64InterpreterGen(ic: X86_64InterpreterCode, w: DataWriter) { masm.emit_v3_X86_64Stack_rsp_r_r(xenv.sp, xenv.scratch); masm.emit_v3_X86_64Stack_vsp_r_r(xenv.vsp, xenv.scratch); restoreCallerIVars(); - restoreDispatchTableReg(); + if (!FeatureDisable.globalProbes) masm.emit_restore_dispatch_table_reg(xenv.dispatch); masm.emit_pop_r(ValueKind.REF, xenv.scratch); masm.emit_jump_r(xenv.scratch); } @@ -2706,7 +2706,7 @@ class X86_64InterpreterGen(ic: X86_64InterpreterCode, w: DataWriter) { } restoreCallerIVars(); - restoreDispatchTableReg(); + if (!FeatureDisable.globalProbes) masm.emit_restore_dispatch_table_reg(xenv.dispatch); // Compute a pointer to the original code at this pc offset. var pc = r_tmp1; // = IP - CODE asm.movq_r_r(pc, r_ip); @@ -3675,12 +3675,6 @@ class X86_64InterpreterGen(ic: X86_64InterpreterCode, w: DataWriter) { masm.emit_restore_ivar(xenv.mem0_base); masm.emit_restore_ivar(xenv.vfp); } - def restoreDispatchTableReg() { - if (!FeatureDisable.globalProbes) { - // restore dispatch table from Interpreter.dispatchTable - asm.movq_r_m(r_dispatch, masm.absPointer(offsets.Interpreter_dispatchTable)); - } - } def callRuntime(abs: Pointer, args: Array, canTrap: bool) { masm.emit_save_ivar(xenv.vsp); // save a copy of VSP into valueStack.sp @@ -3699,7 +3693,7 @@ class X86_64InterpreterGen(ic: X86_64InterpreterCode, w: DataWriter) { for (i < dst.length) orderMoves(dst, stk, i); // emit actual call asm.callr(int.!((abs - (ic.start + w.pos + 5)))); // TODO: handle 64-bit {abs} with movq_r_l - restoreDispatchTableReg(); + if (!FeatureDisable.globalProbes) masm.emit_restore_dispatch_table_reg(xenv.dispatch); // restore VSP from valueStack.sp masm.emit_get_curstack(xenv.vsp); masm.emit_v3_X86_64Stack_vsp_r_r(xenv.vsp, xenv.vsp); @@ -4156,10 +4150,6 @@ class X86_64InterpreterGen(ic: X86_64InterpreterCode, w: DataWriter) { def computePcFromCurIp() { if (!FeatureDisable.stacktraces) asm.q.sub_r_m(r_curpc, m_code); } - def computePc(delta: int) { - asm.q.lea(r_curpc, X86_64Addr.new(r_ip, null, 1, delta - offsets.Array_contents)); - asm.q.sub_r_m(r_curpc, m_code); - } // All traps are generated out-of-line and call into the runtime. def genTraps() { w.atEnd(); @@ -4264,7 +4254,7 @@ class X86_64InterpreterGen(ic: X86_64InterpreterCode, w: DataWriter) { private def genOnResumeFinish(skip_tag: bool) { restoreCurPcFromFrame(); restoreCallerIVars(); - restoreDispatchTableReg(); + if (!FeatureDisable.globalProbes) masm.emit_restore_dispatch_table_reg(xenv.dispatch); var r_stack = r_tmp1; // load %stack masm.emit_get_curstack(xenv.tmp1); diff --git a/src/engine/x86-64/X86_64MacroAssembler.v3 b/src/engine/x86-64/X86_64MacroAssembler.v3 index ecc21028e..3a0b20408 100644 --- a/src/engine/x86-64/X86_64MacroAssembler.v3 +++ b/src/engine/x86-64/X86_64MacroAssembler.v3 @@ -999,6 +999,15 @@ class X86_64MacroAssembler extends MacroAssembler { var offsets = getOffsets(); asm.movq_r_m(G(reg), absPointer(offsets.Interpreter_dispatchTable)); } + def emit_restore_dispatch_table_reg(reg: Reg) { + asm.movq_r_m(G(reg), absPointer(getOffsets().Interpreter_dispatchTable)); + } + def emit_compute_pc(delta: int) { + def r_ip = G(INT_EXEC_ENV.ip), r_curpc = G(INT_EXEC_ENV.curpc); + def m_code = R.RSP.plus(X86_64InterpreterFrame.code.offset); + asm.q.lea(r_curpc, X86_64Addr.new(r_ip, null, 1, delta - getOffsets().Array_contents)); + asm.q.sub_r_m(r_curpc, m_code); + } def emit_i32_clz_r_r(r: X86_64Gpr, s: X86_64Gpr) { asm.movd_r_i(scratch, -1); asm.d.bsr_r_r(r, s); From 358a4a0d8d62900fcca2e606b50085f9636187e0 Mon Sep 17 00:00:00 2001 From: Matthew Schneider Date: Tue, 30 Jun 2026 13:21:50 -0400 Subject: [PATCH 2/2] Restore `restoreDispatchTableReg` --- src/engine/x86-64/X86_64Interpreter.v3 | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/engine/x86-64/X86_64Interpreter.v3 b/src/engine/x86-64/X86_64Interpreter.v3 index eaa12a64e..c34906ad7 100644 --- a/src/engine/x86-64/X86_64Interpreter.v3 +++ b/src/engine/x86-64/X86_64Interpreter.v3 @@ -561,7 +561,7 @@ class X86_64InterpreterGen(ic: X86_64InterpreterCode, w: DataWriter) { masm.emit_v3_X86_64Stack_rsp_r_r(xenv.sp, xenv.scratch); // Restore interpreter registers restoreCallerIVars(); - if (!FeatureDisable.globalProbes) masm.emit_restore_dispatch_table_reg(xenv.dispatch); + restoreDispatchTableReg(); // Continue to dispatch table endHandler(); } @@ -736,7 +736,7 @@ class X86_64InterpreterGen(ic: X86_64InterpreterCode, w: DataWriter) { ic.header.deoptReentryOffset = w.atEnd().pos; restoreCallerIVars(); masm.emit_restore_ivar(xenv.vsp); - if (!FeatureDisable.globalProbes) masm.emit_restore_dispatch_table_reg(xenv.dispatch); + restoreDispatchTableReg(); genJumpToDispatch(); genDeferred(); } @@ -1328,14 +1328,14 @@ class X86_64InterpreterGen(ic: X86_64InterpreterCode, w: DataWriter) { asm.call_rel_far(callReentryLabel); } restoreCallerIVars(); - if (!FeatureDisable.multiTier && !SpcTuning.disable && !FeatureDisable.globalProbes) masm.emit_restore_dispatch_table_reg(xenv.dispatch); + if (!FeatureDisable.multiTier && !SpcTuning.disable) restoreDispatchTableReg(); genDispatchOrJumpToDispatch(); // HostFunction: call into runtime asm.bind(call_host.label); asm.call_rel_far(hostCallStubLabel.label); restoreCallerIVars(); - if (!FeatureDisable.globalProbes) masm.emit_restore_dispatch_table_reg(xenv.dispatch); + restoreDispatchTableReg(); genJumpToDispatch(); } @@ -2605,7 +2605,7 @@ class X86_64InterpreterGen(ic: X86_64InterpreterCode, w: DataWriter) { restoreCallerIVars(); // skip pass {suspend} instruction after restoring pc genSkipLeb(); - if (!FeatureDisable.globalProbes) masm.emit_restore_dispatch_table_reg(xenv.dispatch); + restoreDispatchTableReg(); endHandler(); asm.bind(stub_suspend); { @@ -2639,7 +2639,7 @@ class X86_64InterpreterGen(ic: X86_64InterpreterCode, w: DataWriter) { restoreCallerIVars(); genSkipLeb(); genSkipLeb(); - if (!FeatureDisable.globalProbes) masm.emit_restore_dispatch_table_reg(xenv.dispatch); + restoreDispatchTableReg(); endHandler(); asm.bind(switchStub); { @@ -2647,7 +2647,7 @@ class X86_64InterpreterGen(ic: X86_64InterpreterCode, w: DataWriter) { masm.emit_v3_X86_64Stack_rsp_r_r(xenv.sp, xenv.scratch); masm.emit_v3_X86_64Stack_vsp_r_r(xenv.vsp, xenv.scratch); restoreCallerIVars(); - if (!FeatureDisable.globalProbes) masm.emit_restore_dispatch_table_reg(xenv.dispatch); + restoreDispatchTableReg(); masm.emit_pop_r(ValueKind.REF, xenv.scratch); masm.emit_jump_r(xenv.scratch); } @@ -2706,7 +2706,7 @@ class X86_64InterpreterGen(ic: X86_64InterpreterCode, w: DataWriter) { } restoreCallerIVars(); - if (!FeatureDisable.globalProbes) masm.emit_restore_dispatch_table_reg(xenv.dispatch); + restoreDispatchTableReg(); // Compute a pointer to the original code at this pc offset. var pc = r_tmp1; // = IP - CODE asm.movq_r_r(pc, r_ip); @@ -3675,6 +3675,9 @@ class X86_64InterpreterGen(ic: X86_64InterpreterCode, w: DataWriter) { masm.emit_restore_ivar(xenv.mem0_base); masm.emit_restore_ivar(xenv.vfp); } + def restoreDispatchTableReg() { + if (!FeatureDisable.globalProbes) masm.emit_restore_dispatch_table_reg(xenv.dispatch); + } def callRuntime(abs: Pointer, args: Array, canTrap: bool) { masm.emit_save_ivar(xenv.vsp); // save a copy of VSP into valueStack.sp @@ -3693,7 +3696,7 @@ class X86_64InterpreterGen(ic: X86_64InterpreterCode, w: DataWriter) { for (i < dst.length) orderMoves(dst, stk, i); // emit actual call asm.callr(int.!((abs - (ic.start + w.pos + 5)))); // TODO: handle 64-bit {abs} with movq_r_l - if (!FeatureDisable.globalProbes) masm.emit_restore_dispatch_table_reg(xenv.dispatch); + restoreDispatchTableReg(); // restore VSP from valueStack.sp masm.emit_get_curstack(xenv.vsp); masm.emit_v3_X86_64Stack_vsp_r_r(xenv.vsp, xenv.vsp); @@ -4254,7 +4257,7 @@ class X86_64InterpreterGen(ic: X86_64InterpreterCode, w: DataWriter) { private def genOnResumeFinish(skip_tag: bool) { restoreCurPcFromFrame(); restoreCallerIVars(); - if (!FeatureDisable.globalProbes) masm.emit_restore_dispatch_table_reg(xenv.dispatch); + restoreDispatchTableReg(); var r_stack = r_tmp1; // load %stack masm.emit_get_curstack(xenv.tmp1);