1 #ifndef PQCLEAN_MCELIECE348864F_AVX_VEC256_H 2 #define PQCLEAN_MCELIECE348864F_AVX_VEC256_H 3 /* 4 This file is for functions related to 256-bit vectors 5 including functions for bitsliced field operations 6 */ 7 8 9 #include "vec128.h" 10 11 #include <immintrin.h> 12 13 typedef __m256i vec256; 14 15 vec256 PQCLEAN_MCELIECE348864F_AVX_vec256_set1_16b(uint16_t a); 16 vec256 PQCLEAN_MCELIECE348864F_AVX_vec256_setzero(void); 17 vec256 PQCLEAN_MCELIECE348864F_AVX_vec256_set4x(uint64_t a0, uint64_t a1, uint64_t a2, uint64_t a3); 18 19 // Extract requires a literal argument so need to be macros 20 #define PQCLEAN_MCELIECE348864F_AVX_vec256_extract2x(a,i) ((vec128) _mm256_extractf128_si256((vec256) (a),(i))) 21 #define PQCLEAN_MCELIECE348864F_AVX_vec256_extract(a,i) ((uint64_t) _mm256_extract_epi64((vec256) (a),(i))) 22 23 int PQCLEAN_MCELIECE348864F_AVX_vec256_testz(vec256 a); 24 vec256 PQCLEAN_MCELIECE348864F_AVX_vec256_and(vec256 a, vec256 b); 25 vec256 PQCLEAN_MCELIECE348864F_AVX_vec256_xor(vec256 a, vec256 b); 26 vec256 PQCLEAN_MCELIECE348864F_AVX_vec256_or(vec256 a, vec256 b); 27 vec256 PQCLEAN_MCELIECE348864F_AVX_vec256_sll_4x(vec256 a, int s); 28 vec256 PQCLEAN_MCELIECE348864F_AVX_vec256_srl_4x(vec256 a, int s); 29 vec256 PQCLEAN_MCELIECE348864F_AVX_vec256_unpack_low(vec256 a, vec256 b); 30 vec256 PQCLEAN_MCELIECE348864F_AVX_vec256_unpack_high(vec256 a, vec256 b); 31 vec256 PQCLEAN_MCELIECE348864F_AVX_vec256_unpack_low_2x(vec256 a, vec256 b); 32 vec256 PQCLEAN_MCELIECE348864F_AVX_vec256_unpack_high_2x(vec256 a, vec256 b); 33 vec256 PQCLEAN_MCELIECE348864F_AVX_vec256_or_reduce(const vec256 *a); 34 void PQCLEAN_MCELIECE348864F_AVX_vec256_copy(vec256 *dest, const vec256 *src); 35 36 /* bitsliced field multiplications */ 37 void PQCLEAN_MCELIECE348864F_AVX_vec256_mul(vec256 *h, vec256 *f, const vec256 *g); 38 void PQCLEAN_MCELIECE348864F_AVX_vec256_sq(vec256 * /*out*/, const vec256 * /*in*/); 39 void PQCLEAN_MCELIECE348864F_AVX_vec256_inv(vec256 * /*out*/, const vec256 * /*in*/); 40 41 extern void PQCLEAN_MCELIECE348864F_AVX_vec256_maa_asm(vec256 *, vec256 *, const vec256 *); 42 extern void PQCLEAN_MCELIECE348864F_AVX_vec256_ama_asm(vec256 *, vec256 *, const vec256 *); 43 44 #endif 45 46