1 #ifndef MPFQ_U64K3_H_
2 #define MPFQ_U64K3_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      u64k3
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=3,
39    tag=u64k3,
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_u64k3_elt \*), void *, ],
128      [ (?^:mpfq_u64k3_src_elt\b), const void *, ],
129      [ (?^:mpfq_u64k3_elt\b), void *, ],
130      [ (?^:mpfq_u64k3_dst_elt\b), void *, ],
131      [ (?^:mpfq_u64k3_elt_ur \*), void *, ],
132      [ (?^:mpfq_u64k3_src_elt_ur\b), const void *, ],
133      [ (?^:mpfq_u64k3_elt_ur\b), void *, ],
134      [ (?^:mpfq_u64k3_dst_elt_ur\b), void *, ],
135      [ (?^:mpfq_u64k3_vec \*), void *, ],
136      [ (?^:mpfq_u64k3_src_vec\b), const void *, ],
137      [ (?^:mpfq_u64k3_vec\b), void *, ],
138      [ (?^:mpfq_u64k3_dst_vec\b), void *, ],
139      [ (?^:mpfq_u64k3_vec_ur \*), void *, ],
140      [ (?^:mpfq_u64k3_src_vec_ur\b), const void *, ],
141      [ (?^:mpfq_u64k3_vec_ur\b), void *, ],
142      [ (?^:mpfq_u64k3_dst_vec_ur\b), void *, ],
143      [ (?^:mpfq_u64k3_poly \*), void *, ],
144      [ (?^:mpfq_u64k3_src_poly\b), const void *, ],
145      [ (?^:mpfq_u64k3_poly\b), void *, ],
146      [ (?^:mpfq_u64k3_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_u64k3_field_struct;
156 typedef mpfq_u64k3_field_struct mpfq_u64k3_field [1];
157 typedef mpfq_u64k3_field_struct * mpfq_u64k3_dst_field;
158 typedef const mpfq_u64k3_field_struct * mpfq_u64k3_src_field;
159 
160 typedef uint64_t mpfq_u64k3_elt[3];
161 typedef uint64_t * mpfq_u64k3_dst_elt;
162 typedef const uint64_t * mpfq_u64k3_src_elt;
163 
164 typedef uint64_t mpfq_u64k3_elt_ur[3];
165 typedef uint64_t * mpfq_u64k3_dst_elt_ur;
166 typedef const uint64_t * mpfq_u64k3_src_elt_ur;
167 
168 typedef mpfq_u64k3_elt * mpfq_u64k3_vec;
169 typedef mpfq_u64k3_elt * mpfq_u64k3_dst_vec;
170 typedef mpfq_u64k3_elt * mpfq_u64k3_src_vec;
171 
172 typedef mpfq_u64k3_elt_ur * mpfq_u64k3_vec_ur;
173 typedef mpfq_u64k3_elt_ur * mpfq_u64k3_dst_vec_ur;
174 typedef mpfq_u64k3_elt_ur * mpfq_u64k3_src_vec_ur;
175 
176 typedef struct {
177   mpfq_u64k3_vec c;
178   unsigned long alloc;
179   unsigned long size;
180 } mpfq_u64k3_poly_struct;
181 typedef mpfq_u64k3_poly_struct mpfq_u64k3_poly [1];
182 typedef mpfq_u64k3_poly_struct * mpfq_u64k3_dst_poly;
183 typedef const mpfq_u64k3_poly_struct * mpfq_u64k3_src_poly;
184 
185 #ifdef  __cplusplus
186 extern "C" {
187 #endif
188 /* *Mpfq::defaults::code_for_impl_name */
189 #define mpfq_u64k3_impl_name()	"u64k3"
190 /* *simd_char2::code_for_impl_max_characteristic_bits */
191 #define mpfq_u64k3_impl_max_characteristic_bits()	2
192 /* *simd_char2::code_for_impl_max_degree */
193 #define mpfq_u64k3_impl_max_degree()	1
194 
195 /* Functions operating on the field structure */
196 /* *simd_char2::code_for_field_characteristic */
197 #define mpfq_u64k3_field_characteristic(K, z)	mpz_set_ui(z,2)
198 mpz_srcptr mpfq_u64k3_field_characteristic_srcptr(mpfq_u64k3_src_field);
199 /* *simd_char2::code_for_field_degree */
200 #define mpfq_u64k3_field_degree(f)	1
201 /* *simd_char2::code_for_field_init */
202 #define mpfq_u64k3_field_init(f)	((mpfq_u64k3_dst_field) (f))->c=0
203 /* *simd_char2::code_for_field_clear */
204 #define mpfq_u64k3_field_clear(K)	/**/
205 void mpfq_u64k3_field_specify(mpfq_u64k3_dst_field, unsigned long, const void *);
206 /* *simd_char2::code_for_field_setopt */
207 #define mpfq_u64k3_field_setopt(f, x, y)	/**/
208 
209 /* Element allocation functions */
210 /* *Mpfq::defaults::flatdata::code_for_init, simd_flat, simd_char2 */
211 #define mpfq_u64k3_init(f, px)	/**/
212 /* *Mpfq::defaults::flatdata::code_for_clear, simd_flat, simd_char2 */
213 #define mpfq_u64k3_clear(f, px)	/**/
214 /* *Mpfq::defaults::flatdata::code_for_elt_stride, simd_flat, simd_char2 */
215 #define mpfq_u64k3_elt_stride(k)	sizeof(mpfq_u64k3_elt)
216 
217 /* Elementary assignment functions */
218 static inline
219 void mpfq_u64k3_set(mpfq_u64k3_dst_field, mpfq_u64k3_dst_elt, mpfq_u64k3_src_elt);
220 static inline
221 void mpfq_u64k3_set_zero(mpfq_u64k3_dst_field, mpfq_u64k3_dst_elt);
222 
223 /* Assignment of random values */
224 static inline
225 void mpfq_u64k3_random(mpfq_u64k3_dst_field, mpfq_u64k3_dst_elt, gmp_randstate_t);
226 static inline
227 void mpfq_u64k3_random2(mpfq_u64k3_dst_field, mpfq_u64k3_dst_elt, gmp_randstate_t);
228 
229 /* Arithmetic operations on elements */
230 static inline
231 void mpfq_u64k3_add(mpfq_u64k3_dst_field, mpfq_u64k3_dst_elt, mpfq_u64k3_src_elt, mpfq_u64k3_src_elt);
232 /* *simd_char2::code_for_sub */
233 #define mpfq_u64k3_sub(K, r, s1, s2)	mpfq_u64k3_add(K,r,s1,s2)
234 /* *simd_char2::code_for_neg */
235 #define mpfq_u64k3_neg(K, r, s)	mpfq_u64k3_set(K,r,s)
236 static inline
237 void mpfq_u64k3_mul(mpfq_u64k3_dst_field, mpfq_u64k3_dst_elt, mpfq_u64k3_src_elt, mpfq_u64k3_src_elt);
238 static inline
239 int mpfq_u64k3_inv(mpfq_u64k3_dst_field, mpfq_u64k3_dst_elt, mpfq_u64k3_src_elt);
240 
241 /* Operations involving unreduced elements */
242 /* *Mpfq::defaults::flatdata::code_for_elt_ur_init, simd_flat, simd_char2 */
243 #define mpfq_u64k3_elt_ur_init(f, px)	/**/
244 /* *Mpfq::defaults::flatdata::code_for_elt_ur_clear, simd_flat, simd_char2 */
245 #define mpfq_u64k3_elt_ur_clear(f, px)	/**/
246 /* *Mpfq::defaults::flatdata::code_for_elt_ur_stride, simd_flat, simd_char2 */
247 #define mpfq_u64k3_elt_ur_stride(k)	sizeof(mpfq_u64k3_elt_ur)
248 static inline
249 void mpfq_u64k3_elt_ur_set(mpfq_u64k3_dst_field, mpfq_u64k3_dst_elt_ur, mpfq_u64k3_src_elt_ur);
250 static inline
251 void mpfq_u64k3_elt_ur_set_elt(mpfq_u64k3_dst_field, mpfq_u64k3_dst_elt_ur, mpfq_u64k3_src_elt);
252 static inline
253 void mpfq_u64k3_elt_ur_set_zero(mpfq_u64k3_dst_field, mpfq_u64k3_dst_elt_ur);
254 static inline
255 void mpfq_u64k3_elt_ur_add(mpfq_u64k3_dst_field, mpfq_u64k3_dst_elt_ur, mpfq_u64k3_src_elt_ur, mpfq_u64k3_src_elt_ur);
256 /* *simd_char2::code_for_elt_ur_neg */
257 #define mpfq_u64k3_elt_ur_neg(K, r, s)	mpfq_u64k3_elt_ur_set(K,r,s)
258 /* *simd_char2::code_for_elt_ur_sub */
259 #define mpfq_u64k3_elt_ur_sub(K, r, s1, s2)	mpfq_u64k3_elt_ur_add(K,r,s1,s2)
260 static inline
261 void mpfq_u64k3_mul_ur(mpfq_u64k3_dst_field, mpfq_u64k3_dst_elt_ur, mpfq_u64k3_src_elt, mpfq_u64k3_src_elt);
262 static inline
263 void mpfq_u64k3_reduce(mpfq_u64k3_dst_field, mpfq_u64k3_dst_elt, mpfq_u64k3_dst_elt_ur);
264 
265 /* Comparison functions */
266 static inline
267 int mpfq_u64k3_cmp(mpfq_u64k3_dst_field, mpfq_u64k3_src_elt, mpfq_u64k3_src_elt);
268 static inline
269 int mpfq_u64k3_is_zero(mpfq_u64k3_dst_field, mpfq_u64k3_src_elt);
270 
271 /* Input/output functions */
272 int mpfq_u64k3_asprint(mpfq_u64k3_dst_field, char * *, mpfq_u64k3_src_elt);
273 int mpfq_u64k3_fprint(mpfq_u64k3_dst_field, FILE *, mpfq_u64k3_src_elt);
274 /* *io::code_for_print */
275 #define mpfq_u64k3_print(k, x)	mpfq_u64k3_fprint(k,stdout,x)
276 int mpfq_u64k3_sscan(mpfq_u64k3_dst_field, mpfq_u64k3_dst_elt, const char *);
277 int mpfq_u64k3_fscan(mpfq_u64k3_dst_field, FILE *, mpfq_u64k3_dst_elt);
278 /* *Mpfq::defaults::code_for_scan */
279 #define mpfq_u64k3_scan(k, x)	mpfq_u64k3_fscan(k,stdin,x)
280 
281 /* Vector functions */
282 void mpfq_u64k3_vec_init(mpfq_u64k3_dst_field, mpfq_u64k3_vec *, unsigned long);
283 void mpfq_u64k3_vec_reinit(mpfq_u64k3_dst_field, mpfq_u64k3_vec *, unsigned long, unsigned long);
284 void mpfq_u64k3_vec_clear(mpfq_u64k3_dst_field, mpfq_u64k3_vec *, unsigned long);
285 static inline
286 void mpfq_u64k3_vec_set(mpfq_u64k3_dst_field, mpfq_u64k3_dst_vec, mpfq_u64k3_src_vec, unsigned long);
287 static inline
288 void mpfq_u64k3_vec_set_zero(mpfq_u64k3_dst_field, mpfq_u64k3_dst_vec, unsigned long);
289 static inline
290 void mpfq_u64k3_vec_setcoeff(mpfq_u64k3_dst_field, mpfq_u64k3_dst_vec, mpfq_u64k3_src_elt, unsigned long);
291 /* missing vec_setcoeff_ui */
292 static inline
293 void mpfq_u64k3_vec_getcoeff(mpfq_u64k3_dst_field, mpfq_u64k3_dst_elt, mpfq_u64k3_src_vec, unsigned long);
294 static inline
295 void mpfq_u64k3_vec_add(mpfq_u64k3_dst_field, mpfq_u64k3_dst_vec, mpfq_u64k3_src_vec, mpfq_u64k3_src_vec, unsigned long);
296 static inline
297 void mpfq_u64k3_vec_neg(mpfq_u64k3_dst_field, mpfq_u64k3_dst_vec, mpfq_u64k3_src_vec, unsigned long);
298 static inline
299 void mpfq_u64k3_vec_rev(mpfq_u64k3_dst_field, mpfq_u64k3_dst_vec, mpfq_u64k3_src_vec, unsigned long);
300 static inline
301 void mpfq_u64k3_vec_sub(mpfq_u64k3_dst_field, mpfq_u64k3_dst_vec, mpfq_u64k3_src_vec, mpfq_u64k3_src_vec, unsigned long);
302 static inline
303 void mpfq_u64k3_vec_scal_mul(mpfq_u64k3_dst_field, mpfq_u64k3_dst_vec, mpfq_u64k3_src_vec, mpfq_u64k3_src_elt, unsigned long);
304 void mpfq_u64k3_vec_random(mpfq_u64k3_dst_field, mpfq_u64k3_dst_vec, unsigned long, gmp_randstate_t);
305 void mpfq_u64k3_vec_random2(mpfq_u64k3_dst_field, mpfq_u64k3_dst_vec, unsigned long, gmp_randstate_t);
306 long mpfq_u64k3_vec_cmp(mpfq_u64k3_dst_field, mpfq_u64k3_src_vec, mpfq_u64k3_src_vec, unsigned long);
307 long mpfq_u64k3_vec_is_zero(mpfq_u64k3_dst_field, mpfq_u64k3_src_vec, unsigned long);
308 static inline
309 mpfq_u64k3_dst_vec mpfq_u64k3_vec_subvec(mpfq_u64k3_dst_field, mpfq_u64k3_dst_vec, long);
310 static inline
311 mpfq_u64k3_src_vec mpfq_u64k3_vec_subvec_const(mpfq_u64k3_dst_field, mpfq_u64k3_src_vec, long);
312 static inline
313 mpfq_u64k3_dst_elt mpfq_u64k3_vec_coeff_ptr(mpfq_u64k3_dst_field, mpfq_u64k3_dst_vec, long);
314 static inline
315 mpfq_u64k3_src_elt mpfq_u64k3_vec_coeff_ptr_const(mpfq_u64k3_dst_field, mpfq_u64k3_src_vec, long);
316 long mpfq_u64k3_vec_asprint(mpfq_u64k3_dst_field, char * *, mpfq_u64k3_src_vec, unsigned long);
317 long mpfq_u64k3_vec_fprint(mpfq_u64k3_dst_field, FILE *, mpfq_u64k3_src_vec, unsigned long);
318 long mpfq_u64k3_vec_print(mpfq_u64k3_dst_field, mpfq_u64k3_src_vec, unsigned long);
319 long mpfq_u64k3_vec_sscan(mpfq_u64k3_dst_field, mpfq_u64k3_vec *, unsigned long *, const char *);
320 long mpfq_u64k3_vec_fscan(mpfq_u64k3_dst_field, FILE *, mpfq_u64k3_vec *, unsigned long *);
321 /* *Mpfq::defaults::vec::io::code_for_vec_scan, Mpfq::defaults::vec */
322 #define mpfq_u64k3_vec_scan(K, w, n)	mpfq_u64k3_vec_fscan(K,stdin,w,n)
323 long mpfq_u64k3_vec_hamming_weight(mpfq_u64k3_dst_field, mpfq_u64k3_src_vec, unsigned long);
324 long mpfq_u64k3_vec_find_first_set(mpfq_u64k3_dst_field, mpfq_u64k3_src_vec, unsigned long);
325 long mpfq_u64k3_vec_simd_hamming_weight(mpfq_u64k3_dst_field, mpfq_u64k3_src_vec, unsigned long);
326 long mpfq_u64k3_vec_simd_find_first_set(mpfq_u64k3_dst_field, mpfq_u64k3_src_vec, unsigned long);
327 void mpfq_u64k3_vec_ur_init(mpfq_u64k3_dst_field, mpfq_u64k3_vec_ur *, unsigned long);
328 static inline
329 void mpfq_u64k3_vec_ur_set_zero(mpfq_u64k3_dst_field, mpfq_u64k3_dst_vec_ur, unsigned long);
330 static inline
331 void mpfq_u64k3_vec_ur_set_vec(mpfq_u64k3_dst_field, mpfq_u64k3_dst_vec_ur, mpfq_u64k3_src_vec, unsigned long);
332 void mpfq_u64k3_vec_ur_reinit(mpfq_u64k3_dst_field, mpfq_u64k3_vec_ur *, unsigned long, unsigned long);
333 void mpfq_u64k3_vec_ur_clear(mpfq_u64k3_dst_field, mpfq_u64k3_vec_ur *, unsigned long);
334 static inline
335 void mpfq_u64k3_vec_ur_set(mpfq_u64k3_dst_field, mpfq_u64k3_dst_vec_ur, mpfq_u64k3_src_vec_ur, unsigned long);
336 static inline
337 void mpfq_u64k3_vec_ur_setcoeff(mpfq_u64k3_dst_field, mpfq_u64k3_dst_vec_ur, mpfq_u64k3_src_elt_ur, unsigned long);
338 static inline
339 void mpfq_u64k3_vec_ur_getcoeff(mpfq_u64k3_dst_field, mpfq_u64k3_dst_elt_ur, mpfq_u64k3_src_vec_ur, unsigned long);
340 static inline
341 void mpfq_u64k3_vec_ur_add(mpfq_u64k3_dst_field, mpfq_u64k3_dst_vec_ur, mpfq_u64k3_src_vec_ur, mpfq_u64k3_src_vec_ur, unsigned long);
342 static inline
343 void mpfq_u64k3_vec_ur_sub(mpfq_u64k3_dst_field, mpfq_u64k3_dst_vec_ur, mpfq_u64k3_src_vec_ur, mpfq_u64k3_src_vec_ur, unsigned long);
344 static inline
345 void mpfq_u64k3_vec_ur_neg(mpfq_u64k3_dst_field, mpfq_u64k3_dst_vec_ur, mpfq_u64k3_src_vec_ur, unsigned long);
346 static inline
347 void mpfq_u64k3_vec_ur_rev(mpfq_u64k3_dst_field, mpfq_u64k3_dst_vec_ur, mpfq_u64k3_src_vec_ur, unsigned long);
348 static inline
349 void mpfq_u64k3_vec_scal_mul_ur(mpfq_u64k3_dst_field, mpfq_u64k3_dst_vec_ur, mpfq_u64k3_src_vec, mpfq_u64k3_src_elt, unsigned long);
350 static inline
351 void mpfq_u64k3_vec_reduce(mpfq_u64k3_dst_field, mpfq_u64k3_dst_vec, mpfq_u64k3_dst_vec_ur, unsigned long);
352 static inline
353 mpfq_u64k3_dst_vec_ur mpfq_u64k3_vec_ur_subvec(mpfq_u64k3_dst_field, mpfq_u64k3_dst_vec_ur, long);
354 static inline
355 mpfq_u64k3_src_vec_ur mpfq_u64k3_vec_ur_subvec_const(mpfq_u64k3_dst_field, mpfq_u64k3_src_vec_ur, long);
356 static inline
357 mpfq_u64k3_dst_elt mpfq_u64k3_vec_ur_coeff_ptr(mpfq_u64k3_dst_field, mpfq_u64k3_dst_vec_ur, long);
358 static inline
359 mpfq_u64k3_src_elt mpfq_u64k3_vec_ur_coeff_ptr_const(mpfq_u64k3_dst_field, mpfq_u64k3_src_vec_ur, long);
360 /* *Mpfq::defaults::flatdata::code_for_vec_elt_stride, simd_flat, simd_char2 */
361 #define mpfq_u64k3_vec_elt_stride(k, n)	((n) * mpfq_u64k3_elt_stride((k)))
362 /* *Mpfq::defaults::flatdata::code_for_vec_ur_elt_stride, simd_flat, simd_char2 */
363 #define mpfq_u64k3_vec_ur_elt_stride(k, n)	((n) * mpfq_u64k3_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_u64k3_simd_groupsize(K)	192
370 static inline
371 int mpfq_u64k3_simd_hamming_weight(mpfq_u64k3_dst_field, mpfq_u64k3_src_elt);
372 static inline
373 int mpfq_u64k3_simd_find_first_set(mpfq_u64k3_dst_field, mpfq_u64k3_src_elt);
374 static inline
375 unsigned long mpfq_u64k3_simd_get_ui_at(mpfq_u64k3_dst_field, mpfq_u64k3_src_elt, int);
376 static inline
377 void mpfq_u64k3_simd_set_ui_at(mpfq_u64k3_dst_field, mpfq_u64k3_dst_elt, int, unsigned long);
378 static inline
379 void mpfq_u64k3_simd_add_ui_at(mpfq_u64k3_dst_field, mpfq_u64k3_dst_elt, mpfq_u64k3_src_elt, int, unsigned long);
380 static inline
381 void mpfq_u64k3_simd_set_ui_all(mpfq_u64k3_dst_field, mpfq_u64k3_dst_elt, unsigned long);
382 void mpfq_u64k3_add_dotprod(mpfq_u64k3_dst_field, mpfq_u64k3_dst_vec, mpfq_u64k3_src_vec, mpfq_u64k3_src_vec, unsigned int);
383 
384 /* Member templates related to SIMD operation */
385 
386 /* Object-oriented interface */
387 static inline
388 void mpfq_u64k3_oo_field_clear(mpfq_vbase_ptr);
389 void mpfq_u64k3_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_u64k3_set(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_elt r,mpfq_u64k3_src_elt s)397 void mpfq_u64k3_set(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_elt r, mpfq_u64k3_src_elt s)
398 {
399     mpfq_copy((mp_limb_t*)r,(const mp_limb_t*)s,sizeof(mpfq_u64k3_elt)/sizeof(mp_limb_t));
400 }
401 
402 /* *simd_flat::code_for_set_zero, simd_char2 */
403 static inline
mpfq_u64k3_set_zero(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_elt r)404 void mpfq_u64k3_set_zero(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_elt r)
405 {
406     memset(r, 0, sizeof(mpfq_u64k3_elt));
407 }
408 
409 /* *simd_flat::code_for_random, simd_char2 */
410 static inline
mpfq_u64k3_random(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_elt r,gmp_randstate_t state)411 void mpfq_u64k3_random(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_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_u64k3_elt) / (sizeof(mp_limb_t));
416         ugly->_mp_size = sizeof(mpfq_u64k3_elt) / (sizeof(mp_limb_t));
417         mpz_urandomb(ugly, state, mpfq_u64k3_simd_groupsize(K));
418 }
419 
420 /* *simd_flat::code_for_random2, simd_char2 */
421 static inline
mpfq_u64k3_random2(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_elt r,gmp_randstate_t state)422 void mpfq_u64k3_random2(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_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_u64k3_elt) / (sizeof(mp_limb_t));
427         ugly->_mp_size = sizeof(mpfq_u64k3_elt) / (sizeof(mp_limb_t));
428         mpz_rrandomb(ugly, state, mpfq_u64k3_simd_groupsize(K));
429 }
430 
431 /* *simd_char2::code_for_add */
432 static inline
mpfq_u64k3_add(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_elt r,mpfq_u64k3_src_elt s1,mpfq_u64k3_src_elt s2)433 void mpfq_u64k3_add(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_elt r, mpfq_u64k3_src_elt s1, mpfq_u64k3_src_elt s2)
434 {
435         for(unsigned int i = 0 ; i < sizeof(mpfq_u64k3_elt)/sizeof(*r) ; i++) {
436             r[i] = s1[i] ^ s2[i];
437         }
438 }
439 
440 /* *simd_char2::code_for_mul */
441 static inline
mpfq_u64k3_mul(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_elt r,mpfq_u64k3_src_elt s1,mpfq_u64k3_src_elt s2)442 void mpfq_u64k3_mul(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_elt r, mpfq_u64k3_src_elt s1, mpfq_u64k3_src_elt s2)
443 {
444         for(unsigned int i = 0 ; i < sizeof(mpfq_u64k3_elt)/sizeof(*r) ; i++) {
445             r[i] = s1[i] & s2[i];
446         }
447 }
448 
449 /* *simd_char2::code_for_inv */
450 static inline
mpfq_u64k3_inv(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_elt r,mpfq_u64k3_src_elt s)451 int mpfq_u64k3_inv(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_elt r, mpfq_u64k3_src_elt s)
452 {
453         int rc = 0;
454         for(unsigned int i = 0 ; i < sizeof(mpfq_u64k3_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_u64k3_elt_ur_set(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_elt_ur r,mpfq_u64k3_src_elt_ur s)463 void mpfq_u64k3_elt_ur_set(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_elt_ur r, mpfq_u64k3_src_elt_ur s)
464 {
465     mpfq_copy((mp_limb_t*)r,(const mp_limb_t*)s,sizeof(mpfq_u64k3_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_u64k3_elt_ur_set_elt(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_elt_ur r,mpfq_u64k3_src_elt s)470 void mpfq_u64k3_elt_ur_set_elt(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_elt_ur r, mpfq_u64k3_src_elt s)
471 {
472     memset(r, 0, sizeof(mpfq_u64k3_elt_ur)); memcpy(r,s,sizeof(mpfq_u64k3_elt));
473 }
474 
475 /* *Mpfq::defaults::flatdata::code_for_elt_ur_set_zero, simd_flat, simd_char2 */
476 static inline
mpfq_u64k3_elt_ur_set_zero(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_elt_ur r)477 void mpfq_u64k3_elt_ur_set_zero(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_elt_ur r)
478 {
479     memset(r, 0, sizeof(mpfq_u64k3_elt_ur));
480 }
481 
482 /* *simd_char2::code_for_elt_ur_add */
483 static inline
mpfq_u64k3_elt_ur_add(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_elt_ur r,mpfq_u64k3_src_elt_ur s1,mpfq_u64k3_src_elt_ur s2)484 void mpfq_u64k3_elt_ur_add(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_elt_ur r, mpfq_u64k3_src_elt_ur s1, mpfq_u64k3_src_elt_ur s2)
485 {
486         for(unsigned int i = 0 ; i < sizeof(mpfq_u64k3_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_u64k3_mul_ur(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_elt_ur r,mpfq_u64k3_src_elt s1,mpfq_u64k3_src_elt s2)493 void mpfq_u64k3_mul_ur(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_elt_ur r, mpfq_u64k3_src_elt s1, mpfq_u64k3_src_elt s2)
494 {
495         for(unsigned int i = 0 ; i < sizeof(mpfq_u64k3_elt)/sizeof(*r) ; i++) {
496             r[i] = s1[i] & s2[i];
497         }
498 }
499 
500 /* *simd_char2::code_for_reduce */
501 static inline
mpfq_u64k3_reduce(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_elt r,mpfq_u64k3_dst_elt_ur s)502 void mpfq_u64k3_reduce(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_elt r, mpfq_u64k3_dst_elt_ur s)
503 {
504     mpfq_copy((mp_limb_t*)r,(const mp_limb_t*)s,sizeof(mpfq_u64k3_elt)/sizeof(mp_limb_t));
505 }
506 
507 /* *Mpfq::defaults::flatdata::code_for_cmp, simd_flat, simd_char2 */
508 static inline
mpfq_u64k3_cmp(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_src_elt r,mpfq_u64k3_src_elt s)509 int mpfq_u64k3_cmp(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_src_elt r, mpfq_u64k3_src_elt s)
510 {
511     return memcmp(r,s,sizeof(mpfq_u64k3_elt));
512 }
513 
514 /* *Mpfq::defaults::flatdata::code_for_is_zero, simd_flat, simd_char2 */
515 static inline
mpfq_u64k3_is_zero(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_src_elt r)516 int mpfq_u64k3_is_zero(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_src_elt r)
517 {
518         unsigned int i;
519         for(i = 0 ; i < sizeof(mpfq_u64k3_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_u64k3_vec_set(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_vec r,mpfq_u64k3_src_vec s,unsigned long n)527 void mpfq_u64k3_vec_set(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_vec r, mpfq_u64k3_src_vec s, unsigned long n)
528 {
529     if (r != s) memmove(r, s, n*sizeof(mpfq_u64k3_elt));
530 }
531 
532 /* *Mpfq::defaults::vec::flatdata::code_for_vec_set_zero, Mpfq::defaults::flatdata, simd_flat, simd_char2 */
533 static inline
mpfq_u64k3_vec_set_zero(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_vec r,unsigned long n)534 void mpfq_u64k3_vec_set_zero(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_vec r, unsigned long n)
535 {
536     memset(r, 0, n*sizeof(mpfq_u64k3_elt));
537 }
538 
539 /* *Mpfq::defaults::vec::generic::code_for_vec_setcoeff, Mpfq::defaults::vec */
540 static inline
mpfq_u64k3_vec_setcoeff(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_vec w,mpfq_u64k3_src_elt x,unsigned long i)541 void mpfq_u64k3_vec_setcoeff(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_vec w, mpfq_u64k3_src_elt x, unsigned long i)
542 {
543             mpfq_u64k3_dst_elt y = mpfq_u64k3_vec_coeff_ptr(K, w, i);
544             mpfq_u64k3_set(K, y, x);
545 }
546 
547 /* *Mpfq::defaults::vec::generic::code_for_vec_getcoeff, Mpfq::defaults::vec */
548 static inline
mpfq_u64k3_vec_getcoeff(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_elt x,mpfq_u64k3_src_vec w,unsigned long i)549 void mpfq_u64k3_vec_getcoeff(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_elt x, mpfq_u64k3_src_vec w, unsigned long i)
550 {
551             mpfq_u64k3_src_elt y = mpfq_u64k3_vec_coeff_ptr_const(K, w, i);
552             mpfq_u64k3_set(K, x, y);
553 }
554 
555 /* *Mpfq::defaults::vec::addsub::code_for_vec_add, Mpfq::defaults::vec */
556 static inline
mpfq_u64k3_vec_add(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_vec w,mpfq_u64k3_src_vec u,mpfq_u64k3_src_vec v,unsigned long n)557 void mpfq_u64k3_vec_add(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_vec w, mpfq_u64k3_src_vec u, mpfq_u64k3_src_vec v, unsigned long n)
558 {
559         unsigned int i;
560     for(i = 0; i < n; i+=1)
561         mpfq_u64k3_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_u64k3_vec_neg(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_vec w,mpfq_u64k3_src_vec u,unsigned long n)566 void mpfq_u64k3_vec_neg(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_vec w, mpfq_u64k3_src_vec u, unsigned long n)
567 {
568         unsigned int i;
569     for(i = 0; i < n; ++i)
570         mpfq_u64k3_neg(K, w[i], u[i]);
571 }
572 
573 /* *Mpfq::defaults::vec::addsub::code_for_vec_rev, Mpfq::defaults::vec */
574 static inline
mpfq_u64k3_vec_rev(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_vec w,mpfq_u64k3_src_vec u,unsigned long n)575 void mpfq_u64k3_vec_rev(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_vec w, mpfq_u64k3_src_vec u, unsigned long n)
576 {
577     unsigned int nn = n >> 1;
578     mpfq_u64k3_elt tmp[1];
579     mpfq_u64k3_init(K, tmp);
580     unsigned int i;
581     for(i = 0; i < nn; ++i) {
582         mpfq_u64k3_set(K, tmp[0], u[i]);
583         mpfq_u64k3_set(K, w[i], u[n-1-i]);
584         mpfq_u64k3_set(K, w[n-1-i], tmp[0]);
585     }
586     if (n & 1)
587         mpfq_u64k3_set(K, w[nn], u[nn]);
588     mpfq_u64k3_clear(K, tmp);
589 }
590 
591 /* *Mpfq::defaults::vec::addsub::code_for_vec_sub, Mpfq::defaults::vec */
592 static inline
mpfq_u64k3_vec_sub(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_vec w,mpfq_u64k3_src_vec u,mpfq_u64k3_src_vec v,unsigned long n)593 void mpfq_u64k3_vec_sub(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_vec w, mpfq_u64k3_src_vec u, mpfq_u64k3_src_vec v, unsigned long n)
594 {
595     unsigned int i;
596     for(i = 0; i < n; ++i)
597         mpfq_u64k3_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_u64k3_vec_scal_mul(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_vec w,mpfq_u64k3_src_vec u,mpfq_u64k3_src_elt c,unsigned long n)602 void mpfq_u64k3_vec_scal_mul(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_vec w, mpfq_u64k3_src_vec u, mpfq_u64k3_src_elt c, unsigned long n)
603 {
604         unsigned int i;
605     for(i = 0; i < n; i++) {
606         mpfq_u64k3_src_elt x = mpfq_u64k3_vec_coeff_ptr_const(K, u, i);
607         mpfq_u64k3_dst_elt y = mpfq_u64k3_vec_coeff_ptr(K, w, i);
608         mpfq_u64k3_mul(K, y, x, c);
609     }
610 }
611 
612 /* *Mpfq::defaults::vec::getset::code_for_vec_subvec, Mpfq::defaults::vec */
613 static inline
mpfq_u64k3_vec_subvec(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_vec v,long i)614 mpfq_u64k3_dst_vec mpfq_u64k3_vec_subvec(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_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_u64k3_vec_subvec_const(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_src_vec v,long i)621 mpfq_u64k3_src_vec mpfq_u64k3_vec_subvec_const(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_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_u64k3_vec_coeff_ptr(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_vec v,long i)628 mpfq_u64k3_dst_elt mpfq_u64k3_vec_coeff_ptr(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_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_u64k3_vec_coeff_ptr_const(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_src_vec v,long i)635 mpfq_u64k3_src_elt mpfq_u64k3_vec_coeff_ptr_const(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_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_u64k3_vec_ur_set_zero(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_vec_ur r,unsigned long n)642 void mpfq_u64k3_vec_ur_set_zero(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_vec_ur r, unsigned long n)
643 {
644     memset(r, 0, n*sizeof(mpfq_u64k3_elt_ur));
645 }
646 
647 /* *Mpfq::defaults::vec::generic::code_for_vec_ur_set_vec, Mpfq::defaults::vec */
648 static inline
mpfq_u64k3_vec_ur_set_vec(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_vec_ur w,mpfq_u64k3_src_vec u,unsigned long n)649 void mpfq_u64k3_vec_ur_set_vec(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_vec_ur w, mpfq_u64k3_src_vec u, unsigned long n)
650 {
651             unsigned int i;
652             for(i = 0; i < n; ++i) {
653                 mpfq_u64k3_src_elt x = mpfq_u64k3_vec_coeff_ptr_const(K, u, i);
654                 mpfq_u64k3_dst_elt_ur y = mpfq_u64k3_vec_ur_coeff_ptr(K, w, i);
655                 mpfq_u64k3_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_u64k3_vec_ur_set(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_vec_ur r,mpfq_u64k3_src_vec_ur s,unsigned long n)661 void mpfq_u64k3_vec_ur_set(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_vec_ur r, mpfq_u64k3_src_vec_ur s, unsigned long n)
662 {
663     if (r != s) memmove(r, s, n*sizeof(mpfq_u64k3_elt_ur));
664 }
665 
666 /* *Mpfq::defaults::vec::generic::code_for_vec_ur_setcoeff, Mpfq::defaults::vec */
667 static inline
mpfq_u64k3_vec_ur_setcoeff(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_vec_ur w,mpfq_u64k3_src_elt_ur x,unsigned long i)668 void mpfq_u64k3_vec_ur_setcoeff(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_vec_ur w, mpfq_u64k3_src_elt_ur x, unsigned long i)
669 {
670             mpfq_u64k3_dst_elt_ur y = mpfq_u64k3_vec_ur_coeff_ptr(K, w, i);
671             mpfq_u64k3_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_u64k3_vec_ur_getcoeff(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_elt_ur x,mpfq_u64k3_src_vec_ur w,unsigned long i)676 void mpfq_u64k3_vec_ur_getcoeff(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_elt_ur x, mpfq_u64k3_src_vec_ur w, unsigned long i)
677 {
678             mpfq_u64k3_src_elt_ur y = mpfq_u64k3_vec_ur_coeff_ptr_const(K, w, i);
679             mpfq_u64k3_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_u64k3_vec_ur_add(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_vec_ur w,mpfq_u64k3_src_vec_ur u,mpfq_u64k3_src_vec_ur v,unsigned long n)684 void mpfq_u64k3_vec_ur_add(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_vec_ur w, mpfq_u64k3_src_vec_ur u, mpfq_u64k3_src_vec_ur v, unsigned long n)
685 {
686     unsigned int i;
687     for(i = 0; i < n; i+=1)
688         mpfq_u64k3_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_u64k3_vec_ur_sub(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_vec_ur w,mpfq_u64k3_src_vec_ur u,mpfq_u64k3_src_vec_ur v,unsigned long n)693 void mpfq_u64k3_vec_ur_sub(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_vec_ur w, mpfq_u64k3_src_vec_ur u, mpfq_u64k3_src_vec_ur v, unsigned long n)
694 {
695     unsigned int i;
696     for(i = 0; i < n; i+=1)
697         mpfq_u64k3_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_u64k3_vec_ur_neg(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_vec_ur w,mpfq_u64k3_src_vec_ur u,unsigned long n)702 void mpfq_u64k3_vec_ur_neg(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_vec_ur w, mpfq_u64k3_src_vec_ur u, unsigned long n)
703 {
704     unsigned int i;
705     for(i = 0; i < n; ++i)
706         mpfq_u64k3_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_u64k3_vec_ur_rev(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_vec_ur w,mpfq_u64k3_src_vec_ur u,unsigned long n)711 void mpfq_u64k3_vec_ur_rev(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_vec_ur w, mpfq_u64k3_src_vec_ur u, unsigned long n)
712 {
713     unsigned int nn = n >> 1;
714     mpfq_u64k3_elt_ur tmp[1];
715     mpfq_u64k3_elt_ur_init(K, tmp);
716     unsigned int i;
717     for(i = 0; i < nn; ++i) {
718         mpfq_u64k3_elt_ur_set(K, tmp[0], u[i]);
719         mpfq_u64k3_elt_ur_set(K, w[i], u[n-1-i]);
720         mpfq_u64k3_elt_ur_set(K, w[n-1-i], tmp[0]);
721     }
722     if (n & 1)
723         mpfq_u64k3_elt_ur_set(K, w[nn], u[nn]);
724     mpfq_u64k3_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_u64k3_vec_scal_mul_ur(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_vec_ur w,mpfq_u64k3_src_vec u,mpfq_u64k3_src_elt c,unsigned long n)729 void mpfq_u64k3_vec_scal_mul_ur(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_vec_ur w, mpfq_u64k3_src_vec u, mpfq_u64k3_src_elt c, unsigned long n)
730 {
731     unsigned int i;
732     for(i = 0; i < n; i++) {
733         mpfq_u64k3_src_elt x = mpfq_u64k3_vec_coeff_ptr_const(K, u, i);
734         mpfq_u64k3_dst_elt_ur y = mpfq_u64k3_vec_ur_coeff_ptr(K, w, i);
735         mpfq_u64k3_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_u64k3_vec_reduce(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_vec w,mpfq_u64k3_dst_vec_ur u,unsigned long n)741 void mpfq_u64k3_vec_reduce(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_vec w, mpfq_u64k3_dst_vec_ur u, unsigned long n)
742 {
743     unsigned int i;
744     for(i = 0; i < n; i++) {
745         mpfq_u64k3_dst_elt_ur x = mpfq_u64k3_vec_ur_coeff_ptr(K, u, i);
746         mpfq_u64k3_dst_elt y = mpfq_u64k3_vec_coeff_ptr(K, w, i);
747         mpfq_u64k3_reduce(K, y, x);
748     }
749 }
750 
751 /* *Mpfq::defaults::vec::getset::code_for_vec_ur_subvec, Mpfq::defaults::vec */
752 static inline
mpfq_u64k3_vec_ur_subvec(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_vec_ur v,long i)753 mpfq_u64k3_dst_vec_ur mpfq_u64k3_vec_ur_subvec(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_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_u64k3_vec_ur_subvec_const(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_src_vec_ur v,long i)760 mpfq_u64k3_src_vec_ur mpfq_u64k3_vec_ur_subvec_const(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_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_u64k3_vec_ur_coeff_ptr(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_vec_ur v,long i)767 mpfq_u64k3_dst_elt mpfq_u64k3_vec_ur_coeff_ptr(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_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_u64k3_vec_ur_coeff_ptr_const(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_src_vec_ur v,long i)774 mpfq_u64k3_src_elt mpfq_u64k3_vec_ur_coeff_ptr_const(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_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_u64k3_simd_hamming_weight(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_src_elt p)781 int mpfq_u64k3_simd_hamming_weight(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_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_u64k3_elt_stride(K) % sizeof(unsigned long) == 0);
787         for(size_t b = 0 ; b < mpfq_u64k3_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_u64k3_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_u64k3_simd_find_first_set(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_src_elt p)802 int mpfq_u64k3_simd_find_first_set(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_src_elt p)
803 {
804         size_t bmax = mpfq_u64k3_elt_stride(K) / (sizeof(mpfq_u64k3_elt));
805         assert(mpfq_u64k3_simd_groupsize(K) % bmax == 0);
806         int g = mpfq_u64k3_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_u64k3_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_u64k3_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_u64k3_simd_get_ui_at(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_src_elt p,int k)832 unsigned long mpfq_u64k3_simd_get_ui_at(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_src_elt p, int k)
833 {
834         assert(k < mpfq_u64k3_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_u64k3_simd_set_ui_at(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_elt p,int k,unsigned long v)842 void mpfq_u64k3_simd_set_ui_at(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_elt p, int k, unsigned long v)
843 {
844         assert(k < mpfq_u64k3_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_u64k3_simd_add_ui_at(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_elt p,mpfq_u64k3_src_elt p0,int k,unsigned long v)852 void mpfq_u64k3_simd_add_ui_at(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_elt p, mpfq_u64k3_src_elt p0, int k, unsigned long v)
853 {
854         mpfq_u64k3_set(K, p, p0);
855         assert(k < mpfq_u64k3_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_u64k3_simd_set_ui_all(mpfq_u64k3_dst_field K MAYBE_UNUSED,mpfq_u64k3_dst_elt r,unsigned long v)863 void mpfq_u64k3_simd_set_ui_all(mpfq_u64k3_dst_field K MAYBE_UNUSED, mpfq_u64k3_dst_elt r, unsigned long v)
864 {
865         for(unsigned int i = 0 ; i < sizeof(mpfq_u64k3_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_u64k3_oo_field_clear(mpfq_vbase_ptr f)873 void mpfq_u64k3_oo_field_clear(mpfq_vbase_ptr f)
874 {
875     mpfq_u64k3_field_clear((mpfq_u64k3_dst_field)(f->obj));
876     free(f->obj);
877     f->obj = NULL;
878 }
879 
880 
881 #endif  /* MPFQ_U64K3_H_ */
882 
883 /* vim:set ft=cpp: */
884