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 _ ->
let obj = object_of ty in
ptr_rel binop (loc_of_data obj ga) (loc_of_data obj gb)
| Kstruct s, Kstruct s' when (s.Cil_types.ckey=s'.Cil_types.ckey) ->
M.eq_record s (record_of_data ga) (record_of_data gb)
| Karray arr, Karray arr' when Ctypes.AinfoComparable.equal arr arr' ->
M.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