1 #ifndef MPFQ_U64K1_H_
2 #define MPFQ_U64K1_H_
3
4 /* MPFQ generated file -- do not edit */
5
6 #include "mpfq.h"
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include <assert.h>
11 #include <stdint.h>
12 #include <ctype.h>
13 #include <stddef.h>
14 #include <stdio.h>
15 #include "assert.h"
16 #include "mpfq_vbase.h"
17 #ifdef MPFQ_LAST_GENERATED_TAG
18 #undef MPFQ_LAST_GENERATED_TAG
19 #endif
20 #define MPFQ_LAST_GENERATED_TAG u64k1
21
22 /* Active handler: simd_u64k */
23 /* Automatically generated code */
24 /* Active handler: Mpfq::defaults */
25 /* Active handler: Mpfq::defaults::vec */
26 /* Active handler: simd_dotprod */
27 /* Active handler: io */
28 /* Active handler: trivialities */
29 /* Active handler: simd_char2 */
30 /* Options used:{
31 family=[
32 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_m128, tag=m128, },
33 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k1, tag=u64k1, },
34 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k2, tag=u64k2, },
35 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k3, tag=u64k3, },
36 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k4, tag=u64k4, },
37 ],
38 k=1,
39 tag=u64k1,
40 vbase_stuff={
41 choose_byfeatures=<code>,
42 families=[
43 [
44 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_m128, tag=m128, },
45 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k1, tag=u64k1, },
46 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k2, tag=u64k2, },
47 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k3, tag=u64k3, },
48 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k4, tag=u64k4, },
49 ],
50 [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_1, tag=p_1, }, ],
51 [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_10, tag=p_10, }, ],
52 [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_11, tag=p_11, }, ],
53 [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_12, tag=p_12, }, ],
54 [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_13, tag=p_13, }, ],
55 [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_14, tag=p_14, }, ],
56 [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_15, tag=p_15, }, ],
57 [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_2, tag=p_2, }, ],
58 [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_3, tag=p_3, }, ],
59 [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_4, tag=p_4, }, ],
60 [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_5, tag=p_5, }, ],
61 [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_6, tag=p_6, }, ],
62 [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_7, tag=p_7, }, ],
63 [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_8, tag=p_8, }, ],
64 [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_9, tag=p_9, }, ],
65 [ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_pz, tag=pz, }, ],
66 ],
67 member_templates_restrict={
68 m128=[
69 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_m128, tag=m128, },
70 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k1, tag=u64k1, },
71 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k2, tag=u64k2, },
72 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k3, tag=u64k3, },
73 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k4, tag=u64k4, },
74 ],
75 p_1=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_1, tag=p_1, }, ],
76 p_10=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_10, tag=p_10, }, ],
77 p_11=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_11, tag=p_11, }, ],
78 p_12=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_12, tag=p_12, }, ],
79 p_13=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_13, tag=p_13, }, ],
80 p_14=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_14, tag=p_14, }, ],
81 p_15=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_15, tag=p_15, }, ],
82 p_2=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_2, tag=p_2, }, ],
83 p_3=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_3, tag=p_3, }, ],
84 p_4=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_4, tag=p_4, }, ],
85 p_5=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_5, tag=p_5, }, ],
86 p_6=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_6, tag=p_6, }, ],
87 p_7=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_7, tag=p_7, }, ],
88 p_8=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_8, tag=p_8, }, ],
89 p_9=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_p_9, tag=p_9, }, ],
90 pz=[ { cpp_ifdef=COMPILE_MPFQ_PRIME_FIELD_pz, tag=pz, }, ],
91 u64k1=[
92 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_m128, tag=m128, },
93 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k1, tag=u64k1, },
94 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k2, tag=u64k2, },
95 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k3, tag=u64k3, },
96 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k4, tag=u64k4, },
97 ],
98 u64k2=[
99 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_m128, tag=m128, },
100 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k1, tag=u64k1, },
101 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k2, tag=u64k2, },
102 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k3, tag=u64k3, },
103 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k4, tag=u64k4, },
104 ],
105 u64k3=[
106 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_m128, tag=m128, },
107 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k1, tag=u64k1, },
108 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k2, tag=u64k2, },
109 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k3, tag=u64k3, },
110 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k4, tag=u64k4, },
111 ],
112 u64k4=[
113 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_m128, tag=m128, },
114 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k1, tag=u64k1, },
115 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k2, tag=u64k2, },
116 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k3, tag=u64k3, },
117 { cpp_ifdef=COMPILE_MPFQ_BINARY_FIELD_u64k4, tag=u64k4, },
118 ],
119 },
120 vc:includes=[ <stdarg.h>, ],
121 },
122 virtual_base={
123 filebase=mpfq_vbase,
124 global_prefix=mpfq_,
125 name=mpfq_vbase,
126 substitutions=[
127 [ (?^:mpfq_u64k1_elt \*), void *, ],
128 [ (?^:mpfq_u64k1_src_elt\b), const void *, ],
129 [ (?^:mpfq_u64k1_elt\b), void *, ],
130 [ (?^:mpfq_u64k1_dst_elt\b), void *, ],
131 [ (?^:mpfq_u64k1_elt_ur \*), void *, ],
132 [ (?^:mpfq_u64k1_src_elt_ur\b), const void *, ],
133 [ (?^:mpfq_u64k1_elt_ur\b), void *, ],
134 [ (?^:mpfq_u64k1_dst_elt_ur\b), void *, ],
135 [ (?^:mpfq_u64k1_vec \*), void *, ],
136 [ (?^:mpfq_u64k1_src_vec\b), const void *, ],
137 [ (?^:mpfq_u64k1_vec\b), void *, ],
138 [ (?^:mpfq_u64k1_dst_vec\b), void *, ],
139 [ (?^:mpfq_u64k1_vec_ur \*), void *, ],
140 [ (?^:mpfq_u64k1_src_vec_ur\b), const void *, ],
141 [ (?^:mpfq_u64k1_vec_ur\b), void *, ],
142 [ (?^:mpfq_u64k1_dst_vec_ur\b), void *, ],
143 [ (?^:mpfq_u64k1_poly \*), void *, ],
144 [ (?^:mpfq_u64k1_src_poly\b), const void *, ],
145 [ (?^:mpfq_u64k1_poly\b), void *, ],
146 [ (?^:mpfq_u64k1_dst_poly\b), void *, ],
147 ],
148 },
149 w=64,
150 } */
151
152 typedef struct {
153 /* empty struct is not allowed in C. No, really it's not allowed. */
154 char c;
155 } mpfq_u64k1_field_struct;
156 typedef mpfq_u64k1_field_struct mpfq_u64k1_field [1];
157 typedef mpfq_u64k1_field_struct * mpfq_u64k1_dst_field;
158 typedef const mpfq_u64k1_field_struct * mpfq_u64k1_src_field;
159
160 typedef uint64_t mpfq_u64k1_elt[1];
161 typedef uint64_t * mpfq_u64k1_dst_elt;
162 typedef const uint64_t * mpfq_u64k1_src_elt;
163
164 typedef uint64_t mpfq_u64k1_elt_ur[1];
165 typedef uint64_t * mpfq_u64k1_dst_elt_ur;
166 typedef const uint64_t * mpfq_u64k1_src_elt_ur;
167
168 typedef mpfq_u64k1_elt * mpfq_u64k1_vec;
169 typedef mpfq_u64k1_elt * mpfq_u64k1_dst_vec;
170 typedef mpfq_u64k1_elt * mpfq_u64k1_src_vec;
171
172 typedef mpfq_u64k1_elt_ur * mpfq_u64k1_vec_ur;
173 typedef mpfq_u64k1_elt_ur * mpfq_u64k1_dst_vec_ur;
174 typedef mpfq_u64k1_elt_ur * mpfq_u64k1_src_vec_ur;
175
176 typedef struct {
177 mpfq_u64k1_vec c;
178 unsigned long alloc;
179 unsigned long size;
180 } mpfq_u64k1_poly_struct;
181 typedef mpfq_u64k1_poly_struct mpfq_u64k1_poly [1];
182 typedef mpfq_u64k1_poly_struct * mpfq_u64k1_dst_poly;
183 typedef const mpfq_u64k1_poly_struct * mpfq_u64k1_src_poly;
184
185 #ifdef __cplusplus
186 extern "C" {
187 #endif
188 /* *Mpfq::defaults::code_for_impl_name */
189 #define mpfq_u64k1_impl_name() "u64k1"
190 /* *simd_char2::code_for_impl_max_characteristic_bits */
191 #define mpfq_u64k1_impl_max_characteristic_bits() 2
192 /* *simd_char2::code_for_impl_max_degree */
193 #define mpfq_u64k1_impl_max_degree() 1
194
195 /* Functions operating on the field structure */
196 /* *simd_char2::code_for_field_characteristic */
197 #define mpfq_u64k1_field_characteristic(K, z) mpz_set_ui(z,2)
198 mpz_srcptr mpfq_u64k1_field_characteristic_srcptr(mpfq_u64k1_src_field);
199 /* *simd_char2::code_for_field_degree */
200 #define mpfq_u64k1_field_degree(f) 1
201 /* *simd_char2::code_for_field_init */
202 #define mpfq_u64k1_field_init(f) ((mpfq_u64k1_dst_field) (f))->c=0
203 /* *simd_char2::code_for_field_clear */
204 #define mpfq_u64k1_field_clear(K) /**/
205 void mpfq_u64k1_field_specify(mpfq_u64k1_dst_field, unsigned long, const void *);
206 /* *simd_char2::code_for_field_setopt */
207 #define mpfq_u64k1_field_setopt(f, x, y) /**/
208
209 /* Element allocation functions */
210 /* *Mpfq::defaults::flatdata::code_for_init, simd_flat, simd_char2 */
211 #define mpfq_u64k1_init(f, px) /**/
212 /* *Mpfq::defaults::flatdata::code_for_clear, simd_flat, simd_char2 */
213 #define mpfq_u64k1_clear(f, px) /**/
214 /* *Mpfq::defaults::flatdata::code_for_elt_stride, simd_flat, simd_char2 */
215 #define mpfq_u64k1_elt_stride(k) sizeof(mpfq_u64k1_elt)
216
217 /* Elementary assignment functions */
218 static inline
219 void mpfq_u64k1_set(mpfq_u64k1_dst_field, mpfq_u64k1_dst_elt, mpfq_u64k1_src_elt);
220 static inline
221 void mpfq_u64k1_set_zero(mpfq_u64k1_dst_field, mpfq_u64k1_dst_elt);
222
223 /* Assignment of random values */
224 static inline
225 void mpfq_u64k1_random(mpfq_u64k1_dst_field, mpfq_u64k1_dst_elt, gmp_randstate_t);
226 static inline
227 void mpfq_u64k1_random2(mpfq_u64k1_dst_field, mpfq_u64k1_dst_elt, gmp_randstate_t);
228
229 /* Arithmetic operations on elements */
230 static inline
231 void mpfq_u64k1_add(mpfq_u64k1_dst_field, mpfq_u64k1_dst_elt, mpfq_u64k1_src_elt, mpfq_u64k1_src_elt);
232 /* *simd_char2::code_for_sub */
233 #define mpfq_u64k1_sub(K, r, s1, s2) mpfq_u64k1_add(K,r,s1,s2)
234 /* *simd_char2::code_for_neg */
235 #define mpfq_u64k1_neg(K, r, s) mpfq_u64k1_set(K,r,s)
236 static inline
237 void mpfq_u64k1_mul(mpfq_u64k1_dst_field, mpfq_u64k1_dst_elt, mpfq_u64k1_src_elt, mpfq_u64k1_src_elt);
238 static inline
239 int mpfq_u64k1_inv(mpfq_u64k1_dst_field, mpfq_u64k1_dst_elt, mpfq_u64k1_src_elt);
240
241 /* Operations involving unreduced elements */
242 /* *Mpfq::defaults::flatdata::code_for_elt_ur_init, simd_flat, simd_char2 */
243 #define mpfq_u64k1_elt_ur_init(f, px) /**/
244 /* *Mpfq::defaults::flatdata::code_for_elt_ur_clear, simd_flat, simd_char2 */
245 #define mpfq_u64k1_elt_ur_clear(f, px) /**/
246 /* *Mpfq::defaults::flatdata::code_for_elt_ur_stride, simd_flat, simd_char2 */
247 #define mpfq_u64k1_elt_ur_stride(k) sizeof(mpfq_u64k1_elt_ur)
248 static inline
249 void mpfq_u64k1_elt_ur_set(mpfq_u64k1_dst_field, mpfq_u64k1_dst_elt_ur, mpfq_u64k1_src_elt_ur);
250 static inline
251 void mpfq_u64k1_elt_ur_set_elt(mpfq_u64k1_dst_field, mpfq_u64k1_dst_elt_ur, mpfq_u64k1_src_elt);
252 static inline
253 void mpfq_u64k1_elt_ur_set_zero(mpfq_u64k1_dst_field, mpfq_u64k1_dst_elt_ur);
254 static inline
255 void mpfq_u64k1_elt_ur_add(mpfq_u64k1_dst_field, mpfq_u64k1_dst_elt_ur, mpfq_u64k1_src_elt_ur, mpfq_u64k1_src_elt_ur);
256 /* *simd_char2::code_for_elt_ur_neg */
257 #define mpfq_u64k1_elt_ur_neg(K, r, s) mpfq_u64k1_elt_ur_set(K,r,s)
258 /* *simd_char2::code_for_elt_ur_sub */
259 #define mpfq_u64k1_elt_ur_sub(K, r, s1, s2) mpfq_u64k1_elt_ur_add(K,r,s1,s2)
260 static inline
261 void mpfq_u64k1_mul_ur(mpfq_u64k1_dst_field, mpfq_u64k1_dst_elt_ur, mpfq_u64k1_src_elt, mpfq_u64k1_src_elt);
262 static inline
263 void mpfq_u64k1_reduce(mpfq_u64k1_dst_field, mpfq_u64k1_dst_elt, mpfq_u64k1_dst_elt_ur);
264
265 /* Comparison functions */
266 static inline
267 int mpfq_u64k1_cmp(mpfq_u64k1_dst_field, mpfq_u64k1_src_elt, mpfq_u64k1_src_elt);
268 static inline
269 int mpfq_u64k1_is_zero(mpfq_u64k1_dst_field, mpfq_u64k1_src_elt);
270
271 /* Input/output functions */
272 int mpfq_u64k1_asprint(mpfq_u64k1_dst_field, char * *, mpfq_u64k1_src_elt);
273 int mpfq_u64k1_fprint(mpfq_u64k1_dst_field, FILE *, mpfq_u64k1_src_elt);
274 /* *io::code_for_print */
275 #define mpfq_u64k1_print(k, x) mpfq_u64k1_fprint(k,stdout,x)
276 int mpfq_u64k1_sscan(mpfq_u64k1_dst_field, mpfq_u64k1_dst_elt, const char *);
277 int mpfq_u64k1_fscan(mpfq_u64k1_dst_field, FILE *, mpfq_u64k1_dst_elt);
278 /* *Mpfq::defaults::code_for_scan */
279 #define mpfq_u64k1_scan(k, x) mpfq_u64k1_fscan(k,stdin,x)
280
281 /* Vector functions */
282 void mpfq_u64k1_vec_init(mpfq_u64k1_dst_field, mpfq_u64k1_vec *, unsigned long);
283 void mpfq_u64k1_vec_reinit(mpfq_u64k1_dst_field, mpfq_u64k1_vec *, unsigned long, unsigned long);
284 void mpfq_u64k1_vec_clear(mpfq_u64k1_dst_field, mpfq_u64k1_vec *, unsigned long);
285 static inline
286 void mpfq_u64k1_vec_set(mpfq_u64k1_dst_field, mpfq_u64k1_dst_vec, mpfq_u64k1_src_vec, unsigned long);
287 static inline
288 void mpfq_u64k1_vec_set_zero(mpfq_u64k1_dst_field, mpfq_u64k1_dst_vec, unsigned long);
289 static inline
290 void mpfq_u64k1_vec_setcoeff(mpfq_u64k1_dst_field, mpfq_u64k1_dst_vec, mpfq_u64k1_src_elt, unsigned long);
291 /* missing vec_setcoeff_ui */
292 static inline
293 void mpfq_u64k1_vec_getcoeff(mpfq_u64k1_dst_field, mpfq_u64k1_dst_elt, mpfq_u64k1_src_vec, unsigned long);
294 static inline
295 void mpfq_u64k1_vec_add(mpfq_u64k1_dst_field, mpfq_u64k1_dst_vec, mpfq_u64k1_src_vec, mpfq_u64k1_src_vec, unsigned long);
296 static inline
297 void mpfq_u64k1_vec_neg(mpfq_u64k1_dst_field, mpfq_u64k1_dst_vec, mpfq_u64k1_src_vec, unsigned long);
298 static inline
299 void mpfq_u64k1_vec_rev(mpfq_u64k1_dst_field, mpfq_u64k1_dst_vec, mpfq_u64k1_src_vec, unsigned long);
300 static inline
301 void mpfq_u64k1_vec_sub(mpfq_u64k1_dst_field, mpfq_u64k1_dst_vec, mpfq_u64k1_src_vec, mpfq_u64k1_src_vec, unsigned long);
302 static inline
303 void mpfq_u64k1_vec_scal_mul(mpfq_u64k1_dst_field, mpfq_u64k1_dst_vec, mpfq_u64k1_src_vec, mpfq_u64k1_src_elt, unsigned long);
304 void mpfq_u64k1_vec_random(mpfq_u64k1_dst_field, mpfq_u64k1_dst_vec, unsigned long, gmp_randstate_t);
305 void mpfq_u64k1_vec_random2(mpfq_u64k1_dst_field, mpfq_u64k1_dst_vec, unsigned long, gmp_randstate_t);
306 long mpfq_u64k1_vec_cmp(mpfq_u64k1_dst_field, mpfq_u64k1_src_vec, mpfq_u64k1_src_vec, unsigned long);
307 long mpfq_u64k1_vec_is_zero(mpfq_u64k1_dst_field, mpfq_u64k1_src_vec, unsigned long);
308 static inline
309 mpfq_u64k1_dst_vec mpfq_u64k1_vec_subvec(mpfq_u64k1_dst_field, mpfq_u64k1_dst_vec, long);
310 static inline
311 mpfq_u64k1_src_vec mpfq_u64k1_vec_subvec_const(mpfq_u64k1_dst_field, mpfq_u64k1_src_vec, long);
312 static inline
313 mpfq_u64k1_dst_elt mpfq_u64k1_vec_coeff_ptr(mpfq_u64k1_dst_field, mpfq_u64k1_dst_vec, long);
314 static inline
315 mpfq_u64k1_src_elt mpfq_u64k1_vec_coeff_ptr_const(mpfq_u64k1_dst_field, mpfq_u64k1_src_vec, long);
316 long mpfq_u64k1_vec_asprint(mpfq_u64k1_dst_field, char * *, mpfq_u64k1_src_vec, unsigned long);
317 long mpfq_u64k1_vec_fprint(mpfq_u64k1_dst_field, FILE *, mpfq_u64k1_src_vec, unsigned long);
318 long mpfq_u64k1_vec_print(mpfq_u64k1_dst_field, mpfq_u64k1_src_vec, unsigned long);
319 long mpfq_u64k1_vec_sscan(mpfq_u64k1_dst_field, mpfq_u64k1_vec *, unsigned long *, const char *);
320 long mpfq_u64k1_vec_fscan(mpfq_u64k1_dst_field, FILE *, mpfq_u64k1_vec *, unsigned long *);
321 /* *Mpfq::defaults::vec::io::code_for_vec_scan, Mpfq::defaults::vec */
322 #define mpfq_u64k1_vec_scan(K, w, n) mpfq_u64k1_vec_fscan(K,stdin,w,n)
323 long mpfq_u64k1_vec_hamming_weight(mpfq_u64k1_dst_field, mpfq_u64k1_src_vec, unsigned long);
324 long mpfq_u64k1_vec_find_first_set(mpfq_u64k1_dst_field, mpfq_u64k1_src_vec, unsigned long);
325 long mpfq_u64k1_vec_simd_hamming_weight(mpfq_u64k1_dst_field, mpfq_u64k1_src_vec, unsigned long);
326 long mpfq_u64k1_vec_simd_find_first_set(mpfq_u64k1_dst_field, mpfq_u64k1_src_vec, unsigned long);
327 void mpfq_u64k1_vec_ur_init(mpfq_u64k1_dst_field, mpfq_u64k1_vec_ur *, unsigned long);
328 static inline
329 void mpfq_u64k1_vec_ur_set_zero(mpfq_u64k1_dst_field, mpfq_u64k1_dst_vec_ur, unsigned long);
330 static inline
331 void mpfq_u64k1_vec_ur_set_vec(mpfq_u64k1_dst_field, mpfq_u64k1_dst_vec_ur, mpfq_u64k1_src_vec, unsigned long);
332 void mpfq_u64k1_vec_ur_reinit(mpfq_u64k1_dst_field, mpfq_u64k1_vec_ur *, unsigned long, unsigned long);
333 void mpfq_u64k1_vec_ur_clear(mpfq_u64k1_dst_field, mpfq_u64k1_vec_ur *, unsigned long);
334 static inline
335 void mpfq_u64k1_vec_ur_set(mpfq_u64k1_dst_field, mpfq_u64k1_dst_vec_ur, mpfq_u64k1_src_vec_ur, unsigned long);
336 static inline
337 void mpfq_u64k1_vec_ur_setcoeff(mpfq_u64k1_dst_field, mpfq_u64k1_dst_vec_ur, mpfq_u64k1_src_elt_ur, unsigned long);
338 static inline
339 void mpfq_u64k1_vec_ur_getcoeff(mpfq_u64k1_dst_field, mpfq_u64k1_dst_elt_ur, mpfq_u64k1_src_vec_ur, unsigned long);
340 static inline
341 void mpfq_u64k1_vec_ur_add(mpfq_u64k1_dst_field, mpfq_u64k1_dst_vec_ur, mpfq_u64k1_src_vec_ur, mpfq_u64k1_src_vec_ur, unsigned long);
342 static inline
343 void mpfq_u64k1_vec_ur_sub(mpfq_u64k1_dst_field, mpfq_u64k1_dst_vec_ur, mpfq_u64k1_src_vec_ur, mpfq_u64k1_src_vec_ur, unsigned long);
344 static inline
345 void mpfq_u64k1_vec_ur_neg(mpfq_u64k1_dst_field, mpfq_u64k1_dst_vec_ur, mpfq_u64k1_src_vec_ur, unsigned long);
346 static inline
347 void mpfq_u64k1_vec_ur_rev(mpfq_u64k1_dst_field, mpfq_u64k1_dst_vec_ur, mpfq_u64k1_src_vec_ur, unsigned long);
348 static inline
349 void mpfq_u64k1_vec_scal_mul_ur(mpfq_u64k1_dst_field, mpfq_u64k1_dst_vec_ur, mpfq_u64k1_src_vec, mpfq_u64k1_src_elt, unsigned long);
350 static inline
351 void mpfq_u64k1_vec_reduce(mpfq_u64k1_dst_field, mpfq_u64k1_dst_vec, mpfq_u64k1_dst_vec_ur, unsigned long);
352 static inline
353 mpfq_u64k1_dst_vec_ur mpfq_u64k1_vec_ur_subvec(mpfq_u64k1_dst_field, mpfq_u64k1_dst_vec_ur, long);
354 static inline
355 mpfq_u64k1_src_vec_ur mpfq_u64k1_vec_ur_subvec_const(mpfq_u64k1_dst_field, mpfq_u64k1_src_vec_ur, long);
356 static inline
357 mpfq_u64k1_dst_elt mpfq_u64k1_vec_ur_coeff_ptr(mpfq_u64k1_dst_field, mpfq_u64k1_dst_vec_ur, long);
358 static inline
359 mpfq_u64k1_src_elt mpfq_u64k1_vec_ur_coeff_ptr_const(mpfq_u64k1_dst_field, mpfq_u64k1_src_vec_ur, long);
360 /* *Mpfq::defaults::flatdata::code_for_vec_elt_stride, simd_flat, simd_char2 */
361 #define mpfq_u64k1_vec_elt_stride(k, n) ((n) * mpfq_u64k1_elt_stride((k)))
362 /* *Mpfq::defaults::flatdata::code_for_vec_ur_elt_stride, simd_flat, simd_char2 */
363 #define mpfq_u64k1_vec_ur_elt_stride(k, n) ((n) * mpfq_u64k1_elt_ur_stride((k)))
364
365 /* Polynomial functions */
366
367 /* Functions related to SIMD operation */
368 /* *simd_u64k::code_for_simd_groupsize */
369 #define mpfq_u64k1_simd_groupsize(K) 64
370 static inline
371 int mpfq_u64k1_simd_hamming_weight(mpfq_u64k1_dst_field, mpfq_u64k1_src_elt);
372 static inline
373 int mpfq_u64k1_simd_find_first_set(mpfq_u64k1_dst_field, mpfq_u64k1_src_elt);
374 static inline
375 unsigned long mpfq_u64k1_simd_get_ui_at(mpfq_u64k1_dst_field, mpfq_u64k1_src_elt, int);
376 static inline
377 void mpfq_u64k1_simd_set_ui_at(mpfq_u64k1_dst_field, mpfq_u64k1_dst_elt, int, unsigned long);
378 static inline
379 void mpfq_u64k1_simd_add_ui_at(mpfq_u64k1_dst_field, mpfq_u64k1_dst_elt, mpfq_u64k1_src_elt, int, unsigned long);
380 static inline
381 void mpfq_u64k1_simd_set_ui_all(mpfq_u64k1_dst_field, mpfq_u64k1_dst_elt, unsigned long);
382 void mpfq_u64k1_add_dotprod(mpfq_u64k1_dst_field, mpfq_u64k1_dst_vec, mpfq_u64k1_src_vec, mpfq_u64k1_src_vec, unsigned int);
383
384 /* Member templates related to SIMD operation */
385
386 /* Object-oriented interface */
387 static inline
388 void mpfq_u64k1_oo_field_clear(mpfq_vbase_ptr);
389 void mpfq_u64k1_oo_field_init(mpfq_vbase_ptr);
390 #ifdef __cplusplus
391 }
392 #endif
393
394 /* Implementations for inlines */
395 /* *simd_flat::code_for_set, simd_char2 */
396 static inline
mpfq_u64k1_set(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_elt r,mpfq_u64k1_src_elt s)397 void mpfq_u64k1_set(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_elt r, mpfq_u64k1_src_elt s)
398 {
399 mpfq_copy((mp_limb_t*)r,(const mp_limb_t*)s,sizeof(mpfq_u64k1_elt)/sizeof(mp_limb_t));
400 }
401
402 /* *simd_flat::code_for_set_zero, simd_char2 */
403 static inline
mpfq_u64k1_set_zero(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_elt r)404 void mpfq_u64k1_set_zero(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_elt r)
405 {
406 memset(r, 0, sizeof(mpfq_u64k1_elt));
407 }
408
409 /* *simd_flat::code_for_random, simd_char2 */
410 static inline
mpfq_u64k1_random(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_elt r,gmp_randstate_t state)411 void mpfq_u64k1_random(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_elt r, gmp_randstate_t state)
412 {
413 mpz_t ugly;
414 ugly->_mp_d = (mp_limb_t *) r;
415 ugly->_mp_alloc = sizeof(mpfq_u64k1_elt) / (sizeof(mp_limb_t));
416 ugly->_mp_size = sizeof(mpfq_u64k1_elt) / (sizeof(mp_limb_t));
417 mpz_urandomb(ugly, state, mpfq_u64k1_simd_groupsize(K));
418 }
419
420 /* *simd_flat::code_for_random2, simd_char2 */
421 static inline
mpfq_u64k1_random2(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_elt r,gmp_randstate_t state)422 void mpfq_u64k1_random2(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_elt r, gmp_randstate_t state)
423 {
424 mpz_t ugly;
425 ugly->_mp_d = (mp_limb_t *) r;
426 ugly->_mp_alloc = sizeof(mpfq_u64k1_elt) / (sizeof(mp_limb_t));
427 ugly->_mp_size = sizeof(mpfq_u64k1_elt) / (sizeof(mp_limb_t));
428 mpz_rrandomb(ugly, state, mpfq_u64k1_simd_groupsize(K));
429 }
430
431 /* *simd_char2::code_for_add */
432 static inline
mpfq_u64k1_add(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_elt r,mpfq_u64k1_src_elt s1,mpfq_u64k1_src_elt s2)433 void mpfq_u64k1_add(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_elt r, mpfq_u64k1_src_elt s1, mpfq_u64k1_src_elt s2)
434 {
435 for(unsigned int i = 0 ; i < sizeof(mpfq_u64k1_elt)/sizeof(*r) ; i++) {
436 r[i] = s1[i] ^ s2[i];
437 }
438 }
439
440 /* *simd_char2::code_for_mul */
441 static inline
mpfq_u64k1_mul(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_elt r,mpfq_u64k1_src_elt s1,mpfq_u64k1_src_elt s2)442 void mpfq_u64k1_mul(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_elt r, mpfq_u64k1_src_elt s1, mpfq_u64k1_src_elt s2)
443 {
444 for(unsigned int i = 0 ; i < sizeof(mpfq_u64k1_elt)/sizeof(*r) ; i++) {
445 r[i] = s1[i] & s2[i];
446 }
447 }
448
449 /* *simd_char2::code_for_inv */
450 static inline
mpfq_u64k1_inv(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_elt r,mpfq_u64k1_src_elt s)451 int mpfq_u64k1_inv(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_elt r, mpfq_u64k1_src_elt s)
452 {
453 int rc = 0;
454 for(unsigned int i = 0 ; i < sizeof(mpfq_u64k1_elt)/sizeof(*r) ; i++) {
455 r[i] = s[i];
456 if (r[i]) rc = 1;
457 }
458 return rc;
459 }
460
461 /* *simd_flat::code_for_elt_ur_set, simd_char2 */
462 static inline
mpfq_u64k1_elt_ur_set(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_elt_ur r,mpfq_u64k1_src_elt_ur s)463 void mpfq_u64k1_elt_ur_set(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_elt_ur r, mpfq_u64k1_src_elt_ur s)
464 {
465 mpfq_copy((mp_limb_t*)r,(const mp_limb_t*)s,sizeof(mpfq_u64k1_elt_ur)/sizeof(mp_limb_t));
466 }
467
468 /* *Mpfq::defaults::flatdata::code_for_elt_ur_set_elt, simd_flat, simd_char2 */
469 static inline
mpfq_u64k1_elt_ur_set_elt(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_elt_ur r,mpfq_u64k1_src_elt s)470 void mpfq_u64k1_elt_ur_set_elt(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_elt_ur r, mpfq_u64k1_src_elt s)
471 {
472 memset(r, 0, sizeof(mpfq_u64k1_elt_ur)); memcpy(r,s,sizeof(mpfq_u64k1_elt));
473 }
474
475 /* *Mpfq::defaults::flatdata::code_for_elt_ur_set_zero, simd_flat, simd_char2 */
476 static inline
mpfq_u64k1_elt_ur_set_zero(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_elt_ur r)477 void mpfq_u64k1_elt_ur_set_zero(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_elt_ur r)
478 {
479 memset(r, 0, sizeof(mpfq_u64k1_elt_ur));
480 }
481
482 /* *simd_char2::code_for_elt_ur_add */
483 static inline
mpfq_u64k1_elt_ur_add(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_elt_ur r,mpfq_u64k1_src_elt_ur s1,mpfq_u64k1_src_elt_ur s2)484 void mpfq_u64k1_elt_ur_add(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_elt_ur r, mpfq_u64k1_src_elt_ur s1, mpfq_u64k1_src_elt_ur s2)
485 {
486 for(unsigned int i = 0 ; i < sizeof(mpfq_u64k1_elt)/sizeof(*r) ; i++) {
487 r[i] = s1[i] ^ s2[i];
488 }
489 }
490
491 /* *simd_char2::code_for_mul_ur */
492 static inline
mpfq_u64k1_mul_ur(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_elt_ur r,mpfq_u64k1_src_elt s1,mpfq_u64k1_src_elt s2)493 void mpfq_u64k1_mul_ur(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_elt_ur r, mpfq_u64k1_src_elt s1, mpfq_u64k1_src_elt s2)
494 {
495 for(unsigned int i = 0 ; i < sizeof(mpfq_u64k1_elt)/sizeof(*r) ; i++) {
496 r[i] = s1[i] & s2[i];
497 }
498 }
499
500 /* *simd_char2::code_for_reduce */
501 static inline
mpfq_u64k1_reduce(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_elt r,mpfq_u64k1_dst_elt_ur s)502 void mpfq_u64k1_reduce(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_elt r, mpfq_u64k1_dst_elt_ur s)
503 {
504 mpfq_copy((mp_limb_t*)r,(const mp_limb_t*)s,sizeof(mpfq_u64k1_elt)/sizeof(mp_limb_t));
505 }
506
507 /* *Mpfq::defaults::flatdata::code_for_cmp, simd_flat, simd_char2 */
508 static inline
mpfq_u64k1_cmp(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_src_elt r,mpfq_u64k1_src_elt s)509 int mpfq_u64k1_cmp(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_src_elt r, mpfq_u64k1_src_elt s)
510 {
511 return memcmp(r,s,sizeof(mpfq_u64k1_elt));
512 }
513
514 /* *Mpfq::defaults::flatdata::code_for_is_zero, simd_flat, simd_char2 */
515 static inline
mpfq_u64k1_is_zero(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_src_elt r)516 int mpfq_u64k1_is_zero(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_src_elt r)
517 {
518 unsigned int i;
519 for(i = 0 ; i < sizeof(mpfq_u64k1_elt)/sizeof(r[0]) ; i++) {
520 if (r[i]) return 0;
521 }
522 return 1;
523 }
524
525 /* *Mpfq::defaults::vec::flatdata::code_for_vec_set, Mpfq::defaults::flatdata, simd_flat, simd_char2 */
526 static inline
mpfq_u64k1_vec_set(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_vec r,mpfq_u64k1_src_vec s,unsigned long n)527 void mpfq_u64k1_vec_set(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_vec r, mpfq_u64k1_src_vec s, unsigned long n)
528 {
529 if (r != s) memmove(r, s, n*sizeof(mpfq_u64k1_elt));
530 }
531
532 /* *Mpfq::defaults::vec::flatdata::code_for_vec_set_zero, Mpfq::defaults::flatdata, simd_flat, simd_char2 */
533 static inline
mpfq_u64k1_vec_set_zero(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_vec r,unsigned long n)534 void mpfq_u64k1_vec_set_zero(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_vec r, unsigned long n)
535 {
536 memset(r, 0, n*sizeof(mpfq_u64k1_elt));
537 }
538
539 /* *Mpfq::defaults::vec::generic::code_for_vec_setcoeff, Mpfq::defaults::vec */
540 static inline
mpfq_u64k1_vec_setcoeff(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_vec w,mpfq_u64k1_src_elt x,unsigned long i)541 void mpfq_u64k1_vec_setcoeff(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_vec w, mpfq_u64k1_src_elt x, unsigned long i)
542 {
543 mpfq_u64k1_dst_elt y = mpfq_u64k1_vec_coeff_ptr(K, w, i);
544 mpfq_u64k1_set(K, y, x);
545 }
546
547 /* *Mpfq::defaults::vec::generic::code_for_vec_getcoeff, Mpfq::defaults::vec */
548 static inline
mpfq_u64k1_vec_getcoeff(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_elt x,mpfq_u64k1_src_vec w,unsigned long i)549 void mpfq_u64k1_vec_getcoeff(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_elt x, mpfq_u64k1_src_vec w, unsigned long i)
550 {
551 mpfq_u64k1_src_elt y = mpfq_u64k1_vec_coeff_ptr_const(K, w, i);
552 mpfq_u64k1_set(K, x, y);
553 }
554
555 /* *Mpfq::defaults::vec::addsub::code_for_vec_add, Mpfq::defaults::vec */
556 static inline
mpfq_u64k1_vec_add(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_vec w,mpfq_u64k1_src_vec u,mpfq_u64k1_src_vec v,unsigned long n)557 void mpfq_u64k1_vec_add(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_vec w, mpfq_u64k1_src_vec u, mpfq_u64k1_src_vec v, unsigned long n)
558 {
559 unsigned int i;
560 for(i = 0; i < n; i+=1)
561 mpfq_u64k1_add(K, w[i], u[i], v[i]);
562 }
563
564 /* *Mpfq::defaults::vec::addsub::code_for_vec_neg, Mpfq::defaults::vec */
565 static inline
mpfq_u64k1_vec_neg(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_vec w,mpfq_u64k1_src_vec u,unsigned long n)566 void mpfq_u64k1_vec_neg(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_vec w, mpfq_u64k1_src_vec u, unsigned long n)
567 {
568 unsigned int i;
569 for(i = 0; i < n; ++i)
570 mpfq_u64k1_neg(K, w[i], u[i]);
571 }
572
573 /* *Mpfq::defaults::vec::addsub::code_for_vec_rev, Mpfq::defaults::vec */
574 static inline
mpfq_u64k1_vec_rev(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_vec w,mpfq_u64k1_src_vec u,unsigned long n)575 void mpfq_u64k1_vec_rev(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_vec w, mpfq_u64k1_src_vec u, unsigned long n)
576 {
577 unsigned int nn = n >> 1;
578 mpfq_u64k1_elt tmp[1];
579 mpfq_u64k1_init(K, tmp);
580 unsigned int i;
581 for(i = 0; i < nn; ++i) {
582 mpfq_u64k1_set(K, tmp[0], u[i]);
583 mpfq_u64k1_set(K, w[i], u[n-1-i]);
584 mpfq_u64k1_set(K, w[n-1-i], tmp[0]);
585 }
586 if (n & 1)
587 mpfq_u64k1_set(K, w[nn], u[nn]);
588 mpfq_u64k1_clear(K, tmp);
589 }
590
591 /* *Mpfq::defaults::vec::addsub::code_for_vec_sub, Mpfq::defaults::vec */
592 static inline
mpfq_u64k1_vec_sub(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_vec w,mpfq_u64k1_src_vec u,mpfq_u64k1_src_vec v,unsigned long n)593 void mpfq_u64k1_vec_sub(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_vec w, mpfq_u64k1_src_vec u, mpfq_u64k1_src_vec v, unsigned long n)
594 {
595 unsigned int i;
596 for(i = 0; i < n; ++i)
597 mpfq_u64k1_sub(K, w[i], u[i], v[i]);
598 }
599
600 /* *Mpfq::defaults::vec::mul::code_for_vec_scal_mul, Mpfq::defaults::vec */
601 static inline
mpfq_u64k1_vec_scal_mul(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_vec w,mpfq_u64k1_src_vec u,mpfq_u64k1_src_elt c,unsigned long n)602 void mpfq_u64k1_vec_scal_mul(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_vec w, mpfq_u64k1_src_vec u, mpfq_u64k1_src_elt c, unsigned long n)
603 {
604 unsigned int i;
605 for(i = 0; i < n; i++) {
606 mpfq_u64k1_src_elt x = mpfq_u64k1_vec_coeff_ptr_const(K, u, i);
607 mpfq_u64k1_dst_elt y = mpfq_u64k1_vec_coeff_ptr(K, w, i);
608 mpfq_u64k1_mul(K, y, x, c);
609 }
610 }
611
612 /* *Mpfq::defaults::vec::getset::code_for_vec_subvec, Mpfq::defaults::vec */
613 static inline
mpfq_u64k1_vec_subvec(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_vec v,long i)614 mpfq_u64k1_dst_vec mpfq_u64k1_vec_subvec(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_vec v, long i)
615 {
616 return v+i;
617 }
618
619 /* *Mpfq::defaults::vec::getset::code_for_vec_subvec_const, Mpfq::defaults::vec */
620 static inline
mpfq_u64k1_vec_subvec_const(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_src_vec v,long i)621 mpfq_u64k1_src_vec mpfq_u64k1_vec_subvec_const(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_src_vec v, long i)
622 {
623 return v+i;
624 }
625
626 /* *Mpfq::defaults::vec::getset::code_for_vec_coeff_ptr, Mpfq::defaults::vec */
627 static inline
mpfq_u64k1_vec_coeff_ptr(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_vec v,long i)628 mpfq_u64k1_dst_elt mpfq_u64k1_vec_coeff_ptr(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_vec v, long i)
629 {
630 return v[i];
631 }
632
633 /* *Mpfq::defaults::vec::getset::code_for_vec_coeff_ptr_const, Mpfq::defaults::vec */
634 static inline
mpfq_u64k1_vec_coeff_ptr_const(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_src_vec v,long i)635 mpfq_u64k1_src_elt mpfq_u64k1_vec_coeff_ptr_const(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_src_vec v, long i)
636 {
637 return v[i];
638 }
639
640 /* *Mpfq::defaults::vec::flatdata::code_for_vec_ur_set_zero, Mpfq::defaults::flatdata, simd_flat, simd_char2 */
641 static inline
mpfq_u64k1_vec_ur_set_zero(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_vec_ur r,unsigned long n)642 void mpfq_u64k1_vec_ur_set_zero(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_vec_ur r, unsigned long n)
643 {
644 memset(r, 0, n*sizeof(mpfq_u64k1_elt_ur));
645 }
646
647 /* *Mpfq::defaults::vec::generic::code_for_vec_ur_set_vec, Mpfq::defaults::vec */
648 static inline
mpfq_u64k1_vec_ur_set_vec(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_vec_ur w,mpfq_u64k1_src_vec u,unsigned long n)649 void mpfq_u64k1_vec_ur_set_vec(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_vec_ur w, mpfq_u64k1_src_vec u, unsigned long n)
650 {
651 unsigned int i;
652 for(i = 0; i < n; ++i) {
653 mpfq_u64k1_src_elt x = mpfq_u64k1_vec_coeff_ptr_const(K, u, i);
654 mpfq_u64k1_dst_elt_ur y = mpfq_u64k1_vec_ur_coeff_ptr(K, w, i);
655 mpfq_u64k1_elt_ur_set_elt(K, y, x);
656 }
657 }
658
659 /* *Mpfq::defaults::vec::flatdata::code_for_vec_ur_set, Mpfq::defaults::flatdata, simd_flat, simd_char2 */
660 static inline
mpfq_u64k1_vec_ur_set(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_vec_ur r,mpfq_u64k1_src_vec_ur s,unsigned long n)661 void mpfq_u64k1_vec_ur_set(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_vec_ur r, mpfq_u64k1_src_vec_ur s, unsigned long n)
662 {
663 if (r != s) memmove(r, s, n*sizeof(mpfq_u64k1_elt_ur));
664 }
665
666 /* *Mpfq::defaults::vec::generic::code_for_vec_ur_setcoeff, Mpfq::defaults::vec */
667 static inline
mpfq_u64k1_vec_ur_setcoeff(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_vec_ur w,mpfq_u64k1_src_elt_ur x,unsigned long i)668 void mpfq_u64k1_vec_ur_setcoeff(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_vec_ur w, mpfq_u64k1_src_elt_ur x, unsigned long i)
669 {
670 mpfq_u64k1_dst_elt_ur y = mpfq_u64k1_vec_ur_coeff_ptr(K, w, i);
671 mpfq_u64k1_elt_ur_set(K, y, x);
672 }
673
674 /* *Mpfq::defaults::vec::generic::code_for_vec_ur_getcoeff, Mpfq::defaults::vec */
675 static inline
mpfq_u64k1_vec_ur_getcoeff(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_elt_ur x,mpfq_u64k1_src_vec_ur w,unsigned long i)676 void mpfq_u64k1_vec_ur_getcoeff(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_elt_ur x, mpfq_u64k1_src_vec_ur w, unsigned long i)
677 {
678 mpfq_u64k1_src_elt_ur y = mpfq_u64k1_vec_ur_coeff_ptr_const(K, w, i);
679 mpfq_u64k1_elt_ur_set(K, x, y);
680 }
681
682 /* *Mpfq::defaults::vec::addsub::code_for_vec_ur_add, Mpfq::defaults::vec */
683 static inline
mpfq_u64k1_vec_ur_add(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_vec_ur w,mpfq_u64k1_src_vec_ur u,mpfq_u64k1_src_vec_ur v,unsigned long n)684 void mpfq_u64k1_vec_ur_add(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_vec_ur w, mpfq_u64k1_src_vec_ur u, mpfq_u64k1_src_vec_ur v, unsigned long n)
685 {
686 unsigned int i;
687 for(i = 0; i < n; i+=1)
688 mpfq_u64k1_elt_ur_add(K, w[i], u[i], v[i]);
689 }
690
691 /* *Mpfq::defaults::vec::addsub::code_for_vec_ur_sub, Mpfq::defaults::vec */
692 static inline
mpfq_u64k1_vec_ur_sub(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_vec_ur w,mpfq_u64k1_src_vec_ur u,mpfq_u64k1_src_vec_ur v,unsigned long n)693 void mpfq_u64k1_vec_ur_sub(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_vec_ur w, mpfq_u64k1_src_vec_ur u, mpfq_u64k1_src_vec_ur v, unsigned long n)
694 {
695 unsigned int i;
696 for(i = 0; i < n; i+=1)
697 mpfq_u64k1_elt_ur_sub(K, w[i], u[i], v[i]);
698 }
699
700 /* *Mpfq::defaults::vec::addsub::code_for_vec_ur_neg, Mpfq::defaults::vec */
701 static inline
mpfq_u64k1_vec_ur_neg(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_vec_ur w,mpfq_u64k1_src_vec_ur u,unsigned long n)702 void mpfq_u64k1_vec_ur_neg(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_vec_ur w, mpfq_u64k1_src_vec_ur u, unsigned long n)
703 {
704 unsigned int i;
705 for(i = 0; i < n; ++i)
706 mpfq_u64k1_elt_ur_neg(K, w[i], u[i]);
707 }
708
709 /* *Mpfq::defaults::vec::addsub::code_for_vec_ur_rev, Mpfq::defaults::vec */
710 static inline
mpfq_u64k1_vec_ur_rev(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_vec_ur w,mpfq_u64k1_src_vec_ur u,unsigned long n)711 void mpfq_u64k1_vec_ur_rev(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_vec_ur w, mpfq_u64k1_src_vec_ur u, unsigned long n)
712 {
713 unsigned int nn = n >> 1;
714 mpfq_u64k1_elt_ur tmp[1];
715 mpfq_u64k1_elt_ur_init(K, tmp);
716 unsigned int i;
717 for(i = 0; i < nn; ++i) {
718 mpfq_u64k1_elt_ur_set(K, tmp[0], u[i]);
719 mpfq_u64k1_elt_ur_set(K, w[i], u[n-1-i]);
720 mpfq_u64k1_elt_ur_set(K, w[n-1-i], tmp[0]);
721 }
722 if (n & 1)
723 mpfq_u64k1_elt_ur_set(K, w[nn], u[nn]);
724 mpfq_u64k1_elt_ur_clear(K, tmp);
725 }
726
727 /* *Mpfq::defaults::vec::mul::code_for_vec_scal_mul_ur, Mpfq::defaults::vec */
728 static inline
mpfq_u64k1_vec_scal_mul_ur(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_vec_ur w,mpfq_u64k1_src_vec u,mpfq_u64k1_src_elt c,unsigned long n)729 void mpfq_u64k1_vec_scal_mul_ur(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_vec_ur w, mpfq_u64k1_src_vec u, mpfq_u64k1_src_elt c, unsigned long n)
730 {
731 unsigned int i;
732 for(i = 0; i < n; i++) {
733 mpfq_u64k1_src_elt x = mpfq_u64k1_vec_coeff_ptr_const(K, u, i);
734 mpfq_u64k1_dst_elt_ur y = mpfq_u64k1_vec_ur_coeff_ptr(K, w, i);
735 mpfq_u64k1_mul_ur(K, y, x, c);
736 }
737 }
738
739 /* *Mpfq::defaults::vec::mul::code_for_vec_reduce, Mpfq::defaults::vec */
740 static inline
mpfq_u64k1_vec_reduce(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_vec w,mpfq_u64k1_dst_vec_ur u,unsigned long n)741 void mpfq_u64k1_vec_reduce(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_vec w, mpfq_u64k1_dst_vec_ur u, unsigned long n)
742 {
743 unsigned int i;
744 for(i = 0; i < n; i++) {
745 mpfq_u64k1_dst_elt_ur x = mpfq_u64k1_vec_ur_coeff_ptr(K, u, i);
746 mpfq_u64k1_dst_elt y = mpfq_u64k1_vec_coeff_ptr(K, w, i);
747 mpfq_u64k1_reduce(K, y, x);
748 }
749 }
750
751 /* *Mpfq::defaults::vec::getset::code_for_vec_ur_subvec, Mpfq::defaults::vec */
752 static inline
mpfq_u64k1_vec_ur_subvec(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_vec_ur v,long i)753 mpfq_u64k1_dst_vec_ur mpfq_u64k1_vec_ur_subvec(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_vec_ur v, long i)
754 {
755 return v+i;
756 }
757
758 /* *Mpfq::defaults::vec::getset::code_for_vec_ur_subvec_const, Mpfq::defaults::vec */
759 static inline
mpfq_u64k1_vec_ur_subvec_const(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_src_vec_ur v,long i)760 mpfq_u64k1_src_vec_ur mpfq_u64k1_vec_ur_subvec_const(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_src_vec_ur v, long i)
761 {
762 return v+i;
763 }
764
765 /* *Mpfq::defaults::vec::getset::code_for_vec_ur_coeff_ptr, Mpfq::defaults::vec */
766 static inline
mpfq_u64k1_vec_ur_coeff_ptr(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_vec_ur v,long i)767 mpfq_u64k1_dst_elt mpfq_u64k1_vec_ur_coeff_ptr(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_vec_ur v, long i)
768 {
769 return v[i];
770 }
771
772 /* *Mpfq::defaults::vec::getset::code_for_vec_ur_coeff_ptr_const, Mpfq::defaults::vec */
773 static inline
mpfq_u64k1_vec_ur_coeff_ptr_const(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_src_vec_ur v,long i)774 mpfq_u64k1_src_elt mpfq_u64k1_vec_ur_coeff_ptr_const(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_src_vec_ur v, long i)
775 {
776 return v[i];
777 }
778
779 /* *simd_flat::code_for_simd_hamming_weight, simd_char2 */
780 static inline
mpfq_u64k1_simd_hamming_weight(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_src_elt p)781 int mpfq_u64k1_simd_hamming_weight(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_src_elt p)
782 {
783 int w = 0;
784 #if GNUC_VERSION_ATLEAST(3,4,0)
785 unsigned long * xp = (unsigned long *) p;
786 assert(mpfq_u64k1_elt_stride(K) % sizeof(unsigned long) == 0);
787 for(size_t b = 0 ; b < mpfq_u64k1_elt_stride(K) / sizeof(unsigned long) ; b++) {
788 w += __builtin_popcountl(xp[b]);
789 }
790 #else
791 int tab[16] = { 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4 };
792 uint8_t * xp = (uint8_t *) p;
793 for(size_t b = 0 ; b < mpfq_u64k1_elt_stride(K) ; b++) {
794 w += tab[xp[b]&15] + tab[xp[b]>>4];
795 }
796 #endif
797 return w;
798 }
799
800 /* *simd_flat::code_for_simd_find_first_set, simd_char2 */
801 static inline
mpfq_u64k1_simd_find_first_set(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_src_elt p)802 int mpfq_u64k1_simd_find_first_set(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_src_elt p)
803 {
804 size_t bmax = mpfq_u64k1_elt_stride(K) / (sizeof(mpfq_u64k1_elt));
805 assert(mpfq_u64k1_simd_groupsize(K) % bmax == 0);
806 int g = mpfq_u64k1_simd_groupsize(K) / bmax;
807 int f = 0;
808 for(size_t b = 0 ; b < bmax ; b++, f+=g) {
809 if (!p[b]) continue;
810 #if GNUC_VERSION_ATLEAST(3,4,0)
811 unsigned long * xp = (unsigned long *) (p + b);
812 for(size_t c = 0 ; c < sizeof(mpfq_u64k1_elt) / sizeof(unsigned long) ; c++, f += 64) {
813 if (!xp[c]) continue;
814 return f + __builtin_ctzl(xp[c]);
815 }
816 #else
817 uint8_t * xp = (uint8_t *) (p + b);
818 int tab[16] = { -1,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 };
819 for(size_t c = 0 ; c < sizeof(mpfq_u64k1_elt) ; c++, f += 8) {
820 if (!xp[c]) continue;
821 if (xp[c] & 15) return f + tab[xp[c] & 15];
822 return f + 4 + tab[xp[c] >> 4];
823 }
824 #endif
825 abort();
826 }
827 return -1;
828 }
829
830 /* *simd_flat::code_for_simd_get_ui_at, simd_char2 */
831 static inline
mpfq_u64k1_simd_get_ui_at(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_src_elt p,int k)832 unsigned long mpfq_u64k1_simd_get_ui_at(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_src_elt p, int k)
833 {
834 assert(k < mpfq_u64k1_simd_groupsize(K));
835 uint64_t * xp = (uint64_t *) p;
836 uint64_t mask = ((uint64_t)1) << (k%64);
837 return (xp[k/64] & mask) != 0;
838 }
839
840 /* *simd_flat::code_for_simd_set_ui_at, simd_char2 */
841 static inline
mpfq_u64k1_simd_set_ui_at(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_elt p,int k,unsigned long v)842 void mpfq_u64k1_simd_set_ui_at(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_elt p, int k, unsigned long v)
843 {
844 assert(k < mpfq_u64k1_simd_groupsize(K));
845 uint64_t * xp = (uint64_t *) p;
846 uint64_t mask = ((uint64_t)1) << (k%64);
847 xp[k/64] = (xp[k/64] & ~mask) | ((((uint64_t)v) << (k%64))&mask);
848 }
849
850 /* *simd_flat::code_for_simd_add_ui_at, simd_char2 */
851 static inline
mpfq_u64k1_simd_add_ui_at(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_elt p,mpfq_u64k1_src_elt p0,int k,unsigned long v)852 void mpfq_u64k1_simd_add_ui_at(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_elt p, mpfq_u64k1_src_elt p0, int k, unsigned long v)
853 {
854 mpfq_u64k1_set(K, p, p0);
855 assert(k < mpfq_u64k1_simd_groupsize(K));
856 uint64_t * xp = (uint64_t *) p;
857 uint64_t mask = ((uint64_t)(v&1)) << (k%64);
858 xp[k/64] ^= mask;
859 }
860
861 /* *simd_flat::code_for_simd_set_ui_all, simd_char2 */
862 static inline
mpfq_u64k1_simd_set_ui_all(mpfq_u64k1_dst_field K MAYBE_UNUSED,mpfq_u64k1_dst_elt r,unsigned long v)863 void mpfq_u64k1_simd_set_ui_all(mpfq_u64k1_dst_field K MAYBE_UNUSED, mpfq_u64k1_dst_elt r, unsigned long v)
864 {
865 for(unsigned int i = 0 ; i < sizeof(mpfq_u64k1_elt)/sizeof(*r) ; i++) {
866 r[i] = -v;
867 }
868 }
869
870 /* Mpfq::engine::oo::oo_field_clear */
871 /* Triggered by: oo */
872 static inline
mpfq_u64k1_oo_field_clear(mpfq_vbase_ptr f)873 void mpfq_u64k1_oo_field_clear(mpfq_vbase_ptr f)
874 {
875 mpfq_u64k1_field_clear((mpfq_u64k1_dst_field)(f->obj));
876 free(f->obj);
877 f->obj = NULL;
878 }
879
880
881 #endif /* MPFQ_U64K1_H_ */
882
883 /* vim:set ft=cpp: */
884