@@ -115,13 +115,6 @@ module Generate (Target : Target_sig.S) = struct
115115 ; " caml_erf_float" , (`Pure , [ Float ], Float )
116116 ; " caml_erfc_float" , (`Pure , [ Float ], Float )
117117 ; " caml_float_compare" , (`Pure , [ Float ; Float ], Int )
118- ; " caml_greaterthan" , (`Mutator , [ Value ; Value ], Int )
119- ; " caml_greaterequal" , (`Mutator , [ Value ; Value ], Int )
120- ; " caml_lessthan" , (`Mutator , [ Value ; Value ], Int )
121- ; " caml_lessequal" , (`Mutator , [ Value ; Value ], Int )
122- ; " caml_equal" , (`Mutator , [ Value ; Value ], Int )
123- ; " caml_notequal" , (`Mutator , [ Value ; Value ], Int )
124- ; " caml_compare" , (`Mutator , [ Value ; Value ], Int )
125118 ];
126119 h
127120
@@ -290,6 +283,39 @@ module Generate (Target : Target_sig.S) = struct
290283 (transl_prim_arg ctx ?typ:tz z )
291284 | _ -> invalid_arity name l ~expected: 3 )
292285
286+ let register_comparison name cmp_int cmp_boxed_int cmp_float =
287+ register_prim name `Mutator (fun ctx _ l ->
288+ match l with
289+ | [ x; y ] -> (
290+ match get_type ctx x, get_type ctx y with
291+ | Int _ , Int _ -> cmp_int ctx x y
292+ | Number (Int32, _ ), Number (Int32, _ ) ->
293+ let x = transl_prim_arg ctx ~typ: (Number (Int32 , Unboxed )) x in
294+ let y = transl_prim_arg ctx ~typ: (Number (Int32 , Unboxed )) y in
295+ int32_bin_op cmp_boxed_int x y
296+ | Number (Nativeint, _ ), Number (Nativeint, _ ) ->
297+ let x = transl_prim_arg ctx ~typ: (Number (Nativeint , Unboxed )) x in
298+ let y = transl_prim_arg ctx ~typ: (Number (Nativeint , Unboxed )) y in
299+ nativeint_bin_op cmp_boxed_int x y
300+ | Number (Int64, _ ), Number (Int64, _ ) ->
301+ let x = transl_prim_arg ctx ~typ: (Number (Int64 , Unboxed )) x in
302+ let y = transl_prim_arg ctx ~typ: (Number (Int64 , Unboxed )) y in
303+ int64_bin_op cmp_boxed_int x y
304+ | Number (Float, _ ), Number (Float, _ ) ->
305+ let x = transl_prim_arg ctx ~typ: (Number (Float , Unboxed )) x in
306+ let y = transl_prim_arg ctx ~typ: (Number (Float , Unboxed )) y in
307+ float_bin_op cmp_float x y
308+ | _ ->
309+ let * f =
310+ register_import
311+ ~name
312+ (Fun { W. params = [ Type. value; Type. value ]; result = [ I32 ] })
313+ in
314+ let * x = transl_prim_arg ctx x in
315+ let * y = transl_prim_arg ctx y in
316+ return (W. Call (f, [ x; y ])))
317+ | _ -> invalid_arity name l ~expected: 2 )
318+
293319 let () =
294320 register_bin_prim
295321 " caml_floatarray_unsafe_get"
@@ -1092,7 +1118,83 @@ module Generate (Target : Target_sig.S) = struct
10921118 ~ty: (Int Normalized )
10931119 (fun i j -> Arith. ((j < i) - (i < j)));
10941120 register_prim " %js_array" `Pure (fun ctx _ l ->
1095- Memory. allocate ~tag: 0 (expression_list (fun x -> transl_prim_arg ctx x) l))
1121+ Memory. allocate ~tag: 0 (expression_list (fun x -> transl_prim_arg ctx x) l));
1122+ register_comparison
1123+ " caml_greaterthan"
1124+ (fun ctx x y -> translate_int_comparison ctx (fun y x -> Arith. (x < y)) x y)
1125+ (Gt S )
1126+ Gt ;
1127+ register_comparison
1128+ " caml_greaterequal"
1129+ (fun ctx x y -> translate_int_comparison ctx (fun y x -> Arith. (x < = y)) x y)
1130+ (Ge S )
1131+ Ge ;
1132+ register_comparison
1133+ " caml_lessthan"
1134+ (fun ctx x y -> translate_int_comparison ctx Arith. ( < ) x y)
1135+ (Lt S )
1136+ Lt ;
1137+ register_comparison
1138+ " caml_lessequal"
1139+ (fun ctx x y -> translate_int_comparison ctx Arith. ( < = ) x y)
1140+ (Le S )
1141+ Le ;
1142+ register_comparison
1143+ " caml_equal"
1144+ (fun ctx x y -> translate_int_equality ctx ~negate: false x y)
1145+ Eq
1146+ Eq ;
1147+ register_comparison
1148+ " caml_notequal"
1149+ (fun ctx x y -> translate_int_equality ctx ~negate: true x y)
1150+ Ne
1151+ Ne ;
1152+ register_prim " caml_compare" `Mutator (fun ctx _ l ->
1153+ match l with
1154+ | [ x; y ] -> (
1155+ match get_type ctx x, get_type ctx y with
1156+ | Int _ , Int _ ->
1157+ let x' = transl_prim_arg ctx ~typ: (Int Normalized ) x in
1158+ let y' = transl_prim_arg ctx ~typ: (Int Normalized ) y in
1159+ Arith. ((y' < x') - (x' < y'))
1160+ | Number (Int32 , _), Number (Int32 , _)
1161+ | Number (Nativeint, _ ), Number (Nativeint, _ ) ->
1162+ let * f =
1163+ register_import
1164+ ~name: " caml_int32_compare"
1165+ (Fun { W. params = [ I32 ; I32 ]; result = [ I32 ] })
1166+ in
1167+ let * x' = transl_prim_arg ctx ~typ: (Number (Int32 , Unboxed )) x in
1168+ let * y' = transl_prim_arg ctx ~typ: (Number (Int32 , Unboxed )) y in
1169+ return (W. Call (f, [ x'; y' ]))
1170+ | Number (Int64, _ ), Number (Int64, _ ) ->
1171+ let * f =
1172+ register_import
1173+ ~name: " caml_int64_compare"
1174+ (Fun { W. params = [ I64 ; I64 ]; result = [ I32 ] })
1175+ in
1176+ let * x' = transl_prim_arg ctx ~typ: (Number (Int64 , Unboxed )) x in
1177+ let * y' = transl_prim_arg ctx ~typ: (Number (Int64 , Unboxed )) y in
1178+ return (W. Call (f, [ x'; y' ]))
1179+ | Number (Float, _ ), Number (Float, _ ) ->
1180+ let * f =
1181+ register_import
1182+ ~name: " caml_float_compare"
1183+ (Fun { W. params = [ F64 ; F64 ]; result = [ I32 ] })
1184+ in
1185+ let * x' = transl_prim_arg ctx ~typ: (Number (Float , Unboxed )) x in
1186+ let * y' = transl_prim_arg ctx ~typ: (Number (Float , Unboxed )) y in
1187+ return (W. Call (f, [ x'; y' ]))
1188+ | _ ->
1189+ let * f =
1190+ register_import
1191+ ~name: " caml_compare"
1192+ (Fun { W. params = [ Type. value; Type. value ]; result = [ I32 ] })
1193+ in
1194+ let * x' = transl_prim_arg ctx x in
1195+ let * y' = transl_prim_arg ctx y in
1196+ return (W. Call (f, [ x'; y' ])))
1197+ | _ -> invalid_arity " caml_compare" l ~expected: 2 )
10961198
10971199 let unboxed_type ty : W.value_type option =
10981200 match ty with
0 commit comments