From 7e44a4b8eaad7d7d6fadf933794d3a0d05790b23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= Date: Tue, 12 Mar 2019 07:20:43 +0100 Subject: Combine move with trim It is relatively common to move something from a Y register to an X register before trimming. --- erts/emulator/beam/instrs.tab | 7 +++++++ erts/emulator/beam/ops.tab | 3 +++ 2 files changed, 10 insertions(+) diff --git a/erts/emulator/beam/instrs.tab b/erts/emulator/beam/instrs.tab index aeb47c3b0f..7fa1df64ff 100644 --- a/erts/emulator/beam/instrs.tab +++ b/erts/emulator/beam/instrs.tab @@ -477,6 +477,13 @@ i_make_fun(FunP, NumFree) { HEAVY_SWAPIN; } +move_trim(Src, Dst, Words) { + Uint cp = E[0]; + $Dst = $Src; + E += $Words; + E[0] = cp; +} + i_trim(Words) { Uint cp = E[0]; E += $Words; diff --git a/erts/emulator/beam/ops.tab b/erts/emulator/beam/ops.tab index a6f5ba347c..4f57e8d9d5 100644 --- a/erts/emulator/beam/ops.tab +++ b/erts/emulator/beam/ops.tab @@ -106,7 +106,10 @@ init y allocate_zero t t? allocate_heap_zero t I t? +move Src=y Dst=x | trim N Remaining => move_trim Src Dst N trim N Remaining => i_trim N + +move_trim y x t i_trim t test_heap I t? -- cgit v1.2.3