-rw-r--r-- 1301 libntruprime-20240910/src/core/scale3sntrupP/avx/core.c raw
#include <immintrin.h>
#include "crypto_core.h"
#define p {P}
#define q {Q}
#include "crypto_decode_{P}xint16.h"
#define crypto_decode_pxint16 crypto_decode_{P}xint16
#include "crypto_encode_{P}xint16.h"
#define crypto_encode_pxint16 crypto_encode_{P}xint16
#include "crypto_int16.h"
typedef crypto_int16 Fq;
/* out = 3*in in Rq */
void crypto_core(unsigned char *outbytes,const unsigned char *inbytes,const unsigned char *kbytes,const unsigned char *cbytes)
{
int i = p-16;
__m256i save = _mm256_loadu_si256((__m256i *) (inbytes+2*i));
/* in case outbytes = inbytes */
for (;;) {
do {
__m256i x = _mm256_loadu_si256((__m256i *) inbytes);
__m256i xneg;
x = _mm256_mullo_epi16(x,_mm256_set1_epi16(3));
x = _mm256_sub_epi16(x,_mm256_set1_epi16((q+1)/2));
xneg = _mm256_srai_epi16(x,15);
x = _mm256_add_epi16(x,_mm256_set1_epi16(q)&xneg);
xneg = _mm256_srai_epi16(x,15);
x = _mm256_add_epi16(x,_mm256_set1_epi16(q)&xneg);
x = _mm256_sub_epi16(x,_mm256_set1_epi16((q-1)/2));
_mm256_storeu_si256((__m256i *) outbytes,x);
inbytes += 32;
outbytes += 32;
i -= 16;
} while (i >= 0);
if (i <= -16) break;
inbytes += 2*i;
outbytes += 2*i;
_mm256_storeu_si256((__m256i *) outbytes,save);
}
}