let prop_cmp mem cmpop t1 e1 t2 e2 =
let ct1 = Ctypes.object_of t1 in
let ct2 = Ctypes.object_of t2 in
match ct1,ct2 with
| C_pointer _,C_pointer _ ->
(prop_cmp_ptr mem cmpop e1 e2)
| _ ->
let ctr = Ctypes.promote ct1 ct2 in
begin
match ctr , ct1 , ct2 with
| C_int ir , C_int i1 , C_int i2 ->
let t1 = expr_int mem i1 ir e1 in
let t2 = expr_int mem i2 ir e2 in
prop_icmp cmpop t1 t2
| C_float fr, C_float f1, C_float f2 ->
let t1 = expr_float mem f1 fr e1 in
let t2 = expr_float mem f2 fr e2 in
prop_rcmp cmpop t1 t2
| _ -> WpLog.fatal "[prop_cmp] non arithmetic relation"
end