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