File 2141-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