From 10cc759f259e1f3b6572ce663858c8ce4d34a483 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Sun, 10 Dec 2023 16:10:48 +0100 Subject: [PATCH] ARM: Fix stack restore for FP slots. Thanks to Peter Cawley. #1131 --- src/lj_asm_arm.h | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/lj_asm_arm.h b/src/lj_asm_arm.h index f53f708b..8869af32 100644 --- a/src/lj_asm_arm.h +++ b/src/lj_asm_arm.h @@ -1991,11 +1991,12 @@ static void asm_stack_restore(ASMState *as, SnapShot *snap) SnapEntry *map = &as->T->snapmap[snap->mapofs]; SnapEntry *flinks = &as->T->snapmap[snap_nextofs(as->T, snap)-1]; MSize n, nent = snap->nent; + int32_t bias = 0; /* Store the value of all modified slots to the Lua stack. */ for (n = 0; n < nent; n++) { SnapEntry sn = map[n]; BCReg s = snap_slot(sn); - int32_t ofs = 8*((int32_t)s-1); + int32_t ofs = 8*((int32_t)s-1) - bias; IRRef ref = snap_ref(sn); IRIns *ir = IR(ref); if ((sn & SNAP_NORESTORE)) @@ -2013,6 +2014,12 @@ static void asm_stack_restore(ASMState *as, SnapShot *snap) emit_lso(as, ARMI_STR, tmp, RID_BASE, ofs+4); #else Reg src = ra_alloc1(as, ref, RSET_FPR); + if (LJ_UNLIKELY(ofs < -1020 || ofs > 1020)) { + int32_t adj = ofs & 0xffffff00; /* K12-friendly. */ + bias += adj; + ofs -= adj; + emit_addptr(as, RID_BASE, -adj); + } emit_vlso(as, ARMI_VSTR_D, src, RID_BASE, ofs); #endif } else { @@ -2038,6 +2045,7 @@ static void asm_stack_restore(ASMState *as, SnapShot *snap) } checkmclim(as); } + emit_addptr(as, RID_BASE, bias); lua_assert(map + nent == flinks); }