xref: /netbsd-src/crypto/external/bsd/openssh/dist/sntrup761.c (revision 9469f4f13c84743995b7d51c506f9c9849ba30de)
1 /*	$NetBSD: sntrup761.c,v 1.4 2024/09/24 21:32:18 christos Exp $	*/
2 /*  $OpenBSD: sntrup761.c,v 1.8 2024/09/16 05:37:05 djm Exp $ */
3 
4 /*
5  * Public Domain, Authors:
6  * - Daniel J. Bernstein
7  * - Chitchanok Chuengsatiansup
8  * - Tanja Lange
9  * - Christine van Vredendaal
10  */
11 #include "includes.h"
12 __RCSID("$NetBSD: sntrup761.c,v 1.4 2024/09/24 21:32:18 christos Exp $");
13 
14 #include <string.h>
15 #include "crypto_api.h"
16 
17 #define crypto_declassify(x, y) do {} while (0)
18 
19 #define int8 crypto_int8
20 #define uint8 crypto_uint8
21 #define int16 crypto_int16
22 #define uint16 crypto_uint16
23 #define int32 crypto_int32
24 #define uint32 crypto_uint32
25 #define int64 crypto_int64
26 #define uint64 crypto_uint64
27 extern volatile crypto_int16 crypto_int16_optblocker;
28 extern volatile crypto_int32 crypto_int32_optblocker;
29 extern volatile crypto_int64 crypto_int64_optblocker;
30 
31 /* from supercop-20240808/cryptoint/crypto_int16.h */
32 /* auto-generated: cd cryptoint; ./autogen */
33 /* cryptoint 20240806 */
34 
35 #ifndef crypto_int16_h
36 #define crypto_int16_h
37 
38 #define crypto_int16 int16_t
39 #define crypto_int16_unsigned uint16_t
40 
41 
42 
43 __attribute__((unused))
44 static inline
45 crypto_int16 crypto_int16_load(const unsigned char *crypto_int16_s) {
46   crypto_int16 crypto_int16_z = 0;
47   crypto_int16_z |= ((crypto_int16) (*crypto_int16_s++)) << 0;
48   crypto_int16_z |= ((crypto_int16) (*crypto_int16_s++)) << 8;
49   return crypto_int16_z;
50 }
51 
52 __attribute__((unused))
53 static inline
54 void crypto_int16_store(unsigned char *crypto_int16_s,crypto_int16 crypto_int16_x) {
55   *crypto_int16_s++ = crypto_int16_x >> 0;
56   *crypto_int16_s++ = crypto_int16_x >> 8;
57 }
58 
59 __attribute__((unused))
60 static inline
61 crypto_int16 crypto_int16_negative_mask(crypto_int16 crypto_int16_x) {
62 #if defined(__GNUC__) && defined(__x86_64__)
63   __asm__ ("sarw $15,%0" : "+r"(crypto_int16_x) : : "cc");
64   return crypto_int16_x;
65 #elif defined(__GNUC__) && defined(__aarch64__)
66   crypto_int16 crypto_int16_y;
67   __asm__ ("sbfx %w0,%w1,15,1" : "=r"(crypto_int16_y) : "r"(crypto_int16_x) : );
68   return crypto_int16_y;
69 #else
70   crypto_int16_x >>= 16-6;
71   crypto_int16_x ^= crypto_int16_optblocker;
72   crypto_int16_x >>= 5;
73   return crypto_int16_x;
74 #endif
75 }
76 
77 __attribute__((unused))
78 static inline
79 crypto_int16_unsigned crypto_int16_unsigned_topbit_01(crypto_int16_unsigned crypto_int16_x) {
80 #if defined(__GNUC__) && defined(__x86_64__)
81   __asm__ ("shrw $15,%0" : "+r"(crypto_int16_x) : : "cc");
82   return crypto_int16_x;
83 #elif defined(__GNUC__) && defined(__aarch64__)
84   crypto_int16 crypto_int16_y;
85   __asm__ ("ubfx %w0,%w1,15,1" : "=r"(crypto_int16_y) : "r"(crypto_int16_x) : );
86   return crypto_int16_y;
87 #else
88   crypto_int16_x >>= 16-6;
89   crypto_int16_x ^= crypto_int16_optblocker;
90   crypto_int16_x >>= 5;
91   return crypto_int16_x;
92 #endif
93 }
94 
95 __attribute__((unused))
96 static inline
97 crypto_int16 crypto_int16_negative_01(crypto_int16 crypto_int16_x) {
98   return crypto_int16_unsigned_topbit_01(crypto_int16_x);
99 }
100 
101 __attribute__((unused))
102 static inline
103 crypto_int16 crypto_int16_topbit_mask(crypto_int16 crypto_int16_x) {
104   return crypto_int16_negative_mask(crypto_int16_x);
105 }
106 
107 __attribute__((unused))
108 static inline
109 crypto_int16 crypto_int16_topbit_01(crypto_int16 crypto_int16_x) {
110   return crypto_int16_unsigned_topbit_01(crypto_int16_x);
111 }
112 
113 __attribute__((unused))
114 static inline
115 crypto_int16 crypto_int16_bottombit_mask(crypto_int16 crypto_int16_x) {
116 #if defined(__GNUC__) && defined(__x86_64__)
117   __asm__ ("andw $1,%0" : "+r"(crypto_int16_x) : : "cc");
118   return -crypto_int16_x;
119 #elif defined(__GNUC__) && defined(__aarch64__)
120   crypto_int16 crypto_int16_y;
121   __asm__ ("sbfx %w0,%w1,0,1" : "=r"(crypto_int16_y) : "r"(crypto_int16_x) : );
122   return crypto_int16_y;
123 #else
124   crypto_int16_x &= 1 ^ crypto_int16_optblocker;
125   return -crypto_int16_x;
126 #endif
127 }
128 
129 __attribute__((unused))
130 static inline
131 crypto_int16 crypto_int16_bottombit_01(crypto_int16 crypto_int16_x) {
132 #if defined(__GNUC__) && defined(__x86_64__)
133   __asm__ ("andw $1,%0" : "+r"(crypto_int16_x) : : "cc");
134   return crypto_int16_x;
135 #elif defined(__GNUC__) && defined(__aarch64__)
136   crypto_int16 crypto_int16_y;
137   __asm__ ("ubfx %w0,%w1,0,1" : "=r"(crypto_int16_y) : "r"(crypto_int16_x) : );
138   return crypto_int16_y;
139 #else
140   crypto_int16_x &= 1 ^ crypto_int16_optblocker;
141   return crypto_int16_x;
142 #endif
143 }
144 
145 __attribute__((unused))
146 static inline
147 crypto_int16 crypto_int16_bitinrangepublicpos_mask(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_s) {
148 #if defined(__GNUC__) && defined(__x86_64__)
149   __asm__ ("sarw %%cl,%0" : "+r"(crypto_int16_x) : "c"(crypto_int16_s) : "cc");
150 #elif defined(__GNUC__) && defined(__aarch64__)
151   __asm__ ("sxth %w0,%w0\n asr %w0,%w0,%w1" : "+&r"(crypto_int16_x) : "r"(crypto_int16_s) : );
152 #else
153   crypto_int16_x >>= crypto_int16_s ^ crypto_int16_optblocker;
154 #endif
155   return crypto_int16_bottombit_mask(crypto_int16_x);
156 }
157 
158 __attribute__((unused))
159 static inline
160 crypto_int16 crypto_int16_bitinrangepublicpos_01(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_s) {
161 #if defined(__GNUC__) && defined(__x86_64__)
162   __asm__ ("sarw %%cl,%0" : "+r"(crypto_int16_x) : "c"(crypto_int16_s) : "cc");
163 #elif defined(__GNUC__) && defined(__aarch64__)
164   __asm__ ("sxth %w0,%w0\n asr %w0,%w0,%w1" : "+&r"(crypto_int16_x) : "r"(crypto_int16_s) : );
165 #else
166   crypto_int16_x >>= crypto_int16_s ^ crypto_int16_optblocker;
167 #endif
168   return crypto_int16_bottombit_01(crypto_int16_x);
169 }
170 
171 __attribute__((unused))
172 static inline
173 crypto_int16 crypto_int16_shlmod(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_s) {
174 #if defined(__GNUC__) && defined(__x86_64__)
175   crypto_int16_s &= 15;
176   __asm__ ("shlw %%cl,%0" : "+r"(crypto_int16_x) : "c"(crypto_int16_s) : "cc");
177 #elif defined(__GNUC__) && defined(__aarch64__)
178   __asm__ ("and %w0,%w0,15\n and %w1,%w1,65535\n lsl %w1,%w1,%w0" : "+&r"(crypto_int16_s), "+r"(crypto_int16_x) : : );
179 #else
180   int crypto_int16_k, crypto_int16_l;
181   for (crypto_int16_l = 0,crypto_int16_k = 1;crypto_int16_k < 16;++crypto_int16_l,crypto_int16_k *= 2)
182     crypto_int16_x ^= (crypto_int16_x ^ (crypto_int16_x << crypto_int16_k)) & crypto_int16_bitinrangepublicpos_mask(crypto_int16_s,crypto_int16_l);
183 #endif
184   return crypto_int16_x;
185 }
186 
187 __attribute__((unused))
188 static inline
189 crypto_int16 crypto_int16_shrmod(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_s) {
190 #if defined(__GNUC__) && defined(__x86_64__)
191   crypto_int16_s &= 15;
192   __asm__ ("sarw %%cl,%0" : "+r"(crypto_int16_x) : "c"(crypto_int16_s) : "cc");
193 #elif defined(__GNUC__) && defined(__aarch64__)
194   __asm__ ("and %w0,%w0,15\n sxth %w1,%w1\n asr %w1,%w1,%w0" : "+&r"(crypto_int16_s), "+r"(crypto_int16_x) : : );
195 #else
196   int crypto_int16_k, crypto_int16_l;
197   for (crypto_int16_l = 0,crypto_int16_k = 1;crypto_int16_k < 16;++crypto_int16_l,crypto_int16_k *= 2)
198     crypto_int16_x ^= (crypto_int16_x ^ (crypto_int16_x >> crypto_int16_k)) & crypto_int16_bitinrangepublicpos_mask(crypto_int16_s,crypto_int16_l);
199 #endif
200   return crypto_int16_x;
201 }
202 
203 __attribute__((unused))
204 static inline
205 crypto_int16 crypto_int16_bitmod_mask(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_s) {
206   crypto_int16_x = crypto_int16_shrmod(crypto_int16_x,crypto_int16_s);
207   return crypto_int16_bottombit_mask(crypto_int16_x);
208 }
209 
210 __attribute__((unused))
211 static inline
212 crypto_int16 crypto_int16_bitmod_01(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_s) {
213   crypto_int16_x = crypto_int16_shrmod(crypto_int16_x,crypto_int16_s);
214   return crypto_int16_bottombit_01(crypto_int16_x);
215 }
216 
217 __attribute__((unused))
218 static inline
219 crypto_int16 crypto_int16_nonzero_mask(crypto_int16 crypto_int16_x) {
220 #if defined(__GNUC__) && defined(__x86_64__)
221   crypto_int16 crypto_int16_q,crypto_int16_z;
222   __asm__ ("xorw %0,%0\n movw $-1,%1\n testw %2,%2\n cmovnew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x) : "cc");
223   return crypto_int16_z;
224 #elif defined(__GNUC__) && defined(__aarch64__)
225   crypto_int16 crypto_int16_z;
226   __asm__ ("tst %w1,65535\n csetm %w0,ne" : "=r"(crypto_int16_z) : "r"(crypto_int16_x) : "cc");
227   return crypto_int16_z;
228 #else
229   crypto_int16_x |= -crypto_int16_x;
230   return crypto_int16_negative_mask(crypto_int16_x);
231 #endif
232 }
233 
234 __attribute__((unused))
235 static inline
236 crypto_int16 crypto_int16_nonzero_01(crypto_int16 crypto_int16_x) {
237 #if defined(__GNUC__) && defined(__x86_64__)
238   crypto_int16 crypto_int16_q,crypto_int16_z;
239   __asm__ ("xorw %0,%0\n movw $1,%1\n testw %2,%2\n cmovnew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x) : "cc");
240   return crypto_int16_z;
241 #elif defined(__GNUC__) && defined(__aarch64__)
242   crypto_int16 crypto_int16_z;
243   __asm__ ("tst %w1,65535\n cset %w0,ne" : "=r"(crypto_int16_z) : "r"(crypto_int16_x) : "cc");
244   return crypto_int16_z;
245 #else
246   crypto_int16_x |= -crypto_int16_x;
247   return crypto_int16_unsigned_topbit_01(crypto_int16_x);
248 #endif
249 }
250 
251 __attribute__((unused))
252 static inline
253 crypto_int16 crypto_int16_positive_mask(crypto_int16 crypto_int16_x) {
254 #if defined(__GNUC__) && defined(__x86_64__)
255   crypto_int16 crypto_int16_q,crypto_int16_z;
256   __asm__ ("xorw %0,%0\n movw $-1,%1\n testw %2,%2\n cmovgw %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x) : "cc");
257   return crypto_int16_z;
258 #elif defined(__GNUC__) && defined(__aarch64__)
259   crypto_int16 crypto_int16_z;
260   __asm__ ("sxth %w0,%w1\n cmp %w0,0\n csetm %w0,gt" : "=r"(crypto_int16_z) : "r"(crypto_int16_x) : "cc");
261   return crypto_int16_z;
262 #else
263   crypto_int16 crypto_int16_z = -crypto_int16_x;
264   crypto_int16_z ^= crypto_int16_x & crypto_int16_z;
265   return crypto_int16_negative_mask(crypto_int16_z);
266 #endif
267 }
268 
269 __attribute__((unused))
270 static inline
271 crypto_int16 crypto_int16_positive_01(crypto_int16 crypto_int16_x) {
272 #if defined(__GNUC__) && defined(__x86_64__)
273   crypto_int16 crypto_int16_q,crypto_int16_z;
274   __asm__ ("xorw %0,%0\n movw $1,%1\n testw %2,%2\n cmovgw %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x) : "cc");
275   return crypto_int16_z;
276 #elif defined(__GNUC__) && defined(__aarch64__)
277   crypto_int16 crypto_int16_z;
278   __asm__ ("sxth %w0,%w1\n cmp %w0,0\n cset %w0,gt" : "=r"(crypto_int16_z) : "r"(crypto_int16_x) : "cc");
279   return crypto_int16_z;
280 #else
281   crypto_int16 crypto_int16_z = -crypto_int16_x;
282   crypto_int16_z ^= crypto_int16_x & crypto_int16_z;
283   return crypto_int16_unsigned_topbit_01(crypto_int16_z);
284 #endif
285 }
286 
287 __attribute__((unused))
288 static inline
289 crypto_int16 crypto_int16_zero_mask(crypto_int16 crypto_int16_x) {
290 #if defined(__GNUC__) && defined(__x86_64__)
291   crypto_int16 crypto_int16_q,crypto_int16_z;
292   __asm__ ("xorw %0,%0\n movw $-1,%1\n testw %2,%2\n cmovew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x) : "cc");
293   return crypto_int16_z;
294 #elif defined(__GNUC__) && defined(__aarch64__)
295   crypto_int16 crypto_int16_z;
296   __asm__ ("tst %w1,65535\n csetm %w0,eq" : "=r"(crypto_int16_z) : "r"(crypto_int16_x) : "cc");
297   return crypto_int16_z;
298 #else
299   return ~crypto_int16_nonzero_mask(crypto_int16_x);
300 #endif
301 }
302 
303 __attribute__((unused))
304 static inline
305 crypto_int16 crypto_int16_zero_01(crypto_int16 crypto_int16_x) {
306 #if defined(__GNUC__) && defined(__x86_64__)
307   crypto_int16 crypto_int16_q,crypto_int16_z;
308   __asm__ ("xorw %0,%0\n movw $1,%1\n testw %2,%2\n cmovew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x) : "cc");
309   return crypto_int16_z;
310 #elif defined(__GNUC__) && defined(__aarch64__)
311   crypto_int16 crypto_int16_z;
312   __asm__ ("tst %w1,65535\n cset %w0,eq" : "=r"(crypto_int16_z) : "r"(crypto_int16_x) : "cc");
313   return crypto_int16_z;
314 #else
315   return 1-crypto_int16_nonzero_01(crypto_int16_x);
316 #endif
317 }
318 
319 __attribute__((unused))
320 static inline
321 crypto_int16 crypto_int16_unequal_mask(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) {
322 #if defined(__GNUC__) && defined(__x86_64__)
323   crypto_int16 crypto_int16_q,crypto_int16_z;
324   __asm__ ("xorw %0,%0\n movw $-1,%1\n cmpw %3,%2\n cmovnew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc");
325   return crypto_int16_z;
326 #elif defined(__GNUC__) && defined(__aarch64__)
327   crypto_int16 crypto_int16_z;
328   __asm__ ("and %w0,%w1,65535\n cmp %w0,%w2,uxth\n csetm %w0,ne" : "=&r"(crypto_int16_z) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc");
329   return crypto_int16_z;
330 #else
331   return crypto_int16_nonzero_mask(crypto_int16_x ^ crypto_int16_y);
332 #endif
333 }
334 
335 __attribute__((unused))
336 static inline
337 crypto_int16 crypto_int16_unequal_01(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) {
338 #if defined(__GNUC__) && defined(__x86_64__)
339   crypto_int16 crypto_int16_q,crypto_int16_z;
340   __asm__ ("xorw %0,%0\n movw $1,%1\n cmpw %3,%2\n cmovnew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc");
341   return crypto_int16_z;
342 #elif defined(__GNUC__) && defined(__aarch64__)
343   crypto_int16 crypto_int16_z;
344   __asm__ ("and %w0,%w1,65535\n cmp %w0,%w2,uxth\n cset %w0,ne" : "=&r"(crypto_int16_z) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc");
345   return crypto_int16_z;
346 #else
347   return crypto_int16_nonzero_01(crypto_int16_x ^ crypto_int16_y);
348 #endif
349 }
350 
351 __attribute__((unused))
352 static inline
353 crypto_int16 crypto_int16_equal_mask(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) {
354 #if defined(__GNUC__) && defined(__x86_64__)
355   crypto_int16 crypto_int16_q,crypto_int16_z;
356   __asm__ ("xorw %0,%0\n movw $-1,%1\n cmpw %3,%2\n cmovew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc");
357   return crypto_int16_z;
358 #elif defined(__GNUC__) && defined(__aarch64__)
359   crypto_int16 crypto_int16_z;
360   __asm__ ("and %w0,%w1,65535\n cmp %w0,%w2,uxth\n csetm %w0,eq" : "=&r"(crypto_int16_z) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc");
361   return crypto_int16_z;
362 #else
363   return ~crypto_int16_unequal_mask(crypto_int16_x,crypto_int16_y);
364 #endif
365 }
366 
367 __attribute__((unused))
368 static inline
369 crypto_int16 crypto_int16_equal_01(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) {
370 #if defined(__GNUC__) && defined(__x86_64__)
371   crypto_int16 crypto_int16_q,crypto_int16_z;
372   __asm__ ("xorw %0,%0\n movw $1,%1\n cmpw %3,%2\n cmovew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc");
373   return crypto_int16_z;
374 #elif defined(__GNUC__) && defined(__aarch64__)
375   crypto_int16 crypto_int16_z;
376   __asm__ ("and %w0,%w1,65535\n cmp %w0,%w2,uxth\n cset %w0,eq" : "=&r"(crypto_int16_z) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc");
377   return crypto_int16_z;
378 #else
379   return 1-crypto_int16_unequal_01(crypto_int16_x,crypto_int16_y);
380 #endif
381 }
382 
383 __attribute__((unused))
384 static inline
385 crypto_int16 crypto_int16_min(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) {
386 #if defined(__GNUC__) && defined(__x86_64__)
387   __asm__ ("cmpw %1,%0\n cmovgw %1,%0" : "+r"(crypto_int16_x) : "r"(crypto_int16_y) : "cc");
388   return crypto_int16_x;
389 #elif defined(__GNUC__) && defined(__aarch64__)
390   __asm__ ("sxth %w0,%w0\n cmp %w0,%w1,sxth\n csel %w0,%w0,%w1,lt" : "+&r"(crypto_int16_x) : "r"(crypto_int16_y) : "cc");
391   return crypto_int16_x;
392 #else
393   crypto_int16 crypto_int16_r = crypto_int16_y ^ crypto_int16_x;
394   crypto_int16 crypto_int16_z = crypto_int16_y - crypto_int16_x;
395   crypto_int16_z ^= crypto_int16_r & (crypto_int16_z ^ crypto_int16_y);
396   crypto_int16_z = crypto_int16_negative_mask(crypto_int16_z);
397   crypto_int16_z &= crypto_int16_r;
398   return crypto_int16_x ^ crypto_int16_z;
399 #endif
400 }
401 
402 __attribute__((unused))
403 static inline
404 crypto_int16 crypto_int16_max(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) {
405 #if defined(__GNUC__) && defined(__x86_64__)
406   __asm__ ("cmpw %1,%0\n cmovlw %1,%0" : "+r"(crypto_int16_x) : "r"(crypto_int16_y) : "cc");
407   return crypto_int16_x;
408 #elif defined(__GNUC__) && defined(__aarch64__)
409   __asm__ ("sxth %w0,%w0\n cmp %w0,%w1,sxth\n csel %w0,%w1,%w0,lt" : "+&r"(crypto_int16_x) : "r"(crypto_int16_y) : "cc");
410   return crypto_int16_x;
411 #else
412   crypto_int16 crypto_int16_r = crypto_int16_y ^ crypto_int16_x;
413   crypto_int16 crypto_int16_z = crypto_int16_y - crypto_int16_x;
414   crypto_int16_z ^= crypto_int16_r & (crypto_int16_z ^ crypto_int16_y);
415   crypto_int16_z = crypto_int16_negative_mask(crypto_int16_z);
416   crypto_int16_z &= crypto_int16_r;
417   return crypto_int16_y ^ crypto_int16_z;
418 #endif
419 }
420 
421 __attribute__((unused))
422 static inline
423 void crypto_int16_minmax(crypto_int16 *crypto_int16_p,crypto_int16 *crypto_int16_q) {
424   crypto_int16 crypto_int16_x = *crypto_int16_p;
425   crypto_int16 crypto_int16_y = *crypto_int16_q;
426 #if defined(__GNUC__) && defined(__x86_64__)
427   crypto_int16 crypto_int16_z;
428   __asm__ ("cmpw %2,%1\n movw %1,%0\n cmovgw %2,%1\n cmovgw %0,%2" : "=&r"(crypto_int16_z), "+&r"(crypto_int16_x), "+r"(crypto_int16_y) : : "cc");
429   *crypto_int16_p = crypto_int16_x;
430   *crypto_int16_q = crypto_int16_y;
431 #elif defined(__GNUC__) && defined(__aarch64__)
432   crypto_int16 crypto_int16_r, crypto_int16_s;
433   __asm__ ("sxth %w0,%w0\n cmp %w0,%w3,sxth\n csel %w1,%w0,%w3,lt\n csel %w2,%w3,%w0,lt" : "+&r"(crypto_int16_x), "=&r"(crypto_int16_r), "=r"(crypto_int16_s) : "r"(crypto_int16_y) : "cc");
434   *crypto_int16_p = crypto_int16_r;
435   *crypto_int16_q = crypto_int16_s;
436 #else
437   crypto_int16 crypto_int16_r = crypto_int16_y ^ crypto_int16_x;
438   crypto_int16 crypto_int16_z = crypto_int16_y - crypto_int16_x;
439   crypto_int16_z ^= crypto_int16_r & (crypto_int16_z ^ crypto_int16_y);
440   crypto_int16_z = crypto_int16_negative_mask(crypto_int16_z);
441   crypto_int16_z &= crypto_int16_r;
442   crypto_int16_x ^= crypto_int16_z;
443   crypto_int16_y ^= crypto_int16_z;
444   *crypto_int16_p = crypto_int16_x;
445   *crypto_int16_q = crypto_int16_y;
446 #endif
447 }
448 
449 __attribute__((unused))
450 static inline
451 crypto_int16 crypto_int16_smaller_mask(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) {
452 #if defined(__GNUC__) && defined(__x86_64__)
453   crypto_int16 crypto_int16_q,crypto_int16_z;
454   __asm__ ("xorw %0,%0\n movw $-1,%1\n cmpw %3,%2\n cmovlw %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc");
455   return crypto_int16_z;
456 #elif defined(__GNUC__) && defined(__aarch64__)
457   crypto_int16 crypto_int16_z;
458   __asm__ ("sxth %w0,%w1\n cmp %w0,%w2,sxth\n csetm %w0,lt" : "=&r"(crypto_int16_z) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc");
459   return crypto_int16_z;
460 #else
461   crypto_int16 crypto_int16_r = crypto_int16_x ^ crypto_int16_y;
462   crypto_int16 crypto_int16_z = crypto_int16_x - crypto_int16_y;
463   crypto_int16_z ^= crypto_int16_r & (crypto_int16_z ^ crypto_int16_x);
464   return crypto_int16_negative_mask(crypto_int16_z);
465 #endif
466 }
467 
468 __attribute__((unused))
469 static inline
470 crypto_int16 crypto_int16_smaller_01(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) {
471 #if defined(__GNUC__) && defined(__x86_64__)
472   crypto_int16 crypto_int16_q,crypto_int16_z;
473   __asm__ ("xorw %0,%0\n movw $1,%1\n cmpw %3,%2\n cmovlw %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc");
474   return crypto_int16_z;
475 #elif defined(__GNUC__) && defined(__aarch64__)
476   crypto_int16 crypto_int16_z;
477   __asm__ ("sxth %w0,%w1\n cmp %w0,%w2,sxth\n cset %w0,lt" : "=&r"(crypto_int16_z) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc");
478   return crypto_int16_z;
479 #else
480   crypto_int16 crypto_int16_r = crypto_int16_x ^ crypto_int16_y;
481   crypto_int16 crypto_int16_z = crypto_int16_x - crypto_int16_y;
482   crypto_int16_z ^= crypto_int16_r & (crypto_int16_z ^ crypto_int16_x);
483   return crypto_int16_unsigned_topbit_01(crypto_int16_z);
484 #endif
485 }
486 
487 __attribute__((unused))
488 static inline
489 crypto_int16 crypto_int16_leq_mask(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) {
490 #if defined(__GNUC__) && defined(__x86_64__)
491   crypto_int16 crypto_int16_q,crypto_int16_z;
492   __asm__ ("xorw %0,%0\n movw $-1,%1\n cmpw %3,%2\n cmovlew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc");
493   return crypto_int16_z;
494 #elif defined(__GNUC__) && defined(__aarch64__)
495   crypto_int16 crypto_int16_z;
496   __asm__ ("sxth %w0,%w1\n cmp %w0,%w2,sxth\n csetm %w0,le" : "=&r"(crypto_int16_z) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc");
497   return crypto_int16_z;
498 #else
499   return ~crypto_int16_smaller_mask(crypto_int16_y,crypto_int16_x);
500 #endif
501 }
502 
503 __attribute__((unused))
504 static inline
505 crypto_int16 crypto_int16_leq_01(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) {
506 #if defined(__GNUC__) && defined(__x86_64__)
507   crypto_int16 crypto_int16_q,crypto_int16_z;
508   __asm__ ("xorw %0,%0\n movw $1,%1\n cmpw %3,%2\n cmovlew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc");
509   return crypto_int16_z;
510 #elif defined(__GNUC__) && defined(__aarch64__)
511   crypto_int16 crypto_int16_z;
512   __asm__ ("sxth %w0,%w1\n cmp %w0,%w2,sxth\n cset %w0,le" : "=&r"(crypto_int16_z) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc");
513   return crypto_int16_z;
514 #else
515   return 1-crypto_int16_smaller_01(crypto_int16_y,crypto_int16_x);
516 #endif
517 }
518 
519 __attribute__((unused))
520 static inline
521 int crypto_int16_ones_num(crypto_int16 crypto_int16_x) {
522   crypto_int16_unsigned crypto_int16_y = crypto_int16_x;
523   const crypto_int16 C0 = 0x5555;
524   const crypto_int16 C1 = 0x3333;
525   const crypto_int16 C2 = 0x0f0f;
526   crypto_int16_y -= ((crypto_int16_y >> 1) & C0);
527   crypto_int16_y = (crypto_int16_y & C1) + ((crypto_int16_y >> 2) & C1);
528   crypto_int16_y = (crypto_int16_y + (crypto_int16_y >> 4)) & C2;
529   crypto_int16_y = (crypto_int16_y + (crypto_int16_y >> 8)) & 0xff;
530   return crypto_int16_y;
531 }
532 
533 __attribute__((unused))
534 static inline
535 int crypto_int16_bottomzeros_num(crypto_int16 crypto_int16_x) {
536 #if defined(__GNUC__) && defined(__x86_64__)
537   crypto_int16 fallback = 16;
538   __asm__ ("bsfw %0,%0\n cmovew %1,%0" : "+&r"(crypto_int16_x) : "r"(fallback) : "cc");
539   return crypto_int16_x;
540 #elif defined(__GNUC__) && defined(__aarch64__)
541   int64_t crypto_int16_y;
542   __asm__ ("orr %w0,%w1,-65536\n rbit %w0,%w0\n clz %w0,%w0" : "=r"(crypto_int16_y) : "r"(crypto_int16_x) : );
543   return crypto_int16_y;
544 #else
545   crypto_int16 crypto_int16_y = crypto_int16_x ^ (crypto_int16_x-1);
546   crypto_int16_y = ((crypto_int16) crypto_int16_y) >> 1;
547   crypto_int16_y &= ~(crypto_int16_x & (((crypto_int16) 1) << (16-1)));
548   return crypto_int16_ones_num(crypto_int16_y);
549 #endif
550 }
551 
552 #endif
553 
554 /* from supercop-20240808/cryptoint/crypto_int32.h */
555 /* auto-generated: cd cryptoint; ./autogen */
556 /* cryptoint 20240806 */
557 
558 #ifndef crypto_int32_h
559 #define crypto_int32_h
560 
561 #define crypto_int32 int32_t
562 #define crypto_int32_unsigned uint32_t
563 
564 
565 
566 __attribute__((unused))
567 static inline
568 crypto_int32 crypto_int32_load(const unsigned char *crypto_int32_s) {
569   crypto_int32 crypto_int32_z = 0;
570   crypto_int32_z |= ((crypto_int32) (*crypto_int32_s++)) << 0;
571   crypto_int32_z |= ((crypto_int32) (*crypto_int32_s++)) << 8;
572   crypto_int32_z |= ((crypto_int32) (*crypto_int32_s++)) << 16;
573   crypto_int32_z |= ((crypto_int32) (*crypto_int32_s++)) << 24;
574   return crypto_int32_z;
575 }
576 
577 __attribute__((unused))
578 static inline
579 void crypto_int32_store(unsigned char *crypto_int32_s,crypto_int32 crypto_int32_x) {
580   *crypto_int32_s++ = crypto_int32_x >> 0;
581   *crypto_int32_s++ = crypto_int32_x >> 8;
582   *crypto_int32_s++ = crypto_int32_x >> 16;
583   *crypto_int32_s++ = crypto_int32_x >> 24;
584 }
585 
586 __attribute__((unused))
587 static inline
588 crypto_int32 crypto_int32_negative_mask(crypto_int32 crypto_int32_x) {
589 #if defined(__GNUC__) && defined(__x86_64__)
590   __asm__ ("sarl $31,%0" : "+r"(crypto_int32_x) : : "cc");
591   return crypto_int32_x;
592 #elif defined(__GNUC__) && defined(__aarch64__)
593   crypto_int32 crypto_int32_y;
594   __asm__ ("asr %w0,%w1,31" : "=r"(crypto_int32_y) : "r"(crypto_int32_x) : );
595   return crypto_int32_y;
596 #else
597   crypto_int32_x >>= 32-6;
598   crypto_int32_x ^= crypto_int32_optblocker;
599   crypto_int32_x >>= 5;
600   return crypto_int32_x;
601 #endif
602 }
603 
604 __attribute__((unused))
605 static inline
606 crypto_int32_unsigned crypto_int32_unsigned_topbit_01(crypto_int32_unsigned crypto_int32_x) {
607 #if defined(__GNUC__) && defined(__x86_64__)
608   __asm__ ("shrl $31,%0" : "+r"(crypto_int32_x) : : "cc");
609   return crypto_int32_x;
610 #elif defined(__GNUC__) && defined(__aarch64__)
611   crypto_int32 crypto_int32_y;
612   __asm__ ("lsr %w0,%w1,31" : "=r"(crypto_int32_y) : "r"(crypto_int32_x) : );
613   return crypto_int32_y;
614 #else
615   crypto_int32_x >>= 32-6;
616   crypto_int32_x ^= crypto_int32_optblocker;
617   crypto_int32_x >>= 5;
618   return crypto_int32_x;
619 #endif
620 }
621 
622 __attribute__((unused))
623 static inline
624 crypto_int32 crypto_int32_negative_01(crypto_int32 crypto_int32_x) {
625   return crypto_int32_unsigned_topbit_01(crypto_int32_x);
626 }
627 
628 __attribute__((unused))
629 static inline
630 crypto_int32 crypto_int32_topbit_mask(crypto_int32 crypto_int32_x) {
631   return crypto_int32_negative_mask(crypto_int32_x);
632 }
633 
634 __attribute__((unused))
635 static inline
636 crypto_int32 crypto_int32_topbit_01(crypto_int32 crypto_int32_x) {
637   return crypto_int32_unsigned_topbit_01(crypto_int32_x);
638 }
639 
640 __attribute__((unused))
641 static inline
642 crypto_int32 crypto_int32_bottombit_mask(crypto_int32 crypto_int32_x) {
643 #if defined(__GNUC__) && defined(__x86_64__)
644   __asm__ ("andl $1,%0" : "+r"(crypto_int32_x) : : "cc");
645   return -crypto_int32_x;
646 #elif defined(__GNUC__) && defined(__aarch64__)
647   crypto_int32 crypto_int32_y;
648   __asm__ ("sbfx %w0,%w1,0,1" : "=r"(crypto_int32_y) : "r"(crypto_int32_x) : );
649   return crypto_int32_y;
650 #else
651   crypto_int32_x &= 1 ^ crypto_int32_optblocker;
652   return -crypto_int32_x;
653 #endif
654 }
655 
656 __attribute__((unused))
657 static inline
658 crypto_int32 crypto_int32_bottombit_01(crypto_int32 crypto_int32_x) {
659 #if defined(__GNUC__) && defined(__x86_64__)
660   __asm__ ("andl $1,%0" : "+r"(crypto_int32_x) : : "cc");
661   return crypto_int32_x;
662 #elif defined(__GNUC__) && defined(__aarch64__)
663   crypto_int32 crypto_int32_y;
664   __asm__ ("ubfx %w0,%w1,0,1" : "=r"(crypto_int32_y) : "r"(crypto_int32_x) : );
665   return crypto_int32_y;
666 #else
667   crypto_int32_x &= 1 ^ crypto_int32_optblocker;
668   return crypto_int32_x;
669 #endif
670 }
671 
672 __attribute__((unused))
673 static inline
674 crypto_int32 crypto_int32_bitinrangepublicpos_mask(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_s) {
675 #if defined(__GNUC__) && defined(__x86_64__)
676   __asm__ ("sarl %%cl,%0" : "+r"(crypto_int32_x) : "c"(crypto_int32_s) : "cc");
677 #elif defined(__GNUC__) && defined(__aarch64__)
678   __asm__ ("asr %w0,%w0,%w1" : "+r"(crypto_int32_x) : "r"(crypto_int32_s) : );
679 #else
680   crypto_int32_x >>= crypto_int32_s ^ crypto_int32_optblocker;
681 #endif
682   return crypto_int32_bottombit_mask(crypto_int32_x);
683 }
684 
685 __attribute__((unused))
686 static inline
687 crypto_int32 crypto_int32_bitinrangepublicpos_01(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_s) {
688 #if defined(__GNUC__) && defined(__x86_64__)
689   __asm__ ("sarl %%cl,%0" : "+r"(crypto_int32_x) : "c"(crypto_int32_s) : "cc");
690 #elif defined(__GNUC__) && defined(__aarch64__)
691   __asm__ ("asr %w0,%w0,%w1" : "+r"(crypto_int32_x) : "r"(crypto_int32_s) : );
692 #else
693   crypto_int32_x >>= crypto_int32_s ^ crypto_int32_optblocker;
694 #endif
695   return crypto_int32_bottombit_01(crypto_int32_x);
696 }
697 
698 __attribute__((unused))
699 static inline
700 crypto_int32 crypto_int32_shlmod(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_s) {
701 #if defined(__GNUC__) && defined(__x86_64__)
702   __asm__ ("shll %%cl,%0" : "+r"(crypto_int32_x) : "c"(crypto_int32_s) : "cc");
703 #elif defined(__GNUC__) && defined(__aarch64__)
704   __asm__ ("lsl %w0,%w0,%w1" : "+r"(crypto_int32_x) : "r"(crypto_int32_s) : );
705 #else
706   int crypto_int32_k, crypto_int32_l;
707   for (crypto_int32_l = 0,crypto_int32_k = 1;crypto_int32_k < 32;++crypto_int32_l,crypto_int32_k *= 2)
708     crypto_int32_x ^= (crypto_int32_x ^ (crypto_int32_x << crypto_int32_k)) & crypto_int32_bitinrangepublicpos_mask(crypto_int32_s,crypto_int32_l);
709 #endif
710   return crypto_int32_x;
711 }
712 
713 __attribute__((unused))
714 static inline
715 crypto_int32 crypto_int32_shrmod(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_s) {
716 #if defined(__GNUC__) && defined(__x86_64__)
717   __asm__ ("sarl %%cl,%0" : "+r"(crypto_int32_x) : "c"(crypto_int32_s) : "cc");
718 #elif defined(__GNUC__) && defined(__aarch64__)
719   __asm__ ("asr %w0,%w0,%w1" : "+r"(crypto_int32_x) : "r"(crypto_int32_s) : );
720 #else
721   int crypto_int32_k, crypto_int32_l;
722   for (crypto_int32_l = 0,crypto_int32_k = 1;crypto_int32_k < 32;++crypto_int32_l,crypto_int32_k *= 2)
723     crypto_int32_x ^= (crypto_int32_x ^ (crypto_int32_x >> crypto_int32_k)) & crypto_int32_bitinrangepublicpos_mask(crypto_int32_s,crypto_int32_l);
724 #endif
725   return crypto_int32_x;
726 }
727 
728 __attribute__((unused))
729 static inline
730 crypto_int32 crypto_int32_bitmod_mask(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_s) {
731   crypto_int32_x = crypto_int32_shrmod(crypto_int32_x,crypto_int32_s);
732   return crypto_int32_bottombit_mask(crypto_int32_x);
733 }
734 
735 __attribute__((unused))
736 static inline
737 crypto_int32 crypto_int32_bitmod_01(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_s) {
738   crypto_int32_x = crypto_int32_shrmod(crypto_int32_x,crypto_int32_s);
739   return crypto_int32_bottombit_01(crypto_int32_x);
740 }
741 
742 __attribute__((unused))
743 static inline
744 crypto_int32 crypto_int32_nonzero_mask(crypto_int32 crypto_int32_x) {
745 #if defined(__GNUC__) && defined(__x86_64__)
746   crypto_int32 crypto_int32_q,crypto_int32_z;
747   __asm__ ("xorl %0,%0\n movl $-1,%1\n testl %2,%2\n cmovnel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x) : "cc");
748   return crypto_int32_z;
749 #elif defined(__GNUC__) && defined(__aarch64__)
750   crypto_int32 crypto_int32_z;
751   __asm__ ("cmp %w1,0\n csetm %w0,ne" : "=r"(crypto_int32_z) : "r"(crypto_int32_x) : "cc");
752   return crypto_int32_z;
753 #else
754   crypto_int32_x |= -crypto_int32_x;
755   return crypto_int32_negative_mask(crypto_int32_x);
756 #endif
757 }
758 
759 __attribute__((unused))
760 static inline
761 crypto_int32 crypto_int32_nonzero_01(crypto_int32 crypto_int32_x) {
762 #if defined(__GNUC__) && defined(__x86_64__)
763   crypto_int32 crypto_int32_q,crypto_int32_z;
764   __asm__ ("xorl %0,%0\n movl $1,%1\n testl %2,%2\n cmovnel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x) : "cc");
765   return crypto_int32_z;
766 #elif defined(__GNUC__) && defined(__aarch64__)
767   crypto_int32 crypto_int32_z;
768   __asm__ ("cmp %w1,0\n cset %w0,ne" : "=r"(crypto_int32_z) : "r"(crypto_int32_x) : "cc");
769   return crypto_int32_z;
770 #else
771   crypto_int32_x |= -crypto_int32_x;
772   return crypto_int32_unsigned_topbit_01(crypto_int32_x);
773 #endif
774 }
775 
776 __attribute__((unused))
777 static inline
778 crypto_int32 crypto_int32_positive_mask(crypto_int32 crypto_int32_x) {
779 #if defined(__GNUC__) && defined(__x86_64__)
780   crypto_int32 crypto_int32_q,crypto_int32_z;
781   __asm__ ("xorl %0,%0\n movl $-1,%1\n testl %2,%2\n cmovgl %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x) : "cc");
782   return crypto_int32_z;
783 #elif defined(__GNUC__) && defined(__aarch64__)
784   crypto_int32 crypto_int32_z;
785   __asm__ ("cmp %w1,0\n csetm %w0,gt" : "=r"(crypto_int32_z) : "r"(crypto_int32_x) : "cc");
786   return crypto_int32_z;
787 #else
788   crypto_int32 crypto_int32_z = -crypto_int32_x;
789   crypto_int32_z ^= crypto_int32_x & crypto_int32_z;
790   return crypto_int32_negative_mask(crypto_int32_z);
791 #endif
792 }
793 
794 __attribute__((unused))
795 static inline
796 crypto_int32 crypto_int32_positive_01(crypto_int32 crypto_int32_x) {
797 #if defined(__GNUC__) && defined(__x86_64__)
798   crypto_int32 crypto_int32_q,crypto_int32_z;
799   __asm__ ("xorl %0,%0\n movl $1,%1\n testl %2,%2\n cmovgl %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x) : "cc");
800   return crypto_int32_z;
801 #elif defined(__GNUC__) && defined(__aarch64__)
802   crypto_int32 crypto_int32_z;
803   __asm__ ("cmp %w1,0\n cset %w0,gt" : "=r"(crypto_int32_z) : "r"(crypto_int32_x) : "cc");
804   return crypto_int32_z;
805 #else
806   crypto_int32 crypto_int32_z = -crypto_int32_x;
807   crypto_int32_z ^= crypto_int32_x & crypto_int32_z;
808   return crypto_int32_unsigned_topbit_01(crypto_int32_z);
809 #endif
810 }
811 
812 __attribute__((unused))
813 static inline
814 crypto_int32 crypto_int32_zero_mask(crypto_int32 crypto_int32_x) {
815 #if defined(__GNUC__) && defined(__x86_64__)
816   crypto_int32 crypto_int32_q,crypto_int32_z;
817   __asm__ ("xorl %0,%0\n movl $-1,%1\n testl %2,%2\n cmovel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x) : "cc");
818   return crypto_int32_z;
819 #elif defined(__GNUC__) && defined(__aarch64__)
820   crypto_int32 crypto_int32_z;
821   __asm__ ("cmp %w1,0\n csetm %w0,eq" : "=r"(crypto_int32_z) : "r"(crypto_int32_x) : "cc");
822   return crypto_int32_z;
823 #else
824   return ~crypto_int32_nonzero_mask(crypto_int32_x);
825 #endif
826 }
827 
828 __attribute__((unused))
829 static inline
830 crypto_int32 crypto_int32_zero_01(crypto_int32 crypto_int32_x) {
831 #if defined(__GNUC__) && defined(__x86_64__)
832   crypto_int32 crypto_int32_q,crypto_int32_z;
833   __asm__ ("xorl %0,%0\n movl $1,%1\n testl %2,%2\n cmovel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x) : "cc");
834   return crypto_int32_z;
835 #elif defined(__GNUC__) && defined(__aarch64__)
836   crypto_int32 crypto_int32_z;
837   __asm__ ("cmp %w1,0\n cset %w0,eq" : "=r"(crypto_int32_z) : "r"(crypto_int32_x) : "cc");
838   return crypto_int32_z;
839 #else
840   return 1-crypto_int32_nonzero_01(crypto_int32_x);
841 #endif
842 }
843 
844 __attribute__((unused))
845 static inline
846 crypto_int32 crypto_int32_unequal_mask(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) {
847 #if defined(__GNUC__) && defined(__x86_64__)
848   crypto_int32 crypto_int32_q,crypto_int32_z;
849   __asm__ ("xorl %0,%0\n movl $-1,%1\n cmpl %3,%2\n cmovnel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc");
850   return crypto_int32_z;
851 #elif defined(__GNUC__) && defined(__aarch64__)
852   crypto_int32 crypto_int32_z;
853   __asm__ ("cmp %w1,%w2\n csetm %w0,ne" : "=r"(crypto_int32_z) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc");
854   return crypto_int32_z;
855 #else
856   return crypto_int32_nonzero_mask(crypto_int32_x ^ crypto_int32_y);
857 #endif
858 }
859 
860 __attribute__((unused))
861 static inline
862 crypto_int32 crypto_int32_unequal_01(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) {
863 #if defined(__GNUC__) && defined(__x86_64__)
864   crypto_int32 crypto_int32_q,crypto_int32_z;
865   __asm__ ("xorl %0,%0\n movl $1,%1\n cmpl %3,%2\n cmovnel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc");
866   return crypto_int32_z;
867 #elif defined(__GNUC__) && defined(__aarch64__)
868   crypto_int32 crypto_int32_z;
869   __asm__ ("cmp %w1,%w2\n cset %w0,ne" : "=r"(crypto_int32_z) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc");
870   return crypto_int32_z;
871 #else
872   return crypto_int32_nonzero_01(crypto_int32_x ^ crypto_int32_y);
873 #endif
874 }
875 
876 __attribute__((unused))
877 static inline
878 crypto_int32 crypto_int32_equal_mask(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) {
879 #if defined(__GNUC__) && defined(__x86_64__)
880   crypto_int32 crypto_int32_q,crypto_int32_z;
881   __asm__ ("xorl %0,%0\n movl $-1,%1\n cmpl %3,%2\n cmovel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc");
882   return crypto_int32_z;
883 #elif defined(__GNUC__) && defined(__aarch64__)
884   crypto_int32 crypto_int32_z;
885   __asm__ ("cmp %w1,%w2\n csetm %w0,eq" : "=r"(crypto_int32_z) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc");
886   return crypto_int32_z;
887 #else
888   return ~crypto_int32_unequal_mask(crypto_int32_x,crypto_int32_y);
889 #endif
890 }
891 
892 __attribute__((unused))
893 static inline
894 crypto_int32 crypto_int32_equal_01(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) {
895 #if defined(__GNUC__) && defined(__x86_64__)
896   crypto_int32 crypto_int32_q,crypto_int32_z;
897   __asm__ ("xorl %0,%0\n movl $1,%1\n cmpl %3,%2\n cmovel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc");
898   return crypto_int32_z;
899 #elif defined(__GNUC__) && defined(__aarch64__)
900   crypto_int32 crypto_int32_z;
901   __asm__ ("cmp %w1,%w2\n cset %w0,eq" : "=r"(crypto_int32_z) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc");
902   return crypto_int32_z;
903 #else
904   return 1-crypto_int32_unequal_01(crypto_int32_x,crypto_int32_y);
905 #endif
906 }
907 
908 __attribute__((unused))
909 static inline
910 crypto_int32 crypto_int32_min(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) {
911 #if defined(__GNUC__) && defined(__x86_64__)
912   __asm__ ("cmpl %1,%0\n cmovgl %1,%0" : "+r"(crypto_int32_x) : "r"(crypto_int32_y) : "cc");
913   return crypto_int32_x;
914 #elif defined(__GNUC__) && defined(__aarch64__)
915   __asm__ ("cmp %w0,%w1\n csel %w0,%w0,%w1,lt" : "+r"(crypto_int32_x) : "r"(crypto_int32_y) : "cc");
916   return crypto_int32_x;
917 #else
918   crypto_int64 crypto_int32_r = (crypto_int64)crypto_int32_y ^ (crypto_int64)crypto_int32_x;
919   crypto_int64 crypto_int32_z = (crypto_int64)crypto_int32_y - (crypto_int64)crypto_int32_x;
920   crypto_int32_z ^= crypto_int32_r & (crypto_int32_z ^ crypto_int32_y);
921   crypto_int32_z = crypto_int32_negative_mask(crypto_int32_z);
922   crypto_int32_z &= crypto_int32_r;
923   return crypto_int32_x ^ crypto_int32_z;
924 #endif
925 }
926 
927 __attribute__((unused))
928 static inline
929 crypto_int32 crypto_int32_max(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) {
930 #if defined(__GNUC__) && defined(__x86_64__)
931   __asm__ ("cmpl %1,%0\n cmovll %1,%0" : "+r"(crypto_int32_x) : "r"(crypto_int32_y) : "cc");
932   return crypto_int32_x;
933 #elif defined(__GNUC__) && defined(__aarch64__)
934   __asm__ ("cmp %w0,%w1\n csel %w0,%w1,%w0,lt" : "+r"(crypto_int32_x) : "r"(crypto_int32_y) : "cc");
935   return crypto_int32_x;
936 #else
937   crypto_int64 crypto_int32_r = (crypto_int64)crypto_int32_y ^ (crypto_int64)crypto_int32_x;
938   crypto_int64 crypto_int32_z = (crypto_int64)crypto_int32_y - (crypto_int64)crypto_int32_x;
939   crypto_int32_z ^= crypto_int32_r & (crypto_int32_z ^ crypto_int32_y);
940   crypto_int32_z = crypto_int32_negative_mask(crypto_int32_z);
941   crypto_int32_z &= crypto_int32_r;
942   return crypto_int32_y ^ crypto_int32_z;
943 #endif
944 }
945 
946 __attribute__((unused))
947 static inline
948 void crypto_int32_minmax(crypto_int32 *crypto_int32_p,crypto_int32 *crypto_int32_q) {
949   crypto_int32 crypto_int32_x = *crypto_int32_p;
950   crypto_int32 crypto_int32_y = *crypto_int32_q;
951 #if defined(__GNUC__) && defined(__x86_64__)
952   crypto_int32 crypto_int32_z;
953   __asm__ ("cmpl %2,%1\n movl %1,%0\n cmovgl %2,%1\n cmovgl %0,%2" : "=&r"(crypto_int32_z), "+&r"(crypto_int32_x), "+r"(crypto_int32_y) : : "cc");
954   *crypto_int32_p = crypto_int32_x;
955   *crypto_int32_q = crypto_int32_y;
956 #elif defined(__GNUC__) && defined(__aarch64__)
957   crypto_int32 crypto_int32_r, crypto_int32_s;
958   __asm__ ("cmp %w2,%w3\n csel %w0,%w2,%w3,lt\n csel %w1,%w3,%w2,lt" : "=&r"(crypto_int32_r), "=r"(crypto_int32_s) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc");
959   *crypto_int32_p = crypto_int32_r;
960   *crypto_int32_q = crypto_int32_s;
961 #else
962   crypto_int64 crypto_int32_r = (crypto_int64)crypto_int32_y ^ (crypto_int64)crypto_int32_x;
963   crypto_int64 crypto_int32_z = (crypto_int64)crypto_int32_y - (crypto_int64)crypto_int32_x;
964   crypto_int32_z ^= crypto_int32_r & (crypto_int32_z ^ crypto_int32_y);
965   crypto_int32_z = crypto_int32_negative_mask(crypto_int32_z);
966   crypto_int32_z &= crypto_int32_r;
967   crypto_int32_x ^= crypto_int32_z;
968   crypto_int32_y ^= crypto_int32_z;
969   *crypto_int32_p = crypto_int32_x;
970   *crypto_int32_q = crypto_int32_y;
971 #endif
972 }
973 
974 __attribute__((unused))
975 static inline
976 crypto_int32 crypto_int32_smaller_mask(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) {
977 #if defined(__GNUC__) && defined(__x86_64__)
978   crypto_int32 crypto_int32_q,crypto_int32_z;
979   __asm__ ("xorl %0,%0\n movl $-1,%1\n cmpl %3,%2\n cmovll %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc");
980   return crypto_int32_z;
981 #elif defined(__GNUC__) && defined(__aarch64__)
982   crypto_int32 crypto_int32_z;
983   __asm__ ("cmp %w1,%w2\n csetm %w0,lt" : "=r"(crypto_int32_z) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc");
984   return crypto_int32_z;
985 #else
986   crypto_int32 crypto_int32_r = crypto_int32_x ^ crypto_int32_y;
987   crypto_int32 crypto_int32_z = crypto_int32_x - crypto_int32_y;
988   crypto_int32_z ^= crypto_int32_r & (crypto_int32_z ^ crypto_int32_x);
989   return crypto_int32_negative_mask(crypto_int32_z);
990 #endif
991 }
992 
993 __attribute__((unused))
994 static inline
995 crypto_int32 crypto_int32_smaller_01(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) {
996 #if defined(__GNUC__) && defined(__x86_64__)
997   crypto_int32 crypto_int32_q,crypto_int32_z;
998   __asm__ ("xorl %0,%0\n movl $1,%1\n cmpl %3,%2\n cmovll %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc");
999   return crypto_int32_z;
1000 #elif defined(__GNUC__) && defined(__aarch64__)
1001   crypto_int32 crypto_int32_z;
1002   __asm__ ("cmp %w1,%w2\n cset %w0,lt" : "=r"(crypto_int32_z) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc");
1003   return crypto_int32_z;
1004 #else
1005   crypto_int32 crypto_int32_r = crypto_int32_x ^ crypto_int32_y;
1006   crypto_int32 crypto_int32_z = crypto_int32_x - crypto_int32_y;
1007   crypto_int32_z ^= crypto_int32_r & (crypto_int32_z ^ crypto_int32_x);
1008   return crypto_int32_unsigned_topbit_01(crypto_int32_z);
1009 #endif
1010 }
1011 
1012 __attribute__((unused))
1013 static inline
1014 crypto_int32 crypto_int32_leq_mask(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) {
1015 #if defined(__GNUC__) && defined(__x86_64__)
1016   crypto_int32 crypto_int32_q,crypto_int32_z;
1017   __asm__ ("xorl %0,%0\n movl $-1,%1\n cmpl %3,%2\n cmovlel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc");
1018   return crypto_int32_z;
1019 #elif defined(__GNUC__) && defined(__aarch64__)
1020   crypto_int32 crypto_int32_z;
1021   __asm__ ("cmp %w1,%w2\n csetm %w0,le" : "=r"(crypto_int32_z) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc");
1022   return crypto_int32_z;
1023 #else
1024   return ~crypto_int32_smaller_mask(crypto_int32_y,crypto_int32_x);
1025 #endif
1026 }
1027 
1028 __attribute__((unused))
1029 static inline
1030 crypto_int32 crypto_int32_leq_01(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) {
1031 #if defined(__GNUC__) && defined(__x86_64__)
1032   crypto_int32 crypto_int32_q,crypto_int32_z;
1033   __asm__ ("xorl %0,%0\n movl $1,%1\n cmpl %3,%2\n cmovlel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc");
1034   return crypto_int32_z;
1035 #elif defined(__GNUC__) && defined(__aarch64__)
1036   crypto_int32 crypto_int32_z;
1037   __asm__ ("cmp %w1,%w2\n cset %w0,le" : "=r"(crypto_int32_z) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc");
1038   return crypto_int32_z;
1039 #else
1040   return 1-crypto_int32_smaller_01(crypto_int32_y,crypto_int32_x);
1041 #endif
1042 }
1043 
1044 __attribute__((unused))
1045 static inline
1046 int crypto_int32_ones_num(crypto_int32 crypto_int32_x) {
1047   crypto_int32_unsigned crypto_int32_y = crypto_int32_x;
1048   const crypto_int32 C0 = 0x55555555;
1049   const crypto_int32 C1 = 0x33333333;
1050   const crypto_int32 C2 = 0x0f0f0f0f;
1051   crypto_int32_y -= ((crypto_int32_y >> 1) & C0);
1052   crypto_int32_y = (crypto_int32_y & C1) + ((crypto_int32_y >> 2) & C1);
1053   crypto_int32_y = (crypto_int32_y + (crypto_int32_y >> 4)) & C2;
1054   crypto_int32_y += crypto_int32_y >> 8;
1055   crypto_int32_y = (crypto_int32_y + (crypto_int32_y >> 16)) & 0xff;
1056   return crypto_int32_y;
1057 }
1058 
1059 __attribute__((unused))
1060 static inline
1061 int crypto_int32_bottomzeros_num(crypto_int32 crypto_int32_x) {
1062 #if defined(__GNUC__) && defined(__x86_64__)
1063   crypto_int32 fallback = 32;
1064   __asm__ ("bsfl %0,%0\n cmovel %1,%0" : "+&r"(crypto_int32_x) : "r"(fallback) : "cc");
1065   return crypto_int32_x;
1066 #elif defined(__GNUC__) && defined(__aarch64__)
1067   int64_t crypto_int32_y;
1068   __asm__ ("rbit %w0,%w1\n clz %w0,%w0" : "=r"(crypto_int32_y) : "r"(crypto_int32_x) : );
1069   return crypto_int32_y;
1070 #else
1071   crypto_int32 crypto_int32_y = crypto_int32_x ^ (crypto_int32_x-1);
1072   crypto_int32_y = ((crypto_int32) crypto_int32_y) >> 1;
1073   crypto_int32_y &= ~(crypto_int32_x & (((crypto_int32) 1) << (32-1)));
1074   return crypto_int32_ones_num(crypto_int32_y);
1075 #endif
1076 }
1077 
1078 #endif
1079 
1080 /* from supercop-20240808/cryptoint/crypto_int64.h */
1081 /* auto-generated: cd cryptoint; ./autogen */
1082 /* cryptoint 20240806 */
1083 
1084 #ifndef crypto_int64_h
1085 #define crypto_int64_h
1086 
1087 #define crypto_int64 int64_t
1088 #define crypto_int64_unsigned uint64_t
1089 
1090 
1091 
1092 __attribute__((unused))
1093 static inline
1094 crypto_int64 crypto_int64_load(const unsigned char *crypto_int64_s) {
1095   crypto_int64 crypto_int64_z = 0;
1096   crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 0;
1097   crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 8;
1098   crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 16;
1099   crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 24;
1100   crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 32;
1101   crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 40;
1102   crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 48;
1103   crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 56;
1104   return crypto_int64_z;
1105 }
1106 
1107 __attribute__((unused))
1108 static inline
1109 void crypto_int64_store(unsigned char *crypto_int64_s,crypto_int64 crypto_int64_x) {
1110   *crypto_int64_s++ = crypto_int64_x >> 0;
1111   *crypto_int64_s++ = crypto_int64_x >> 8;
1112   *crypto_int64_s++ = crypto_int64_x >> 16;
1113   *crypto_int64_s++ = crypto_int64_x >> 24;
1114   *crypto_int64_s++ = crypto_int64_x >> 32;
1115   *crypto_int64_s++ = crypto_int64_x >> 40;
1116   *crypto_int64_s++ = crypto_int64_x >> 48;
1117   *crypto_int64_s++ = crypto_int64_x >> 56;
1118 }
1119 
1120 __attribute__((unused))
1121 static inline
1122 crypto_int64 crypto_int64_negative_mask(crypto_int64 crypto_int64_x) {
1123 #if defined(__GNUC__) && defined(__x86_64__)
1124   __asm__ ("sarq $63,%0" : "+r"(crypto_int64_x) : : "cc");
1125   return crypto_int64_x;
1126 #elif defined(__GNUC__) && defined(__aarch64__)
1127   crypto_int64 crypto_int64_y;
1128   __asm__ ("asr %0,%1,63" : "=r"(crypto_int64_y) : "r"(crypto_int64_x) : );
1129   return crypto_int64_y;
1130 #else
1131   crypto_int64_x >>= 64-6;
1132   crypto_int64_x ^= crypto_int64_optblocker;
1133   crypto_int64_x >>= 5;
1134   return crypto_int64_x;
1135 #endif
1136 }
1137 
1138 __attribute__((unused))
1139 static inline
1140 crypto_int64_unsigned crypto_int64_unsigned_topbit_01(crypto_int64_unsigned crypto_int64_x) {
1141 #if defined(__GNUC__) && defined(__x86_64__)
1142   __asm__ ("shrq $63,%0" : "+r"(crypto_int64_x) : : "cc");
1143   return crypto_int64_x;
1144 #elif defined(__GNUC__) && defined(__aarch64__)
1145   crypto_int64 crypto_int64_y;
1146   __asm__ ("lsr %0,%1,63" : "=r"(crypto_int64_y) : "r"(crypto_int64_x) : );
1147   return crypto_int64_y;
1148 #else
1149   crypto_int64_x >>= 64-6;
1150   crypto_int64_x ^= crypto_int64_optblocker;
1151   crypto_int64_x >>= 5;
1152   return crypto_int64_x;
1153 #endif
1154 }
1155 
1156 __attribute__((unused))
1157 static inline
1158 crypto_int64 crypto_int64_negative_01(crypto_int64 crypto_int64_x) {
1159   return crypto_int64_unsigned_topbit_01(crypto_int64_x);
1160 }
1161 
1162 __attribute__((unused))
1163 static inline
1164 crypto_int64 crypto_int64_topbit_mask(crypto_int64 crypto_int64_x) {
1165   return crypto_int64_negative_mask(crypto_int64_x);
1166 }
1167 
1168 __attribute__((unused))
1169 static inline
1170 crypto_int64 crypto_int64_topbit_01(crypto_int64 crypto_int64_x) {
1171   return crypto_int64_unsigned_topbit_01(crypto_int64_x);
1172 }
1173 
1174 __attribute__((unused))
1175 static inline
1176 crypto_int64 crypto_int64_bottombit_mask(crypto_int64 crypto_int64_x) {
1177 #if defined(__GNUC__) && defined(__x86_64__)
1178   __asm__ ("andq $1,%0" : "+r"(crypto_int64_x) : : "cc");
1179   return -crypto_int64_x;
1180 #elif defined(__GNUC__) && defined(__aarch64__)
1181   crypto_int64 crypto_int64_y;
1182   __asm__ ("sbfx %0,%1,0,1" : "=r"(crypto_int64_y) : "r"(crypto_int64_x) : );
1183   return crypto_int64_y;
1184 #else
1185   crypto_int64_x &= 1 ^ crypto_int64_optblocker;
1186   return -crypto_int64_x;
1187 #endif
1188 }
1189 
1190 __attribute__((unused))
1191 static inline
1192 crypto_int64 crypto_int64_bottombit_01(crypto_int64 crypto_int64_x) {
1193 #if defined(__GNUC__) && defined(__x86_64__)
1194   __asm__ ("andq $1,%0" : "+r"(crypto_int64_x) : : "cc");
1195   return crypto_int64_x;
1196 #elif defined(__GNUC__) && defined(__aarch64__)
1197   crypto_int64 crypto_int64_y;
1198   __asm__ ("ubfx %0,%1,0,1" : "=r"(crypto_int64_y) : "r"(crypto_int64_x) : );
1199   return crypto_int64_y;
1200 #else
1201   crypto_int64_x &= 1 ^ crypto_int64_optblocker;
1202   return crypto_int64_x;
1203 #endif
1204 }
1205 
1206 __attribute__((unused))
1207 static inline
1208 crypto_int64 crypto_int64_bitinrangepublicpos_mask(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_s) {
1209 #if defined(__GNUC__) && defined(__x86_64__)
1210   __asm__ ("sarq %%cl,%0" : "+r"(crypto_int64_x) : "c"(crypto_int64_s) : "cc");
1211 #elif defined(__GNUC__) && defined(__aarch64__)
1212   __asm__ ("asr %0,%0,%1" : "+r"(crypto_int64_x) : "r"(crypto_int64_s) : );
1213 #else
1214   crypto_int64_x >>= crypto_int64_s ^ crypto_int64_optblocker;
1215 #endif
1216   return crypto_int64_bottombit_mask(crypto_int64_x);
1217 }
1218 
1219 __attribute__((unused))
1220 static inline
1221 crypto_int64 crypto_int64_bitinrangepublicpos_01(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_s) {
1222 #if defined(__GNUC__) && defined(__x86_64__)
1223   __asm__ ("sarq %%cl,%0" : "+r"(crypto_int64_x) : "c"(crypto_int64_s) : "cc");
1224 #elif defined(__GNUC__) && defined(__aarch64__)
1225   __asm__ ("asr %0,%0,%1" : "+r"(crypto_int64_x) : "r"(crypto_int64_s) : );
1226 #else
1227   crypto_int64_x >>= crypto_int64_s ^ crypto_int64_optblocker;
1228 #endif
1229   return crypto_int64_bottombit_01(crypto_int64_x);
1230 }
1231 
1232 __attribute__((unused))
1233 static inline
1234 crypto_int64 crypto_int64_shlmod(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_s) {
1235 #if defined(__GNUC__) && defined(__x86_64__)
1236   __asm__ ("shlq %%cl,%0" : "+r"(crypto_int64_x) : "c"(crypto_int64_s) : "cc");
1237 #elif defined(__GNUC__) && defined(__aarch64__)
1238   __asm__ ("lsl %0,%0,%1" : "+r"(crypto_int64_x) : "r"(crypto_int64_s) : );
1239 #else
1240   int crypto_int64_k, crypto_int64_l;
1241   for (crypto_int64_l = 0,crypto_int64_k = 1;crypto_int64_k < 64;++crypto_int64_l,crypto_int64_k *= 2)
1242     crypto_int64_x ^= (crypto_int64_x ^ (crypto_int64_x << crypto_int64_k)) & crypto_int64_bitinrangepublicpos_mask(crypto_int64_s,crypto_int64_l);
1243 #endif
1244   return crypto_int64_x;
1245 }
1246 
1247 __attribute__((unused))
1248 static inline
1249 crypto_int64 crypto_int64_shrmod(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_s) {
1250 #if defined(__GNUC__) && defined(__x86_64__)
1251   __asm__ ("sarq %%cl,%0" : "+r"(crypto_int64_x) : "c"(crypto_int64_s) : "cc");
1252 #elif defined(__GNUC__) && defined(__aarch64__)
1253   __asm__ ("asr %0,%0,%1" : "+r"(crypto_int64_x) : "r"(crypto_int64_s) : );
1254 #else
1255   int crypto_int64_k, crypto_int64_l;
1256   for (crypto_int64_l = 0,crypto_int64_k = 1;crypto_int64_k < 64;++crypto_int64_l,crypto_int64_k *= 2)
1257     crypto_int64_x ^= (crypto_int64_x ^ (crypto_int64_x >> crypto_int64_k)) & crypto_int64_bitinrangepublicpos_mask(crypto_int64_s,crypto_int64_l);
1258 #endif
1259   return crypto_int64_x;
1260 }
1261 
1262 __attribute__((unused))
1263 static inline
1264 crypto_int64 crypto_int64_bitmod_mask(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_s) {
1265   crypto_int64_x = crypto_int64_shrmod(crypto_int64_x,crypto_int64_s);
1266   return crypto_int64_bottombit_mask(crypto_int64_x);
1267 }
1268 
1269 __attribute__((unused))
1270 static inline
1271 crypto_int64 crypto_int64_bitmod_01(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_s) {
1272   crypto_int64_x = crypto_int64_shrmod(crypto_int64_x,crypto_int64_s);
1273   return crypto_int64_bottombit_01(crypto_int64_x);
1274 }
1275 
1276 __attribute__((unused))
1277 static inline
1278 crypto_int64 crypto_int64_nonzero_mask(crypto_int64 crypto_int64_x) {
1279 #if defined(__GNUC__) && defined(__x86_64__)
1280   crypto_int64 crypto_int64_q,crypto_int64_z;
1281   __asm__ ("xorq %0,%0\n movq $-1,%1\n testq %2,%2\n cmovneq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x) : "cc");
1282   return crypto_int64_z;
1283 #elif defined(__GNUC__) && defined(__aarch64__)
1284   crypto_int64 crypto_int64_z;
1285   __asm__ ("cmp %1,0\n csetm %0,ne" : "=r"(crypto_int64_z) : "r"(crypto_int64_x) : "cc");
1286   return crypto_int64_z;
1287 #else
1288   crypto_int64_x |= -crypto_int64_x;
1289   return crypto_int64_negative_mask(crypto_int64_x);
1290 #endif
1291 }
1292 
1293 __attribute__((unused))
1294 static inline
1295 crypto_int64 crypto_int64_nonzero_01(crypto_int64 crypto_int64_x) {
1296 #if defined(__GNUC__) && defined(__x86_64__)
1297   crypto_int64 crypto_int64_q,crypto_int64_z;
1298   __asm__ ("xorq %0,%0\n movq $1,%1\n testq %2,%2\n cmovneq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x) : "cc");
1299   return crypto_int64_z;
1300 #elif defined(__GNUC__) && defined(__aarch64__)
1301   crypto_int64 crypto_int64_z;
1302   __asm__ ("cmp %1,0\n cset %0,ne" : "=r"(crypto_int64_z) : "r"(crypto_int64_x) : "cc");
1303   return crypto_int64_z;
1304 #else
1305   crypto_int64_x |= -crypto_int64_x;
1306   return crypto_int64_unsigned_topbit_01(crypto_int64_x);
1307 #endif
1308 }
1309 
1310 __attribute__((unused))
1311 static inline
1312 crypto_int64 crypto_int64_positive_mask(crypto_int64 crypto_int64_x) {
1313 #if defined(__GNUC__) && defined(__x86_64__)
1314   crypto_int64 crypto_int64_q,crypto_int64_z;
1315   __asm__ ("xorq %0,%0\n movq $-1,%1\n testq %2,%2\n cmovgq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x) : "cc");
1316   return crypto_int64_z;
1317 #elif defined(__GNUC__) && defined(__aarch64__)
1318   crypto_int64 crypto_int64_z;
1319   __asm__ ("cmp %1,0\n csetm %0,gt" : "=r"(crypto_int64_z) : "r"(crypto_int64_x) : "cc");
1320   return crypto_int64_z;
1321 #else
1322   crypto_int64 crypto_int64_z = -crypto_int64_x;
1323   crypto_int64_z ^= crypto_int64_x & crypto_int64_z;
1324   return crypto_int64_negative_mask(crypto_int64_z);
1325 #endif
1326 }
1327 
1328 __attribute__((unused))
1329 static inline
1330 crypto_int64 crypto_int64_positive_01(crypto_int64 crypto_int64_x) {
1331 #if defined(__GNUC__) && defined(__x86_64__)
1332   crypto_int64 crypto_int64_q,crypto_int64_z;
1333   __asm__ ("xorq %0,%0\n movq $1,%1\n testq %2,%2\n cmovgq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x) : "cc");
1334   return crypto_int64_z;
1335 #elif defined(__GNUC__) && defined(__aarch64__)
1336   crypto_int64 crypto_int64_z;
1337   __asm__ ("cmp %1,0\n cset %0,gt" : "=r"(crypto_int64_z) : "r"(crypto_int64_x) : "cc");
1338   return crypto_int64_z;
1339 #else
1340   crypto_int64 crypto_int64_z = -crypto_int64_x;
1341   crypto_int64_z ^= crypto_int64_x & crypto_int64_z;
1342   return crypto_int64_unsigned_topbit_01(crypto_int64_z);
1343 #endif
1344 }
1345 
1346 __attribute__((unused))
1347 static inline
1348 crypto_int64 crypto_int64_zero_mask(crypto_int64 crypto_int64_x) {
1349 #if defined(__GNUC__) && defined(__x86_64__)
1350   crypto_int64 crypto_int64_q,crypto_int64_z;
1351   __asm__ ("xorq %0,%0\n movq $-1,%1\n testq %2,%2\n cmoveq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x) : "cc");
1352   return crypto_int64_z;
1353 #elif defined(__GNUC__) && defined(__aarch64__)
1354   crypto_int64 crypto_int64_z;
1355   __asm__ ("cmp %1,0\n csetm %0,eq" : "=r"(crypto_int64_z) : "r"(crypto_int64_x) : "cc");
1356   return crypto_int64_z;
1357 #else
1358   return ~crypto_int64_nonzero_mask(crypto_int64_x);
1359 #endif
1360 }
1361 
1362 __attribute__((unused))
1363 static inline
1364 crypto_int64 crypto_int64_zero_01(crypto_int64 crypto_int64_x) {
1365 #if defined(__GNUC__) && defined(__x86_64__)
1366   crypto_int64 crypto_int64_q,crypto_int64_z;
1367   __asm__ ("xorq %0,%0\n movq $1,%1\n testq %2,%2\n cmoveq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x) : "cc");
1368   return crypto_int64_z;
1369 #elif defined(__GNUC__) && defined(__aarch64__)
1370   crypto_int64 crypto_int64_z;
1371   __asm__ ("cmp %1,0\n cset %0,eq" : "=r"(crypto_int64_z) : "r"(crypto_int64_x) : "cc");
1372   return crypto_int64_z;
1373 #else
1374   return 1-crypto_int64_nonzero_01(crypto_int64_x);
1375 #endif
1376 }
1377 
1378 __attribute__((unused))
1379 static inline
1380 crypto_int64 crypto_int64_unequal_mask(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) {
1381 #if defined(__GNUC__) && defined(__x86_64__)
1382   crypto_int64 crypto_int64_q,crypto_int64_z;
1383   __asm__ ("xorq %0,%0\n movq $-1,%1\n cmpq %3,%2\n cmovneq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc");
1384   return crypto_int64_z;
1385 #elif defined(__GNUC__) && defined(__aarch64__)
1386   crypto_int64 crypto_int64_z;
1387   __asm__ ("cmp %1,%2\n csetm %0,ne" : "=r"(crypto_int64_z) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc");
1388   return crypto_int64_z;
1389 #else
1390   return crypto_int64_nonzero_mask(crypto_int64_x ^ crypto_int64_y);
1391 #endif
1392 }
1393 
1394 __attribute__((unused))
1395 static inline
1396 crypto_int64 crypto_int64_unequal_01(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) {
1397 #if defined(__GNUC__) && defined(__x86_64__)
1398   crypto_int64 crypto_int64_q,crypto_int64_z;
1399   __asm__ ("xorq %0,%0\n movq $1,%1\n cmpq %3,%2\n cmovneq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc");
1400   return crypto_int64_z;
1401 #elif defined(__GNUC__) && defined(__aarch64__)
1402   crypto_int64 crypto_int64_z;
1403   __asm__ ("cmp %1,%2\n cset %0,ne" : "=r"(crypto_int64_z) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc");
1404   return crypto_int64_z;
1405 #else
1406   return crypto_int64_nonzero_01(crypto_int64_x ^ crypto_int64_y);
1407 #endif
1408 }
1409 
1410 __attribute__((unused))
1411 static inline
1412 crypto_int64 crypto_int64_equal_mask(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) {
1413 #if defined(__GNUC__) && defined(__x86_64__)
1414   crypto_int64 crypto_int64_q,crypto_int64_z;
1415   __asm__ ("xorq %0,%0\n movq $-1,%1\n cmpq %3,%2\n cmoveq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc");
1416   return crypto_int64_z;
1417 #elif defined(__GNUC__) && defined(__aarch64__)
1418   crypto_int64 crypto_int64_z;
1419   __asm__ ("cmp %1,%2\n csetm %0,eq" : "=r"(crypto_int64_z) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc");
1420   return crypto_int64_z;
1421 #else
1422   return ~crypto_int64_unequal_mask(crypto_int64_x,crypto_int64_y);
1423 #endif
1424 }
1425 
1426 __attribute__((unused))
1427 static inline
1428 crypto_int64 crypto_int64_equal_01(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) {
1429 #if defined(__GNUC__) && defined(__x86_64__)
1430   crypto_int64 crypto_int64_q,crypto_int64_z;
1431   __asm__ ("xorq %0,%0\n movq $1,%1\n cmpq %3,%2\n cmoveq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc");
1432   return crypto_int64_z;
1433 #elif defined(__GNUC__) && defined(__aarch64__)
1434   crypto_int64 crypto_int64_z;
1435   __asm__ ("cmp %1,%2\n cset %0,eq" : "=r"(crypto_int64_z) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc");
1436   return crypto_int64_z;
1437 #else
1438   return 1-crypto_int64_unequal_01(crypto_int64_x,crypto_int64_y);
1439 #endif
1440 }
1441 
1442 __attribute__((unused))
1443 static inline
1444 crypto_int64 crypto_int64_min(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) {
1445 #if defined(__GNUC__) && defined(__x86_64__)
1446   __asm__ ("cmpq %1,%0\n cmovgq %1,%0" : "+r"(crypto_int64_x) : "r"(crypto_int64_y) : "cc");
1447   return crypto_int64_x;
1448 #elif defined(__GNUC__) && defined(__aarch64__)
1449   __asm__ ("cmp %0,%1\n csel %0,%0,%1,lt" : "+r"(crypto_int64_x) : "r"(crypto_int64_y) : "cc");
1450   return crypto_int64_x;
1451 #else
1452   crypto_int64 crypto_int64_r = crypto_int64_y ^ crypto_int64_x;
1453   crypto_int64 crypto_int64_z = crypto_int64_y - crypto_int64_x;
1454   crypto_int64_z ^= crypto_int64_r & (crypto_int64_z ^ crypto_int64_y);
1455   crypto_int64_z = crypto_int64_negative_mask(crypto_int64_z);
1456   crypto_int64_z &= crypto_int64_r;
1457   return crypto_int64_x ^ crypto_int64_z;
1458 #endif
1459 }
1460 
1461 __attribute__((unused))
1462 static inline
1463 crypto_int64 crypto_int64_max(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) {
1464 #if defined(__GNUC__) && defined(__x86_64__)
1465   __asm__ ("cmpq %1,%0\n cmovlq %1,%0" : "+r"(crypto_int64_x) : "r"(crypto_int64_y) : "cc");
1466   return crypto_int64_x;
1467 #elif defined(__GNUC__) && defined(__aarch64__)
1468   __asm__ ("cmp %0,%1\n csel %0,%1,%0,lt" : "+r"(crypto_int64_x) : "r"(crypto_int64_y) : "cc");
1469   return crypto_int64_x;
1470 #else
1471   crypto_int64 crypto_int64_r = crypto_int64_y ^ crypto_int64_x;
1472   crypto_int64 crypto_int64_z = crypto_int64_y - crypto_int64_x;
1473   crypto_int64_z ^= crypto_int64_r & (crypto_int64_z ^ crypto_int64_y);
1474   crypto_int64_z = crypto_int64_negative_mask(crypto_int64_z);
1475   crypto_int64_z &= crypto_int64_r;
1476   return crypto_int64_y ^ crypto_int64_z;
1477 #endif
1478 }
1479 
1480 __attribute__((unused))
1481 static inline
1482 void crypto_int64_minmax(crypto_int64 *crypto_int64_p,crypto_int64 *crypto_int64_q) {
1483   crypto_int64 crypto_int64_x = *crypto_int64_p;
1484   crypto_int64 crypto_int64_y = *crypto_int64_q;
1485 #if defined(__GNUC__) && defined(__x86_64__)
1486   crypto_int64 crypto_int64_z;
1487   __asm__ ("cmpq %2,%1\n movq %1,%0\n cmovgq %2,%1\n cmovgq %0,%2" : "=&r"(crypto_int64_z), "+&r"(crypto_int64_x), "+r"(crypto_int64_y) : : "cc");
1488   *crypto_int64_p = crypto_int64_x;
1489   *crypto_int64_q = crypto_int64_y;
1490 #elif defined(__GNUC__) && defined(__aarch64__)
1491   crypto_int64 crypto_int64_r, crypto_int64_s;
1492   __asm__ ("cmp %2,%3\n csel %0,%2,%3,lt\n csel %1,%3,%2,lt" : "=&r"(crypto_int64_r), "=r"(crypto_int64_s) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc");
1493   *crypto_int64_p = crypto_int64_r;
1494   *crypto_int64_q = crypto_int64_s;
1495 #else
1496   crypto_int64 crypto_int64_r = crypto_int64_y ^ crypto_int64_x;
1497   crypto_int64 crypto_int64_z = crypto_int64_y - crypto_int64_x;
1498   crypto_int64_z ^= crypto_int64_r & (crypto_int64_z ^ crypto_int64_y);
1499   crypto_int64_z = crypto_int64_negative_mask(crypto_int64_z);
1500   crypto_int64_z &= crypto_int64_r;
1501   crypto_int64_x ^= crypto_int64_z;
1502   crypto_int64_y ^= crypto_int64_z;
1503   *crypto_int64_p = crypto_int64_x;
1504   *crypto_int64_q = crypto_int64_y;
1505 #endif
1506 }
1507 
1508 __attribute__((unused))
1509 static inline
1510 crypto_int64 crypto_int64_smaller_mask(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) {
1511 #if defined(__GNUC__) && defined(__x86_64__)
1512   crypto_int64 crypto_int64_q,crypto_int64_z;
1513   __asm__ ("xorq %0,%0\n movq $-1,%1\n cmpq %3,%2\n cmovlq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc");
1514   return crypto_int64_z;
1515 #elif defined(__GNUC__) && defined(__aarch64__)
1516   crypto_int64 crypto_int64_z;
1517   __asm__ ("cmp %1,%2\n csetm %0,lt" : "=r"(crypto_int64_z) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc");
1518   return crypto_int64_z;
1519 #else
1520   crypto_int64 crypto_int64_r = crypto_int64_x ^ crypto_int64_y;
1521   crypto_int64 crypto_int64_z = crypto_int64_x - crypto_int64_y;
1522   crypto_int64_z ^= crypto_int64_r & (crypto_int64_z ^ crypto_int64_x);
1523   return crypto_int64_negative_mask(crypto_int64_z);
1524 #endif
1525 }
1526 
1527 __attribute__((unused))
1528 static inline
1529 crypto_int64 crypto_int64_smaller_01(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) {
1530 #if defined(__GNUC__) && defined(__x86_64__)
1531   crypto_int64 crypto_int64_q,crypto_int64_z;
1532   __asm__ ("xorq %0,%0\n movq $1,%1\n cmpq %3,%2\n cmovlq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc");
1533   return crypto_int64_z;
1534 #elif defined(__GNUC__) && defined(__aarch64__)
1535   crypto_int64 crypto_int64_z;
1536   __asm__ ("cmp %1,%2\n cset %0,lt" : "=r"(crypto_int64_z) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc");
1537   return crypto_int64_z;
1538 #else
1539   crypto_int64 crypto_int64_r = crypto_int64_x ^ crypto_int64_y;
1540   crypto_int64 crypto_int64_z = crypto_int64_x - crypto_int64_y;
1541   crypto_int64_z ^= crypto_int64_r & (crypto_int64_z ^ crypto_int64_x);
1542   return crypto_int64_unsigned_topbit_01(crypto_int64_z);
1543 #endif
1544 }
1545 
1546 __attribute__((unused))
1547 static inline
1548 crypto_int64 crypto_int64_leq_mask(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) {
1549 #if defined(__GNUC__) && defined(__x86_64__)
1550   crypto_int64 crypto_int64_q,crypto_int64_z;
1551   __asm__ ("xorq %0,%0\n movq $-1,%1\n cmpq %3,%2\n cmovleq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc");
1552   return crypto_int64_z;
1553 #elif defined(__GNUC__) && defined(__aarch64__)
1554   crypto_int64 crypto_int64_z;
1555   __asm__ ("cmp %1,%2\n csetm %0,le" : "=r"(crypto_int64_z) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc");
1556   return crypto_int64_z;
1557 #else
1558   return ~crypto_int64_smaller_mask(crypto_int64_y,crypto_int64_x);
1559 #endif
1560 }
1561 
1562 __attribute__((unused))
1563 static inline
1564 crypto_int64 crypto_int64_leq_01(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) {
1565 #if defined(__GNUC__) && defined(__x86_64__)
1566   crypto_int64 crypto_int64_q,crypto_int64_z;
1567   __asm__ ("xorq %0,%0\n movq $1,%1\n cmpq %3,%2\n cmovleq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc");
1568   return crypto_int64_z;
1569 #elif defined(__GNUC__) && defined(__aarch64__)
1570   crypto_int64 crypto_int64_z;
1571   __asm__ ("cmp %1,%2\n cset %0,le" : "=r"(crypto_int64_z) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc");
1572   return crypto_int64_z;
1573 #else
1574   return 1-crypto_int64_smaller_01(crypto_int64_y,crypto_int64_x);
1575 #endif
1576 }
1577 
1578 __attribute__((unused))
1579 static inline
1580 int crypto_int64_ones_num(crypto_int64 crypto_int64_x) {
1581   crypto_int64_unsigned crypto_int64_y = crypto_int64_x;
1582   const crypto_int64 C0 = 0x5555555555555555;
1583   const crypto_int64 C1 = 0x3333333333333333;
1584   const crypto_int64 C2 = 0x0f0f0f0f0f0f0f0f;
1585   crypto_int64_y -= ((crypto_int64_y >> 1) & C0);
1586   crypto_int64_y = (crypto_int64_y & C1) + ((crypto_int64_y >> 2) & C1);
1587   crypto_int64_y = (crypto_int64_y + (crypto_int64_y >> 4)) & C2;
1588   crypto_int64_y += crypto_int64_y >> 8;
1589   crypto_int64_y += crypto_int64_y >> 16;
1590   crypto_int64_y = (crypto_int64_y + (crypto_int64_y >> 32)) & 0xff;
1591   return crypto_int64_y;
1592 }
1593 
1594 __attribute__((unused))
1595 static inline
1596 int crypto_int64_bottomzeros_num(crypto_int64 crypto_int64_x) {
1597 #if defined(__GNUC__) && defined(__x86_64__)
1598   crypto_int64 fallback = 64;
1599   __asm__ ("bsfq %0,%0\n cmoveq %1,%0" : "+&r"(crypto_int64_x) : "r"(fallback) : "cc");
1600   return crypto_int64_x;
1601 #elif defined(__GNUC__) && defined(__aarch64__)
1602   int64_t crypto_int64_y;
1603   __asm__ ("rbit %0,%1\n clz %0,%0" : "=r"(crypto_int64_y) : "r"(crypto_int64_x) : );
1604   return crypto_int64_y;
1605 #else
1606   crypto_int64 crypto_int64_y = crypto_int64_x ^ (crypto_int64_x-1);
1607   crypto_int64_y = ((crypto_int64) crypto_int64_y) >> 1;
1608   crypto_int64_y &= ~(crypto_int64_x & (((crypto_int64) 1) << (64-1)));
1609   return crypto_int64_ones_num(crypto_int64_y);
1610 #endif
1611 }
1612 
1613 #endif
1614 
1615 /* from supercop-20240808/crypto_sort/int32/portable4/sort.c */
1616 #define int32_MINMAX(a,b) crypto_int32_minmax(&a,&b)
1617 
1618 static void crypto_sort_int32(void *array,long long n)
1619 {
1620   long long top,p,q,r,i,j;
1621   int32 *x = array;
1622 
1623   if (n < 2) return;
1624   top = 1;
1625   while (top < n - top) top += top;
1626 
1627   for (p = top;p >= 1;p >>= 1) {
1628     i = 0;
1629     while (i + 2 * p <= n) {
1630       for (j = i;j < i + p;++j)
1631         int32_MINMAX(x[j],x[j+p]);
1632       i += 2 * p;
1633     }
1634     for (j = i;j < n - p;++j)
1635       int32_MINMAX(x[j],x[j+p]);
1636 
1637     i = 0;
1638     j = 0;
1639     for (q = top;q > p;q >>= 1) {
1640       if (j != i) for (;;) {
1641         if (j == n - q) goto done;
1642         int32 a = x[j + p];
1643         for (r = q;r > p;r >>= 1)
1644           int32_MINMAX(a,x[j + r]);
1645         x[j + p] = a;
1646         ++j;
1647         if (j == i + p) {
1648           i += 2 * p;
1649           break;
1650         }
1651       }
1652       while (i + p <= n - q) {
1653         for (j = i;j < i + p;++j) {
1654           int32 a = x[j + p];
1655           for (r = q;r > p;r >>= 1)
1656             int32_MINMAX(a,x[j+r]);
1657           x[j + p] = a;
1658         }
1659         i += 2 * p;
1660       }
1661       /* now i + p > n - q */
1662       j = i;
1663       while (j < n - q) {
1664         int32 a = x[j + p];
1665         for (r = q;r > p;r >>= 1)
1666           int32_MINMAX(a,x[j+r]);
1667         x[j + p] = a;
1668         ++j;
1669       }
1670 
1671       done: ;
1672     }
1673   }
1674 }
1675 
1676 /* from supercop-20240808/crypto_sort/uint32/useint32/sort.c */
1677 
1678 /* can save time by vectorizing xor loops */
1679 /* can save time by integrating xor loops with int32_sort */
1680 
1681 static void crypto_sort_uint32(void *array,long long n)
1682 {
1683   crypto_uint32 *x = array;
1684   long long j;
1685   for (j = 0;j < n;++j) x[j] ^= 0x80000000;
1686   crypto_sort_int32(array,n);
1687   for (j = 0;j < n;++j) x[j] ^= 0x80000000;
1688 }
1689 
1690 /* from supercop-20240808/crypto_kem/sntrup761/compact/kem.c */
1691 // 20240806 djb: some automated conversion to cryptoint
1692 
1693 #define p 761
1694 #define q 4591
1695 #define w 286
1696 #define q12 ((q - 1) / 2)
1697 typedef int8_t small;
1698 typedef int16_t Fq;
1699 #define Hash_bytes 32
1700 #define Small_bytes ((p + 3) / 4)
1701 typedef small Inputs[p];
1702 #define SecretKeys_bytes (2 * Small_bytes)
1703 #define Confirm_bytes 32
1704 
1705 static small F3_freeze(int16_t x) { return x - 3 * ((10923 * x + 16384) >> 15); }
1706 
1707 static Fq Fq_freeze(int32_t x) {
1708   const int32_t q16 = (0x10000 + q / 2) / q;
1709   const int32_t q20 = (0x100000 + q / 2) / q;
1710   const int32_t q28 = (0x10000000 + q / 2) / q;
1711   x -= q * ((q16 * x) >> 16);
1712   x -= q * ((q20 * x) >> 20);
1713   return x - q * ((q28 * x + 0x8000000) >> 28);
1714 }
1715 
1716 static int Weightw_mask(small *r) {
1717   int i, weight = 0;
1718   for (i = 0; i < p; ++i) weight += crypto_int64_bottombit_01(r[i]);
1719   return crypto_int16_nonzero_mask(weight - w);
1720 }
1721 
1722 static void uint32_divmod_uint14(uint32_t *Q, uint16_t *r, uint32_t x, uint16_t m) {
1723   uint32_t qpart, mask, v = 0x80000000 / m;
1724   qpart = (x * (uint64_t)v) >> 31;
1725   x -= qpart * m;
1726   *Q = qpart;
1727   qpart = (x * (uint64_t)v) >> 31;
1728   x -= qpart * m;
1729   *Q += qpart;
1730   x -= m;
1731   *Q += 1;
1732   mask = crypto_int32_negative_mask(x);
1733   x += mask & (uint32_t)m;
1734   *Q += mask;
1735   *r = x;
1736 }
1737 
1738 static uint16_t uint32_mod_uint14(uint32_t x, uint16_t m) {
1739   uint32_t Q;
1740   uint16_t r;
1741   uint32_divmod_uint14(&Q, &r, x, m);
1742   return r;
1743 }
1744 
1745 static void Encode(unsigned char *out, const uint16_t *R, const uint16_t *M, long long len) {
1746   if (len == 1) {
1747     uint16_t r = R[0], m = M[0];
1748     while (m > 1) {
1749       *out++ = r;
1750       r >>= 8;
1751       m = (m + 255) >> 8;
1752     }
1753   }
1754   if (len > 1) {
1755     uint16_t R2[(len + 1) / 2], M2[(len + 1) / 2];
1756     long long i;
1757     for (i = 0; i < len - 1; i += 2) {
1758       uint32_t m0 = M[i];
1759       uint32_t r = R[i] + R[i + 1] * m0;
1760       uint32_t m = M[i + 1] * m0;
1761       while (m >= 16384) {
1762         *out++ = r;
1763         r >>= 8;
1764         m = (m + 255) >> 8;
1765       }
1766       R2[i / 2] = r;
1767       M2[i / 2] = m;
1768     }
1769     if (i < len) {
1770       R2[i / 2] = R[i];
1771       M2[i / 2] = M[i];
1772     }
1773     Encode(out, R2, M2, (len + 1) / 2);
1774   }
1775 }
1776 
1777 static void Decode(uint16_t *out, const unsigned char *S, const uint16_t *M, long long len) {
1778   if (len == 1) {
1779     if (M[0] == 1)
1780       *out = 0;
1781     else if (M[0] <= 256)
1782       *out = uint32_mod_uint14(S[0], M[0]);
1783     else
1784       *out = uint32_mod_uint14(S[0] + (((uint16_t)S[1]) << 8), M[0]);
1785   }
1786   if (len > 1) {
1787     uint16_t R2[(len + 1) / 2], M2[(len + 1) / 2], bottomr[len / 2];
1788     uint32_t bottomt[len / 2];
1789     long long i;
1790     for (i = 0; i < len - 1; i += 2) {
1791       uint32_t m = M[i] * (uint32_t)M[i + 1];
1792       if (m > 256 * 16383) {
1793         bottomt[i / 2] = 256 * 256;
1794         bottomr[i / 2] = S[0] + 256 * S[1];
1795         S += 2;
1796         M2[i / 2] = (((m + 255) >> 8) + 255) >> 8;
1797       } else if (m >= 16384) {
1798         bottomt[i / 2] = 256;
1799         bottomr[i / 2] = S[0];
1800         S += 1;
1801         M2[i / 2] = (m + 255) >> 8;
1802       } else {
1803         bottomt[i / 2] = 1;
1804         bottomr[i / 2] = 0;
1805         M2[i / 2] = m;
1806       }
1807     }
1808     if (i < len) M2[i / 2] = M[i];
1809     Decode(R2, S, M2, (len + 1) / 2);
1810     for (i = 0; i < len - 1; i += 2) {
1811       uint32_t r1, r = bottomr[i / 2];
1812       uint16_t r0;
1813       r += bottomt[i / 2] * R2[i / 2];
1814       uint32_divmod_uint14(&r1, &r0, r, M[i]);
1815       r1 = uint32_mod_uint14(r1, M[i + 1]);
1816       *out++ = r0;
1817       *out++ = r1;
1818     }
1819     if (i < len) *out++ = R2[i / 2];
1820   }
1821 }
1822 
1823 static void R3_fromRq(small *out, const Fq *r) {
1824   int i;
1825   for (i = 0; i < p; ++i) out[i] = F3_freeze(r[i]);
1826 }
1827 
1828 static void R3_mult(small *h, const small *f, const small *g) {
1829   int16_t fg[p + p - 1];
1830   int i, j;
1831   for (i = 0; i < p + p - 1; ++i) fg[i] = 0;
1832   for (i = 0; i < p; ++i)
1833     for (j = 0; j < p; ++j) fg[i + j] += f[i] * (int16_t)g[j];
1834   for (i = p; i < p + p - 1; ++i) fg[i - p] += fg[i];
1835   for (i = p; i < p + p - 1; ++i) fg[i - p + 1] += fg[i];
1836   for (i = 0; i < p; ++i) h[i] = F3_freeze(fg[i]);
1837 }
1838 
1839 static int R3_recip(small *out, const small *in) {
1840   small f[p + 1], g[p + 1], v[p + 1], r[p + 1];
1841   int sign, swap, t, i, loop, delta = 1;
1842   for (i = 0; i < p + 1; ++i) v[i] = 0;
1843   for (i = 0; i < p + 1; ++i) r[i] = 0;
1844   r[0] = 1;
1845   for (i = 0; i < p; ++i) f[i] = 0;
1846   f[0] = 1;
1847   f[p - 1] = f[p] = -1;
1848   for (i = 0; i < p; ++i) g[p - 1 - i] = in[i];
1849   g[p] = 0;
1850   for (loop = 0; loop < 2 * p - 1; ++loop) {
1851     for (i = p; i > 0; --i) v[i] = v[i - 1];
1852     v[0] = 0;
1853     sign = -g[0] * f[0];
1854     swap = crypto_int16_negative_mask(-delta) & crypto_int16_nonzero_mask(g[0]);
1855     delta ^= swap & (delta ^ -delta);
1856     delta += 1;
1857     for (i = 0; i < p + 1; ++i) {
1858       t = swap & (f[i] ^ g[i]);
1859       f[i] ^= t;
1860       g[i] ^= t;
1861       t = swap & (v[i] ^ r[i]);
1862       v[i] ^= t;
1863       r[i] ^= t;
1864     }
1865     for (i = 0; i < p + 1; ++i) g[i] = F3_freeze(g[i] + sign * f[i]);
1866     for (i = 0; i < p + 1; ++i) r[i] = F3_freeze(r[i] + sign * v[i]);
1867     for (i = 0; i < p; ++i) g[i] = g[i + 1];
1868     g[p] = 0;
1869   }
1870   sign = f[0];
1871   for (i = 0; i < p; ++i) out[i] = sign * v[p - 1 - i];
1872   return crypto_int16_nonzero_mask(delta);
1873 }
1874 
1875 static void Rq_mult_small(Fq *h, const Fq *f, const small *g) {
1876   int32_t fg[p + p - 1];
1877   int i, j;
1878   for (i = 0; i < p + p - 1; ++i) fg[i] = 0;
1879   for (i = 0; i < p; ++i)
1880     for (j = 0; j < p; ++j) fg[i + j] += f[i] * (int32_t)g[j];
1881   for (i = p; i < p + p - 1; ++i) fg[i - p] += fg[i];
1882   for (i = p; i < p + p - 1; ++i) fg[i - p + 1] += fg[i];
1883   for (i = 0; i < p; ++i) h[i] = Fq_freeze(fg[i]);
1884 }
1885 
1886 static void Rq_mult3(Fq *h, const Fq *f) {
1887   int i;
1888   for (i = 0; i < p; ++i) h[i] = Fq_freeze(3 * f[i]);
1889 }
1890 
1891 static Fq Fq_recip(Fq a1) {
1892   int i = 1;
1893   Fq ai = a1;
1894   while (i < q - 2) {
1895     ai = Fq_freeze(a1 * (int32_t)ai);
1896     i += 1;
1897   }
1898   return ai;
1899 }
1900 
1901 static int Rq_recip3(Fq *out, const small *in) {
1902   Fq f[p + 1], g[p + 1], v[p + 1], r[p + 1], scale;
1903   int swap, t, i, loop, delta = 1;
1904   int32_t f0, g0;
1905   for (i = 0; i < p + 1; ++i) v[i] = 0;
1906   for (i = 0; i < p + 1; ++i) r[i] = 0;
1907   r[0] = Fq_recip(3);
1908   for (i = 0; i < p; ++i) f[i] = 0;
1909   f[0] = 1;
1910   f[p - 1] = f[p] = -1;
1911   for (i = 0; i < p; ++i) g[p - 1 - i] = in[i];
1912   g[p] = 0;
1913   for (loop = 0; loop < 2 * p - 1; ++loop) {
1914     for (i = p; i > 0; --i) v[i] = v[i - 1];
1915     v[0] = 0;
1916     swap = crypto_int16_negative_mask(-delta) & crypto_int16_nonzero_mask(g[0]);
1917     delta ^= swap & (delta ^ -delta);
1918     delta += 1;
1919     for (i = 0; i < p + 1; ++i) {
1920       t = swap & (f[i] ^ g[i]);
1921       f[i] ^= t;
1922       g[i] ^= t;
1923       t = swap & (v[i] ^ r[i]);
1924       v[i] ^= t;
1925       r[i] ^= t;
1926     }
1927     f0 = f[0];
1928     g0 = g[0];
1929     for (i = 0; i < p + 1; ++i) g[i] = Fq_freeze(f0 * g[i] - g0 * f[i]);
1930     for (i = 0; i < p + 1; ++i) r[i] = Fq_freeze(f0 * r[i] - g0 * v[i]);
1931     for (i = 0; i < p; ++i) g[i] = g[i + 1];
1932     g[p] = 0;
1933   }
1934   scale = Fq_recip(f[0]);
1935   for (i = 0; i < p; ++i) out[i] = Fq_freeze(scale * (int32_t)v[p - 1 - i]);
1936   return crypto_int16_nonzero_mask(delta);
1937 }
1938 
1939 static void Round(Fq *out, const Fq *a) {
1940   int i;
1941   for (i = 0; i < p; ++i) out[i] = a[i] - F3_freeze(a[i]);
1942 }
1943 
1944 static void Short_fromlist(small *out, const uint32_t *in) {
1945   uint32_t L[p];
1946   int i;
1947   for (i = 0; i < w; ++i) L[i] = in[i] & (uint32_t)-2;
1948   for (i = w; i < p; ++i) L[i] = (in[i] & (uint32_t)-3) | 1;
1949   crypto_sort_uint32(L, p);
1950   for (i = 0; i < p; ++i) out[i] = (L[i] & 3) - 1;
1951 }
1952 
1953 static void Hash_prefix(unsigned char *out, int b, const unsigned char *in, int inlen) {
1954   unsigned char x[inlen + 1], h[64];
1955   int i;
1956   x[0] = b;
1957   for (i = 0; i < inlen; ++i) x[i + 1] = in[i];
1958   crypto_hash_sha512(h, x, inlen + 1);
1959   for (i = 0; i < 32; ++i) out[i] = h[i];
1960 }
1961 
1962 static uint32_t urandom32(void) {
1963   unsigned char c[4];
1964   uint32_t result = 0;
1965   int i;
1966   randombytes(c, 4);
1967   for (i = 0; i < 4; ++i) result += ((uint32_t)c[i]) << (8 * i);
1968   return result;
1969 }
1970 
1971 static void Short_random(small *out) {
1972   uint32_t L[p];
1973   int i;
1974   for (i = 0; i < p; ++i) L[i] = urandom32();
1975   Short_fromlist(out, L);
1976 }
1977 
1978 static void Small_random(small *out) {
1979   int i;
1980   for (i = 0; i < p; ++i) out[i] = (((urandom32() & 0x3fffffff) * 3) >> 30) - 1;
1981 }
1982 
1983 static void KeyGen(Fq *h, small *f, small *ginv) {
1984   small g[p];
1985   Fq finv[p];
1986   for (;;) {
1987     int result;
1988     Small_random(g);
1989     result = R3_recip(ginv, g);
1990     crypto_declassify(&result, sizeof result);
1991     if (result == 0) break;
1992   }
1993   Short_random(f);
1994   Rq_recip3(finv, f);
1995   Rq_mult_small(h, finv, g);
1996 }
1997 
1998 static void Encrypt(Fq *c, const small *r, const Fq *h) {
1999   Fq hr[p];
2000   Rq_mult_small(hr, h, r);
2001   Round(c, hr);
2002 }
2003 
2004 static void Decrypt(small *r, const Fq *c, const small *f, const small *ginv) {
2005   Fq cf[p], cf3[p];
2006   small e[p], ev[p];
2007   int mask, i;
2008   Rq_mult_small(cf, c, f);
2009   Rq_mult3(cf3, cf);
2010   R3_fromRq(e, cf3);
2011   R3_mult(ev, e, ginv);
2012   mask = Weightw_mask(ev);
2013   for (i = 0; i < w; ++i) r[i] = ((ev[i] ^ 1) & ~mask) ^ 1;
2014   for (i = w; i < p; ++i) r[i] = ev[i] & ~mask;
2015 }
2016 
2017 static void Small_encode(unsigned char *s, const small *f) {
2018   int i, j;
2019   for (i = 0; i < p / 4; ++i) {
2020     small x = 0;
2021     for (j = 0;j < 4;++j) x += (*f++ + 1) << (2 * j);
2022     *s++ = x;
2023   }
2024   *s = *f++ + 1;
2025 }
2026 
2027 static void Small_decode(small *f, const unsigned char *s) {
2028   int i, j;
2029   for (i = 0; i < p / 4; ++i) {
2030     unsigned char x = *s++;
2031     for (j = 0;j < 4;++j) *f++ = ((small)((x >> (2 * j)) & 3)) - 1;
2032   }
2033   *f++ = ((small)(*s & 3)) - 1;
2034 }
2035 
2036 static void Rq_encode(unsigned char *s, const Fq *r) {
2037   uint16_t R[p], M[p];
2038   int i;
2039   for (i = 0; i < p; ++i) R[i] = r[i] + q12;
2040   for (i = 0; i < p; ++i) M[i] = q;
2041   Encode(s, R, M, p);
2042 }
2043 
2044 static void Rq_decode(Fq *r, const unsigned char *s) {
2045   uint16_t R[p], M[p];
2046   int i;
2047   for (i = 0; i < p; ++i) M[i] = q;
2048   Decode(R, s, M, p);
2049   for (i = 0; i < p; ++i) r[i] = ((Fq)R[i]) - q12;
2050 }
2051 
2052 static void Rounded_encode(unsigned char *s, const Fq *r) {
2053   uint16_t R[p], M[p];
2054   int i;
2055   for (i = 0; i < p; ++i) R[i] = ((r[i] + q12) * 10923) >> 15;
2056   for (i = 0; i < p; ++i) M[i] = (q + 2) / 3;
2057   Encode(s, R, M, p);
2058 }
2059 
2060 static void Rounded_decode(Fq *r, const unsigned char *s) {
2061   uint16_t R[p], M[p];
2062   int i;
2063   for (i = 0; i < p; ++i) M[i] = (q + 2) / 3;
2064   Decode(R, s, M, p);
2065   for (i = 0; i < p; ++i) r[i] = R[i] * 3 - q12;
2066 }
2067 
2068 static void ZKeyGen(unsigned char *pk, unsigned char *sk) {
2069   Fq h[p];
2070   small f[p], v[p];
2071   KeyGen(h, f, v);
2072   Rq_encode(pk, h);
2073   Small_encode(sk, f);
2074   Small_encode(sk + Small_bytes, v);
2075 }
2076 
2077 static void ZEncrypt(unsigned char *C, const Inputs r, const unsigned char *pk) {
2078   Fq h[p], c[p];
2079   Rq_decode(h, pk);
2080   Encrypt(c, r, h);
2081   Rounded_encode(C, c);
2082 }
2083 
2084 static void ZDecrypt(Inputs r, const unsigned char *C, const unsigned char *sk) {
2085   small f[p], v[p];
2086   Fq c[p];
2087   Small_decode(f, sk);
2088   Small_decode(v, sk + Small_bytes);
2089   Rounded_decode(c, C);
2090   Decrypt(r, c, f, v);
2091 }
2092 
2093 static void HashConfirm(unsigned char *h, const unsigned char *r, const unsigned char *cache) {
2094   unsigned char x[Hash_bytes * 2];
2095   int i;
2096   Hash_prefix(x, 3, r, Small_bytes);
2097   for (i = 0; i < Hash_bytes; ++i) x[Hash_bytes + i] = cache[i];
2098   Hash_prefix(h, 2, x, sizeof x);
2099 }
2100 
2101 static void HashSession(unsigned char *k, int b, const unsigned char *y, const unsigned char *z) {
2102   unsigned char x[Hash_bytes + crypto_kem_sntrup761_CIPHERTEXTBYTES];
2103   int i;
2104   Hash_prefix(x, 3, y, Small_bytes);
2105   for (i = 0; i < crypto_kem_sntrup761_CIPHERTEXTBYTES; ++i) x[Hash_bytes + i] = z[i];
2106   Hash_prefix(k, b, x, sizeof x);
2107 }
2108 
2109 int crypto_kem_sntrup761_keypair(unsigned char *pk, unsigned char *sk) {
2110   int i;
2111   ZKeyGen(pk, sk);
2112   sk += SecretKeys_bytes;
2113   for (i = 0; i < crypto_kem_sntrup761_PUBLICKEYBYTES; ++i) *sk++ = pk[i];
2114   randombytes(sk, Small_bytes);
2115   Hash_prefix(sk + Small_bytes, 4, pk, crypto_kem_sntrup761_PUBLICKEYBYTES);
2116   return 0;
2117 }
2118 
2119 static void Hide(unsigned char *c, unsigned char *r_enc, const Inputs r, const unsigned char *pk, const unsigned char *cache) {
2120   Small_encode(r_enc, r);
2121   ZEncrypt(c, r, pk);
2122   HashConfirm(c + crypto_kem_sntrup761_CIPHERTEXTBYTES - Confirm_bytes, r_enc, cache);
2123 }
2124 
2125 int crypto_kem_sntrup761_enc(unsigned char *c, unsigned char *k, const unsigned char *pk) {
2126   Inputs r;
2127   unsigned char r_enc[Small_bytes], cache[Hash_bytes];
2128   Hash_prefix(cache, 4, pk, crypto_kem_sntrup761_PUBLICKEYBYTES);
2129   Short_random(r);
2130   Hide(c, r_enc, r, pk, cache);
2131   HashSession(k, 1, r_enc, c);
2132   return 0;
2133 }
2134 
2135 static int Ciphertexts_diff_mask(const unsigned char *c, const unsigned char *c2) {
2136   uint16_t differentbits = 0;
2137   int len = crypto_kem_sntrup761_CIPHERTEXTBYTES;
2138   while (len-- > 0) differentbits |= (*c++) ^ (*c2++);
2139   return (crypto_int64_bitmod_01((differentbits - 1),8)) - 1;
2140 }
2141 
2142 int crypto_kem_sntrup761_dec(unsigned char *k, const unsigned char *c, const unsigned char *sk) {
2143   const unsigned char *pk = sk + SecretKeys_bytes;
2144   const unsigned char *rho = pk + crypto_kem_sntrup761_PUBLICKEYBYTES;
2145   const unsigned char *cache = rho + Small_bytes;
2146   Inputs r;
2147   unsigned char r_enc[Small_bytes], cnew[crypto_kem_sntrup761_CIPHERTEXTBYTES];
2148   int mask, i;
2149   ZDecrypt(r, c, sk);
2150   Hide(cnew, r_enc, r, pk, cache);
2151   mask = Ciphertexts_diff_mask(c, cnew);
2152   for (i = 0; i < Small_bytes; ++i) r_enc[i] ^= mask & (r_enc[i] ^ rho[i]);
2153   HashSession(k, 1 + mask, r_enc, c);
2154   return 0;
2155 }
2156 
2157