aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2023-09-09 18:16:31 +0200
committerMike Pall <mike>2023-09-09 18:16:31 +0200
commit44da356e97a159f5962f32a526525d14bcd13179 (patch)
treef960585085dc840776438aa334a00d77c93aaffa
parent43eff4aad45e03ac7e415cd20b97161897b14756 (diff)
downloadluajit-44da356e97a159f5962f32a526525d14bcd13179.tar.gz
luajit-44da356e97a159f5962f32a526525d14bcd13179.tar.bz2
luajit-44da356e97a159f5962f32a526525d14bcd13179.zip
ARM: Fix stack check code generation.
Thanks to Peter Cawley. #1068
-rw-r--r--src/lj_asm_arm.h7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/lj_asm_arm.h b/src/lj_asm_arm.h
index 20e57393..f53f708b 100644
--- a/src/lj_asm_arm.h
+++ b/src/lj_asm_arm.h
@@ -1947,6 +1947,7 @@ static void asm_hiop(ASMState *as, IRIns *ir)
1947static void asm_stack_check(ASMState *as, BCReg topslot, 1947static void asm_stack_check(ASMState *as, BCReg topslot,
1948 IRIns *irp, RegSet allow, ExitNo exitno) 1948 IRIns *irp, RegSet allow, ExitNo exitno)
1949{ 1949{
1950 int savereg = 0;
1950 Reg pbase; 1951 Reg pbase;
1951 uint32_t k; 1952 uint32_t k;
1952 if (irp) { 1953 if (irp) {
@@ -1957,12 +1958,14 @@ static void asm_stack_check(ASMState *as, BCReg topslot,
1957 pbase = rset_pickbot(allow); 1958 pbase = rset_pickbot(allow);
1958 } else { 1959 } else {
1959 pbase = RID_RET; 1960 pbase = RID_RET;
1960 emit_lso(as, ARMI_LDR, RID_RET, RID_SP, 0); /* Restore temp. register. */ 1961 savereg = 1;
1961 } 1962 }
1962 } else { 1963 } else {
1963 pbase = RID_BASE; 1964 pbase = RID_BASE;
1964 } 1965 }
1965 emit_branch(as, ARMF_CC(ARMI_BL, CC_LS), exitstub_addr(as->J, exitno)); 1966 emit_branch(as, ARMF_CC(ARMI_BL, CC_LS), exitstub_addr(as->J, exitno));
1967 if (savereg)
1968 emit_lso(as, ARMI_LDR, RID_RET, RID_SP, 0); /* Restore temp. register. */
1966 k = emit_isk12(0, (int32_t)(8*topslot)); 1969 k = emit_isk12(0, (int32_t)(8*topslot));
1967 lua_assert(k); 1970 lua_assert(k);
1968 emit_n(as, ARMI_CMP^k, RID_TMP); 1971 emit_n(as, ARMI_CMP^k, RID_TMP);
@@ -1974,7 +1977,7 @@ static void asm_stack_check(ASMState *as, BCReg topslot,
1974 if (ra_hasspill(irp->s)) 1977 if (ra_hasspill(irp->s))
1975 emit_lso(as, ARMI_LDR, pbase, RID_SP, sps_scale(irp->s)); 1978 emit_lso(as, ARMI_LDR, pbase, RID_SP, sps_scale(irp->s));
1976 emit_lso(as, ARMI_LDR, RID_TMP, RID_TMP, (i & 4095)); 1979 emit_lso(as, ARMI_LDR, RID_TMP, RID_TMP, (i & 4095));
1977 if (ra_hasspill(irp->s) && !allow) 1980 if (savereg)
1978 emit_lso(as, ARMI_STR, RID_RET, RID_SP, 0); /* Save temp. register. */ 1981 emit_lso(as, ARMI_STR, RID_RET, RID_SP, 0); /* Save temp. register. */
1979 emit_loadi(as, RID_TMP, (i & ~4095)); 1982 emit_loadi(as, RID_TMP, (i & ~4095));
1980 } else { 1983 } else {