quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

FStar_UInt128_extracted.c (14010B)


      1 /* 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 
     15 uint64_t FStar_UInt128___proj__Mkuint128__item__low(FStar_UInt128_uint128 projectee)
     16 {
     17   return projectee.low;
     18 }
     19 
     20 uint64_t FStar_UInt128___proj__Mkuint128__item__high(FStar_UInt128_uint128 projectee)
     21 {
     22   return projectee.high;
     23 }
     24 
     25 static 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 
     30 static uint64_t FStar_UInt128_carry(uint64_t a, uint64_t b)
     31 {
     32   return FStar_UInt128_constant_time_carry(a, b);
     33 }
     34 
     35 FStar_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 
     42 FStar_UInt128_uint128
     43 FStar_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 
     50 FStar_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 
     57 FStar_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 
     64 FStar_UInt128_uint128
     65 FStar_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 
     72 static FStar_UInt128_uint128
     73 FStar_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 
     80 FStar_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 
     85 FStar_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 
     91 FStar_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 
     97 FStar_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 
    103 FStar_UInt128_uint128 FStar_UInt128_lognot(FStar_UInt128_uint128 a)
    104 {
    105   FStar_UInt128_uint128 flat = { ~a.low, ~a.high };
    106   return flat;
    107 }
    108 
    109 static uint32_t FStar_UInt128_u32_64 = (uint32_t)64U;
    110 
    111 static 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 
    116 static 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 
    121 static FStar_UInt128_uint128
    122 FStar_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 
    136 static FStar_UInt128_uint128
    137 FStar_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 
    143 FStar_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 
    155 static 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 
    160 static 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 
    165 static FStar_UInt128_uint128
    166 FStar_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 
    180 static FStar_UInt128_uint128
    181 FStar_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 
    187 FStar_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 
    199 bool FStar_UInt128_eq(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b)
    200 {
    201   return a.low == b.low && a.high == b.high;
    202 }
    203 
    204 bool 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 
    209 bool 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 
    214 bool 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 
    219 bool 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 
    224 FStar_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 
    239 FStar_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 
    252 FStar_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 
    258 uint64_t FStar_UInt128_uint128_to_uint64(FStar_UInt128_uint128 a)
    259 {
    260   return a.low;
    261 }
    262 
    263 FStar_UInt128_uint128
    264 (*FStar_UInt128_op_Plus_Hat)(FStar_UInt128_uint128 x0, FStar_UInt128_uint128 x1) =
    265   FStar_UInt128_add;
    266 
    267 FStar_UInt128_uint128
    268 (*FStar_UInt128_op_Plus_Question_Hat)(FStar_UInt128_uint128 x0, FStar_UInt128_uint128 x1) =
    269   FStar_UInt128_add_underspec;
    270 
    271 FStar_UInt128_uint128
    272 (*FStar_UInt128_op_Plus_Percent_Hat)(FStar_UInt128_uint128 x0, FStar_UInt128_uint128 x1) =
    273   FStar_UInt128_add_mod;
    274 
    275 FStar_UInt128_uint128
    276 (*FStar_UInt128_op_Subtraction_Hat)(FStar_UInt128_uint128 x0, FStar_UInt128_uint128 x1) =
    277   FStar_UInt128_sub;
    278 
    279 FStar_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 
    285 FStar_UInt128_uint128
    286 (*FStar_UInt128_op_Subtraction_Percent_Hat)(FStar_UInt128_uint128 x0, FStar_UInt128_uint128 x1) =
    287   FStar_UInt128_sub_mod;
    288 
    289 FStar_UInt128_uint128
    290 (*FStar_UInt128_op_Amp_Hat)(FStar_UInt128_uint128 x0, FStar_UInt128_uint128 x1) =
    291   FStar_UInt128_logand;
    292 
    293 FStar_UInt128_uint128
    294 (*FStar_UInt128_op_Hat_Hat)(FStar_UInt128_uint128 x0, FStar_UInt128_uint128 x1) =
    295   FStar_UInt128_logxor;
    296 
    297 FStar_UInt128_uint128
    298 (*FStar_UInt128_op_Bar_Hat)(FStar_UInt128_uint128 x0, FStar_UInt128_uint128 x1) =
    299   FStar_UInt128_logor;
    300 
    301 FStar_UInt128_uint128
    302 (*FStar_UInt128_op_Less_Less_Hat)(FStar_UInt128_uint128 x0, uint32_t x1) =
    303   FStar_UInt128_shift_left;
    304 
    305 FStar_UInt128_uint128
    306 (*FStar_UInt128_op_Greater_Greater_Hat)(FStar_UInt128_uint128 x0, uint32_t x1) =
    307   FStar_UInt128_shift_right;
    308 
    309 bool
    310 (*FStar_UInt128_op_Equals_Hat)(FStar_UInt128_uint128 x0, FStar_UInt128_uint128 x1) =
    311   FStar_UInt128_eq;
    312 
    313 bool
    314 (*FStar_UInt128_op_Greater_Hat)(FStar_UInt128_uint128 x0, FStar_UInt128_uint128 x1) =
    315   FStar_UInt128_gt;
    316 
    317 bool
    318 (*FStar_UInt128_op_Less_Hat)(FStar_UInt128_uint128 x0, FStar_UInt128_uint128 x1) =
    319   FStar_UInt128_lt;
    320 
    321 bool
    322 (*FStar_UInt128_op_Greater_Equals_Hat)(FStar_UInt128_uint128 x0, FStar_UInt128_uint128 x1) =
    323   FStar_UInt128_gte;
    324 
    325 bool
    326 (*FStar_UInt128_op_Less_Equals_Hat)(FStar_UInt128_uint128 x0, FStar_UInt128_uint128 x1) =
    327   FStar_UInt128_lte;
    328 
    329 static uint64_t FStar_UInt128_u64_mod_32(uint64_t a)
    330 {
    331   return a & (uint64_t)0xffffffffU;
    332 }
    333 
    334 static uint32_t FStar_UInt128_u32_32 = (uint32_t)32U;
    335 
    336 static uint64_t FStar_UInt128_u32_combine(uint64_t hi, uint64_t lo)
    337 {
    338   return lo + (hi << FStar_UInt128_u32_32);
    339 }
    340 
    341 FStar_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 
    358 typedef 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 }
    365 K___uint64_t_uint64_t_uint64_t_uint64_t;
    366 
    367 static K___uint64_t_uint64_t_uint64_t_uint64_t
    368 FStar_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 
    384 static uint64_t FStar_UInt128_u32_combine_(uint64_t hi, uint64_t lo)
    385 {
    386   return lo + (hi << FStar_UInt128_u32_32);
    387 }
    388 
    389 static 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 
    409 FStar_UInt128_uint128 FStar_UInt128_mul_wide(uint64_t x, uint64_t y)
    410 {
    411   return FStar_UInt128_mul_wide_impl(x, y);
    412 }
    413