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