let pred_cmp binop ka ga kb gb =
match ka,kb with
| (Kint | Kcint _) , (Kint | Kcint _) ->
pint_cmp binop (integer_of_data ka ga) (integer_of_data kb gb)
| (Kreal|Kint| Kcint _) , (Kreal|Kint| Kcint _) ->
preal_cmp binop (real_of_data ka ga) (real_of_data kb gb)
| Kptr _ty , Kptr _ ->
ptr_rel binop
(F.unwrap (term_of_data ga))
(F.unwrap (term_of_data gb))
| Kstruct s, Kstruct s' when (s.Cil_types.ckey=s'.Cil_types.ckey) ->
D.eq_record s (record_of_data ga) (record_of_data gb)
| Karray arr, Karray arr' when Ctypes.AinfoComparable.equal arr arr' ->
D.eq_array arr (array_of_data ga) (array_of_data gb)
| _ ->
begin
match binop with
| Eq -> F.p_eq (term_of_data ga) (term_of_data gb)
| Ne -> F.p_not (F.p_eq (term_of_data ga) (term_of_data gb))
| _ -> WpLog.fatal ~current:true "Unexpected comparison"
end