diff options
author | Mike Pall <mike> | 2023-09-09 18:16:31 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2023-09-09 18:16:31 +0200 |
commit | 44da356e97a159f5962f32a526525d14bcd13179 (patch) | |
tree | f960585085dc840776438aa334a00d77c93aaffa | |
parent | 43eff4aad45e03ac7e415cd20b97161897b14756 (diff) | |
download | luajit-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.h | 7 |
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) | |||
1947 | static void asm_stack_check(ASMState *as, BCReg topslot, | 1947 | static 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 { |