@@ -916,7 +916,7 @@ let to_uint32 ?comment (e : J.expression) : J.expression =
916
916
we can apply a more general optimization here,
917
917
do some algebraic rewerite rules to rewrite [triple_equal]
918
918
*)
919
- let is_out ?comment (e : t ) (range : t ) : t =
919
+ let rec is_out ?comment (e : t ) (range : t ) : t =
920
920
begin match range.expression_desc, e.expression_desc with
921
921
922
922
| Number (Int {i = 1l }), Var _
@@ -925,8 +925,8 @@ let is_out ?comment (e : t) (range : t) : t =
925
925
| Number (Int {i = 1l }),
926
926
(
927
927
Bin (Plus , {expression_desc = Number (Int {i ; _}) }, {expression_desc = Var _; _})
928
- | Bin (Plus , {expression_desc = Var _; _}, {expression_desc = Number (Int {i ; _}) })
929
- )
928
+ | Bin (Plus , {expression_desc = Var _; _}, {expression_desc = Number (Int {i ; _}) }))
929
+
930
930
->
931
931
not (or_ (triple_equal e (int (Int32. neg i ))) (triple_equal e (int (Int32. sub Int32. one i))))
932
932
| Number (Int {i = 1l }),
@@ -946,6 +946,16 @@ let is_out ?comment (e : t) (range : t) : t =
946
946
*)
947
947
or_ (int_comp Cgt e (int ( k))) (int_comp Clt e zero_int_literal)
948
948
949
+ | _, Bin (Bor ,
950
+ ({expression_desc =
951
+ (Bin ((Plus | Minus ) ,
952
+ {expression_desc = Number (Int {i ; _}) }, {expression_desc = Var _; _})
953
+ | Bin ((Plus | Minus ) ,
954
+ {expression_desc = Var _; _}, {expression_desc = Number (Int {i ; _}) } ))
955
+ } as e), {expression_desc = Number (Int {i= 0l } | Uint 0l | Nint 0n ); _})
956
+ ->
957
+ (* TODO: check correctness *)
958
+ is_out ?comment e range
949
959
| _ , _ ->
950
960
int_comp ?comment Cgt (to_uint32 e) range
951
961
end
@@ -1004,9 +1014,6 @@ let int32_minus ?comment e1 e2 : J.expression =
1004
1014
let unchecked_int32_minus ?comment e1 e2 : J.expression =
1005
1015
float_minus ?comment e1 e2
1006
1016
1007
- let unchecked_prefix_inc ?comment (i : J.vident ) =
1008
- let v : t = {expression_desc = Var i; comment = None } in
1009
- assign ?comment v (unchecked_int32_add v one_int_literal)
1010
1017
1011
1018
1012
1019
let float_div ?comment e1 e2 =
@@ -1034,22 +1041,6 @@ let int32_div ?comment (e1 : J.expression) (e2 : J.expression)
1034
1041
to_int32 (float_div ?comment e1 e2)
1035
1042
1036
1043
1037
- (* TODO: call primitive *)
1038
- let int32_mul ?comment
1039
- (e1 : J.expression )
1040
- (e2 : J.expression ) : J.expression =
1041
- match e1.expression_desc, e2.expression_desc with
1042
- | Number (Int {i = i0}), Number (Int {i = i1})
1043
- -> int (Int32. mul i0 i1)
1044
- | _ ->
1045
- { comment ;
1046
- expression_desc = Bin (Mul , e1,e2)
1047
- }
1048
-
1049
- let unchecked_int32_mul ?comment e1 e2 : J.expression =
1050
- { comment ;
1051
- expression_desc = Bin (Mul , e1,e2)
1052
- }
1053
1044
1054
1045
let float_mul ?comment e1 e2 =
1055
1046
bin ?comment Mul e1 e2
@@ -1068,6 +1059,32 @@ let int32_lsl ?comment e1 e2 : J.expression =
1068
1059
}
1069
1060
1070
1061
1062
+ let int32_mul ?comment
1063
+ (e1 : J.expression )
1064
+ (e2 : J.expression ) : J.expression =
1065
+ match e1, e2 with
1066
+ | {expression_desc = Number (Int {i = 0l }| Uint 0l | Nint 0n ); _}, x
1067
+ | x, {expression_desc = Number (Int {i = 0l }| Uint 0l | Nint 0n ); _}
1068
+ when Js_analyzer. no_side_effect_expression x
1069
+ -> zero_int_literal
1070
+ | {expression_desc = Number (Int {i = i0}); _}, {expression_desc = Number (Int {i = i1}); _}
1071
+ -> int (Int32. mul i0 i1)
1072
+ | e , {expression_desc = Number (Int {i = i0} | Uint i0 ); _}
1073
+ | {expression_desc = Number (Int {i = i0} | Uint i0 ); _}, e
1074
+ ->
1075
+ let i = Ext_pervasives. is_pos_pow i0 in
1076
+ if i > = 0 then
1077
+ int32_lsl e (small_int i)
1078
+ else
1079
+ runtime_call ?comment Js_config. prim " imul" [e1;e2]
1080
+ | _ ->
1081
+ runtime_call ?comment Js_config. prim " imul" [e1;e2]
1082
+
1083
+ let unchecked_int32_mul ?comment e1 e2 : J.expression =
1084
+ { comment ;
1085
+ expression_desc = Bin (Mul , e1,e2)
1086
+ }
1087
+
1071
1088
1072
1089
1073
1090
let rec int32_bxor ?comment (e1 : t ) (e2 : t ) : J.expression =
0 commit comments