File 1130-AArch64-Combine-move-deallocate-return.patch of Package erlang

From ffb56dd56a9dd9122fb3fd51253bd9e8b006c1cf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
Date: Thu, 7 Sep 2023 07:28:26 +0200
Subject: [PATCH 10/25] AArch64: Combine `move` + `deallocate` + `return`

The combination of `move`, `deallocate`, and `return` occurs about
1600 times in the OTP sources.

By combining those three BEAM instructions into one, the first three
native instructions of the combined instruction:

    ldr x25, [x20]
    add x20, x20, 8
    ldr x30, [x20], 8

can be combined to:

    ldp x25, x30, [x20], 16
---
 erts/emulator/beam/jit/arm/beam_asm.hpp   |  2 ++
 erts/emulator/beam/jit/arm/instr_call.cpp | 14 +++++++++++---
 erts/emulator/beam/jit/arm/ops.tab        |  5 +++++
 3 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/erts/emulator/beam/jit/arm/beam_asm.hpp b/erts/emulator/beam/jit/arm/beam_asm.hpp
index c51edb512f..5789ef2978 100644
--- a/erts/emulator/beam/jit/arm/beam_asm.hpp
+++ b/erts/emulator/beam/jit/arm/beam_asm.hpp
@@ -1249,6 +1249,8 @@ protected:
     void emit_tuple_assertion(const ArgSource &Src, arm::Gp tuple_reg);
 #endif
 
+    void emit_dispatch_return();
+
 #include "beamasm_protos.h"
 
     /* Resolves a BEAM label.
diff --git a/erts/emulator/beam/jit/arm/instr_call.cpp b/erts/emulator/beam/jit/arm/instr_call.cpp
index faf8c59db7..2699c30962 100644
--- a/erts/emulator/beam/jit/arm/instr_call.cpp
+++ b/erts/emulator/beam/jit/arm/instr_call.cpp
@@ -33,9 +33,7 @@ void BeamGlobalAssembler::emit_dispatch_return() {
     a.b(labels[context_switch_simplified]);
 }
 
-void BeamModuleAssembler::emit_return() {
-    emit_leave_erlang_frame();
-
+void BeamModuleAssembler::emit_dispatch_return() {
 #ifdef JIT_HARD_DEBUG
     /* Validate return address and {x,0} */
     emit_validate(ArgVal(ArgVal::Word, 1));
@@ -54,6 +52,16 @@ void BeamModuleAssembler::emit_return() {
     a.ret(a64::x30);
 }
 
+void BeamModuleAssembler::emit_return() {
+    emit_leave_erlang_frame();
+    emit_dispatch_return();
+}
+
+void BeamModuleAssembler::emit_move_deallocate_return() {
+    a.ldp(XREG0, a64::x30, arm::Mem(E).post(16));
+    emit_dispatch_return();
+}
+
 void BeamModuleAssembler::emit_i_call(const ArgLabel &CallTarget) {
     erlang_call(resolve_beam_label(CallTarget, disp128MB));
 }
diff --git a/erts/emulator/beam/jit/arm/ops.tab b/erts/emulator/beam/jit/arm/ops.tab
index 2c3cd64757..e4b303ca23 100644
--- a/erts/emulator/beam/jit/arm/ops.tab
+++ b/erts/emulator/beam/jit/arm/ops.tab
@@ -185,6 +185,11 @@ try_end Y | move Src Dst | deallocate N => try_end_move_deallocate Src Dst N
 try_end_deallocate t
 try_end_move_deallocate s d t
 
+move y==0 x==0 | deallocate u==1 | return =>
+    move_deallocate_return
+
+move_deallocate_return
+
 # Destructive set tuple element
 
 set_tuple_element s S P
-- 
2.35.3

openSUSE Build Service is sponsored by