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(
const 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(
const 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(
const 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];
264 REDUCE_FIELD_ELEMENT(
"%[twice_modulus_0]",
"%[twice_modulus_1]",
"%[twice_modulus_2]",
"%[twice_modulus_3]")
270 [twice_modulus_0]
"m"(twice_modulus_0),
271 [twice_modulus_1]
"m"(twice_modulus_1),
272 [twice_modulus_2]
"m"(twice_modulus_2),
273 [twice_modulus_3]
"m"(twice_modulus_3)
274 :
"%r8",
"%r9",
"%r10",
"%r11",
"%r12",
"%r13",
"%r14",
"%r15",
"cc",
"memory");
278template <
class T>
void field<T>::asm_self_sub_with_coarse_reduction(
const field&
a,
const field&
b)
noexcept
280 constexpr uint64_t twice_modulus_0 = twice_modulus.data[0];
281 constexpr uint64_t twice_modulus_1 = twice_modulus.data[1];
282 constexpr uint64_t twice_modulus_2 = twice_modulus.data[2];
283 constexpr uint64_t twice_modulus_3 = twice_modulus.data[3];
287 REDUCE_FIELD_ELEMENT(
"%[twice_modulus_0]",
"%[twice_modulus_1]",
"%[twice_modulus_2]",
"%[twice_modulus_3]")
292 [twice_modulus_0]
"m"(twice_modulus_0),
293 [twice_modulus_1]
"m"(twice_modulus_1),
294 [twice_modulus_2]
"m"(twice_modulus_2),
295 [twice_modulus_3]
"m"(twice_modulus_3)
296 :
"%r8",
"%r9",
"%r10",
"%r11",
"%r12",
"%r13",
"%r14",
"%r15",
"cc",
"memory");
299template <
class T>
void field<T>::asm_conditional_negate(field& r,
const uint64_t predicate)
noexcept
301 constexpr uint64_t twice_modulus_0 = twice_modulus.data[0];
302 constexpr uint64_t twice_modulus_1 = twice_modulus.data[1];
303 constexpr uint64_t twice_modulus_2 = twice_modulus.data[2];
304 constexpr uint64_t twice_modulus_3 = twice_modulus.data[3];
307 "%1",
"%%r8",
"%%r9",
"%%r10",
"%%r11")
"movq %[twice_modulus_0], %%r12 \n\t"
308 "movq %[twice_modulus_1], %%r13 \n\t"
309 "movq %[twice_modulus_2], %%r14 \n\t"
310 "movq %[twice_modulus_3], %%r15 \n\t"
311 "subq %%r8, %%r12 \n\t"
312 "sbbq %%r9, %%r13 \n\t"
313 "sbbq %%r10, %%r14 \n\t"
314 "sbbq %%r11, %%r15 \n\t"
316 "cmovnzq %%r12, %%r8 \n\t"
317 "cmovnzq %%r13, %%r9 \n\t"
318 "cmovnzq %%r14, %%r10 \n\t"
320 "%1",
"%%r8",
"%%r9",
"%%r10",
"%%r11")
324 [twice_modulus_0]
"i"(twice_modulus_0),
325 [twice_modulus_1]
"i"(twice_modulus_1),
326 [twice_modulus_2]
"i"(twice_modulus_2),
327 [twice_modulus_3]
"i"(twice_modulus_3)
328 :
"%r8",
"%r9",
"%r10",
"%r11",
"%r12",
"%r13",
"%r14",
"%r15",
"cc",
"memory");
331template <
class T> field<T> field<T>::asm_reduce_once(
const field&
a)
noexcept
335 constexpr uint64_t not_modulus_0 = not_modulus.data[0];
336 constexpr uint64_t not_modulus_1 = not_modulus.data[1];
337 constexpr uint64_t not_modulus_2 = not_modulus.data[2];
338 constexpr uint64_t not_modulus_3 = not_modulus.data[3];
341 REDUCE_FIELD_ELEMENT(
"%[not_modulus_0]",
"%[not_modulus_1]",
"%[not_modulus_2]",
"%[not_modulus_3]")
346 [not_modulus_0]
"m"(not_modulus_0),
347 [not_modulus_1]
"m"(not_modulus_1),
348 [not_modulus_2]
"m"(not_modulus_2),
349 [not_modulus_3]
"m"(not_modulus_3)
350 :
"%r8",
"%r9",
"%r10",
"%r11",
"%r12",
"%r13",
"%r14",
"%r15",
"cc",
"memory");
354template <
class T>
void field<T>::asm_self_reduce_once(
const field&
a)
noexcept
356 constexpr uint64_t not_modulus_0 = not_modulus.data[0];
357 constexpr uint64_t not_modulus_1 = not_modulus.data[1];
358 constexpr uint64_t not_modulus_2 = not_modulus.data[2];
359 constexpr uint64_t not_modulus_3 = not_modulus.data[3];
362 REDUCE_FIELD_ELEMENT(
"%[not_modulus_0]",
"%[not_modulus_1]",
"%[not_modulus_2]",
"%[not_modulus_3]")
366 [not_modulus_0]
"m"(not_modulus_0),
367 [not_modulus_1]
"m"(not_modulus_1),
368 [not_modulus_2]
"m"(not_modulus_2),
369 [not_modulus_3]
"m"(not_modulus_3)
370 :
"%r8",
"%r9",
"%r10",
"%r11",
"%r12",
"%r13",
"%r14",
"%r15",
"cc",
"memory");
#define ADD_REDUCE(b, modulus_0, modulus_1, modulus_2, 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 REDUCE_FIELD_ELEMENT(neg_modulus_0, neg_modulus_1, neg_modulus_2, neg_modulus_3)
Entry point for Barretenberg command-line interface.
@ SQR
Square a field element.
@ SUB
Subtract two field elements.
@ MUL
Multiply two field elements.