Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:25
erlang
1201-jit-Fix-reduction-counting-in-binary-const...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 1201-jit-Fix-reduction-counting-in-binary-construction.patch of Package erlang
From 3161548c95fedbd487d4d346b32e493dfacfdd20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20H=C3=B6gberg?= <john@erlang.org> Date: Mon, 15 May 2023 16:35:56 +0200 Subject: [PATCH 1/2] jit: Fix reduction counting in binary construction --- erts/emulator/beam/jit/x86/instr_bs.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/erts/emulator/beam/jit/x86/instr_bs.cpp b/erts/emulator/beam/jit/x86/instr_bs.cpp index 36e95df57c..b7a9fdc0e1 100644 --- a/erts/emulator/beam/jit/x86/instr_bs.cpp +++ b/erts/emulator/beam/jit/x86/instr_bs.cpp @@ -2444,7 +2444,12 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, if (seg.effectiveSize < 0 && seg.type != am_append && seg.type != am_private_append) { - sizeReg = FCALLS; + /* We need a callee-save register for the size. We'll pick the + * active code index register because it's not used in any capacity + * here. Note that we have to spill it since `save_calls` may be + * enabled and we'll lose that information if we blindly re-read + * the index. */ + sizeReg = active_code_ix; need_error_handler = true; } @@ -2515,6 +2520,11 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, error = a.newLabel(); a.bind(error); bs_maybe_leave_runtime(runtime_entered); + + if (sizeReg.isValid()) { + a.mov(sizeReg, TMP_MEM5q); + } + comment("handle error"); if (Fail.get() != 0) { a.jmp(resolve_beam_label(Fail)); @@ -2531,6 +2541,7 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, * word. */ if (sizeReg.isValid()) { comment("calculate sizes"); + a.mov(TMP_MEM5q, sizeReg); mov_imm(sizeReg, num_bits); } @@ -3318,6 +3329,11 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, } bs_maybe_leave_runtime(runtime_entered); + + if (sizeReg.isValid()) { + a.mov(sizeReg, TMP_MEM5q); + } + comment("done"); a.mov(RET, TMP_MEM1q); mov_arg(Dst, RET); -- 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