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