@@ -356,17 +356,21 @@ let relop' (ty : Ty.t) (op : relop) (hte1 : t) (hte2 : t) : t =
356
356
[@@ inline]
357
357
358
358
let rec relop ty (op : relop ) (hte1 : t ) (hte2 : t ) : t =
359
- match (view hte1, view hte2) with
360
- | Val (App (`Op s1 , _ )), Val (App (`Op s2 , _ )) ->
361
- if String. equal s1 s2 then value (if op = Eq then True else False )
362
- else relop' ty op hte1 hte2
363
- | Val (App _ ), Val _ | Val _ , Val (App _ ) -> (
364
- match op with
365
- | Eq -> value False
366
- | Ne -> value True
367
- | _ -> relop' ty op hte1 hte2 )
368
- | Val v1 , Val v2 -> value (if Eval. relop ty op v1 v2 then True else False )
369
- | Ptr { base = b1 ; offset = os1 } , Ptr { base = b2 ; offset = os2 } -> (
359
+ match (op, view hte1, view hte2) with
360
+ | Eq , Val (App (`Op s1 , _ )), Val (App (`Op s2 , _ )) ->
361
+ if String. equal s1 s2 then value True else value False
362
+ | Ne , Val (App (`Op s1 , _ )), Val (App (`Op s2 , _ )) ->
363
+ if String. equal s1 s2 then value False else value True
364
+ | Eq , Val (App _ ), Val _ | Eq , Val _ , Val (App _ ) -> value False
365
+ | Ne , Val (App _ ), Val _ | Ne , Val _ , Val (App _ ) -> value True
366
+ | (Ne , Val (Real v), Symbol _ | Ne , Symbol _, Val (Real v))
367
+ when Float. is_nan v || Float. is_infinite v ->
368
+ value True
369
+ | (_, Val (Real v), Symbol _ | _, Symbol _, Val (Real v))
370
+ when Float. is_nan v || Float. is_infinite v ->
371
+ value False
372
+ | _ , Val v1 , Val v2 -> value (if Eval. relop ty op v1 v2 then True else False )
373
+ | _ , Ptr { base = b1 ; offset = os1 } , Ptr { base = b2 ; offset = os2 } -> (
370
374
match op with
371
375
| Eq -> if b1 = b2 then relop' ty Eq os1 os2 else value False
372
376
| Ne -> if b1 = b2 then relop' ty Ne os1 os2 else value True
@@ -377,13 +381,15 @@ let rec relop ty (op : relop) (hte1 : t) (hte2 : t) : t =
377
381
( if Eval. relop ty op (Num (I32 b1)) (Num (I32 b2)) then True
378
382
else False )
379
383
| _ -> relop' ty op hte1 hte2 )
380
- | Val (Num _ as n ), Ptr { base; offset = { node = Val (Num _ as o ); _ } } ->
384
+ | _, Val (Num _ as n), Ptr { base; offset = { node = Val (Num _ as o); _ } }
385
+ ->
381
386
let base = Eval. binop (Ty_bitv 32 ) Add (Num (I32 base)) o in
382
387
value (if Eval. relop ty op n base then True else False )
383
- | Ptr { base; offset = { node = Val (Num _ as o ); _ } } , Val (Num _ as n ) ->
388
+ | _, Ptr { base; offset = { node = Val (Num _ as o); _ } }, Val (Num _ as n)
389
+ ->
384
390
let base = Eval. binop (Ty_bitv 32 ) Add (Num (I32 base)) o in
385
391
value (if Eval. relop ty op base n then True else False )
386
- | _ -> relop' ty op hte1 hte2
392
+ | _ , _ , _ -> relop' ty op hte1 hte2
387
393
388
394
let cvtop' (ty : Ty.t ) (op : cvtop ) (hte : t ) : t = make (Cvtop (ty, op, hte))
389
395
[@@ inline]
0 commit comments