#include "rivide/internal/kem_cbd.h"
void poly_cbd(poly_t *p, const uint8_t *buf, int eta) {
unsigned int i, j;
if (eta == 2) {
for (i = 0; i < KEM_N / 8; i++) {
uint32_t t = (uint32_t)buf[4 * i] | ((uint32_t)buf[4 * i + 1] << 8) |
((uint32_t)buf[4 * i + 2] << 16) | ((uint32_t)buf[4 * i + 3] << 24);
for (j = 0; j < 8; j++) {
int16_t a = (int16_t)((t >> (4 * j)) & 0x03);
int16_t b_val = (int16_t)((t >> (4 * j + 2)) & 0x03);
a = (int16_t)((a & 1) + ((a >> 1) & 1));
b_val = (int16_t)((b_val & 1) + ((b_val >> 1) & 1));
p->coeffs[8 * i + j] = (int16_t)(a - b_val);
}
}
} else {
for (i = 0; i < KEM_N / 4; i++) {
uint32_t t = (uint32_t)buf[3 * i] | ((uint32_t)buf[3 * i + 1] << 8) |
((uint32_t)buf[3 * i + 2] << 16);
for (j = 0; j < 4; j++) {
int16_t a = (int16_t)((t >> (6 * j)) & 0x07);
int16_t b_val = (int16_t)((t >> (6 * j + 3)) & 0x07);
a = (int16_t)((a & 1) + ((a >> 1) & 1) + ((a >> 2) & 1));
b_val = (int16_t)((b_val & 1) + ((b_val >> 1) & 1) + ((b_val >> 2) & 1));
p->coeffs[4 * i + j] = (int16_t)(a - b_val);
}
}
}
}