summaryrefslogtreecommitdiff
path: root/erts/emulator/test/op_SUITE.erl
diff options
context:
space:
mode:
Diffstat (limited to 'erts/emulator/test/op_SUITE.erl')
-rw-r--r--erts/emulator/test/op_SUITE.erl255
1 files changed, 252 insertions, 3 deletions
diff --git a/erts/emulator/test/op_SUITE.erl b/erts/emulator/test/op_SUITE.erl
index dd13fde16d..73b556ad66 100644
--- a/erts/emulator/test/op_SUITE.erl
+++ b/erts/emulator/test/op_SUITE.erl
@@ -25,7 +25,7 @@
-export([all/0, suite/0,
bsl_bsr/1,logical/1,t_not/1,relop_simple/1,relop/1,
complex_relop/1,unsafe_fusing/1,
- range_tests/1,typed_relop/1]).
+ range_tests/1,combined_relops/1,typed_relop/1]).
-import(lists, [foldl/3,flatmap/2]).
@@ -35,7 +35,8 @@ suite() ->
all() ->
[bsl_bsr, logical, t_not, relop_simple, relop,
- complex_relop, unsafe_fusing, range_tests, typed_relop].
+ complex_relop, unsafe_fusing, range_tests,
+ combined_relops, typed_relop].
%% Test the bsl and bsr operators.
bsl_bsr(Config) when is_list(Config) ->
@@ -523,7 +524,7 @@ range_tests(_Config) ->
inside = range_big(MinSmall),
inside = range_big(-1 bsl 58),
inside = range_big(0),
- inside = range_barely_small(17.75),
+ inside = range_big(17.75),
inside = range_big(1 bsl 58),
inside = range_big(MaxSmall),
@@ -531,6 +532,39 @@ range_tests(_Config) ->
greater = range_big(1 bsl 64),
greater = range_big(float(1 bsl 64)),
+ inside = int_range_1(id(-100_000)),
+ inside = int_range_1(id(-10)),
+ inside = int_range_1(id(100)),
+ inside = int_range_1(id(100_000)),
+
+ outside = int_range_1(id(atom)),
+ outside = int_range_1(id(-1 bsl 60)),
+ outside = int_range_1(id(-100_001)),
+ outside = int_range_1(id(100_001)),
+ outside = int_range_1(id(1 bsl 60)),
+
+ inside = int_range_2(id(1)),
+ inside = int_range_2(id(42)),
+ inside = int_range_2(id(16#f000_0000)),
+
+ outside = int_range_2(id([a,list])),
+ outside = int_range_2(id(0)),
+ outside = int_range_1(id(-1 bsl 60)),
+ outside = int_range_1(id(1 bsl 60)),
+
+ inside = int_range_3(id(1 bsl 28)),
+ inside = int_range_3(id((1 bsl 28) + 1)),
+ inside = int_range_3(id((1 bsl 33) + 555)),
+ inside = int_range_3(id((1 bsl 58) - 1)),
+ inside = int_range_3(id(1 bsl 58)),
+
+ outside = int_range_3(id({a,tuple})),
+ outside = int_range_3(id(-1 bsl 60)),
+ outside = int_range_3(id(-1000)),
+ outside = int_range_3(id(100)),
+ outside = int_range_3(id((1 bsl 58) + 1)),
+ outside = int_range_3(id(1 bsl 60)),
+
ok.
range(X) ->
@@ -683,6 +717,221 @@ range_big_2(X) when (-1 bsl 59) - 1 =< X, X =< 1 bsl 59 ->
range_big_2(_) ->
outside.
+int_range_1(X) when is_integer(X), -100_000 =< X, X =< 100_000 ->
+ inside;
+int_range_1(_) ->
+ outside.
+
+int_range_2(X) when is_integer(X), 1 =< X, X =< 16#f000_0000 ->
+ inside;
+int_range_2(_) ->
+ outside.
+
+int_range_3(X) when is_integer(X), 1 bsl 28 =< X, X =< 1 bsl 58 ->
+ inside;
+int_range_3(_) ->
+ outside.
+
+combined_relops(_Config) ->
+ other = test_tok_char(-1 bsl 64),
+ other = test_tok_char($A - 1),
+
+ var = test_tok_char($A),
+ var = test_tok_char($B),
+ var = test_tok_char($P),
+ var = test_tok_char($Y),
+ var = test_tok_char($Z),
+
+ other = test_tok_char($Z + 1),
+
+ var = tok_char($_),
+ other = tok_char(float($_)),
+
+ other = test_tok_char(1 bsl 64),
+
+ other = test_tok_char(atom),
+ other = test_tok_char(self()),
+
+ %%
+ b = ge_ge_int_range_1(-200),
+ b = ge_ge_int_range_1(-101),
+
+ a = ge_ge_int_range_1(-100),
+ a = ge_ge_int_range_1(-50),
+ a = ge_ge_int_range_1(-10),
+
+ b = ge_ge_int_range_1(-9),
+ b = ge_ge_int_range_1(-6),
+
+ a = ge_ge_int_range_1(-5),
+
+ b = ge_ge_int_range_1(-4),
+ b = ge_ge_int_range_1(0),
+ b = ge_ge_int_range_1(42),
+
+ %%
+ b = ge_ge_int_range_2(-1 bsl 59),
+
+ a = ge_ge_int_range_2((-1 bsl 59) + 1),
+ a = ge_ge_int_range_2(-1 bsl 58),
+ a = ge_ge_int_range_2(-1000),
+ a = ge_ge_int_range_2(1 bsl 58),
+ a = ge_ge_int_range_2((1 bsl 59) - 10),
+
+ b = ge_ge_int_range_2((1 bsl 59) - 9),
+
+ a = ge_ge_int_range_2((1 bsl 59) - 5),
+
+ b = ge_ge_int_range_2((1 bsl 59) - 4),
+ b = ge_ge_int_range_2((1 bsl 59) - 1),
+
+ %%
+ b = ge_ge_int_range_3(-1 bsl 59),
+
+ b = ge_ge_int_range_3((-1 bsl 59) + 1),
+ b = ge_ge_int_range_3(-1 bsl 58),
+ b = ge_ge_int_range_3(-1000),
+ b = ge_ge_int_range_3(1 bsl 58),
+
+ a = ge_ge_int_range_3((1 bsl 59) - 20),
+ a = ge_ge_int_range_3((1 bsl 59) - 15),
+ a = ge_ge_int_range_3((1 bsl 59) - 10),
+
+ b = ge_ge_int_range_3((1 bsl 59) - 9),
+
+ a = ge_ge_int_range_3((1 bsl 59) - 5),
+
+ b = ge_ge_int_range_3((1 bsl 59) - 4),
+ b = ge_ge_int_range_3((1 bsl 59) - 1),
+
+ %%
+ b = ge_ge_int_range_4(-1 bsl 59),
+
+ a = ge_ge_int_range_4((-1 bsl 59) + 1),
+ a = ge_ge_int_range_4((-1 bsl 59) + 3),
+ a = ge_ge_int_range_4((-1 bsl 59) + 5),
+
+ b = ge_ge_int_range_4((-1 bsl 59) + 6),
+ b = ge_ge_int_range_4((-1 bsl 59) + 9),
+
+ a = ge_ge_int_range_4((-1 bsl 59) + 10),
+
+ b = ge_ge_int_range_4((-1 bsl 59) + 11),
+
+ b = ge_ge_int_range_4(0),
+ b = ge_ge_int_range_4(1000),
+
+ b = ge_ge_int_range_4((1 bsl 59) - 1),
+
+ %% Test a sequence that can't occur in optimized code:
+ %% is_ge Fail Src 10
+ %% is_ge Fail Src 5
+ Module = {?FUNCTION_NAME,[{test,1}],[],
+ [{function, test, 1, 2,
+ [{label,1},
+ {line,[{location,"t.erl",4}]},
+ {func_info,{atom,?FUNCTION_NAME},{atom,test},1},
+ {label,2},
+ {test,is_ge,{f,4},
+ [{tr,{x,0},{t_integer,{0,1000}}},
+ {integer,10}]},
+ {test,is_ge,
+ {f,3},
+ [{tr,{x,0},{t_integer,{0,1000}}},
+ {integer,5}]},
+ {label,3},
+ {move,{atom,a},{x,0}},
+ return,
+ {label,4},
+ {move,{atom,b},{x,0}},
+ return]}],
+ 5},
+
+ {ok,Mod,Code} = compile:forms(Module, [from_asm,time,report]),
+ {module,Mod} = code:load_binary(Mod, Mod, Code),
+
+ b = Mod:test(0),
+ b = Mod:test(5),
+ b = Mod:test(9),
+
+ a = Mod:test(10),
+ a = Mod:test(11),
+ a = Mod:test(1000),
+
+ true = code:delete(Mod),
+ _ = code:purge(Mod),
+
+ ok.
+
+test_tok_char(C) ->
+ Result = tok_char(C),
+ if
+ is_integer(C) ->
+ Result = tok_char(float(C)),
+ Result = tok_char_int(C),
+ if
+ C band 16#FFFF =:= C ->
+ Result = tok_char_int_range(C);
+ true ->
+ Result
+ end;
+ true ->
+ Result
+ end.
+
+%% is_ge + is_lt
+tok_char(C) when $A =< C, C =< $Z ->
+ var;
+tok_char($_) ->
+ var;
+tok_char(_) ->
+ other.
+
+%% is_ge + is_ge
+tok_char_int(C) when $A =< C, C =< $Z ->
+ var;
+tok_char_int($_) ->
+ var;
+tok_char_int(_) ->
+ other.
+
+%% is_ge + is_ge
+tok_char_int_range(C) when $A =< C, C =< $Z ->
+ var;
+tok_char_int_range($_) ->
+ var;
+tok_char_int_range(_) ->
+ other.
+
+%% is_ge + is_ge
+ge_ge_int_range_1(X) when -100 =< X, X =< -10 ->
+ a;
+ge_ge_int_range_1(-5) ->
+ a;
+ge_ge_int_range_1(_) ->
+ b.
+
+ge_ge_int_range_2(X) when (-1 bsl 59) + 1 =< X, X =< (1 bsl 59) - 10 ->
+ a;
+ge_ge_int_range_2((1 bsl 59) - 5) ->
+ a;
+ge_ge_int_range_2(_) ->
+ b.
+
+ge_ge_int_range_3(X) when (1 bsl 59) - 20 =< X, X =< (1 bsl 59) - 10 ->
+ a;
+ge_ge_int_range_3((1 bsl 59) - 5) ->
+ a;
+ge_ge_int_range_3(_) ->
+ b.
+
+ge_ge_int_range_4(X) when (-1 bsl 59) + 1 =< X, X =< (-1 bsl 59) + 5 ->
+ a;
+ge_ge_int_range_4((-1 bsl 59) + 10) ->
+ a;
+ge_ge_int_range_4(_) ->
+ b.
+
%% Tests operators where type hints are significant.
typed_relop(Config) when is_list(Config) ->
_ = [compare_integer_pid(1 bsl N) || N <- lists:seq(1, 64)],