aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2023-12-10 16:10:48 +0100
committerMike Pall <mike>2023-12-10 16:10:48 +0100
commit10cc759f259e1f3b6572ce663858c8ce4d34a483 (patch)
tree67a24c061a7d09d3dbab765d6187d3fd933957f7
parent1b38c736550004fba1b9712c1a5788b3eefa49be (diff)
downloadluajit-10cc759f259e1f3b6572ce663858c8ce4d34a483.tar.gz
luajit-10cc759f259e1f3b6572ce663858c8ce4d34a483.tar.bz2
luajit-10cc759f259e1f3b6572ce663858c8ce4d34a483.zip
ARM: Fix stack restore for FP slots.
Thanks to Peter Cawley. #1131
-rw-r--r--src/lj_asm_arm.h10
1 files changed, 9 insertions, 1 deletions
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)
1991 SnapEntry *map = &as->T->snapmap[snap->mapofs]; 1991 SnapEntry *map = &as->T->snapmap[snap->mapofs];
1992 SnapEntry *flinks = &as->T->snapmap[snap_nextofs(as->T, snap)-1]; 1992 SnapEntry *flinks = &as->T->snapmap[snap_nextofs(as->T, snap)-1];
1993 MSize n, nent = snap->nent; 1993 MSize n, nent = snap->nent;
1994 int32_t bias = 0;
1994 /* Store the value of all modified slots to the Lua stack. */ 1995 /* Store the value of all modified slots to the Lua stack. */
1995 for (n = 0; n < nent; n++) { 1996 for (n = 0; n < nent; n++) {
1996 SnapEntry sn = map[n]; 1997 SnapEntry sn = map[n];
1997 BCReg s = snap_slot(sn); 1998 BCReg s = snap_slot(sn);
1998 int32_t ofs = 8*((int32_t)s-1); 1999 int32_t ofs = 8*((int32_t)s-1) - bias;
1999 IRRef ref = snap_ref(sn); 2000 IRRef ref = snap_ref(sn);
2000 IRIns *ir = IR(ref); 2001 IRIns *ir = IR(ref);
2001 if ((sn & SNAP_NORESTORE)) 2002 if ((sn & SNAP_NORESTORE))
@@ -2013,6 +2014,12 @@ static void asm_stack_restore(ASMState *as, SnapShot *snap)
2013 emit_lso(as, ARMI_STR, tmp, RID_BASE, ofs+4); 2014 emit_lso(as, ARMI_STR, tmp, RID_BASE, ofs+4);
2014#else 2015#else
2015 Reg src = ra_alloc1(as, ref, RSET_FPR); 2016 Reg src = ra_alloc1(as, ref, RSET_FPR);
2017 if (LJ_UNLIKELY(ofs < -1020 || ofs > 1020)) {
2018 int32_t adj = ofs & 0xffffff00; /* K12-friendly. */
2019 bias += adj;
2020 ofs -= adj;
2021 emit_addptr(as, RID_BASE, -adj);
2022 }
2016 emit_vlso(as, ARMI_VSTR_D, src, RID_BASE, ofs); 2023 emit_vlso(as, ARMI_VSTR_D, src, RID_BASE, ofs);
2017#endif 2024#endif
2018 } else { 2025 } else {
@@ -2038,6 +2045,7 @@ static void asm_stack_restore(ASMState *as, SnapShot *snap)
2038 } 2045 }
2039 checkmclim(as); 2046 checkmclim(as);
2040 } 2047 }
2048 emit_addptr(as, RID_BASE, bias);
2041 lua_assert(map + nent == flinks); 2049 lua_assert(map + nent == flinks);
2042} 2050}
2043 2051