Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:26
erlang
1140-AArch64-Combine-move-deallocate-return.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 1140-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
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