/ src / secp256k1 / src / int128_native_impl.h
int128_native_impl.h
 1  #ifndef SECP256K1_INT128_NATIVE_IMPL_H
 2  #define SECP256K1_INT128_NATIVE_IMPL_H
 3  
 4  #include "int128.h"
 5  #include "util.h"
 6  
 7  static SECP256K1_INLINE void secp256k1_u128_load(secp256k1_uint128 *r, uint64_t hi, uint64_t lo) {
 8      *r = (((uint128_t)hi) << 64) + lo;
 9  }
10  
11  static SECP256K1_INLINE void secp256k1_u128_mul(secp256k1_uint128 *r, uint64_t a, uint64_t b) {
12     *r = (uint128_t)a * b;
13  }
14  
15  static SECP256K1_INLINE void secp256k1_u128_accum_mul(secp256k1_uint128 *r, uint64_t a, uint64_t b) {
16     *r += (uint128_t)a * b;
17  }
18  
19  static SECP256K1_INLINE void secp256k1_u128_accum_u64(secp256k1_uint128 *r, uint64_t a) {
20     *r += a;
21  }
22  
23  static SECP256K1_INLINE void secp256k1_u128_rshift(secp256k1_uint128 *r, unsigned int n) {
24     VERIFY_CHECK(n < 128);
25     *r >>= n;
26  }
27  
28  static SECP256K1_INLINE uint64_t secp256k1_u128_to_u64(const secp256k1_uint128 *a) {
29     return (uint64_t)(*a);
30  }
31  
32  static SECP256K1_INLINE uint64_t secp256k1_u128_hi_u64(const secp256k1_uint128 *a) {
33     return (uint64_t)(*a >> 64);
34  }
35  
36  static SECP256K1_INLINE void secp256k1_u128_from_u64(secp256k1_uint128 *r, uint64_t a) {
37     *r = a;
38  }
39  
40  static SECP256K1_INLINE int secp256k1_u128_check_bits(const secp256k1_uint128 *r, unsigned int n) {
41     VERIFY_CHECK(n < 128);
42     return (*r >> n == 0);
43  }
44  
45  static SECP256K1_INLINE void secp256k1_i128_load(secp256k1_int128 *r, int64_t hi, uint64_t lo) {
46      *r = (((uint128_t)(uint64_t)hi) << 64) + lo;
47  }
48  
49  static SECP256K1_INLINE void secp256k1_i128_mul(secp256k1_int128 *r, int64_t a, int64_t b) {
50     *r = (int128_t)a * b;
51  }
52  
53  static SECP256K1_INLINE void secp256k1_i128_accum_mul(secp256k1_int128 *r, int64_t a, int64_t b) {
54     int128_t ab = (int128_t)a * b;
55     VERIFY_CHECK(0 <= ab ? *r <= INT128_MAX - ab : INT128_MIN - ab <= *r);
56     *r += ab;
57  }
58  
59  static SECP256K1_INLINE void secp256k1_i128_det(secp256k1_int128 *r, int64_t a, int64_t b, int64_t c, int64_t d) {
60     int128_t ad = (int128_t)a * d;
61     int128_t bc = (int128_t)b * c;
62     VERIFY_CHECK(0 <= bc ? INT128_MIN + bc <= ad : ad <= INT128_MAX + bc);
63     *r = ad - bc;
64  }
65  
66  static SECP256K1_INLINE void secp256k1_i128_rshift(secp256k1_int128 *r, unsigned int n) {
67     VERIFY_CHECK(n < 128);
68     *r >>= n;
69  }
70  
71  static SECP256K1_INLINE uint64_t secp256k1_i128_to_u64(const secp256k1_int128 *a) {
72     return (uint64_t)*a;
73  }
74  
75  static SECP256K1_INLINE int64_t secp256k1_i128_to_i64(const secp256k1_int128 *a) {
76     VERIFY_CHECK(INT64_MIN <= *a && *a <= INT64_MAX);
77     return *a;
78  }
79  
80  static SECP256K1_INLINE void secp256k1_i128_from_i64(secp256k1_int128 *r, int64_t a) {
81     *r = a;
82  }
83  
84  static SECP256K1_INLINE int secp256k1_i128_eq_var(const secp256k1_int128 *a, const secp256k1_int128 *b) {
85     return *a == *b;
86  }
87  
88  static SECP256K1_INLINE int secp256k1_i128_check_pow2(const secp256k1_int128 *r, unsigned int n, int sign) {
89     VERIFY_CHECK(n < 127);
90     VERIFY_CHECK(sign == 1 || sign == -1);
91     return (*r == (int128_t)((uint128_t)sign << n));
92  }
93  
94  #endif