aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/ops.tab
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2019-08-16 16:04:02 +0200
committerBjörn Gustavsson <[email protected]>2019-08-22 13:37:41 +0200
commit8041849a8e55281b4d954e63e9415995607e1870 (patch)
tree834f0ef2393ca6e8a39222906dd7f3795d049740 /erts/emulator/beam/ops.tab
parent25fe3fb23c594d735cb6ebae120910e44f0cdae4 (diff)
downloadotp-8041849a8e55281b4d954e63e9415995607e1870.tar.gz
otp-8041849a8e55281b4d954e63e9415995607e1870.tar.bz2
otp-8041849a8e55281b4d954e63e9415995607e1870.zip
Optimize deallocate_return instructions
Eliminating the CP register and putting continuation pointers directly on the stack made the deallocate_return instruction slower. Try to mitigate this slow down by specializing deallocate_return for small stack. For the move_deallocate_return instruction, reorder instructions to make it possible to execute the read instructions in parallel.
Diffstat (limited to 'erts/emulator/beam/ops.tab')
-rw-r--r--erts/emulator/beam/ops.tab12
1 files changed, 12 insertions, 0 deletions
diff --git a/erts/emulator/beam/ops.tab b/erts/emulator/beam/ops.tab
index f525d126e7..c0ca9260a0 100644
--- a/erts/emulator/beam/ops.tab
+++ b/erts/emulator/beam/ops.tab
@@ -596,8 +596,20 @@ move S x==0 | deallocate D | return => move_deallocate_return S D
move_deallocate_return xycn Q
+deallocate u==0 | return => deallocate_return0
+deallocate u==1 | return => deallocate_return1
+deallocate u==2 | return => deallocate_return2
+deallocate u==3 | return => deallocate_return3
+deallocate u==4 | return => deallocate_return4
+
deallocate D | return => deallocate_return D
+deallocate_return0
+deallocate_return1
+deallocate_return2
+deallocate_return3
+deallocate_return4
+
deallocate_return Q
test_heap Need u==1 | put_list Y=y x==0 x==0 => test_heap_1_put_list Need Y