-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