Path: blob/main/Modules/_hacl/include/krml/FStar_UInt128_Verified.h
12 views
/*1Copyright (c) INRIA and Microsoft Corporation. All rights reserved.2Licensed under the Apache 2.0 License.3*/456#ifndef __FStar_UInt128_Verified_H7#define __FStar_UInt128_Verified_H89#include "FStar_UInt_8_16_32_64.h"10#include <inttypes.h>11#include <stdbool.h>12#include "krml/types.h"13#include "krml/internal/target.h"1415static inline uint64_t FStar_UInt128_constant_time_carry(uint64_t a, uint64_t b)16{17return (a ^ ((a ^ b) | ((a - b) ^ b))) >> (uint32_t)63U;18}1920static inline uint64_t FStar_UInt128_carry(uint64_t a, uint64_t b)21{22return FStar_UInt128_constant_time_carry(a, b);23}2425static inline FStar_UInt128_uint12826FStar_UInt128_add(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)27{28FStar_UInt128_uint128 lit;29lit.low = a.low + b.low;30lit.high = a.high + b.high + FStar_UInt128_carry(a.low + b.low, b.low);31return lit;32}3334static inline FStar_UInt128_uint12835FStar_UInt128_add_underspec(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)36{37FStar_UInt128_uint128 lit;38lit.low = a.low + b.low;39lit.high = a.high + b.high + FStar_UInt128_carry(a.low + b.low, b.low);40return lit;41}4243static inline FStar_UInt128_uint12844FStar_UInt128_add_mod(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)45{46FStar_UInt128_uint128 lit;47lit.low = a.low + b.low;48lit.high = a.high + b.high + FStar_UInt128_carry(a.low + b.low, b.low);49return lit;50}5152static inline FStar_UInt128_uint12853FStar_UInt128_sub(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)54{55FStar_UInt128_uint128 lit;56lit.low = a.low - b.low;57lit.high = a.high - b.high - FStar_UInt128_carry(a.low, a.low - b.low);58return lit;59}6061static inline FStar_UInt128_uint12862FStar_UInt128_sub_underspec(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)63{64FStar_UInt128_uint128 lit;65lit.low = a.low - b.low;66lit.high = a.high - b.high - FStar_UInt128_carry(a.low, a.low - b.low);67return lit;68}6970static inline FStar_UInt128_uint12871FStar_UInt128_sub_mod_impl(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)72{73FStar_UInt128_uint128 lit;74lit.low = a.low - b.low;75lit.high = a.high - b.high - FStar_UInt128_carry(a.low, a.low - b.low);76return lit;77}7879static inline FStar_UInt128_uint12880FStar_UInt128_sub_mod(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)81{82return FStar_UInt128_sub_mod_impl(a, b);83}8485static inline FStar_UInt128_uint12886FStar_UInt128_logand(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)87{88FStar_UInt128_uint128 lit;89lit.low = a.low & b.low;90lit.high = a.high & b.high;91return lit;92}9394static inline FStar_UInt128_uint12895FStar_UInt128_logxor(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)96{97FStar_UInt128_uint128 lit;98lit.low = a.low ^ b.low;99lit.high = a.high ^ b.high;100return lit;101}102103static inline FStar_UInt128_uint128104FStar_UInt128_logor(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)105{106FStar_UInt128_uint128 lit;107lit.low = a.low | b.low;108lit.high = a.high | b.high;109return lit;110}111112static inline FStar_UInt128_uint128 FStar_UInt128_lognot(FStar_UInt128_uint128 a)113{114FStar_UInt128_uint128 lit;115lit.low = ~a.low;116lit.high = ~a.high;117return lit;118}119120static uint32_t FStar_UInt128_u32_64 = (uint32_t)64U;121122static inline uint64_t FStar_UInt128_add_u64_shift_left(uint64_t hi, uint64_t lo, uint32_t s)123{124return (hi << s) + (lo >> (FStar_UInt128_u32_64 - s));125}126127static inline uint64_t128FStar_UInt128_add_u64_shift_left_respec(uint64_t hi, uint64_t lo, uint32_t s)129{130return FStar_UInt128_add_u64_shift_left(hi, lo, s);131}132133static inline FStar_UInt128_uint128134FStar_UInt128_shift_left_small(FStar_UInt128_uint128 a, uint32_t s)135{136if (s == (uint32_t)0U)137{138return a;139}140else141{142FStar_UInt128_uint128 lit;143lit.low = a.low << s;144lit.high = FStar_UInt128_add_u64_shift_left_respec(a.high, a.low, s);145return lit;146}147}148149static inline FStar_UInt128_uint128150FStar_UInt128_shift_left_large(FStar_UInt128_uint128 a, uint32_t s)151{152FStar_UInt128_uint128 lit;153lit.low = (uint64_t)0U;154lit.high = a.low << (s - FStar_UInt128_u32_64);155return lit;156}157158static inline FStar_UInt128_uint128159FStar_UInt128_shift_left(FStar_UInt128_uint128 a, uint32_t s)160{161if (s < FStar_UInt128_u32_64)162{163return FStar_UInt128_shift_left_small(a, s);164}165else166{167return FStar_UInt128_shift_left_large(a, s);168}169}170171static inline uint64_t FStar_UInt128_add_u64_shift_right(uint64_t hi, uint64_t lo, uint32_t s)172{173return (lo >> s) + (hi << (FStar_UInt128_u32_64 - s));174}175176static inline uint64_t177FStar_UInt128_add_u64_shift_right_respec(uint64_t hi, uint64_t lo, uint32_t s)178{179return FStar_UInt128_add_u64_shift_right(hi, lo, s);180}181182static inline FStar_UInt128_uint128183FStar_UInt128_shift_right_small(FStar_UInt128_uint128 a, uint32_t s)184{185if (s == (uint32_t)0U)186{187return a;188}189else190{191FStar_UInt128_uint128 lit;192lit.low = FStar_UInt128_add_u64_shift_right_respec(a.high, a.low, s);193lit.high = a.high >> s;194return lit;195}196}197198static inline FStar_UInt128_uint128199FStar_UInt128_shift_right_large(FStar_UInt128_uint128 a, uint32_t s)200{201FStar_UInt128_uint128 lit;202lit.low = a.high >> (s - FStar_UInt128_u32_64);203lit.high = (uint64_t)0U;204return lit;205}206207static inline FStar_UInt128_uint128208FStar_UInt128_shift_right(FStar_UInt128_uint128 a, uint32_t s)209{210if (s < FStar_UInt128_u32_64)211{212return FStar_UInt128_shift_right_small(a, s);213}214else215{216return FStar_UInt128_shift_right_large(a, s);217}218}219220static inline bool FStar_UInt128_eq(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)221{222return a.low == b.low && a.high == b.high;223}224225static inline bool FStar_UInt128_gt(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)226{227return a.high > b.high || (a.high == b.high && a.low > b.low);228}229230static inline bool FStar_UInt128_lt(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)231{232return a.high < b.high || (a.high == b.high && a.low < b.low);233}234235static inline bool FStar_UInt128_gte(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)236{237return a.high > b.high || (a.high == b.high && a.low >= b.low);238}239240static inline bool FStar_UInt128_lte(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)241{242return a.high < b.high || (a.high == b.high && a.low <= b.low);243}244245static inline FStar_UInt128_uint128246FStar_UInt128_eq_mask(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)247{248FStar_UInt128_uint128 lit;249lit.low = FStar_UInt64_eq_mask(a.low, b.low) & FStar_UInt64_eq_mask(a.high, b.high);250lit.high = FStar_UInt64_eq_mask(a.low, b.low) & FStar_UInt64_eq_mask(a.high, b.high);251return lit;252}253254static inline FStar_UInt128_uint128255FStar_UInt128_gte_mask(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)256{257FStar_UInt128_uint128 lit;258lit.low =259(FStar_UInt64_gte_mask(a.high, b.high) & ~FStar_UInt64_eq_mask(a.high, b.high))260| (FStar_UInt64_eq_mask(a.high, b.high) & FStar_UInt64_gte_mask(a.low, b.low));261lit.high =262(FStar_UInt64_gte_mask(a.high, b.high) & ~FStar_UInt64_eq_mask(a.high, b.high))263| (FStar_UInt64_eq_mask(a.high, b.high) & FStar_UInt64_gte_mask(a.low, b.low));264return lit;265}266267static inline FStar_UInt128_uint128 FStar_UInt128_uint64_to_uint128(uint64_t a)268{269FStar_UInt128_uint128 lit;270lit.low = a;271lit.high = (uint64_t)0U;272return lit;273}274275static inline uint64_t FStar_UInt128_uint128_to_uint64(FStar_UInt128_uint128 a)276{277return a.low;278}279280static inline uint64_t FStar_UInt128_u64_mod_32(uint64_t a)281{282return a & (uint64_t)0xffffffffU;283}284285static uint32_t FStar_UInt128_u32_32 = (uint32_t)32U;286287static inline uint64_t FStar_UInt128_u32_combine(uint64_t hi, uint64_t lo)288{289return lo + (hi << FStar_UInt128_u32_32);290}291292static inline FStar_UInt128_uint128 FStar_UInt128_mul32(uint64_t x, uint32_t y)293{294FStar_UInt128_uint128 lit;295lit.low =296FStar_UInt128_u32_combine((x >> FStar_UInt128_u32_32)297* (uint64_t)y298+ (FStar_UInt128_u64_mod_32(x) * (uint64_t)y >> FStar_UInt128_u32_32),299FStar_UInt128_u64_mod_32(FStar_UInt128_u64_mod_32(x) * (uint64_t)y));300lit.high =301((x >> FStar_UInt128_u32_32)302* (uint64_t)y303+ (FStar_UInt128_u64_mod_32(x) * (uint64_t)y >> FStar_UInt128_u32_32))304>> FStar_UInt128_u32_32;305return lit;306}307308static inline uint64_t FStar_UInt128_u32_combine_(uint64_t hi, uint64_t lo)309{310return lo + (hi << FStar_UInt128_u32_32);311}312313static inline FStar_UInt128_uint128 FStar_UInt128_mul_wide(uint64_t x, uint64_t y)314{315FStar_UInt128_uint128 lit;316lit.low =317FStar_UInt128_u32_combine_(FStar_UInt128_u64_mod_32(x)318* (y >> FStar_UInt128_u32_32)319+320FStar_UInt128_u64_mod_32((x >> FStar_UInt128_u32_32)321* FStar_UInt128_u64_mod_32(y)322+ (FStar_UInt128_u64_mod_32(x) * FStar_UInt128_u64_mod_32(y) >> FStar_UInt128_u32_32)),323FStar_UInt128_u64_mod_32(FStar_UInt128_u64_mod_32(x) * FStar_UInt128_u64_mod_32(y)));324lit.high =325(x >> FStar_UInt128_u32_32)326* (y >> FStar_UInt128_u32_32)327+328(((x >> FStar_UInt128_u32_32)329* FStar_UInt128_u64_mod_32(y)330+ (FStar_UInt128_u64_mod_32(x) * FStar_UInt128_u64_mod_32(y) >> FStar_UInt128_u32_32))331>> FStar_UInt128_u32_32)332+333((FStar_UInt128_u64_mod_32(x)334* (y >> FStar_UInt128_u32_32)335+336FStar_UInt128_u64_mod_32((x >> FStar_UInt128_u32_32)337* FStar_UInt128_u64_mod_32(y)338+ (FStar_UInt128_u64_mod_32(x) * FStar_UInt128_u64_mod_32(y) >> FStar_UInt128_u32_32)))339>> FStar_UInt128_u32_32);340return lit;341}342343344#define __FStar_UInt128_Verified_H_DEFINED345#endif346347348