aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/map_instrs.tab
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2019-03-19 12:24:26 +0100
committerBjörn Gustavsson <[email protected]>2019-03-19 16:02:00 +0100
commit6e87e37bdd01401aa340a0f47e2d10fd8fe472ee (patch)
treef453fb264105f2a205b37dcd1c0950f611dc97ad /erts/emulator/beam/map_instrs.tab
parent5836998a956966a5ecc6dddfc4f8b73fc3aa6f1e (diff)
downloadotp-6e87e37bdd01401aa340a0f47e2d10fd8fe472ee.tar.gz
otp-6e87e37bdd01401aa340a0f47e2d10fd8fe472ee.tar.bz2
otp-6e87e37bdd01401aa340a0f47e2d10fd8fe472ee.zip
Optimize map updating instructions
Diffstat (limited to 'erts/emulator/beam/map_instrs.tab')
-rw-r--r--erts/emulator/beam/map_instrs.tab28
1 files changed, 24 insertions, 4 deletions
diff --git a/erts/emulator/beam/map_instrs.tab b/erts/emulator/beam/map_instrs.tab
index c594a87298..5620d5a2d1 100644
--- a/erts/emulator/beam/map_instrs.tab
+++ b/erts/emulator/beam/map_instrs.tab
@@ -127,11 +127,21 @@ i_get_map_elements(Fail, Src, N) {
}
}
-update_map_assoc(Src, Dst, Live, N) {
+update_map_assoc := update_map_assoc.fetch.execute;
+
+update_map_assoc.head() {
+ Eterm map;
+}
+
+update_map_assoc.fetch(Src) {
+ map = $Src;
+}
+
+update_map_assoc.execute(Dst, Live, N) {
Eterm res;
Uint live = $Live;
- reg[live] = $Src;
+ reg[live] = map;
HEAVY_SWAPOUT;
res = erts_gc_update_map_assoc(c_p, reg, live, $N, $NEXT_INSTRUCTION);
HEAVY_SWAPIN;
@@ -141,11 +151,21 @@ update_map_assoc(Src, Dst, Live, N) {
$NEXT($NEXT_INSTRUCTION+$N);
}
-update_map_exact(Fail, Src, Dst, Live, N) {
+update_map_exact := update_map_exact.fetch.execute;
+
+update_map_exact.head() {
+ Eterm map;
+}
+
+update_map_exact.fetch(Src) {
+ map = $Src;
+}
+
+update_map_exact.execute(Fail, Dst, Live, N) {
Eterm res;
Uint live = $Live;
- reg[live] = $Src;
+ reg[live] = map;
HEAVY_SWAPOUT;
res = erts_gc_update_map_exact(c_p, reg, live, $N, $NEXT_INSTRUCTION);
HEAVY_SWAPIN;