diff options
author | Björn Gustavsson <[email protected]> | 2018-01-25 10:09:59 +0100 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2018-01-26 15:57:57 +0100 |
commit | fbcff5a137e37edd80aca9c5fe18ce6880648169 (patch) | |
tree | fb846d82599a3e52230f1b028b59f63cb0dd09ec /erts/emulator/beam | |
parent | 5b58d9e2d3262160b7f10d8b6798f89f0618c5f6 (diff) | |
download | otp-fbcff5a137e37edd80aca9c5fe18ce6880648169.tar.gz otp-fbcff5a137e37edd80aca9c5fe18ce6880648169.tar.bz2 otp-fbcff5a137e37edd80aca9c5fe18ce6880648169.zip |
Eliminate get_list/3 internally in the compiler
Instructions that produce more than one result complicate
optimizations. get_list/3 is one of two instructions that
produce multiple results (get_map_elements/3 is the other).
Introduce the get_hd/2 and get_tl/2 instructions
that return the head and tail of a cons cell, respectively,
and use it internally in all optimization passes.
For efficiency, we still want to use get_list/3 if both
head and tail are used, so we will translate matching pairs
of get_hd and get_tl back to get_list instructions.
Diffstat (limited to 'erts/emulator/beam')
-rw-r--r-- | erts/emulator/beam/instrs.tab | 10 | ||||
-rw-r--r-- | erts/emulator/beam/ops.tab | 3 |
2 files changed, 13 insertions, 0 deletions
diff --git a/erts/emulator/beam/instrs.tab b/erts/emulator/beam/instrs.tab index f19027b1ec..6a531fcc09 100644 --- a/erts/emulator/beam/instrs.tab +++ b/erts/emulator/beam/instrs.tab @@ -322,6 +322,16 @@ get_list(Src, Hd, Tl) { $Tl = tl; } +get_hd(Src, Hd) { + Eterm* tmp_ptr = list_val($Src); + $Hd = CAR(tmp_ptr); +} + +get_tl(Src, Tl) { + Eterm* tmp_ptr = list_val($Src); + $Tl = CDR(tmp_ptr); +} + i_get(Src, Dst) { $Dst = erts_pd_hash_get(c_p, $Src); } diff --git a/erts/emulator/beam/ops.tab b/erts/emulator/beam/ops.tab index 1f4a8eadb0..77e375f2c0 100644 --- a/erts/emulator/beam/ops.tab +++ b/erts/emulator/beam/ops.tab @@ -182,6 +182,9 @@ get_list r x y get_list r y r get_list r x r +get_hd xy xy +get_tl xy xy + # Old-style catch. catch y f catch_end y |