From 14d8a7a27dc8c626ab9e7c7e9e50b6df6def4f03 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Sat, 18 Jul 2026 09:48:48 +0200 Subject: [PATCH] x64/LJ_GC64: Avoid store-to-load forwarding stall after stack restore. Thanks to Sergey Kaplun. #1485 --- src/lj_asm_x86.h | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/lj_asm_x86.h b/src/lj_asm_x86.h index 943cf2b7..3c024092 100644 --- a/src/lj_asm_x86.h +++ b/src/lj_asm_x86.h @@ -1112,10 +1112,12 @@ static void asm_tvptr(ASMState *as, Reg dest, IRRef ref, MSize mode) } else { #if LJ_GC64 if (irref_isk(ref)) { + Reg tmp; TValue k; lj_ir_kvalue(as->J->L, &k, ir); - emit_movmroi(as, dest, 4, k.u32.hi); - emit_movmroi(as, dest, 0, k.u32.lo); + tmp = ra_scratch(as, rset_exclude(RSET_GPR, dest)); + emit_rmro(as, XO_MOVto, tmp|REX_64, dest, 0); + emit_loadu64(as, tmp, k.u64); } else { /* TODO: 64 bit store + 32 bit load-modify-store is suboptimal. */ Reg src = ra_alloc1(as, ref, rset_exclude(RSET_GPR, dest)); @@ -2787,8 +2789,9 @@ static void asm_stack_restore(ASMState *as, SnapShot *snap) emit_i32(as, -1); emit_rmro(as, XO_MOVmi, REX_64, RID_BASE, ofs); } else { - emit_movmroi(as, RID_BASE, ofs+4, k.u32.hi); - emit_movmroi(as, RID_BASE, ofs, k.u32.lo); + Reg tmp = ra_scratch(as, rset_exclude(RSET_GPR, RID_BASE)); + emit_rmro(as, XO_MOVto, tmp|REX_64, RID_BASE, ofs); + emit_loadu64(as, tmp, k.u64); } #else } else if (!irt_ispri(ir->t)) { -- 2.47.3