aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2018-01-26 10:46:23 +0100
committerBjörn Gustavsson <[email protected]>2018-01-26 10:46:23 +0100
commit26e3ec83c54d42d73c42ef7c4e79ae629866faa2 (patch)
tree85b4d8e6d245d2b6def5fc21d789dca6166775ab /lib
parent5b58d9e2d3262160b7f10d8b6798f89f0618c5f6 (diff)
downloadotp-26e3ec83c54d42d73c42ef7c4e79ae629866faa2.tar.gz
otp-26e3ec83c54d42d73c42ef7c4e79ae629866faa2.tar.bz2
otp-26e3ec83c54d42d73c42ef7c4e79ae629866faa2.zip
beam_asm: Encode big numbers as literals
Numbers that clearly are not smalls can be encoded as literals. Conservatively, we assume that integers whose absolute value is greater than 1 bsl 128 are bignums and that they can be encoded as literals. Literals are slightly easier for the loader to handle than huge integers.
Diffstat (limited to 'lib')
-rw-r--r--lib/compiler/src/beam_asm.erl12
1 files changed, 11 insertions, 1 deletions
diff --git a/lib/compiler/src/beam_asm.erl b/lib/compiler/src/beam_asm.erl
index 453e00fce3..fa919ca862 100644
--- a/lib/compiler/src/beam_asm.erl
+++ b/lib/compiler/src/beam_asm.erl
@@ -407,7 +407,17 @@ encode_arg({atom, Atom}, Dict0) when is_atom(Atom) ->
{Index, Dict} = beam_dict:atom(Atom, Dict0),
{encode(?tag_a, Index), Dict};
encode_arg({integer, N}, Dict) ->
- {encode(?tag_i, N), Dict};
+ %% Conservatily assume that all integers whose absolute
+ %% value is greater than 1 bsl 128 will be bignums in
+ %% the runtime system.
+ if
+ N >= 1 bsl 128 ->
+ encode_arg({literal, N}, Dict);
+ N =< -(1 bsl 128) ->
+ encode_arg({literal, N}, Dict);
+ true ->
+ {encode(?tag_i, N), Dict}
+ end;
encode_arg(nil, Dict) ->
{encode(?tag_a, 0), Dict};
encode_arg({f, W}, Dict) ->