7 #ifndef _SECP256K1_FIELD_INNER5X52_IMPL_H_
8 #define _SECP256K1_FIELD_INNER5X52_IMPL_H_
13 #define VERIFY_BITS(x, n) VERIFY_CHECK(((x) >> (n)) == 0)
15 #define VERIFY_BITS(x, n) do { } while(0)
31 const uint64_t
M = 0xFFFFFFFFFFFFFULL,
R = 0x1000003D10ULL;
37 uint64_t a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4];
41 d = (__int128)a0 *
b[3]
44 + (__int128)a3 *
b[0];
47 c = (__int128)a4 *
b[4];
50 d += (c &
M) *
R; c >>= 52;
54 uint64_t t3 = d &
M; d >>= 52;
59 d += (__int128)a0 *
b[4]
63 + (__int128)a4 *
b[0];
69 uint64_t t4 = d &
M; d >>= 52;
73 uint64_t tx = (t4 >> 48); t4 &= (
M >> 4);
78 c = (__int128)a0 *
b[0];
81 d += (__int128)a1 *
b[4]
84 + (__int128)a4 *
b[1];
87 uint64_t u0 = d &
M; d >>= 52;
95 c += (__int128)u0 * (
R >> 4);
98 r[0] = c &
M; c >>= 52;
103 c += (__int128)a0 *
b[1]
104 + (__int128)a1 *
b[0];
107 d += (__int128)a2 *
b[4]
108 + (__int128)a3 *
b[3]
109 + (__int128)a4 *
b[2];
112 c += (d &
M) *
R; d >>= 52;
116 r[1] = c &
M; c >>= 52;
121 c += (__int128)a0 *
b[2]
122 + (__int128)a1 *
b[1]
123 + (__int128)a2 *
b[0];
126 d += (__int128)a3 *
b[4]
127 + (__int128)a4 *
b[3];
130 c += (d &
M) *
R; d >>= 52;
136 r[2] = c &
M; c >>= 52;
143 r[3] = c &
M; c >>= 52;
155 SECP256K1_INLINE static void secp256k1_fe_sqr_inner(
const uint64_t *a, uint64_t *
r) {
162 const uint64_t
M = 0xFFFFFFFFFFFFFULL,
R = 0x1000003D10ULL;
170 uint64_t a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4];
172 d = (__int128)(a0*2) * a3
173 + (__int128)(a1*2) * a2;
176 c = (__int128)a4 * a4;
179 d += (c &
M) *
R; c >>= 52;
183 uint64_t t3 = d &
M; d >>= 52;
189 d += (__int128)a0 * a4
190 + (__int128)(a1*2) * a3
197 uint64_t t4 = d &
M; d >>= 52;
201 uint64_t tx = (t4 >> 48); t4 &= (
M >> 4);
206 c = (__int128)a0 * a0;
209 d += (__int128)a1 * a4
210 + (__int128)(a2*2) * a3;
213 uint64_t u0 = d &
M; d >>= 52;
221 c += (__int128)u0 * (
R >> 4);
224 r[0] = c &
M; c >>= 52;
230 c += (__int128)a0 * a1;
233 d += (__int128)a2 * a4
237 c += (d &
M) *
R; d >>= 52;
241 r[1] = c &
M; c >>= 52;
246 c += (__int128)a0 * a2
250 d += (__int128)a3 * a4;
253 c += (d &
M) *
R; d >>= 52;
257 r[2] = c &
M; c >>= 52;
265 r[3] = c &
M; c >>= 52;