Skip to content

Commit 0a31176

Browse files
committed
Added function implementations for integers in Core.Num
1 parent ce32e26 commit 0a31176

File tree

2 files changed

+44
-17
lines changed

2 files changed

+44
-17
lines changed

hax-lib/proof-libs/fstar/core/Core.Num.fsti

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,29 @@ let impl_i64__BITS: u32 = mk_int 64
3838
let impl_i128__BITS: u32 = mk_int 128
3939

4040

41+
42+
let impl_u8__wrapping_add: u8 -> u8 -> u8 = add_mod
43+
let impl_u16__wrapping_add: u16 -> u16 -> u16 = add_mod
44+
let impl_u32__wrapping_add: u32 -> u32 -> u32 = add_mod
45+
let impl_u64__wrapping_add: u64 -> u64 -> u64 = add_mod
46+
let impl_u128__wrapping_add: u128 -> u128 -> u128 = add_mod
47+
let impl_i8__wrapping_add: i8 -> i8 -> i8 = add_mod
48+
let impl_i16__wrapping_add: i16 -> i16 -> i16 = add_mod
49+
let impl_i32__wrapping_add: i32 -> i32 -> i32 = add_mod
50+
let impl_i64__wrapping_add: i64 -> i64 -> i64 = add_mod
51+
let impl_i128__wrapping_add: i128 -> i128 -> i128 = add_mod
52+
53+
let impl_u8__wrapping_sub: u8 -> u8 -> u8 = sub_mod
54+
let impl_u16__wrapping_sub: u16 -> u16 -> u16 = sub_mod
55+
let impl_u32__wrapping_sub: u32 -> u32 -> u32 = sub_mod
56+
let impl_u64__wrapping_sub: u64 -> u64 -> u64 = sub_mod
57+
let impl_u128__wrapping_sub: u128 -> u128 -> u128 = sub_mod
58+
let impl_i8__wrapping_sub: i8 -> i8 -> i8 = sub_mod
59+
let impl_i16__wrapping_sub: i16 -> i16 -> i16 = sub_mod
60+
let impl_i32__wrapping_sub: i32 -> i32 -> i32 = sub_mod
61+
let impl_i64__wrapping_sub: i64 -> i64 -> i64 = sub_mod
62+
let impl_i128__wrapping_sub: i128 -> i128 -> i128 = sub_mod
63+
4164
let impl_u8__rem_euclid (x: u8) (y: u8 {v y <> 0}): u8 = x %! y
4265
let impl_u16__rem_euclid (x: u16) (y: u16 {v y <> 0}): u16 = x %! y
4366
let impl_u32__rem_euclid (x: u32) (y: u32 {v y <> 0}): u32 = x %! y
@@ -51,23 +74,31 @@ let impl_i64__rem_euclid (x: i64) (y: i64 {v y <> 0}): i64 = x %! y
5174
let impl_i128__rem_euclid (x: i128) (y: i128 {v y <> 0}): i128 = x %! y
5275
let impl_isize__rem_euclid (x: isize) (y: isize {v y <> 0}): isize = x %! y
5376

54-
let impl_u8__wrapping_add: u8 -> u8 -> u8 = add_mod
55-
let impl_u8__wrapping_sub: u8 -> u8 -> u8 = sub_mod
56-
let impl_u16__wrapping_add: u16 -> u16 -> u16 = add_mod
77+
78+
79+
let impl_u8__overflowing_mul: u8 -> u8 -> u8 * bool = mul_overflow
80+
let impl_u16__overflowing_mul: u16 -> u16 -> u16 * bool = mul_overflow
81+
let impl_u32__overflowing_mul: u32 -> u32 -> u32 * bool = mul_overflow
82+
let impl_u64__overflowing_mul: u64 -> u64 -> u64 * bool = mul_overflow
83+
let impl_u128__overflowing_mul: u128 -> u128 -> u128 * bool = mul_overflow
84+
let impl_i8__overflowing_mul: i8 -> i8 -> i8 * bool = mul_overflow
85+
let impl_i16__overflowing_mul: i16 -> i16 -> i16 * bool = mul_overflow
86+
let impl_i32__overflowing_mul: i32 -> i32 -> i32 * bool = mul_overflow
87+
let impl_i64__overflowing_mul: i64 -> i64 -> i64 * bool = mul_overflow
88+
let impl_i128__overflowing_mul: i128 -> i128 -> i128 * bool = mul_overflow
89+
5790
val impl_u16__to_be_bytes: u16 -> t_Array u8 (sz 2)
5891
val impl_u16__from_be_bytes: t_Array u8 (sz 2) -> u16
5992

60-
let impl_i32__wrapping_add: i32 -> i32 -> i32 = add_mod
61-
let impl_i32__wrapping_sub: i32 -> i32 -> i32 = sub_mod
93+
94+
6295
let impl_i32__abs (a:i32{minint i32_inttype < v a}) : i32 = abs_int a
63-
val impl_i32__overflowing_mul: i32 -> i32 -> i32 * bool
6496

65-
let impl_i16__wrapping_add: i16 -> i16 -> i16 = add_mod
66-
let impl_i16__wrapping_sub: i16 -> i16 -> i16 = sub_mod
97+
98+
6799
let impl_i16__wrapping_mul: i16 -> i16 -> i16 = mul_mod
68-
val impl_i16__overflowing_mul: i16 -> i16 -> i16 * bool
69100

70-
let impl_u32__wrapping_add: u32 -> u32 -> u32 = add_mod
101+
71102
val impl_u32__rotate_left: u32 -> u32 -> u32
72103
val impl_u32__from_le_bytes: t_Array u8 (sz 4) -> u32
73104
val impl_u32__from_be_bytes: t_Array u8 (sz 4) -> u32
@@ -76,7 +107,6 @@ val impl_u32__to_be_bytes: u32 -> t_Array u8 (sz 4)
76107
val impl_u32__rotate_right: u32 -> u32 -> u32
77108

78109

79-
let impl_u64__wrapping_add: u64 -> u64 -> u64 = add_mod
80110
val impl_u64__rotate_left: u32 -> u32 -> u32
81111
val impl_u64__from_le_bytes: t_Array u8 (sz 8) -> u64
82112
val impl_u64__from_be_bytes: t_Array u8 (sz 8) -> u64
@@ -89,12 +119,8 @@ let impl_u64__overflowing_sub (x y: u64): u64 * bool
89119
let out = if borrow then pow2 64 + sub else sub in
90120
(mk_u64 out, borrow)
91121

92-
let impl_i64__wrapping_add: i64 -> i64 -> i64 = add_mod
93-
let impl_i64__wrapping_sub: i64 -> i64 -> i64 = sub_mod
94122
let impl_i64__wrapping_mul: i64 -> i64 -> i64 = mul_mod
95123

96-
let impl_u128__wrapping_add: u128 -> u128 -> u128 = add_mod
97-
let impl_u128__wrapping_sub: u128 -> u128 -> u128 = sub_mod
98124
val impl_u128__rotate_left: u128 -> u128 -> u128
99125
val impl_u128__from_le_bytes: t_Array u8 (sz 16) -> u128
100126
val impl_u128__from_be_bytes: t_Array u8 (sz 16) -> u128
@@ -110,8 +136,6 @@ val impl_u128__pow: u128 -> u32 -> u128
110136
val impl_i16__pow (base: i16) (exponent: u32): result: i16 {v base == 2 /\ v exponent < 15 ==> (Math.Lemmas.pow2_lt_compat 15 (v exponent); result == mk_i16 (pow2 (v exponent)))}
111137
val impl_i32__pow (base: i32) (exponent: u32): result: i32 {v base == 2 /\ v exponent <= 16 ==> result == mk_i32 (pow2 (v exponent))}
112138

113-
let impl_i128__wrapping_add: i128 -> i128 -> i128 = add_mod
114-
let impl_i128__wrapping_sub: i128 -> i128 -> i128 = sub_mod
115139

116140
val impl_u8__count_ones: u8 -> r:u32{v r <= 8}
117141
val impl_i32__count_ones: i32 -> r:u32{v r <= 32}

hax-lib/proof-libs/fstar/rust_primitives/Rust_primitives.Integers.fsti

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,9 @@ let mul_mod (#t:inttype) (a:int_t t)
197197
(b:int_t t) =
198198
mk_int #t (v a * v b @%. t)
199199

200+
let mul_overflow (#t:inttype) (a:int_t t)
201+
(b:int_t t) =
202+
(mk_int #t (v a * v b @%. t), (v a * v b > maxint t || v a * v b < maxint t))
200203
let mul (#t:inttype) (a:int_t t)
201204
(b:int_t t{range (v a * v b) t}) =
202205
mk_int #t (v a * v b)

0 commit comments

Comments
 (0)