let data_unop kr unop ka ga =
    match unop with
      | Neg ->
          begin
            match kr with
              | (Kint  | Kcint _)  ->
                  data_of_integer (F.e_ineg (integer_of_data ka ga))
              | Kreal -> data_of_real (F.e_rneg (real_of_data ka ga))
              | _ -> WpLog.fatal
                  "wrong type of parameter for negation operator"
          end
      | LNot ->
          let b =
            match kr with
              |(Kint | Kcint _)->
                 F.e_icmp Ceq (integer_of_data ka ga) (F.e_icst "0")
              |Kreal -> F.e_rcmp Ceq (real_of_data ka ga) (F.e_rcst "0.0")
              |Kptr ty ->
                 let obj = object_of ty in
                 M.is_null (loc_of_data obj ga)
              | Kbool ->
                  F.e_not (boolean_of_data ga)
              | k -> WpLog.fatal
                  "%a : wrong type of parameter for logic not operator" pp_kind k
          in data_of_boolean b
      | BNot ->
          begin
            match kr with
             | (Kint  | Kcint _) ->
                 data_of_integer (F.e_bnot (integer_of_data ka ga))
             | _ -> WpLog.fatal
                 "wrong type of parameter for bitwise not operator"
          end