14template <
class T> field<T> field<T>::asm_mul_with_coarse_reduction(
const field&
a,
const field&
b)
noexcept
17 constexpr uint64_t r_inv = T::r_inv;
18 constexpr uint64_t modulus_0 = modulus.data[0];
19 constexpr uint64_t modulus_1 = modulus.data[1];
20 constexpr uint64_t modulus_2 = modulus.data[2];
21 constexpr uint64_t modulus_3 = modulus.data[3];
22 constexpr uint64_t zero_ref = 0;
33 __asm__(
MUL(
"0(%0)",
"8(%0)",
"16(%0)",
"24(%0)",
"%1")
39 [modulus_0]
"m"(modulus_0),
40 [modulus_1]
"m"(modulus_1),
41 [modulus_2]
"m"(modulus_2),
42 [modulus_3]
"m"(modulus_3),
44 [zero_reference]
"m"(zero_ref)
45 :
"%rdx",
"%rdi",
"%r8",
"%r9",
"%r10",
"%r11",
"%r12",
"%r13",
"%r14",
"%r15",
"cc",
"memory");
49template <
class T>
void field<T>::asm_self_mul_with_coarse_reduction(field&
a,
const field&
b)
noexcept
51 constexpr uint64_t r_inv = T::r_inv;
52 constexpr uint64_t modulus_0 = modulus.data[0];
53 constexpr uint64_t modulus_1 = modulus.data[1];
54 constexpr uint64_t modulus_2 = modulus.data[2];
55 constexpr uint64_t modulus_3 = modulus.data[3];
56 constexpr uint64_t zero_ref = 0;
66 __asm__(
MUL(
"0(%0)",
"8(%0)",
"16(%0)",
"24(%0)",
"%1")
71 [modulus_0]
"m"(modulus_0),
72 [modulus_1]
"m"(modulus_1),
73 [modulus_2]
"m"(modulus_2),
74 [modulus_3]
"m"(modulus_3),
76 [zero_reference]
"m"(zero_ref)
77 :
"%rdx",
"%rdi",
"%r8",
"%r9",
"%r10",
"%r11",
"%r12",
"%r13",
"%r14",
"%r15",
"cc",
"memory");
80template <
class T> field<T> field<T>::asm_sqr_with_coarse_reduction(
const field&
a)
noexcept
83 constexpr uint64_t r_inv = T::r_inv;
84 constexpr uint64_t modulus_0 = modulus.data[0];
85 constexpr uint64_t modulus_1 = modulus.data[1];
86 constexpr uint64_t modulus_2 = modulus.data[2];
87 constexpr uint64_t modulus_3 = modulus.data[3];
88 constexpr uint64_t zero_ref = 0;
93#if !defined(__ADX__) || defined(DISABLE_ADX)
103 __asm__(
MUL(
"0(%0)",
"8(%0)",
"16(%0)",
"24(%0)",
"%1")
109 [modulus_0]
"m"(modulus_0),
110 [modulus_1]
"m"(modulus_1),
111 [modulus_2]
"m"(modulus_2),
112 [modulus_3]
"m"(modulus_3),
114 [zero_reference]
"m"(zero_ref)
115 :
"%rdx",
"%rdi",
"%r8",
"%r9",
"%r10",
"%r11",
"%r12",
"%r13",
"%r14",
"%r15",
"cc",
"memory");
133 [zero_reference]
"m"(zero_ref),
134 [modulus_0]
"m"(modulus_0),
135 [modulus_1]
"m"(modulus_1),
136 [modulus_2]
"m"(modulus_2),
137 [modulus_3]
"m"(modulus_3),
139 :
"%rcx",
"%rdx",
"%rdi",
"%r8",
"%r9",
"%r10",
"%r11",
"%r12",
"%r13",
"%r14",
"%r15",
"cc",
"memory");
144template <
class T>
void field<T>::asm_self_sqr_with_coarse_reduction(field&
a)
noexcept
146 constexpr uint64_t r_inv = T::r_inv;
147 constexpr uint64_t modulus_0 = modulus.data[0];
148 constexpr uint64_t modulus_1 = modulus.data[1];
149 constexpr uint64_t modulus_2 = modulus.data[2];
150 constexpr uint64_t modulus_3 = modulus.data[3];
151 constexpr uint64_t zero_ref = 0;
156#if !defined(__ADX__) || defined(DISABLE_ADX)
166 __asm__(
MUL(
"0(%0)",
"8(%0)",
"16(%0)",
"24(%0)",
"%1")
171 [modulus_0]
"m"(modulus_0),
172 [modulus_1]
"m"(modulus_1),
173 [modulus_2]
"m"(modulus_2),
174 [modulus_3]
"m"(modulus_3),
176 [zero_reference]
"m"(zero_ref)
177 :
"%rdx",
"%rdi",
"%r8",
"%r9",
"%r10",
"%r11",
"%r12",
"%r13",
"%r14",
"%r15",
"cc",
"memory");
193 [zero_reference]
"m"(zero_ref),
194 [modulus_0]
"m"(modulus_0),
195 [modulus_1]
"m"(modulus_1),
196 [modulus_2]
"m"(modulus_2),
197 [modulus_3]
"m"(modulus_3),
199 :
"%rcx",
"%rdx",
"%rdi",
"%r8",
"%r9",
"%r10",
"%r11",
"%r12",
"%r13",
"%r14",
"%r15",
"cc",
"memory");
203template <
class T> field<T> field<T>::asm_add_with_coarse_reduction(
const field&
a,
const field&
b)
noexcept
207 constexpr uint64_t twice_not_modulus_0 = twice_not_modulus.data[0];
208 constexpr uint64_t twice_not_modulus_1 = twice_not_modulus.data[1];
209 constexpr uint64_t twice_not_modulus_2 = twice_not_modulus.data[2];
210 constexpr uint64_t twice_not_modulus_3 = twice_not_modulus.data[3];
214 "%[twice_not_modulus_0]",
215 "%[twice_not_modulus_1]",
216 "%[twice_not_modulus_2]",
222 [twice_not_modulus_0]
"m"(twice_not_modulus_0),
223 [twice_not_modulus_1]
"m"(twice_not_modulus_1),
224 [twice_not_modulus_2]
"m"(twice_not_modulus_2),
225 [twice_not_modulus_3]
"m"(twice_not_modulus_3)
226 :
"%r8",
"%r9",
"%r10",
"%r11",
"%r12",
"%r13",
"%r14",
"%r15",
"cc",
"memory");
230template <
class T>
void field<T>::asm_self_add_with_coarse_reduction(field&
a,
const field&
b)
noexcept
232 constexpr uint64_t twice_not_modulus_0 = twice_not_modulus.data[0];
233 constexpr uint64_t twice_not_modulus_1 = twice_not_modulus.data[1];
234 constexpr uint64_t twice_not_modulus_2 = twice_not_modulus.data[2];
235 constexpr uint64_t twice_not_modulus_3 = twice_not_modulus.data[3];
239 "%[twice_not_modulus_0]",
240 "%[twice_not_modulus_1]",
241 "%[twice_not_modulus_2]",
246 [twice_not_modulus_0]
"m"(twice_not_modulus_0),
247 [twice_not_modulus_1]
"m"(twice_not_modulus_1),
248 [twice_not_modulus_2]
"m"(twice_not_modulus_2),
249 [twice_not_modulus_3]
"m"(twice_not_modulus_3)
250 :
"%r8",
"%r9",
"%r10",
"%r11",
"%r12",
"%r13",
"%r14",
"%r15",
"cc",
"memory");
253template <
class T> field<T> field<T>::asm_sub_with_coarse_reduction(
const field&
a,
const field&
b)
noexcept
257 constexpr uint64_t twice_modulus_0 = twice_modulus.data[0];
258 constexpr uint64_t twice_modulus_1 = twice_modulus.data[1];
259 constexpr uint64_t twice_modulus_2 = twice_modulus.data[2];
260 constexpr uint64_t twice_modulus_3 = twice_modulus.data[3];
266 CONDITIONAL_ADD(
"%[twice_modulus_0]",
"%[twice_modulus_1]",
"%[twice_modulus_2]",
"%[twice_modulus_3]")
272 [twice_modulus_0]
"m"(twice_modulus_0),
273 [twice_modulus_1]
"m"(twice_modulus_1),
274 [twice_modulus_2]
"m"(twice_modulus_2),
275 [twice_modulus_3]
"m"(twice_modulus_3)
276 :
"%r8",
"%r9",
"%r10",
"%r11",
"%r12",
"%r13",
"%r14",
"%r15",
"cc",
"memory");
280template <
class T>
void field<T>::asm_self_sub_with_coarse_reduction(field&
a,
const field&
b)
noexcept
282 constexpr uint64_t twice_modulus_0 = twice_modulus.data[0];
283 constexpr uint64_t twice_modulus_1 = twice_modulus.data[1];
284 constexpr uint64_t twice_modulus_2 = twice_modulus.data[2];
285 constexpr uint64_t twice_modulus_3 = twice_modulus.data[3];
289 CONDITIONAL_ADD(
"%[twice_modulus_0]",
"%[twice_modulus_1]",
"%[twice_modulus_2]",
"%[twice_modulus_3]")
294 [twice_modulus_0]
"m"(twice_modulus_0),
295 [twice_modulus_1]
"m"(twice_modulus_1),
296 [twice_modulus_2]
"m"(twice_modulus_2),
297 [twice_modulus_3]
"m"(twice_modulus_3)
298 :
"%r8",
"%r9",
"%r10",
"%r11",
"%r12",
"%r13",
"%r14",
"%r15",
"cc",
"memory");
301template <
class T>
void field<T>::asm_conditional_negate(field& r,
const uint64_t predicate)
noexcept
303 constexpr uint64_t twice_modulus_0 = twice_modulus.data[0];
304 constexpr uint64_t twice_modulus_1 = twice_modulus.data[1];
305 constexpr uint64_t twice_modulus_2 = twice_modulus.data[2];
306 constexpr uint64_t twice_modulus_3 = twice_modulus.data[3];
309 "%1",
"%%r8",
"%%r9",
"%%r10",
"%%r11")
"movq %[twice_modulus_0], %%r12 \n\t"
310 "movq %[twice_modulus_1], %%r13 \n\t"
311 "movq %[twice_modulus_2], %%r14 \n\t"
312 "movq %[twice_modulus_3], %%r15 \n\t"
313 "subq %%r8, %%r12 \n\t"
314 "sbbq %%r9, %%r13 \n\t"
315 "sbbq %%r10, %%r14 \n\t"
316 "sbbq %%r11, %%r15 \n\t"
318 "cmovnzq %%r12, %%r8 \n\t"
319 "cmovnzq %%r13, %%r9 \n\t"
320 "cmovnzq %%r14, %%r10 \n\t"
322 "%1",
"%%r8",
"%%r9",
"%%r10",
"%%r11")
326 [twice_modulus_0]
"i"(twice_modulus_0),
327 [twice_modulus_1]
"i"(twice_modulus_1),
328 [twice_modulus_2]
"i"(twice_modulus_2),
329 [twice_modulus_3]
"i"(twice_modulus_3)
330 :
"%r8",
"%r9",
"%r10",
"%r11",
"%r12",
"%r13",
"%r14",
"%r15",
"cc",
"memory");
333template <
class T> field<T> field<T>::asm_reduce_once(
const field&
a)
noexcept
337 constexpr uint64_t not_modulus_0 = not_modulus.data[0];
338 constexpr uint64_t not_modulus_1 = not_modulus.data[1];
339 constexpr uint64_t not_modulus_2 = not_modulus.data[2];
340 constexpr uint64_t not_modulus_3 = not_modulus.data[3];
343 CONDITIONAL_ADD(
"%[not_modulus_0]",
"%[not_modulus_1]",
"%[not_modulus_2]",
"%[not_modulus_3]")
348 [not_modulus_0]
"m"(not_modulus_0),
349 [not_modulus_1]
"m"(not_modulus_1),
350 [not_modulus_2]
"m"(not_modulus_2),
351 [not_modulus_3]
"m"(not_modulus_3)
352 :
"%r8",
"%r9",
"%r10",
"%r11",
"%r12",
"%r13",
"%r14",
"%r15",
"cc",
"memory");
356template <
class T>
void field<T>::asm_self_reduce_once(field&
a)
noexcept
358 constexpr uint64_t not_modulus_0 = not_modulus.data[0];
359 constexpr uint64_t not_modulus_1 = not_modulus.data[1];
360 constexpr uint64_t not_modulus_2 = not_modulus.data[2];
361 constexpr uint64_t not_modulus_3 = not_modulus.data[3];
364 CONDITIONAL_ADD(
"%[not_modulus_0]",
"%[not_modulus_1]",
"%[not_modulus_2]",
"%[not_modulus_3]")
368 [not_modulus_0]
"m"(not_modulus_0),
369 [not_modulus_1]
"m"(not_modulus_1),
370 [not_modulus_2]
"m"(not_modulus_2),
371 [not_modulus_3]
"m"(not_modulus_3)
372 :
"%r8",
"%r9",
"%r10",
"%r11",
"%r12",
"%r13",
"%r14",
"%r15",
"cc",
"memory");
#define ADD_REDUCE(b, twice_not_modulus_0, twice_not_modulus_1, twice_not_modulus_2, twice_not_modulus_3)
#define STORE_FIELD_ELEMENT(r, lolo, lohi, hilo, hihi)
#define LOAD_FIELD_ELEMENT(a, lolo, lohi, hilo, hihi)
#define CLEAR_FLAGS(empty_reg)
#define CONDITIONAL_ADD(b_0, b_1, b_2, b_3)
Entry point for Barretenberg command-line interface.
@ SQR
Square a field element.
@ SUB
Subtract two field elements.
@ MUL
Multiply two field elements.