diff options
author | Björn Gustavsson <[email protected]> | 2015-06-16 06:39:25 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2015-07-03 14:34:49 +0200 |
commit | f0923b143ecfdacfe4873fc1e96c8ec69726a4d9 (patch) | |
tree | 41f683ecd61f2aca87bb0944c622d3b9c48b732b /erts/emulator/utils | |
parent | e1019cbba7a66788a068b6df1a1caf2d643ef65b (diff) | |
download | otp-f0923b143ecfdacfe4873fc1e96c8ec69726a4d9.tar.gz otp-f0923b143ecfdacfe4873fc1e96c8ec69726a4d9.tar.bz2 otp-f0923b143ecfdacfe4873fc1e96c8ec69726a4d9.zip |
Allow X and Y registers to be overloaded with any literal
Consider the try_case_end instruction:
try_case_end s
The 's' operand type means that the operand can either be a
literal of one of the types atom, integer, or empty list, or
a register. That worked well before R12. In R12 additional
types of literals where introduced. Because of way the
overloading was done, an 's' operand cannot handle the
new types of literals. Therefore, code such as the following
is necessary in ops.tab to avoid giving an 's' operand a
literal:
try_case_end Literal=q => move Literal x | try_case_end x
While this work, it is error-prone in that it is easy to
forget to add that kind of rule. It would also be complicated
in case we wanted to introduce a new kind of addition operator
such as:
i_plus jssd
Since there are two 's' operands, two scratch registers and
two 'move' instructions would be needed.
Therefore, we'll need to find a smarter way to find tag
register operands. We will overload the pid and port tags
for X and Y register, respectively. That works because pids
and port are immediate values (fit in one word), and there
are no literals for pids and ports.
Diffstat (limited to 'erts/emulator/utils')
-rwxr-xr-x | erts/emulator/utils/beam_makeops | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/erts/emulator/utils/beam_makeops b/erts/emulator/utils/beam_makeops index 6e1741af85..00b0df5b73 100755 --- a/erts/emulator/utils/beam_makeops +++ b/erts/emulator/utils/beam_makeops @@ -180,7 +180,8 @@ sub define_type_bit { define_type_bit('c', $type_bit{'i'} | $type_bit{'a'} | $type_bit{'n'} | $type_bit{'q'}); define_type_bit('s', $type_bit{'d'} | $type_bit{'i'} | - $type_bit{'a'} | $type_bit{'n'}); + $type_bit{'a'} | $type_bit{'n'} | + $type_bit{'q'}); define_type_bit('j', $type_bit{'f'} | $type_bit{'p'}); # Aliases (for matching purposes). |