Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang
erlang
1141-Slightly-improve-code-generation-for-AArch...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 1141-Slightly-improve-code-generation-for-AArch64.patch of Package erlang
From a3bfc46331e4fac87974bfc993ab207cff983a26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org> Date: Tue, 30 Aug 2022 07:22:33 +0200 Subject: [PATCH] Slightly improve code generation for AArch64 --- erts/emulator/beam/jit/arm/instr_bs.cpp | 15 +++++++-------- erts/emulator/beam/jit/arm/instr_common.cpp | 4 ++-- erts/emulator/test/bs_construct_SUITE.erl | 3 +++ 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/erts/emulator/beam/jit/arm/instr_bs.cpp b/erts/emulator/beam/jit/arm/instr_bs.cpp index ac57063b4f..9010dd0ba1 100644 --- a/erts/emulator/beam/jit/arm/instr_bs.cpp +++ b/erts/emulator/beam/jit/arm/instr_bs.cpp @@ -585,9 +585,8 @@ void BeamModuleAssembler::emit_i_bs_match_string(const ArgRegister &Ctx, a.and_(ARG4, TMP2, imm(7)); /* ARG3 = mb->base + (mb->offset >> 3) */ - a.lsr(TMP2, TMP2, imm(3)); a.ldur(TMP1, emit_boxed_val(ctx_reg.reg, base_offset)); - a.add(ARG3, TMP1, TMP2); + a.add(ARG3, TMP1, TMP2, arm::lsr(3)); } emit_enter_runtime(); @@ -1890,10 +1889,10 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, if (can_fail) { a.tbnz(ARG3, 63, resolve_label(error, disp32K)); } - a.asr(TMP1, ARG3, imm(_TAG_IMMED1_SIZE)); if (seg.unit == 1) { - a.add(sizeReg, sizeReg, TMP1); + a.add(sizeReg, sizeReg, ARG3, arm::asr(_TAG_IMMED1_SIZE)); } else { + a.asr(TMP1, ARG3, imm(_TAG_IMMED1_SIZE)); if (Fail.get() == 0) { mov_imm(ARG4, beam_jit_update_bsc_reason_info( @@ -2162,8 +2161,8 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, * the value is a non-negative small in the * appropriate range. Multiply the size with the * unit. */ - mov_arg(ARG3, seg.size); - a.asr(ARG3, ARG3, imm(_TAG_IMMED1_SIZE)); + auto r = load_source(seg.size, ARG3); + a.asr(ARG3, r.reg, imm(_TAG_IMMED1_SIZE)); if (seg.unit != 1) { mov_imm(TMP1, seg.unit); a.mul(ARG3, ARG3, TMP1); @@ -2194,8 +2193,8 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, if (seg.effectiveSize >= 0) { mov_imm(ARG3, seg.effectiveSize); } else { - mov_arg(ARG3, seg.size); - a.asr(ARG3, ARG3, imm(_TAG_IMMED1_SIZE)); + auto r = load_source(seg.size, ARG3); + a.asr(ARG3, r.reg, imm(_TAG_IMMED1_SIZE)); if (seg.unit != 1) { mov_imm(TMP1, seg.unit); a.mul(ARG3, ARG3, TMP1); diff --git a/erts/emulator/beam/jit/arm/instr_common.cpp b/erts/emulator/beam/jit/arm/instr_common.cpp index 78326fbcec..895abec15c 100644 --- a/erts/emulator/beam/jit/arm/instr_common.cpp +++ b/erts/emulator/beam/jit/arm/instr_common.cpp @@ -2233,11 +2233,11 @@ void BeamModuleAssembler::emit_try_case_end(const ArgSource &Src) { void BeamModuleAssembler::emit_raise(const ArgSource &Trace, const ArgSource &Value) { - mov_arg(TMP1, Value); + auto value = load_source(Value, TMP1); mov_arg(ARG2, Trace); /* This is an error, attach a stacktrace to the reason. */ - a.str(TMP1, arm::Mem(c_p, offsetof(Process, fvalue))); + a.str(value.reg, arm::Mem(c_p, offsetof(Process, fvalue))); a.str(ARG2, arm::Mem(c_p, offsetof(Process, ftrace))); emit_enter_runtime(0); diff --git a/erts/emulator/test/bs_construct_SUITE.erl b/erts/emulator/test/bs_construct_SUITE.erl index 099bae1cee..283723e211 100644 --- a/erts/emulator/test/bs_construct_SUITE.erl +++ b/erts/emulator/test/bs_construct_SUITE.erl @@ -104,6 +104,9 @@ l(I_13, I_big1) -> ?T(<<4,3,<<1,2>>:1/binary>>, [4,3,1]), + ?T(<< <<153,27:5>>:I_13/bits, 1:3 >>, + [153,217]), + ?T(<<(256*45+47)>>, [47]), -- 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