[m-rev.] diff: add more builtin ops on uints (part 1)

Julien Fischer jfischer at opturion.com
Wed Apr 12 09:41:31 AEST 2017


Hi,

This part of the change is available in rotd-2017-04-11.  Everyone will
need to update; I'll commit the second part next week.

Julien.

On 11 April 2017 at 13:07, Julien Fischer <jfischer at opturion.com> wrote:

>
> The following will need to bootstrap before the new oprations can be
> made available in the standard library -- I'll commit the second part
> some time next week.  Also, there's been some discussion on of the
> operand types and semantics of the shift operations -- the outcome of
> those discussions won't affect the code below.
>
> ---------------------
>
> Add more builtin ops on uints (part 1).
>
> compiler/builtin_ops.m:
>      Add unchecked left and right shifts for uints as well
>      as the reverse modes of addition and subtraction.
>
> library/uint.m:
>      Add commented out mode declarations for addition and
>      subtraction; they can be uncommented once the above
>      has bootstrapped.
>
> compiler/bytecode.m:
> compiler/c_util.m:
> compiler/erl_call_gen.m:
> compiler/llds.m:
> compiler/llds_out_data.m:
> compiler/ml_global_data.m:
> compiler/mlds_to_c.m:
> compiler/mlds_to_cs.m:
> compiler/mlds_to_java.m:
> compiler/opt_debug.m:
>      Conform to the above changes.
>
> Julien.
>
> diff --git a/compiler/builtin_ops.m b/compiler/builtin_ops.m
> index 356f0b8..e19eee9 100644
> --- a/compiler/builtin_ops.m
> +++ b/compiler/builtin_ops.m
> @@ -111,6 +111,9 @@
>      ;       uint_bitwise_or
>      ;       uint_bitwise_xor
>
> +    ;       uint_unchecked_left_shift
> +    ;       uint_unchecked_right_shift
> +
>      ;       float_plus      %  XXX the integer versions use different
> names.
>      ;       float_minus     %  E.g add instead of plus etc.
>      ;       float_times
> @@ -397,15 +400,43 @@ builtin_translation(ModuleName, PredName, ProcNum,
> Args, Code) :-
>              ProcNum = 0,
>              Args = [X, Y],
>              Code = assign(Y, unary(uint_bitwise_complement, leaf(X)))
> -    ;
> -            ( PredName = "+", ArithOp = uint_add
> -            ; PredName = "-", ArithOp = uint_sub
> -            ; PredName = "*", ArithOp = uint_mul
> +        ;
> +            PredName = "+",
> +            Args = [X, Y, Z],
> +            (
> +                ProcNum = 0,
> +                Code = assign(Z, binary(uint_add, leaf(X), leaf(Y)))
> +            ;
> +                ProcNum = 1,
> +                Code = assign(X, binary(uint_sub, leaf(Z), leaf(Y)))
> +            ;
> +                ProcNum = 2,
> +                Code = assign(Y, binary(uint_sub, leaf(Z), leaf(X)))
> +            )
> +        ;
> +            PredName = "-",
> +            Args = [X, Y, Z],
> +            (
> +                ProcNum = 0,
> +                Code = assign(Z, binary(int_sub, leaf(X), leaf(Y)))
> +            ;
> +                ProcNum = 1,
> +                Code = assign(X, binary(uint_add, leaf(Y), leaf(Z)))
> +            ;
> +                ProcNum = 2,
> +                Code = assign(Y, binary(uint_sub, leaf(X), leaf(Z)))
> +            )
> +        ;
> +            ( PredName = "*", ArithOp = uint_mul
>              ; PredName = "unchecked_quotient", ArithOp = uint_div
>              ; PredName = "unchecked_rem", ArithOp = uint_mod
>              ; PredName = "/\\", ArithOp = uint_bitwise_and
>              ; PredName = "\\/", ArithOp = uint_bitwise_or
>              ; PredName = "xor", ArithOp = uint_bitwise_xor
> +            ; PredName = "unchecked_left_shift",
> +                ArithOp = uint_unchecked_left_shift
> +            ; PredName = "unchecked_right_shift",
> +                ArithOp = uint_unchecked_right_shift
>              ),
>              ProcNum = 0,
>              Args = [X, Y, Z],
> diff --git a/compiler/bytecode.m b/compiler/bytecode.m
> index 21af01a..5dc8d79 100644
> --- a/compiler/bytecode.m
> +++ b/compiler/bytecode.m
> @@ -1090,6 +1090,8 @@ binop_code(uint_mod,                55).
>  binop_code(uint_bitwise_and,        56).
>  binop_code(uint_bitwise_or,         57).
>  binop_code(uint_bitwise_xor,        58).
> +binop_code(uint_unchecked_left_shift, 59).
> +binop_code(uint_unchecked_right_shift, 60).
>
>  :- pred binop_debug(binary_op::in, string::out) is det.
>
> @@ -1152,6 +1154,8 @@ binop_debug(uint_mod,               "uint_mod").
>  binop_debug(uint_bitwise_and,       "uint_bitwise_and").
>  binop_debug(uint_bitwise_or,        "uint_bitwise_or").
>  binop_debug(uint_bitwise_xor,       "uint_bitwise_xor").
> +binop_debug(uint_unchecked_left_shift, "uint_unchecked_left_shift").
> +binop_debug(uint_unchecked_right_shift, "uint_unchecked_right_shift").
>
>  :- pred unop_code(unary_op::in, int::out) is det.
>
> diff --git a/compiler/c_util.m b/compiler/c_util.m
> index 90fb6a1..4f25295 100644
> --- a/compiler/c_util.m
> +++ b/compiler/c_util.m
> @@ -855,6 +855,8 @@ binop_category_string(uint_mod,
> uint_binary_infix_binop, "%").
>  binop_category_string(uint_bitwise_and, uint_binary_infix_binop, "&").
>  binop_category_string(uint_bitwise_or, uint_binary_infix_binop, "|").
>  binop_category_string(uint_bitwise_xor, uint_binary_infix_binop, "^").
> +binop_category_string(uint_unchecked_left_shift,
> uint_binary_infix_binop, "<<").
> +binop_category_string(uint_unchecked_right_shift,
> uint_binary_infix_binop, ">>").
>
>  binop_category_string(float_plus, float_arith_binop, "+").
>  binop_category_string(float_minus, float_arith_binop, "-").
> diff --git a/compiler/erl_call_gen.m b/compiler/erl_call_gen.m
> index 194d515..2efea95 100644
> --- a/compiler/erl_call_gen.m
> +++ b/compiler/erl_call_gen.m
> @@ -566,6 +566,8 @@ std_binop_to_elds(StdBinOp, EldsBinOp) :-
>          ; StdBinOp = uint_bitwise_and,      EldsBinOp = elds.band
>          ; StdBinOp = uint_bitwise_or,       EldsBinOp = elds.bor
>          ; StdBinOp = uint_bitwise_xor,      EldsBinOp = elds.bxor
> +        ; StdBinOp = uint_unchecked_left_shift, EldsBinOp = elds.bsl
> +        ; StdBinOp = uint_unchecked_right_shift, EldsBinOp = elds.bsr
>          )
>      ).
>
> diff --git a/compiler/llds.m b/compiler/llds.m
> index a6366eb..02df86c 100644
> --- a/compiler/llds.m
> +++ b/compiler/llds.m
> @@ -1769,6 +1769,8 @@ binop_return_type(uint_mod, lt_unsigned).
>  binop_return_type(uint_bitwise_and, lt_unsigned).
>  binop_return_type(uint_bitwise_or, lt_unsigned).
>  binop_return_type(uint_bitwise_xor, lt_unsigned).
> +binop_return_type(uint_unchecked_left_shift, lt_unsigned).
> +binop_return_type(uint_unchecked_right_shift, lt_unsigned).
>
>  register_type(reg_r, lt_word).
>  register_type(reg_f, lt_float).
> diff --git a/compiler/llds_out_data.m b/compiler/llds_out_data.m
> index f214136..bbcab36 100644
> --- a/compiler/llds_out_data.m
> +++ b/compiler/llds_out_data.m
> @@ -1024,6 +1024,8 @@ output_rval(Info, Rval, !IO) :-
>              ; Op = uint_bitwise_and, OpStr = "&"
>              ; Op = uint_bitwise_or, OpStr = "|"
>              ; Op = uint_bitwise_xor, OpStr = "^"
> +            ; Op = uint_unchecked_left_shift, OpStr = "<<"
> +            ; Op = uint_unchecked_right_shift, OpStr = ">>"
>              ),
>              io.write_string("(", !IO),
>              output_rval_as_type(Info, SubRvalA, lt_unsigned, !IO),
> diff --git a/compiler/ml_global_data.m b/compiler/ml_global_data.m
> index 0bd2825..3a2776b 100644
> --- a/compiler/ml_global_data.m
> +++ b/compiler/ml_global_data.m
> @@ -606,6 +606,8 @@ ml_specialize_generic_array_binop(Op, IsFloat) :-
>          ; Op = uint_bitwise_and
>          ; Op = uint_bitwise_or
>          ; Op = uint_bitwise_xor
> +        ; Op = uint_unchecked_left_shift
> +        ; Op = uint_unchecked_right_shift
>          ; Op = float_eq
>          ; Op = float_ne
>          ; Op = float_lt
> diff --git a/compiler/mlds_to_c.m b/compiler/mlds_to_c.m
> index 2bebf57..070027e 100644
> --- a/compiler/mlds_to_c.m
> +++ b/compiler/mlds_to_c.m
> @@ -4615,6 +4615,8 @@ mlds_output_binop(Opts, Op, X, Y, !IO) :-
>          ; Op = uint_bitwise_and, OpStr = "&"
>          ; Op = uint_bitwise_or, OpStr = "|"
>          ; Op = uint_bitwise_xor, OpStr = "^"
> +        ; Op = uint_unchecked_left_shift, OpStr = "<<"
> +        ; Op = uint_unchecked_right_shift, OpStr = ">>"
>          ),
>          io.write_string("(", !IO),
>          mlds_output_rval_as_op_arg(Opts, X, !IO),
> diff --git a/compiler/mlds_to_cs.m b/compiler/mlds_to_cs.m
> index 6ce2f7e..70b0aa0 100644
> --- a/compiler/mlds_to_cs.m
> +++ b/compiler/mlds_to_cs.m
> @@ -3797,6 +3797,8 @@ output_binop(Info, Op, X, Y, !IO) :-
>          ; Op = uint_bitwise_and
>          ; Op = uint_bitwise_or
>          ; Op = uint_bitwise_xor
> +        ; Op = uint_unchecked_left_shift
> +        ; Op = uint_unchecked_right_shift
>          ; Op = float_plus
>          ; Op = float_minus
>          ; Op = float_times
> @@ -3859,6 +3861,8 @@ output_binary_op(Op, !IO) :-
>          ; Op = uint_bitwise_and, OpStr = "&"
>          ; Op = uint_bitwise_or, OpStr = "|"
>          ; Op = uint_bitwise_xor, OpStr = "^"
> +        ; Op = uint_unchecked_left_shift, OpStr = "<<"
> +        ; Op = uint_unchecked_right_shift, OpStr = ">>"
>
>          ; Op = float_eq, OpStr = "=="
>          ; Op = float_ne, OpStr = "!="
> diff --git a/compiler/mlds_to_java.m b/compiler/mlds_to_java.m
> index d915d0f..6c674b3 100644
> --- a/compiler/mlds_to_java.m
> +++ b/compiler/mlds_to_java.m
> @@ -5205,6 +5205,8 @@ output_binop(Info, Op, X, Y, !IO) :-
>          ; Op = uint_bitwise_and
>          ; Op = uint_bitwise_or
>          ; Op = uint_bitwise_xor
> +        ; Op = uint_unchecked_left_shift
> +        ; Op = uint_unchecked_right_shift
>          ),
>          io.write_string("(", !IO),
>          output_rval(Info, X, !IO),
> @@ -5305,6 +5307,8 @@ output_binary_op(Op, !IO) :-
>          ; Op = uint_bitwise_and, OpStr = "&"
>          ; Op = uint_bitwise_or, OpStr = "|"
>          ; Op = uint_bitwise_xor, OpStr = "^"
> +        ; Op = uint_unchecked_left_shift, OpStr = "<<"
> +        ; Op = uint_unchecked_right_shift, OpStr = ">>>"
>
>          ; Op = float_eq, OpStr = "=="
>          ; Op = float_ne, OpStr = "!="
> diff --git a/compiler/opt_debug.m b/compiler/opt_debug.m
> index 1458e8a..40ee7ca 100644
> --- a/compiler/opt_debug.m
> +++ b/compiler/opt_debug.m
> @@ -870,6 +870,8 @@ dump_binop(uint_mod) = "uint%".
>  dump_binop(uint_bitwise_and) = "uint&".
>  dump_binop(uint_bitwise_or) = "uint|".
>  dump_binop(uint_bitwise_xor) = "uint^".
> +dump_binop(uint_unchecked_left_shift) = "uint_unchecked<<".
> +dump_binop(uint_unchecked_right_shift) = "uint_unchecked>>".
>  dump_binop(float_plus) = "fl+".
>  dump_binop(float_minus) = "fl-".
>  dump_binop(float_times) = "fl*".
> diff --git a/library/uint.m b/library/uint.m
> index 9d79531..5bce93f 100644
> --- a/library/uint.m
> +++ b/library/uint.m
> @@ -53,11 +53,17 @@
>
>      % Addition.
>      %
> -:- func (uint::in) + (uint::in) = (uint::uo) is det.
> +:- func uint + int = uint.
> +:- mode in   + in  = uo is det.
> +%:- mode uo   + in  = in is det.
> +%:- mode in   + uo  = in is det.
>
>      % Subtraction.
>      %
> -:- func (uint::in) - (uint::in) = (uint::uo) is det.
> +:- func uint - uint = uint.
> +:- mode in   - in   = uo is det.
> +%:- mode uo   - in   = in is det.
> +%:- mode in   - uo   = in is det.
>
>      % Multiplication.
>      %
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mercurylang.org/archives/reviews/attachments/20170412/82b3bdc8/attachment-0001.html>


More information about the reviews mailing list