Packages

An experimental work-in-progress (WIP) WebAssembly runtime written in Gleam.

Current section

Files

Jump to
gwr src gwr@exec@arith.erl
Raw

src/gwr@exec@arith.erl

-module(gwr@exec@arith).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/gwr/exec/arith.gleam").
-export([unsigned/2, signed/2, bool_to_int/1, iadd/3, isub/3, imul/3, idiv_u/3, idiv_s/3, irem_u/3, irem_s/3, inot/2, iand/3, iandnot/3, ior/3, ixor/3, ishl/3, ishr_u/3, ishr_s/3, irotl/3, irotr/3, iclz/2, ictz/2, ipopcnt/2, ieqz/1, ieq/2, ine/2, ilt_u/3, ilt_s/3, igt_u/3, igt_s/3, ile_u/3, ile_s/3, ige_u/3, ige_s/3, iextend8_s/2, iextend16_s/2, iextend32_s/2, ibitselect/3, iabs/2, ineg/2]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
-file("src/gwr/exec/arith.gleam", 6).
-spec two_power_n(integer()) -> integer().
two_power_n(N) ->
erlang:'bsl'(1, N).
-file("src/gwr/exec/arith.gleam", 10).
-spec two_power_n_minus_one(integer()) -> integer().
two_power_n_minus_one(N) ->
erlang:'bsl'(1, N - 1).
-file("src/gwr/exec/arith.gleam", 22).
-spec unsigned(integer(), integer()) -> integer().
unsigned(N, I) ->
case two_power_n(N) of
0 -> 0;
Gleam@denominator -> (I + two_power_n(N)) rem Gleam@denominator
end.
-file("src/gwr/exec/arith.gleam", 15).
?DOC(" https://webassembly.github.io/spec/core/exec/numerics.html#sign-interpretation\n").
-spec signed(integer(), integer()) -> integer().
signed(N, I) ->
case (0 =< I) andalso (I < two_power_n_minus_one(N)) of
true ->
I;
_ ->
unsigned(N, I) - two_power_n(N)
end.
-file("src/gwr/exec/arith.gleam", 27).
?DOC(" https://webassembly.github.io/spec/core/exec/numerics.html#boolean-interpretation\n").
-spec bool_to_int(boolean()) -> integer().
bool_to_int(C) ->
case C of
true ->
1;
_ ->
0
end.
-file("src/gwr/exec/arith.gleam", 39).
?DOC(
" Return the result of adding i_1 and i_2 modulo 2^N.\n"
" \n"
" \\begin{array}{@{}lcll}{\\mathrm{iadd}}_N(i_1, i_2) &=& (i_1 + i_2) \\mathbin{\\mathrm{mod}} 2^N\\end{array}\n"
" \n"
" https://webassembly.github.io/spec/core/exec/numerics.html#xref-exec-numerics-op-iadd-mathrm-iadd-n-i-1-i-2\n"
).
-spec iadd(integer(), integer(), integer()) -> integer().
iadd(N, I_1, I_2) ->
unsigned(N, I_1 + I_2).
-file("src/gwr/exec/arith.gleam", 48).
?DOC(
" Return the result of subtracting i_2 from i_1 modulo 2^N.\n"
" \n"
" \\begin{array}{@{}lcll}{\\mathrm{isub}}_N(i_1, i_2) &=& (i_1 - i_2 + 2^N) \\mathbin{\\mathrm{mod}} 2^N\\end{array}\n"
" \n"
" https://webassembly.github.io/spec/core/exec/numerics.html#xref-exec-numerics-op-isub-mathrm-isub-n-i-1-i-2\n"
).
-spec isub(integer(), integer(), integer()) -> integer().
isub(N, I_1, I_2) ->
unsigned(N, I_1 - I_2).
-file("src/gwr/exec/arith.gleam", 57).
?DOC(
" Return the result of multiplying i_2 and i_1 modulo 2^N.\n"
" \n"
" \\begin{array}{@{}lcll}{\\mathrm{imul}}_N(i_1, i_2) &=& (i_1 \\cdot i_2) \\mathbin{\\mathrm{mod}} 2^N\\end{array}\n"
" \n"
" https://webassembly.github.io/spec/core/exec/numerics.html#xref-exec-numerics-op-imul-mathrm-imul-n-i-1-i-2\n"
).
-spec imul(integer(), integer(), integer()) -> integer().
imul(N, I_1, I_2) ->
unsigned(N, I_1 * I_2).
-file("src/gwr/exec/arith.gleam", 62).
?DOC(" https://webassembly.github.io/spec/core/exec/numerics.html#xref-exec-numerics-op-idiv-u-mathrm-idiv-u-n-i-1-i-2\n").
-spec idiv_u(integer(), integer(), integer()) -> {ok, integer()} |
{error, gwr@exec@trap:trap()}.
idiv_u(N, I_1, I_2) ->
I_1@1 = unsigned(N, I_1),
I_2@1 = unsigned(N, I_2),
case I_2@1 of
0 ->
_pipe = gwr@exec@trap:make(division_by_zero),
gwr@exec@trap:to_error(_pipe);
_ ->
{ok, case I_2@1 of
0 -> 0;
Gleam@denominator -> I_1@1 div Gleam@denominator
end}
end.
-file("src/gwr/exec/arith.gleam", 78).
?DOC(" https://webassembly.github.io/spec/core/exec/numerics.html#xref-exec-numerics-op-idiv-s-mathrm-idiv-s-n-i-1-i-2\n").
-spec idiv_s(integer(), integer(), integer()) -> {ok, integer()} |
{error, gwr@exec@trap:trap()}.
idiv_s(N, I_1, I_2) ->
J_1 = signed(N, I_1),
J_2 = signed(N, I_2),
Two_power_n_minus_one = two_power_n_minus_one(N),
case J_2 of
0 ->
_pipe = gwr@exec@trap:make(division_by_zero),
gwr@exec@trap:to_error(_pipe);
_ ->
case case J_2 of
0 -> 0;
Gleam@denominator -> J_1 div Gleam@denominator
end of
X when X =:= Two_power_n_minus_one ->
_pipe@1 = gwr@exec@trap:make(overflow),
gwr@exec@trap:to_error(_pipe@1);
_ ->
{ok, unsigned(N, case J_2 of
0 -> 0;
Gleam@denominator@1 -> J_1 div Gleam@denominator@1
end)}
end
end.
-file("src/gwr/exec/arith.gleam", 104).
?DOC(" https://webassembly.github.io/spec/core/exec/numerics.html?highlight=test#xref-exec-numerics-op-irem-u-mathrm-irem-u-n-i-1-i-2\n").
-spec irem_u(integer(), integer(), integer()) -> {ok, integer()} |
{error, gwr@exec@trap:trap()}.
irem_u(N, I_1, I_2) ->
I_1@1 = unsigned(N, I_1),
I_2@1 = unsigned(N, I_2),
_pipe = gleam@int:remainder(I_1@1, I_2@1),
gleam@result:replace_error(_pipe, gwr@exec@trap:make(division_by_zero)).
-file("src/gwr/exec/arith.gleam", 114).
?DOC(" https://webassembly.github.io/spec/core/exec/numerics.html?highlight=test#xref-exec-numerics-op-irem-s-mathrm-irem-s-n-i-1-i-2\n").
-spec irem_s(integer(), integer(), integer()) -> {ok, integer()} |
{error, gwr@exec@trap:trap()}.
irem_s(N, I_1, I_2) ->
J_1 = signed(N, I_1),
J_2 = signed(N, I_2),
gleam@result:'try'(
begin
_pipe = gleam@int:remainder(J_1, J_2),
gleam@result:replace_error(
_pipe,
gwr@exec@trap:make(division_by_zero)
)
end,
fun(Res) -> {ok, unsigned(N, Res)} end
).
-file("src/gwr/exec/arith.gleam", 131).
?DOC(
" Return the bitwise negation of i.\n"
" \n"
" https://webassembly.github.io/spec/core/exec/numerics.html?highlight=test#xref-exec-numerics-op-inot-mathrm-inot-n-i\n"
).
-spec inot(integer(), integer()) -> integer().
inot(N, I) ->
I@1 = unsigned(N, I),
erlang:'bxor'(I@1, two_power_n_minus_one(N)).
-file("src/gwr/exec/arith.gleam", 139).
?DOC(
" Return the bitwise conjunction of i_1 and i_2.\n"
" \n"
" https://webassembly.github.io/spec/core/exec/numerics.html?highlight=test#xref-exec-numerics-op-iand-mathrm-iand-n-i-1-i-2\n"
).
-spec iand(integer(), integer(), integer()) -> integer().
iand(N, I_1, I_2) ->
I_1@1 = unsigned(N, I_1),
I_2@1 = unsigned(N, I_2),
erlang:'band'(I_1@1, I_2@1).
-file("src/gwr/exec/arith.gleam", 148).
?DOC(
" Return the bitwise conjunction of i_1 and the bitwise negation of i_2.\n"
" \n"
" https://webassembly.github.io/spec/core/exec/numerics.html?highlight=test#xref-exec-numerics-op-iandnot-mathrm-iandnot-n-i-1-i-2\n"
).
-spec iandnot(integer(), integer(), integer()) -> integer().
iandnot(N, I_1, I_2) ->
iand(N, I_1, inot(N, I_2)).
-file("src/gwr/exec/arith.gleam", 155).
?DOC(
" Return the bitwise disjunction of i_1 and i_2.\n"
" \n"
" https://webassembly.github.io/spec/core/exec/numerics.html?highlight=test#xref-exec-numerics-op-ior-mathrm-ior-n-i-1-i-2\n"
).
-spec ior(integer(), integer(), integer()) -> integer().
ior(N, I_1, I_2) ->
I_1@1 = unsigned(N, I_1),
I_2@1 = unsigned(N, I_2),
erlang:'bor'(I_1@1, I_2@1).
-file("src/gwr/exec/arith.gleam", 164).
?DOC(
" Return the bitwise exclusive disjunction of i_1 and i_2.\n"
" \n"
" https://webassembly.github.io/spec/core/exec/numerics.html?highlight=test#xref-exec-numerics-op-ixor-mathrm-ixor-n-i-1-i-2\n"
).
-spec ixor(integer(), integer(), integer()) -> integer().
ixor(N, I_1, I_2) ->
I_1@1 = unsigned(N, I_1),
I_2@1 = unsigned(N, I_2),
erlang:'bxor'(I_1@1, I_2@1).
-file("src/gwr/exec/arith.gleam", 171).
?DOC(" https://webassembly.github.io/spec/core/exec/numerics.html?highlight=test#xref-exec-numerics-op-ishl-mathrm-ishl-n-i-1-i-2\n").
-spec ishl(integer(), integer(), integer()) -> {ok, integer()} |
{error, gwr@exec@trap:trap()}.
ishl(N, I_1, I_2) ->
I_1@1 = unsigned(N, I_1),
gleam@result:'try'(
begin
_pipe = gleam@int:modulo(unsigned(N, I_2), N),
gleam@result:replace_error(
_pipe,
gwr@exec@trap:make(division_by_zero)
)
end,
fun(K) -> {ok, unsigned(N, erlang:'bsl'(I_1@1, K))} end
).
-file("src/gwr/exec/arith.gleam", 183).
?DOC(" https://webassembly.github.io/spec/core/exec/numerics.html?highlight=test#xref-exec-numerics-op-ishr-u-mathrm-ishr-u-n-i-1-i-2\n").
-spec ishr_u(integer(), integer(), integer()) -> {ok, integer()} |
{error, gwr@exec@trap:trap()}.
ishr_u(N, I_1, I_2) ->
I_1@1 = unsigned(N, I_1),
gleam@result:'try'(
begin
_pipe = gleam@int:modulo(unsigned(N, I_2), N),
gleam@result:replace_error(
_pipe,
gwr@exec@trap:make(division_by_zero)
)
end,
fun(K) -> {ok, unsigned(N, erlang:'bsr'(I_1@1, K))} end
).
-file("src/gwr/exec/arith.gleam", 195).
?DOC(" https://webassembly.github.io/spec/core/exec/numerics.html?highlight=test#xref-exec-numerics-op-ishr-s-mathrm-ishr-s-n-i-1-i-2\n").
-spec ishr_s(integer(), integer(), integer()) -> {ok, integer()} |
{error, gwr@exec@trap:trap()}.
ishr_s(N, I_1, I_2) ->
I_1@1 = signed(N, I_1),
gleam@result:'try'(
begin
_pipe = gleam@int:modulo(unsigned(N, I_2), N),
gleam@result:replace_error(
_pipe,
gwr@exec@trap:make(division_by_zero)
)
end,
fun(K) -> {ok, unsigned(N, erlang:'bsr'(I_1@1, K))} end
).
-file("src/gwr/exec/arith.gleam", 206).
-spec irotl(integer(), integer(), integer()) -> {ok, integer()} |
{error, gwr@exec@trap:trap()}.
irotl(N, I_1, I_2) ->
I_1@1 = unsigned(N, I_1),
gleam@result:'try'(
begin
_pipe = gleam@int:modulo(unsigned(N, I_2), N),
gleam@result:replace_error(
_pipe,
gwr@exec@trap:make(division_by_zero)
)
end,
fun(K) ->
Res = erlang:'bor'(
erlang:'bsl'(I_1@1, K),
erlang:'bsr'(I_1@1, N - K)
),
{ok, unsigned(N, Res)}
end
).
-file("src/gwr/exec/arith.gleam", 222).
-spec irotr(integer(), integer(), integer()) -> {ok, integer()} |
{error, gwr@exec@trap:trap()}.
irotr(N, I_1, I_2) ->
I_1@1 = unsigned(N, I_1),
gleam@result:'try'(
begin
_pipe = gleam@int:modulo(unsigned(N, I_2), N),
gleam@result:replace_error(
_pipe,
gwr@exec@trap:make(division_by_zero)
)
end,
fun(K) ->
Res = erlang:'bor'(
erlang:'bsr'(I_1@1, K),
erlang:'bsl'(I_1@1, N - K)
),
{ok, unsigned(N, Res)}
end
).
-file("src/gwr/exec/arith.gleam", 238).
-spec iclz_32(integer()) -> integer().
iclz_32(I) ->
case I of
0 ->
32;
_ ->
N = 0,
{N@1, I@1} = case I =< 16#0000ffff of
true ->
{N + 16,
begin
_pipe = erlang:'bsl'(I, 16),
erlang:'band'(_pipe, 16#ffffffff)
end};
false ->
{N, I}
end,
{N@2, I@2} = case I@1 =< 16#00ffffff of
true ->
{N@1 + 8,
begin
_pipe@1 = erlang:'bsl'(I@1, 8),
erlang:'band'(_pipe@1, 16#ffffffff)
end};
false ->
{N@1, I@1}
end,
{N@3, I@3} = case I@2 =< 16#0fffffff of
true ->
{N@2 + 4,
begin
_pipe@2 = erlang:'bsl'(I@2, 4),
erlang:'band'(_pipe@2, 16#ffffffff)
end};
false ->
{N@2, I@2}
end,
{N@4, I@4} = case I@3 =< 16#3fffffff of
true ->
{N@3 + 2,
begin
_pipe@3 = erlang:'bsl'(I@3, 2),
erlang:'band'(_pipe@3, 16#ffffffff)
end};
false ->
{N@3, I@3}
end,
N@5 = case I@4 =< 16#7fffffff of
true ->
N@4 + 1;
false ->
N@4
end,
N@5
end.
-file("src/gwr/exec/arith.gleam", 280).
-spec iclz_64(integer()) -> integer().
iclz_64(I) ->
case I of
0 ->
64;
_ ->
Low = erlang:'band'(I, 16#00000000ffffffff),
High = erlang:'bsr'(I, 32),
case High of
0 ->
32 + iclz_32(Low);
_ ->
iclz_32(High)
end
end.
-file("src/gwr/exec/arith.gleam", 297).
?DOC(
" Return the count of leading zero bits in i; all bits are considered leading zeros if i is 0.\n"
" \n"
" https://webassembly.github.io/spec/core/exec/numerics.html?highlight=test#xref-exec-numerics-op-iclz-mathrm-iclz-n-i\n"
).
-spec iclz(integer(), integer()) -> {ok, integer()} |
{error, gwr@exec@trap:trap()}.
iclz(N, I) ->
case N of
32 ->
{ok, iclz_32(I)};
64 ->
{ok, iclz_64(I)};
_ ->
_pipe = gwr@exec@trap:make(bad_argument),
_pipe@1 = gwr@exec@trap:add_message(
_pipe,
<<"The iclz operation is currently implemented only for 32 and 64-bit integers"/utf8>>
),
gwr@exec@trap:to_error(_pipe@1)
end.
-file("src/gwr/exec/arith.gleam", 310).
-spec ictz_32(integer()) -> integer().
ictz_32(I) ->
case I of
0 ->
32;
_ ->
N = 0,
{N@1, I@1} = case erlang:'band'(I, 16#0000ffff) of
0 ->
{N + 16, erlang:'bsr'(I, 16)};
_ ->
{N, I}
end,
{N@2, I@2} = case erlang:'band'(I@1, 16#000000ff) of
0 ->
{N@1 + 8, erlang:'bsr'(I@1, 8)};
_ ->
{N@1, I@1}
end,
{N@3, I@3} = case erlang:'band'(I@2, 16#0000000f) of
0 ->
{N@2 + 4, erlang:'bsr'(I@2, 4)};
_ ->
{N@2, I@2}
end,
{N@4, I@4} = case erlang:'band'(I@3, 16#00000003) of
0 ->
{N@3 + 2, erlang:'bsr'(I@3, 2)};
_ ->
{N@3, I@3}
end,
N@5 = case erlang:'band'(I@4, 16#00000001) of
0 ->
N@4 + 1;
_ ->
N@4
end,
N@5
end.
-file("src/gwr/exec/arith.gleam", 340).
-spec ictz_64(integer()) -> integer().
ictz_64(I) ->
case I of
0 ->
64;
_ ->
Low = erlang:'band'(I, 16#00000000ffffffff),
High = erlang:'bsr'(I, 32),
case Low of
0 ->
32 + ictz_32(High);
_ ->
ictz_32(Low)
end
end.
-file("src/gwr/exec/arith.gleam", 357).
?DOC(
" Return the count of trailing zero bits in i; all bits are considered trailing zeros if i is 0.\n"
" \n"
" https://webassembly.github.io/spec/core/exec/numerics.html?highlight=test#xref-exec-numerics-op-ictz-mathrm-ictz-n-i\n"
).
-spec ictz(integer(), integer()) -> {ok, integer()} |
{error, gwr@exec@trap:trap()}.
ictz(N, I) ->
case N of
32 ->
{ok, ictz_32(I)};
64 ->
{ok, ictz_64(I)};
_ ->
_pipe = gwr@exec@trap:make(bad_argument),
_pipe@1 = gwr@exec@trap:add_message(
_pipe,
<<"The ictz operation is currently implemented only for 32 and 64-bit integers"/utf8>>
),
gwr@exec@trap:to_error(_pipe@1)
end.
-file("src/gwr/exec/arith.gleam", 370).
-spec ipopcnt_32(integer()) -> integer().
ipopcnt_32(I) ->
case I of
0 ->
0;
_ ->
I@1 = erlang:'band'(I, 16#55555555) + erlang:'band'(
erlang:'bsr'(I, 1),
16#55555555
),
I@2 = erlang:'band'(I@1, 16#33333333) + erlang:'band'(
erlang:'bsr'(I@1, 2),
16#33333333
),
I@3 = erlang:'band'(I@2, 16#0f0f0f0f) + erlang:'band'(
erlang:'bsr'(I@2, 4),
16#0f0f0f0f
),
I@4 = erlang:'band'(I@3, 16#00ff00ff) + erlang:'band'(
erlang:'bsr'(I@3, 8),
16#00ff00ff
),
I@5 = erlang:'band'(I@4, 16#0000ffff) + erlang:'band'(
erlang:'bsr'(I@4, 16),
16#0000ffff
),
I@5
end.
-file("src/gwr/exec/arith.gleam", 394).
-spec ipopcnt_64(integer()) -> integer().
ipopcnt_64(I) ->
case I of
0 ->
0;
_ ->
Low_cnt = ipopcnt_32(I),
High_cnt = ipopcnt_32(erlang:'bsr'(I, 32)),
Low_cnt + High_cnt
end.
-file("src/gwr/exec/arith.gleam", 408).
?DOC(
" Return the count of non-zero bits in i.\n"
" \n"
" https://webassembly.github.io/spec/core/exec/numerics.html?highlight=test#xref-exec-numerics-op-ipopcnt-mathrm-ipopcnt-n-i\n"
).
-spec ipopcnt(integer(), integer()) -> {ok, integer()} |
{error, gwr@exec@trap:trap()}.
ipopcnt(N, I) ->
case N of
32 ->
{ok, ipopcnt_32(I)};
64 ->
{ok, ipopcnt_64(I)};
_ ->
_pipe = gwr@exec@trap:make(bad_argument),
_pipe@1 = gwr@exec@trap:add_message(
_pipe,
<<"The ipopcnt operation is currently implemented only for 32 and 64-bit integers"/utf8>>
),
gwr@exec@trap:to_error(_pipe@1)
end.
-file("src/gwr/exec/arith.gleam", 424).
?DOC(
" Return 1 if i is zero, 0 otherwise.\n"
" \n"
" https://webassembly.github.io/spec/core/exec/numerics.html?highlight=test#xref-exec-numerics-op-ieqz-mathrm-ieqz-n-i\n"
).
-spec ieqz(integer()) -> integer().
ieqz(I) ->
bool_to_int(I =:= 0).
-file("src/gwr/exec/arith.gleam", 431).
?DOC(
" Return 1 if i_1 equals i_2, 0 otherwise.\n"
" \n"
" https://webassembly.github.io/spec/core/exec/numerics.html?highlight=test#xref-exec-numerics-op-ieq-mathrm-ieq-n-i-1-i-2\n"
).
-spec ieq(integer(), integer()) -> integer().
ieq(I_1, I_2) ->
bool_to_int(I_1 =:= I_2).
-file("src/gwr/exec/arith.gleam", 438).
?DOC(
" Return 1 if i_1 does not equal i_2, 0 otherwise.\n"
" \n"
" https://webassembly.github.io/spec/core/exec/numerics.html?highlight=test#xref-exec-numerics-op-ine-mathrm-ine-n-i-1-i-2\n"
).
-spec ine(integer(), integer()) -> integer().
ine(I_1, I_2) ->
bool_to_int(I_1 /= I_2).
-file("src/gwr/exec/arith.gleam", 445).
?DOC(
" Return 1 if i_1 is less than i_2, 0 otherwise.\n"
" \n"
" https://webassembly.github.io/spec/core/exec/numerics.html?highlight=test#xref-exec-numerics-op-ilt-u-mathrm-ilt-u-n-i-1-i-2\n"
).
-spec ilt_u(integer(), integer(), integer()) -> integer().
ilt_u(N, I_1, I_2) ->
bool_to_int(unsigned(N, I_1) < unsigned(N, I_2)).
-file("src/gwr/exec/arith.gleam", 452).
?DOC(
" Return 1 if i_1 is less than i_2, 0 otherwise.\n"
" \n"
" https://webassembly.github.io/spec/core/exec/numerics.html?highlight=test#xref-exec-numerics-op-ilt-s-mathrm-ilt-s-n-i-1-i-2\n"
).
-spec ilt_s(integer(), integer(), integer()) -> integer().
ilt_s(N, I_1, I_2) ->
J_1 = signed(N, I_1),
J_2 = signed(N, I_2),
bool_to_int(J_1 < J_2).
-file("src/gwr/exec/arith.gleam", 464).
?DOC(
" Return 1 if i_1 is greater than i_2, 0 otherwise.\n"
" \n"
" https://webassembly.github.io/spec/core/exec/numerics.html?highlight=test#xref-exec-numerics-op-igt-u-mathrm-igt-u-n-i-1-i-2\n"
).
-spec igt_u(integer(), integer(), integer()) -> integer().
igt_u(N, I_1, I_2) ->
bool_to_int(unsigned(N, I_1) > unsigned(N, I_2)).
-file("src/gwr/exec/arith.gleam", 471).
?DOC(
" Return 1 if i_1 is greater than i_2, 0 otherwise.\n"
" \n"
" https://webassembly.github.io/spec/core/exec/numerics.html?highlight=test#xref-exec-numerics-op-igt-s-mathrm-igt-s-n-i-1-i-2\n"
).
-spec igt_s(integer(), integer(), integer()) -> integer().
igt_s(N, I_1, I_2) ->
J_1 = signed(N, I_1),
J_2 = signed(N, I_2),
bool_to_int(J_1 > J_2).
-file("src/gwr/exec/arith.gleam", 483).
?DOC(
" Return 1 if i_1 is less than or equal to i_2, 0 otherwise.\n"
" \n"
" https://webassembly.github.io/spec/core/exec/numerics.html?highlight=test#xref-exec-numerics-op-ile-u-mathrm-ile-u-n-i-1-i-2\n"
).
-spec ile_u(integer(), integer(), integer()) -> integer().
ile_u(N, I_1, I_2) ->
bool_to_int(unsigned(N, I_1) =< unsigned(N, I_2)).
-file("src/gwr/exec/arith.gleam", 490).
?DOC(
" Return 1 if i_1 is less than or equal to i_2, 0 otherwise.\n"
" \n"
" https://webassembly.github.io/spec/core/exec/numerics.html?highlight=test#xref-exec-numerics-op-ile-s-mathrm-ile-s-n-i-1-i-2\n"
).
-spec ile_s(integer(), integer(), integer()) -> integer().
ile_s(N, I_1, I_2) ->
J_1 = signed(N, I_1),
J_2 = signed(N, I_2),
bool_to_int(J_1 =< J_2).
-file("src/gwr/exec/arith.gleam", 502).
?DOC(
" Return 1 if i_1 is greater than or equal to i_2, 0 otherwise.\n"
" \n"
" https://webassembly.github.io/spec/core/exec/numerics.html?highlight=test#xref-exec-numerics-op-ige-u-mathrm-ige-u-n-i-1-i-2\n"
).
-spec ige_u(integer(), integer(), integer()) -> integer().
ige_u(N, I_1, I_2) ->
bool_to_int(unsigned(N, I_1) >= unsigned(N, I_2)).
-file("src/gwr/exec/arith.gleam", 509).
?DOC(
" Return 1 if i_1 is greater than or equal to i_2, 0 otherwise.\n"
" \n"
" https://webassembly.github.io/spec/core/exec/numerics.html?highlight=test#xref-exec-numerics-op-ige-s-mathrm-ige-s-n-i-1-i-2\n"
).
-spec ige_s(integer(), integer(), integer()) -> integer().
ige_s(N, I_1, I_2) ->
J_1 = signed(N, I_1),
J_2 = signed(N, I_2),
bool_to_int(J_1 >= J_2).
-file("src/gwr/exec/arith.gleam", 519).
?DOC(" https://webassembly.github.io/spec/core/exec/numerics.html?highlight=test#xref-exec-numerics-op-iextendn-s-mathrm-iextend-m-mathrm-s-n-i\n").
-spec iextend_s(integer(), integer(), integer()) -> {ok, integer()} |
{error, gwr@exec@trap:trap()}.
iextend_s(M, N, I) ->
gleam@result:'try'(
begin
_pipe = gleam@int:modulo(I, two_power_n(M)),
gleam@result:replace_error(_pipe, gwr@exec@trap:make(bad_argument))
end,
fun(J) ->
J@1 = signed(M, J),
{ok, unsigned(N, J@1)}
end
).
-file("src/gwr/exec/arith.gleam", 528).
-spec iextend8_s(integer(), integer()) -> {ok, integer()} |
{error, gwr@exec@trap:trap()}.
iextend8_s(N, I) ->
iextend_s(8, N, I).
-file("src/gwr/exec/arith.gleam", 532).
-spec iextend16_s(integer(), integer()) -> {ok, integer()} |
{error, gwr@exec@trap:trap()}.
iextend16_s(N, I) ->
iextend_s(16, N, I).
-file("src/gwr/exec/arith.gleam", 536).
-spec iextend32_s(integer(), integer()) -> {ok, integer()} |
{error, gwr@exec@trap:trap()}.
iextend32_s(N, I) ->
iextend_s(32, N, I).
-file("src/gwr/exec/arith.gleam", 541).
?DOC(" https://webassembly.github.io/spec/core/exec/numerics.html?highlight=test#xref-exec-numerics-op-ibitselect-mathrm-ibitselect-n-i-1-i-2-i-3\n").
-spec ibitselect(integer(), integer(), integer()) -> integer().
ibitselect(I_1, I_2, I_3) ->
J_1 = erlang:'band'(I_1, I_3),
J_3 = erlang:'bnot'(I_3),
J_2 = erlang:'band'(I_2, J_3),
erlang:'bor'(J_1, J_2).
-file("src/gwr/exec/arith.gleam", 553).
?DOC(" https://webassembly.github.io/spec/core/exec/numerics.html?highlight=test#xref-exec-numerics-op-iabs-mathrm-iabs-n-i\n").
-spec iabs(integer(), integer()) -> integer().
iabs(N, I) ->
J = signed(N, I),
case J >= 0 of
true ->
I;
_ ->
case two_power_n(N) of
0 -> 0;
Gleam@denominator -> gleam@int:negate(J) rem Gleam@denominator
end
end.
-file("src/gwr/exec/arith.gleam", 569).
?DOC(
" Return the result of negating i, modulo 2^N.\n"
" \n"
" https://webassembly.github.io/spec/core/exec/numerics.html?highlight=test#xref-exec-numerics-op-ineg-mathrm-ineg-n-i\n"
).
-spec ineg(integer(), integer()) -> integer().
ineg(N, I) ->
case two_power_n(N) of
0 -> 0;
Gleam@denominator -> (two_power_n(N) - I) rem Gleam@denominator
end.