summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Larsson <lukas@erlang.org>2021-04-07 13:43:47 +0200
committerGitHub <noreply@github.com>2021-04-07 13:43:47 +0200
commit6d5ecafcd4879df5b35e74daad1a0715a525e01d (patch)
treef3dffe175b8beb1b118ab178aad2cb31114b737a
parent84f3389110f8635ca3acb3993247a6f4a3dc0aff (diff)
parentc535f1c67888c9f974a247ef31e1e8362848b7f6 (diff)
downloaderlang-6d5ecafcd4879df5b35e74daad1a0715a525e01d.tar.gz
Merge pull request #4709 from max-au/max-au/fix-msacc-extras
msacc: fix segfault caused when extra MSACC states are enabled
-rw-r--r--erts/emulator/beam/jit/x86/instr_bif.cpp9
1 files changed, 5 insertions, 4 deletions
diff --git a/erts/emulator/beam/jit/x86/instr_bif.cpp b/erts/emulator/beam/jit/x86/instr_bif.cpp
index 7d130595ba..ae329e3f0c 100644
--- a/erts/emulator/beam/jit/x86/instr_bif.cpp
+++ b/erts/emulator/beam/jit/x86/instr_bif.cpp
@@ -446,11 +446,12 @@ void BeamGlobalAssembler::emit_call_light_bif_shared() {
a.cmp(erts_msacc_cache, imm(0));
a.short_().je(skip_msacc);
- /* update cache if it was changed in the bif */
- a.mov(TMP_MEM1q, RET);
+ /* update cache if it was changed in the bif.
+ TMP_MEM1q is already taken to save ARG1 above */
+ a.mov(TMP_MEM2q, RET);
a.lea(ARG1, erts_msacc_cache);
runtime_call<1>(erts_msacc_update_cache);
- a.mov(RET, TMP_MEM1q);
+ a.mov(RET, TMP_MEM2q);
/* set state to emulator if msacc has been enabled */
a.cmp(erts_msacc_cache, imm(0));
@@ -459,7 +460,7 @@ void BeamGlobalAssembler::emit_call_light_bif_shared() {
a.mov(ARG2, imm(ERTS_MSACC_STATE_EMULATOR));
a.mov(ARG3, imm(1));
runtime_call<3>(erts_msacc_set_state_m__);
- a.mov(RET, TMP_MEM1q);
+ a.mov(RET, TMP_MEM2q);
a.bind(skip_msacc);
}