blob: 1060515d927aa568c59a4f4f4c23177b78cbd5f5 [file] [log] [blame]
Tom Rini0344c602024-10-08 13:56:50 -06001/* Copyright (c) INRIA and Microsoft Corporation. All rights reserved.
2 Licensed under the Apache 2.0 License. */
3
4/* This file was generated by KreMLin <https://github.com/FStarLang/kremlin>
5 * KreMLin invocation: ../krml -fc89 -fparentheses -fno-shadow -header /mnt/e/everest/verify/hdrB9w -minimal -fparentheses -fcurly-braces -fno-shadow -header copyright-header.txt -minimal -tmpdir extracted -warn-error +9+11 -skip-compilation -extract-uints -add-include <inttypes.h> -add-include "kremlib.h" -add-include "kremlin/internal/compat.h" extracted/prims.krml extracted/FStar_Pervasives_Native.krml extracted/FStar_Pervasives.krml extracted/FStar_Mul.krml extracted/FStar_Squash.krml extracted/FStar_Classical.krml extracted/FStar_StrongExcludedMiddle.krml extracted/FStar_FunctionalExtensionality.krml extracted/FStar_List_Tot_Base.krml extracted/FStar_List_Tot_Properties.krml extracted/FStar_List_Tot.krml extracted/FStar_Seq_Base.krml extracted/FStar_Seq_Properties.krml extracted/FStar_Seq.krml extracted/FStar_Math_Lib.krml extracted/FStar_Math_Lemmas.krml extracted/FStar_BitVector.krml extracted/FStar_UInt.krml extracted/FStar_UInt32.krml extracted/FStar_Int.krml extracted/FStar_Int16.krml extracted/FStar_Preorder.krml extracted/FStar_Ghost.krml extracted/FStar_ErasedLogic.krml extracted/FStar_UInt64.krml extracted/FStar_Set.krml extracted/FStar_PropositionalExtensionality.krml extracted/FStar_PredicateExtensionality.krml extracted/FStar_TSet.krml extracted/FStar_Monotonic_Heap.krml extracted/FStar_Heap.krml extracted/FStar_Map.krml extracted/FStar_Monotonic_HyperHeap.krml extracted/FStar_Monotonic_HyperStack.krml extracted/FStar_HyperStack.krml extracted/FStar_Monotonic_Witnessed.krml extracted/FStar_HyperStack_ST.krml extracted/FStar_HyperStack_All.krml extracted/FStar_Date.krml extracted/FStar_Universe.krml extracted/FStar_GSet.krml extracted/FStar_ModifiesGen.krml extracted/LowStar_Monotonic_Buffer.krml extracted/LowStar_Buffer.krml extracted/Spec_Loops.krml extracted/LowStar_BufferOps.krml extracted/C_Loops.krml extracted/FStar_UInt8.krml extracted/FStar_Kremlin_Endianness.krml extracted/FStar_UInt63.krml extracted/FStar_Exn.krml extracted/FStar_ST.krml extracted/FStar_All.krml extracted/FStar_Dyn.krml extracted/FStar_Int63.krml extracted/FStar_Int64.krml extracted/FStar_Int32.krml extracted/FStar_Int8.krml extracted/FStar_UInt16.krml extracted/FStar_Int_Cast.krml extracted/FStar_UInt128.krml extracted/C_Endianness.krml extracted/FStar_List.krml extracted/FStar_Float.krml extracted/FStar_IO.krml extracted/C.krml extracted/FStar_Char.krml extracted/FStar_String.krml extracted/LowStar_Modifies.krml extracted/C_String.krml extracted/FStar_Bytes.krml extracted/FStar_HyperStack_IO.krml extracted/C_Failure.krml extracted/TestLib.krml extracted/FStar_Int_Cast_Full.krml
6 * F* version: 059db0c8
7 * KreMLin version: 916c37ac
8 */
9
10
11#include "FStar_UInt128.h"
12#include "kremlin/c_endianness.h"
13#include "FStar_UInt64_FStar_UInt32_FStar_UInt16_FStar_UInt8.h"
14
15uint64_t FStar_UInt128___proj__Mkuint128__item__low(FStar_UInt128_uint128 projectee)
16{
17 return projectee.low;
18}
19
20uint64_t FStar_UInt128___proj__Mkuint128__item__high(FStar_UInt128_uint128 projectee)
21{
22 return projectee.high;
23}
24
25static uint64_t FStar_UInt128_constant_time_carry(uint64_t a, uint64_t b)
26{
27 return (a ^ ((a ^ b) | ((a - b) ^ b))) >> (uint32_t)63U;
28}
29
30static uint64_t FStar_UInt128_carry(uint64_t a, uint64_t b)
31{
32 return FStar_UInt128_constant_time_carry(a, b);
33}
34
35FStar_UInt128_uint128 FStar_UInt128_add(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)
36{
37 FStar_UInt128_uint128
38 flat = { a.low + b.low, a.high + b.high + FStar_UInt128_carry(a.low + b.low, b.low) };
39 return flat;
40}
41
42FStar_UInt128_uint128
43FStar_UInt128_add_underspec(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)
44{
45 FStar_UInt128_uint128
46 flat = { a.low + b.low, a.high + b.high + FStar_UInt128_carry(a.low + b.low, b.low) };
47 return flat;
48}
49
50FStar_UInt128_uint128 FStar_UInt128_add_mod(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)
51{
52 FStar_UInt128_uint128
53 flat = { a.low + b.low, a.high + b.high + FStar_UInt128_carry(a.low + b.low, b.low) };
54 return flat;
55}
56
57FStar_UInt128_uint128 FStar_UInt128_sub(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)
58{
59 FStar_UInt128_uint128
60 flat = { a.low - b.low, a.high - b.high - FStar_UInt128_carry(a.low, a.low - b.low) };
61 return flat;
62}
63
64FStar_UInt128_uint128
65FStar_UInt128_sub_underspec(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)
66{
67 FStar_UInt128_uint128
68 flat = { a.low - b.low, a.high - b.high - FStar_UInt128_carry(a.low, a.low - b.low) };
69 return flat;
70}
71
72static FStar_UInt128_uint128
73FStar_UInt128_sub_mod_impl(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)
74{
75 FStar_UInt128_uint128
76 flat = { a.low - b.low, a.high - b.high - FStar_UInt128_carry(a.low, a.low - b.low) };
77 return flat;
78}
79
80FStar_UInt128_uint128 FStar_UInt128_sub_mod(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)
81{
82 return FStar_UInt128_sub_mod_impl(a, b);
83}
84
85FStar_UInt128_uint128 FStar_UInt128_logand(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)
86{
87 FStar_UInt128_uint128 flat = { a.low & b.low, a.high & b.high };
88 return flat;
89}
90
91FStar_UInt128_uint128 FStar_UInt128_logxor(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)
92{
93 FStar_UInt128_uint128 flat = { a.low ^ b.low, a.high ^ b.high };
94 return flat;
95}
96
97FStar_UInt128_uint128 FStar_UInt128_logor(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)
98{
99 FStar_UInt128_uint128 flat = { a.low | b.low, a.high | b.high };
100 return flat;
101}
102
103FStar_UInt128_uint128 FStar_UInt128_lognot(FStar_UInt128_uint128 a)
104{
105 FStar_UInt128_uint128 flat = { ~a.low, ~a.high };
106 return flat;
107}
108
109static uint32_t FStar_UInt128_u32_64 = (uint32_t)64U;
110
111static uint64_t FStar_UInt128_add_u64_shift_left(uint64_t hi, uint64_t lo, uint32_t s)
112{
113 return (hi << s) + (lo >> (FStar_UInt128_u32_64 - s));
114}
115
116static uint64_t FStar_UInt128_add_u64_shift_left_respec(uint64_t hi, uint64_t lo, uint32_t s)
117{
118 return FStar_UInt128_add_u64_shift_left(hi, lo, s);
119}
120
121static FStar_UInt128_uint128
122FStar_UInt128_shift_left_small(FStar_UInt128_uint128 a, uint32_t s)
123{
124 if (s == (uint32_t)0U)
125 {
126 return a;
127 }
128 else
129 {
130 FStar_UInt128_uint128
131 flat = { a.low << s, FStar_UInt128_add_u64_shift_left_respec(a.high, a.low, s) };
132 return flat;
133 }
134}
135
136static FStar_UInt128_uint128
137FStar_UInt128_shift_left_large(FStar_UInt128_uint128 a, uint32_t s)
138{
139 FStar_UInt128_uint128 flat = { (uint64_t)0U, a.low << (s - FStar_UInt128_u32_64) };
140 return flat;
141}
142
143FStar_UInt128_uint128 FStar_UInt128_shift_left(FStar_UInt128_uint128 a, uint32_t s)
144{
145 if (s < FStar_UInt128_u32_64)
146 {
147 return FStar_UInt128_shift_left_small(a, s);
148 }
149 else
150 {
151 return FStar_UInt128_shift_left_large(a, s);
152 }
153}
154
155static uint64_t FStar_UInt128_add_u64_shift_right(uint64_t hi, uint64_t lo, uint32_t s)
156{
157 return (lo >> s) + (hi << (FStar_UInt128_u32_64 - s));
158}
159
160static uint64_t FStar_UInt128_add_u64_shift_right_respec(uint64_t hi, uint64_t lo, uint32_t s)
161{
162 return FStar_UInt128_add_u64_shift_right(hi, lo, s);
163}
164
165static FStar_UInt128_uint128
166FStar_UInt128_shift_right_small(FStar_UInt128_uint128 a, uint32_t s)
167{
168 if (s == (uint32_t)0U)
169 {
170 return a;
171 }
172 else
173 {
174 FStar_UInt128_uint128
175 flat = { FStar_UInt128_add_u64_shift_right_respec(a.high, a.low, s), a.high >> s };
176 return flat;
177 }
178}
179
180static FStar_UInt128_uint128
181FStar_UInt128_shift_right_large(FStar_UInt128_uint128 a, uint32_t s)
182{
183 FStar_UInt128_uint128 flat = { a.high >> (s - FStar_UInt128_u32_64), (uint64_t)0U };
184 return flat;
185}
186
187FStar_UInt128_uint128 FStar_UInt128_shift_right(FStar_UInt128_uint128 a, uint32_t s)
188{
189 if (s < FStar_UInt128_u32_64)
190 {
191 return FStar_UInt128_shift_right_small(a, s);
192 }
193 else
194 {
195 return FStar_UInt128_shift_right_large(a, s);
196 }
197}
198
199bool FStar_UInt128_eq(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)
200{
201 return a.low == b.low && a.high == b.high;
202}
203
204bool FStar_UInt128_gt(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)
205{
206 return a.high > b.high || (a.high == b.high && a.low > b.low);
207}
208
209bool FStar_UInt128_lt(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)
210{
211 return a.high < b.high || (a.high == b.high && a.low < b.low);
212}
213
214bool FStar_UInt128_gte(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)
215{
216 return a.high > b.high || (a.high == b.high && a.low >= b.low);
217}
218
219bool FStar_UInt128_lte(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)
220{
221 return a.high < b.high || (a.high == b.high && a.low <= b.low);
222}
223
224FStar_UInt128_uint128 FStar_UInt128_eq_mask(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)
225{
226 FStar_UInt128_uint128
227 flat =
228 {
229 FStar_UInt64_eq_mask(a.low,
230 b.low)
231 & FStar_UInt64_eq_mask(a.high, b.high),
232 FStar_UInt64_eq_mask(a.low,
233 b.low)
234 & FStar_UInt64_eq_mask(a.high, b.high)
235 };
236 return flat;
237}
238
239FStar_UInt128_uint128 FStar_UInt128_gte_mask(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)
240{
241 FStar_UInt128_uint128
242 flat =
243 {
244 (FStar_UInt64_gte_mask(a.high, b.high) & ~FStar_UInt64_eq_mask(a.high, b.high))
245 | (FStar_UInt64_eq_mask(a.high, b.high) & FStar_UInt64_gte_mask(a.low, b.low)),
246 (FStar_UInt64_gte_mask(a.high, b.high) & ~FStar_UInt64_eq_mask(a.high, b.high))
247 | (FStar_UInt64_eq_mask(a.high, b.high) & FStar_UInt64_gte_mask(a.low, b.low))
248 };
249 return flat;
250}
251
252FStar_UInt128_uint128 FStar_UInt128_uint64_to_uint128(uint64_t a)
253{
254 FStar_UInt128_uint128 flat = { a, (uint64_t)0U };
255 return flat;
256}
257
258uint64_t FStar_UInt128_uint128_to_uint64(FStar_UInt128_uint128 a)
259{
260 return a.low;
261}
262
263FStar_UInt128_uint128
264(*FStar_UInt128_op_Plus_Hat)(FStar_UInt128_uint128 x0, FStar_UInt128_uint128 x1) =
265 FStar_UInt128_add;
266
267FStar_UInt128_uint128
268(*FStar_UInt128_op_Plus_Question_Hat)(FStar_UInt128_uint128 x0, FStar_UInt128_uint128 x1) =
269 FStar_UInt128_add_underspec;
270
271FStar_UInt128_uint128
272(*FStar_UInt128_op_Plus_Percent_Hat)(FStar_UInt128_uint128 x0, FStar_UInt128_uint128 x1) =
273 FStar_UInt128_add_mod;
274
275FStar_UInt128_uint128
276(*FStar_UInt128_op_Subtraction_Hat)(FStar_UInt128_uint128 x0, FStar_UInt128_uint128 x1) =
277 FStar_UInt128_sub;
278
279FStar_UInt128_uint128
280(*FStar_UInt128_op_Subtraction_Question_Hat)(
281 FStar_UInt128_uint128 x0,
282 FStar_UInt128_uint128 x1
283) = FStar_UInt128_sub_underspec;
284
285FStar_UInt128_uint128
286(*FStar_UInt128_op_Subtraction_Percent_Hat)(FStar_UInt128_uint128 x0, FStar_UInt128_uint128 x1) =
287 FStar_UInt128_sub_mod;
288
289FStar_UInt128_uint128
290(*FStar_UInt128_op_Amp_Hat)(FStar_UInt128_uint128 x0, FStar_UInt128_uint128 x1) =
291 FStar_UInt128_logand;
292
293FStar_UInt128_uint128
294(*FStar_UInt128_op_Hat_Hat)(FStar_UInt128_uint128 x0, FStar_UInt128_uint128 x1) =
295 FStar_UInt128_logxor;
296
297FStar_UInt128_uint128
298(*FStar_UInt128_op_Bar_Hat)(FStar_UInt128_uint128 x0, FStar_UInt128_uint128 x1) =
299 FStar_UInt128_logor;
300
301FStar_UInt128_uint128
302(*FStar_UInt128_op_Less_Less_Hat)(FStar_UInt128_uint128 x0, uint32_t x1) =
303 FStar_UInt128_shift_left;
304
305FStar_UInt128_uint128
306(*FStar_UInt128_op_Greater_Greater_Hat)(FStar_UInt128_uint128 x0, uint32_t x1) =
307 FStar_UInt128_shift_right;
308
309bool
310(*FStar_UInt128_op_Equals_Hat)(FStar_UInt128_uint128 x0, FStar_UInt128_uint128 x1) =
311 FStar_UInt128_eq;
312
313bool
314(*FStar_UInt128_op_Greater_Hat)(FStar_UInt128_uint128 x0, FStar_UInt128_uint128 x1) =
315 FStar_UInt128_gt;
316
317bool
318(*FStar_UInt128_op_Less_Hat)(FStar_UInt128_uint128 x0, FStar_UInt128_uint128 x1) =
319 FStar_UInt128_lt;
320
321bool
322(*FStar_UInt128_op_Greater_Equals_Hat)(FStar_UInt128_uint128 x0, FStar_UInt128_uint128 x1) =
323 FStar_UInt128_gte;
324
325bool
326(*FStar_UInt128_op_Less_Equals_Hat)(FStar_UInt128_uint128 x0, FStar_UInt128_uint128 x1) =
327 FStar_UInt128_lte;
328
329static uint64_t FStar_UInt128_u64_mod_32(uint64_t a)
330{
331 return a & (uint64_t)0xffffffffU;
332}
333
334static uint32_t FStar_UInt128_u32_32 = (uint32_t)32U;
335
336static uint64_t FStar_UInt128_u32_combine(uint64_t hi, uint64_t lo)
337{
338 return lo + (hi << FStar_UInt128_u32_32);
339}
340
341FStar_UInt128_uint128 FStar_UInt128_mul32(uint64_t x, uint32_t y)
342{
343 FStar_UInt128_uint128
344 flat =
345 {
346 FStar_UInt128_u32_combine((x >> FStar_UInt128_u32_32)
347 * (uint64_t)y
348 + (FStar_UInt128_u64_mod_32(x) * (uint64_t)y >> FStar_UInt128_u32_32),
349 FStar_UInt128_u64_mod_32(FStar_UInt128_u64_mod_32(x) * (uint64_t)y)),
350 ((x >> FStar_UInt128_u32_32)
351 * (uint64_t)y
352 + (FStar_UInt128_u64_mod_32(x) * (uint64_t)y >> FStar_UInt128_u32_32))
353 >> FStar_UInt128_u32_32
354 };
355 return flat;
356}
357
358typedef struct K___uint64_t_uint64_t_uint64_t_uint64_t_s
359{
360 uint64_t fst;
361 uint64_t snd;
362 uint64_t thd;
363 uint64_t f3;
364}
365K___uint64_t_uint64_t_uint64_t_uint64_t;
366
367static K___uint64_t_uint64_t_uint64_t_uint64_t
368FStar_UInt128_mul_wide_impl_t_(uint64_t x, uint64_t y)
369{
370 K___uint64_t_uint64_t_uint64_t_uint64_t
371 flat =
372 {
373 FStar_UInt128_u64_mod_32(x),
374 FStar_UInt128_u64_mod_32(FStar_UInt128_u64_mod_32(x) * FStar_UInt128_u64_mod_32(y)),
375 x
376 >> FStar_UInt128_u32_32,
377 (x >> FStar_UInt128_u32_32)
378 * FStar_UInt128_u64_mod_32(y)
379 + (FStar_UInt128_u64_mod_32(x) * FStar_UInt128_u64_mod_32(y) >> FStar_UInt128_u32_32)
380 };
381 return flat;
382}
383
384static uint64_t FStar_UInt128_u32_combine_(uint64_t hi, uint64_t lo)
385{
386 return lo + (hi << FStar_UInt128_u32_32);
387}
388
389static FStar_UInt128_uint128 FStar_UInt128_mul_wide_impl(uint64_t x, uint64_t y)
390{
391 K___uint64_t_uint64_t_uint64_t_uint64_t scrut = FStar_UInt128_mul_wide_impl_t_(x, y);
392 uint64_t u1 = scrut.fst;
393 uint64_t w3 = scrut.snd;
394 uint64_t x_ = scrut.thd;
395 uint64_t t_ = scrut.f3;
396 FStar_UInt128_uint128
397 flat =
398 {
399 FStar_UInt128_u32_combine_(u1 * (y >> FStar_UInt128_u32_32) + FStar_UInt128_u64_mod_32(t_),
400 w3),
401 x_
402 * (y >> FStar_UInt128_u32_32)
403 + (t_ >> FStar_UInt128_u32_32)
404 + ((u1 * (y >> FStar_UInt128_u32_32) + FStar_UInt128_u64_mod_32(t_)) >> FStar_UInt128_u32_32)
405 };
406 return flat;
407}
408
409FStar_UInt128_uint128 FStar_UInt128_mul_wide(uint64_t x, uint64_t y)
410{
411 return FStar_UInt128_mul_wide_impl(x, y);
412}
413