Electroneum
Toggle main menu visibility
Loading...
Searching...
No Matches
int128_native_impl.h
Go to the documentation of this file.
1
#ifndef SECP256K1_INT128_NATIVE_IMPL_H
2
#define SECP256K1_INT128_NATIVE_IMPL_H
3
4
#include "
int128.h
"
5
6
static
SECP256K1_INLINE
void
secp256k1_u128_load(
secp256k1_uint128
*r,
uint64_t
hi,
uint64_t
lo) {
7
*r = (((uint128_t)hi) << 64) + lo;
8
}
9
10
static
SECP256K1_INLINE
void
secp256k1_u128_mul(
secp256k1_uint128
*r,
uint64_t
a
,
uint64_t
b) {
11
*r = (uint128_t)
a
* b;
12
}
13
14
static
SECP256K1_INLINE
void
secp256k1_u128_accum_mul(
secp256k1_uint128
*r,
uint64_t
a
,
uint64_t
b) {
15
*r += (uint128_t)
a
* b;
16
}
17
18
static
SECP256K1_INLINE
void
secp256k1_u128_accum_u64(
secp256k1_uint128
*r,
uint64_t
a
) {
19
*r +=
a
;
20
}
21
22
static
SECP256K1_INLINE
void
secp256k1_u128_rshift(
secp256k1_uint128
*r,
unsigned
int
n) {
23
VERIFY_CHECK
(n < 128);
24
*r >>= n;
25
}
26
27
static
SECP256K1_INLINE
uint64_t
secp256k1_u128_to_u64(
const
secp256k1_uint128
*
a
) {
28
return
(
uint64_t
)(*a);
29
}
30
31
static
SECP256K1_INLINE
uint64_t
secp256k1_u128_hi_u64(
const
secp256k1_uint128
*
a
) {
32
return
(
uint64_t
)(*
a
>> 64);
33
}
34
35
static
SECP256K1_INLINE
void
secp256k1_u128_from_u64(
secp256k1_uint128
*r,
uint64_t
a
) {
36
*r =
a
;
37
}
38
39
static
SECP256K1_INLINE
int
secp256k1_u128_check_bits(
const
secp256k1_uint128
*r,
unsigned
int
n) {
40
VERIFY_CHECK
(n < 128);
41
return
(*r >> n == 0);
42
}
43
44
static
SECP256K1_INLINE
void
secp256k1_i128_load(
secp256k1_int128
*r,
int64_t
hi,
uint64_t
lo) {
45
*r = (((uint128_t)(
uint64_t
)hi) << 64) + lo;
46
}
47
48
static
SECP256K1_INLINE
void
secp256k1_i128_mul(
secp256k1_int128
*r,
int64_t
a
,
int64_t
b) {
49
*r = (int128_t)
a
* b;
50
}
51
52
static
SECP256K1_INLINE
void
secp256k1_i128_accum_mul(
secp256k1_int128
*r,
int64_t
a
,
int64_t
b) {
53
int128_t ab = (int128_t)
a
* b;
54
VERIFY_CHECK
(0 <= ab ? *r <= INT128_MAX - ab : INT128_MIN - ab <= *r);
55
*r += ab;
56
}
57
58
static
SECP256K1_INLINE
void
secp256k1_i128_det(
secp256k1_int128
*r,
int64_t
a
,
int64_t
b,
int64_t
c,
int64_t
d) {
59
int128_t ad = (int128_t)
a
* d;
60
int128_t bc = (int128_t)b * c;
61
VERIFY_CHECK
(0 <= bc ? INT128_MIN + bc <= ad : ad <= INT128_MAX + bc);
62
*r = ad - bc;
63
}
64
65
static
SECP256K1_INLINE
void
secp256k1_i128_rshift(
secp256k1_int128
*r,
unsigned
int
n) {
66
VERIFY_CHECK
(n < 128);
67
*r >>= n;
68
}
69
70
static
SECP256K1_INLINE
uint64_t
secp256k1_i128_to_u64(
const
secp256k1_int128
*
a
) {
71
return
(
uint64_t
)*
a
;
72
}
73
74
static
SECP256K1_INLINE
int64_t
secp256k1_i128_to_i64(
const
secp256k1_int128
*
a
) {
75
VERIFY_CHECK
(
INT64_MIN
<= *
a
&& *
a
<=
INT64_MAX
);
76
return
*
a
;
77
}
78
79
static
SECP256K1_INLINE
void
secp256k1_i128_from_i64(
secp256k1_int128
*r,
int64_t
a
) {
80
*r =
a
;
81
}
82
83
static
SECP256K1_INLINE
int
secp256k1_i128_eq_var(
const
secp256k1_int128
*
a
,
const
secp256k1_int128
*b) {
84
return
*
a
== *b;
85
}
86
87
static
SECP256K1_INLINE
int
secp256k1_i128_check_pow2(
const
secp256k1_int128
*r,
unsigned
int
n) {
88
VERIFY_CHECK
(n < 127);
89
return
(*r == (int128_t)1 << n);
90
}
91
92
#endif
VERIFY_CHECK
#define VERIFY_CHECK(cond)
Definition
util.h:96
int128.h
secp256k1_int128
int128_t secp256k1_int128
Definition
int128_native.h:17
a
const GenericPointer< typename T::ValueType > T2 T::AllocatorType & a
Definition
pointer.h:1124
SECP256K1_INLINE
#define SECP256K1_INLINE
Definition
secp256k1.h:131
int64_t
signed __int64 int64_t
Definition
stdint.h:135
INT64_MIN
#define INT64_MIN
Definition
stdint.h:184
INT64_MAX
#define INT64_MAX
Definition
stdint.h:185
uint64_t
unsigned __int64 uint64_t
Definition
stdint.h:136
secp256k1_uint128
Definition
int128_struct.h:7
external
secp256k1
src
int128_native_impl.h
Generated on
for Electroneum by
1.17.0