Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:25
erlang
0191-jit-Update-stack-pointer-in-bs_get_float2....
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0191-jit-Update-stack-pointer-in-bs_get_float2.patch of Package erlang
From 13611dee1b112689d9a4242eedf86b6f140b62b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20H=C3=B6gberg?= <john@erlang.org> Date: Mon, 9 Jan 2023 15:01:16 +0100 Subject: [PATCH] jit: Update stack pointer in bs_get_float2 --- erts/emulator/beam/jit/arm/instr_bs.cpp | 11 +++++++++++ erts/emulator/beam/jit/x86/instr_bs.cpp | 11 +++++++++++ 2 files changed, 22 insertions(+) diff --git a/erts/emulator/beam/jit/arm/instr_bs.cpp b/erts/emulator/beam/jit/arm/instr_bs.cpp index 06873cd709..04277534c8 100644 --- a/erts/emulator/beam/jit/arm/instr_bs.cpp +++ b/erts/emulator/beam/jit/arm/instr_bs.cpp @@ -919,13 +919,24 @@ void BeamModuleAssembler::emit_i_bs_get_float2(const ArgRegister &Ctx, if (emit_bs_get_field_size(Sz, unit, fail, ARG2) >= 0) { lea(ARG4, emit_boxed_val(ARG4, offsetof(ErlBinMatchState, mb))); + /* erts_bs_get_float_2 uses HeapOnlyAlloc which usually requires just + * an updated heap pointer, but in debug mode it needs the stack + * pointer too for an assertion. */ +#ifdef DEBUG + emit_enter_runtime<Update::eStack | Update::eHeap>(Live.get()); +#else emit_enter_runtime<Update::eHeap>(Live.get()); +#endif a.mov(ARG1, c_p); mov_imm(ARG3, Flags.get()); runtime_call<4>(erts_bs_get_float_2); +#ifdef DEBUG + emit_leave_runtime<Update::eStack | Update::eHeap>(Live.get()); +#else emit_leave_runtime<Update::eHeap>(Live.get()); +#endif emit_branch_if_not_value(ARG1, fail); diff --git a/erts/emulator/beam/jit/x86/instr_bs.cpp b/erts/emulator/beam/jit/x86/instr_bs.cpp index ab6abff6cc..2bf909f544 100644 --- a/erts/emulator/beam/jit/x86/instr_bs.cpp +++ b/erts/emulator/beam/jit/x86/instr_bs.cpp @@ -1116,14 +1116,25 @@ void BeamModuleAssembler::emit_i_bs_get_float2(const ArgRegister &Ctx, emit_gc_test_preserve(ArgWord(FLOAT_SIZE_OBJECT), Live, ARG4); if (emit_bs_get_field_size(Sz, unit, fail, ARG2, 64) >= 0) { + /* erts_bs_get_float_2 uses HeapOnlyAlloc which usually requires just + * an updated heap pointer, but in debug mode it needs the stack + * pointer too for an assertion. */ +#ifdef DEBUG + emit_enter_runtime<Update::eStack | Update::eHeap>(); +#else emit_enter_runtime<Update::eHeap>(); +#endif a.mov(ARG1, c_p); mov_imm(ARG3, Flags.get()); a.lea(ARG4, emit_boxed_val(ARG4, offsetof(ErlBinMatchState, mb))); runtime_call<4>(erts_bs_get_float_2); +#ifdef DEBUG + emit_leave_runtime<Update::eStack | Update::eHeap>(); +#else emit_leave_runtime<Update::eHeap>(); +#endif emit_test_the_non_value(RET); a.je(fail); -- 2.35.3
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor