csecp256k1

Haskell FFI bindings to bitcoin-core/secp256k1 (docs.ppad.tech/csecp256k1).
git clone git://git.ppad.tech/csecp256k1.git
Log | Files | Refs | README | LICENSE

int128_native_impl.h (3427B)


      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 haskellsecp256k1_v0_1_0_u128_load(haskellsecp256k1_v0_1_0_uint128 *r, uint64_t hi, uint64_t lo) {
      8     *r = (((uint128_t)hi) << 64) + lo;
      9 }
     10 
     11 static SECP256K1_INLINE void haskellsecp256k1_v0_1_0_u128_mul(haskellsecp256k1_v0_1_0_uint128 *r, uint64_t a, uint64_t b) {
     12    *r = (uint128_t)a * b;
     13 }
     14 
     15 static SECP256K1_INLINE void haskellsecp256k1_v0_1_0_u128_accum_mul(haskellsecp256k1_v0_1_0_uint128 *r, uint64_t a, uint64_t b) {
     16    *r += (uint128_t)a * b;
     17 }
     18 
     19 static SECP256K1_INLINE void haskellsecp256k1_v0_1_0_u128_accum_u64(haskellsecp256k1_v0_1_0_uint128 *r, uint64_t a) {
     20    *r += a;
     21 }
     22 
     23 static SECP256K1_INLINE void haskellsecp256k1_v0_1_0_u128_rshift(haskellsecp256k1_v0_1_0_uint128 *r, unsigned int n) {
     24    VERIFY_CHECK(n < 128);
     25    *r >>= n;
     26 }
     27 
     28 static SECP256K1_INLINE uint64_t haskellsecp256k1_v0_1_0_u128_to_u64(const haskellsecp256k1_v0_1_0_uint128 *a) {
     29    return (uint64_t)(*a);
     30 }
     31 
     32 static SECP256K1_INLINE uint64_t haskellsecp256k1_v0_1_0_u128_hi_u64(const haskellsecp256k1_v0_1_0_uint128 *a) {
     33    return (uint64_t)(*a >> 64);
     34 }
     35 
     36 static SECP256K1_INLINE void haskellsecp256k1_v0_1_0_u128_from_u64(haskellsecp256k1_v0_1_0_uint128 *r, uint64_t a) {
     37    *r = a;
     38 }
     39 
     40 static SECP256K1_INLINE int haskellsecp256k1_v0_1_0_u128_check_bits(const haskellsecp256k1_v0_1_0_uint128 *r, unsigned int n) {
     41    VERIFY_CHECK(n < 128);
     42    return (*r >> n == 0);
     43 }
     44 
     45 static SECP256K1_INLINE void haskellsecp256k1_v0_1_0_i128_load(haskellsecp256k1_v0_1_0_int128 *r, int64_t hi, uint64_t lo) {
     46     *r = (((uint128_t)(uint64_t)hi) << 64) + lo;
     47 }
     48 
     49 static SECP256K1_INLINE void haskellsecp256k1_v0_1_0_i128_mul(haskellsecp256k1_v0_1_0_int128 *r, int64_t a, int64_t b) {
     50    *r = (int128_t)a * b;
     51 }
     52 
     53 static SECP256K1_INLINE void haskellsecp256k1_v0_1_0_i128_accum_mul(haskellsecp256k1_v0_1_0_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 haskellsecp256k1_v0_1_0_i128_det(haskellsecp256k1_v0_1_0_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 haskellsecp256k1_v0_1_0_i128_rshift(haskellsecp256k1_v0_1_0_int128 *r, unsigned int n) {
     67    VERIFY_CHECK(n < 128);
     68    *r >>= n;
     69 }
     70 
     71 static SECP256K1_INLINE uint64_t haskellsecp256k1_v0_1_0_i128_to_u64(const haskellsecp256k1_v0_1_0_int128 *a) {
     72    return (uint64_t)*a;
     73 }
     74 
     75 static SECP256K1_INLINE int64_t haskellsecp256k1_v0_1_0_i128_to_i64(const haskellsecp256k1_v0_1_0_int128 *a) {
     76    VERIFY_CHECK(INT64_MIN <= *a && *a <= INT64_MAX);
     77    return *a;
     78 }
     79 
     80 static SECP256K1_INLINE void haskellsecp256k1_v0_1_0_i128_from_i64(haskellsecp256k1_v0_1_0_int128 *r, int64_t a) {
     81    *r = a;
     82 }
     83 
     84 static SECP256K1_INLINE int haskellsecp256k1_v0_1_0_i128_eq_var(const haskellsecp256k1_v0_1_0_int128 *a, const haskellsecp256k1_v0_1_0_int128 *b) {
     85    return *a == *b;
     86 }
     87 
     88 static SECP256K1_INLINE int haskellsecp256k1_v0_1_0_i128_check_pow2(const haskellsecp256k1_v0_1_0_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