-rw-r--r-- 1426 libmceliece-20240726/crypto_kem/348864/avx/vec128_gf.h raw
// 20240508 djb: eliminated unused vec128_copy, vec128_or_reduce
// 20240508 djb: split out of vec128.h
#ifndef vec128_gf_h
#define vec128_gf_h
#include "params.h"
#include "gf.h"
#include "vec128.h"
#define vec128_mul_asm CRYPTO_SHARED_NAMESPACE(vec128_mul_asm)
#define vec128_mul_GF CRYPTO_NAMESPACE(vec128_mul_GF)
extern void vec128_mul_GF(vec128 [GFBITS], vec128 [GFBITS], gf [SYS_T]);
static inline void vec128_add(vec128 *c, vec128 *a, vec128 *b)
{
int i;
for (i = 0; i < GFBITS; i++)
c[i] = vec128_xor(a[i], b[i]);
}
extern void vec128_mul_asm(vec128 *, vec128 *, const vec128 *, int);
/* bitsliced field multiplications */
static inline void vec128_mul(vec128 *h, vec128 *f, const vec128 *g)
{
vec128_mul_asm(h, f, g, 16);
}
static inline void vec128_mul_gf(vec128 out[ GFBITS ], vec128 v[ GFBITS ], gf a)
{
int i;
uint64_t b;
vec128 bits[GFBITS];
for (i = 0; i < GFBITS; i++)
{
b = -((a >> i) & 1);
bits[i] = vec128_set2x(b, b);
}
vec128_mul(out, v, bits);
}
static inline void vec_mul_gf(uint64_t out[ GFBITS ], uint64_t v[ GFBITS ], gf a)
{
int i;
uint64_t bits[GFBITS];
vec128 x[GFBITS], y[GFBITS], z[GFBITS];
for (i = 0; i < GFBITS; i++)
bits[i] = -((a >> i) & 1);
for (i = 0; i < GFBITS; i++)
{
x[i] = vec128_set2x(v[i], 0);
y[i] = vec128_set2x(bits[i], 0);
}
vec128_mul(z, x, y);
for (i = 0; i < GFBITS; i++)
out[i] = vec128_extract(z[i], 0);
}
#endif