@@ -23,9 +23,9 @@ auxiliary-submitters: | |||
- Zhenfei Zhang | |||
implementations: | |||
- name: clean | |||
version: https://github.com/jschanck/ntru/tree/6d1f44f5 reference implementation | |||
version: https://github.com/jschanck/ntru/tree/60cc7277 reference implementation | |||
- name: avx2 | |||
version: https://github.com/jschanck/ntru/tree/6d1f44f5 avx2 implementation | |||
version: https://github.com/jschanck/ntru/tree/60cc7277 avx2 implementation | |||
supported_platforms: | |||
- architecture: x86_64 | |||
operating_systems: | |||
@@ -4,12 +4,9 @@ | |||
#include "params.h" | |||
#include "poly.h" | |||
void PQCLEAN_NTRUHPS2048509_AVX2_owcpa_samplemsg(unsigned char msg[NTRU_OWCPA_MSGBYTES], | |||
const unsigned char seed[NTRU_SEEDBYTES]); | |||
void PQCLEAN_NTRUHPS2048509_AVX2_owcpa_keypair(unsigned char *pk, | |||
unsigned char *sk, | |||
const unsigned char seed[NTRU_SEEDBYTES]); | |||
const unsigned char seed[NTRU_SAMPLE_FG_BYTES]); | |||
void PQCLEAN_NTRUHPS2048509_AVX2_owcpa_enc(unsigned char *c, | |||
const poly *r, | |||
@@ -23,7 +23,15 @@ void PQCLEAN_NTRUHPS2048509_AVX2_poly_Sq_mul(poly *r, const poly *a, const poly | |||
} | |||
void PQCLEAN_NTRUHPS2048509_AVX2_poly_S3_mul(poly *r, const poly *a, const poly *b) { | |||
int i; | |||
/* Our S3 multiplications do not overflow mod q, */ | |||
/* so we can re-purpose PQCLEAN_NTRUHPS2048509_AVX2_poly_Rq_mul, as long as we */ | |||
/* follow with an explicit reduction mod q. */ | |||
PQCLEAN_NTRUHPS2048509_AVX2_poly_Rq_mul(r, a, b); | |||
for (i = 0; i < NTRU_N; i++) { | |||
r->coeffs[i] = MODQ(r->coeffs[i]); | |||
} | |||
PQCLEAN_NTRUHPS2048509_AVX2_poly_mod_3_Phi_n(r); | |||
} | |||
@@ -253,23 +253,6 @@ mask_keephigh: | |||
.word 65535 | |||
.word 65535 | |||
.word 65535 | |||
mask_mod2048: | |||
.word 2047 | |||
.word 2047 | |||
.word 2047 | |||
.word 2047 | |||
.word 2047 | |||
.word 2047 | |||
.word 2047 | |||
.word 2047 | |||
.word 2047 | |||
.word 2047 | |||
.word 2047 | |||
.word 2047 | |||
.word 2047 | |||
.word 2047 | |||
.word 2047 | |||
.word 2047 | |||
.text | |||
.global PQCLEAN_NTRUHPS2048509_AVX2_poly_Rq_mul | |||
.global _PQCLEAN_NTRUHPS2048509_AVX2_poly_Rq_mul | |||
@@ -3597,13 +3580,9 @@ vpand mask_keephigh(%rip), %ymm9, %ymm10 | |||
vpor %ymm10, %ymm5, %ymm5 | |||
vpaddw %ymm5, %ymm3, %ymm3 | |||
vmovdqa %xmm9, 2560(%rsp) | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 0(%rdi) | |||
vpand mask_mod2048(%rip), %ymm6, %ymm6 | |||
vmovdqa %ymm6, 256(%rdi) | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqa %ymm3, 512(%rdi) | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqa %ymm4, 768(%rdi) | |||
vmovdqa 32(%rsp), %ymm5 | |||
vpunpcklwd const0(%rip), %ymm5, %ymm8 | |||
@@ -3693,13 +3672,9 @@ vpand mask_keephigh(%rip), %ymm7, %ymm8 | |||
vpor %ymm8, %ymm11, %ymm11 | |||
vpaddw %ymm11, %ymm10, %ymm10 | |||
vmovdqa %xmm7, 2592(%rsp) | |||
vpand mask_mod2048(%rip), %ymm5, %ymm5 | |||
vmovdqa %ymm5, 64(%rdi) | |||
vpand mask_mod2048(%rip), %ymm6, %ymm6 | |||
vmovdqa %ymm6, 320(%rdi) | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqa %ymm10, 576(%rdi) | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqa %ymm9, 832(%rdi) | |||
vmovdqa 64(%rsp), %ymm11 | |||
vpunpcklwd const0(%rip), %ymm11, %ymm4 | |||
@@ -3789,13 +3764,9 @@ vpand mask_keephigh(%rip), %ymm3, %ymm4 | |||
vpor %ymm4, %ymm5, %ymm5 | |||
vpaddw %ymm5, %ymm8, %ymm8 | |||
vmovdqa %xmm3, 2624(%rsp) | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 128(%rdi) | |||
vpand mask_mod2048(%rip), %ymm6, %ymm6 | |||
vmovdqa %ymm6, 384(%rdi) | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqa %ymm8, 640(%rdi) | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqa %ymm7, 896(%rdi) | |||
vmovdqa 96(%rsp), %ymm5 | |||
vpunpcklwd const0(%rip), %ymm5, %ymm9 | |||
@@ -3885,13 +3856,9 @@ vpand mask_keephigh(%rip), %ymm10, %ymm9 | |||
vpor %ymm9, %ymm11, %ymm11 | |||
vpaddw %ymm11, %ymm4, %ymm4 | |||
vmovdqa %xmm10, 2656(%rsp) | |||
vpand mask_mod2048(%rip), %ymm5, %ymm5 | |||
vmovdqa %ymm5, 192(%rdi) | |||
vpand mask_mod2048(%rip), %ymm6, %ymm6 | |||
vmovdqa %ymm6, 448(%rdi) | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqa %ymm4, 704(%rdi) | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqa %ymm3, 960(%rdi) | |||
vmovdqa 128(%rsp), %ymm11 | |||
vpunpcklwd const0(%rip), %ymm11, %ymm7 | |||
@@ -3971,7 +3938,6 @@ vpand mask_keephigh(%rip), %ymm2, %ymm7 | |||
vpor %ymm7, %ymm10, %ymm10 | |||
vmovdqa 0(%rdi), %ymm7 | |||
vpaddw %ymm10, %ymm7, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqa %ymm7, 0(%rdi) | |||
vmovdqa %xmm2, 1920(%rsp) | |||
vpshufb shuf48_16(%rip), %ymm4, %ymm4 | |||
@@ -3998,11 +3964,8 @@ vpand mask_keephigh(%rip), %ymm2, %ymm7 | |||
vpor %ymm7, %ymm5, %ymm5 | |||
vpaddw %ymm5, %ymm9, %ymm9 | |||
vmovdqa %xmm2, 2688(%rsp) | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 256(%rdi) | |||
vpand mask_mod2048(%rip), %ymm6, %ymm6 | |||
vmovdqa %ymm6, 512(%rdi) | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqa %ymm9, 768(%rdi) | |||
vmovdqa 160(%rsp), %ymm5 | |||
vpunpcklwd const0(%rip), %ymm5, %ymm3 | |||
@@ -4082,7 +4045,6 @@ vpand mask_keephigh(%rip), %ymm8, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm2 | |||
vmovdqa 64(%rdi), %ymm3 | |||
vpaddw %ymm2, %ymm3, %ymm3 | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqa %ymm3, 64(%rdi) | |||
vmovdqa %xmm8, 1952(%rsp) | |||
vpshufb shuf48_16(%rip), %ymm9, %ymm9 | |||
@@ -4109,11 +4071,8 @@ vpand mask_keephigh(%rip), %ymm8, %ymm3 | |||
vpor %ymm3, %ymm11, %ymm11 | |||
vpaddw %ymm11, %ymm7, %ymm7 | |||
vmovdqa %xmm8, 2720(%rsp) | |||
vpand mask_mod2048(%rip), %ymm5, %ymm5 | |||
vmovdqa %ymm5, 320(%rdi) | |||
vpand mask_mod2048(%rip), %ymm6, %ymm6 | |||
vmovdqa %ymm6, 576(%rdi) | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqa %ymm7, 832(%rdi) | |||
vmovdqa 192(%rsp), %ymm11 | |||
vpunpcklwd const0(%rip), %ymm11, %ymm10 | |||
@@ -4193,7 +4152,6 @@ vpand mask_keephigh(%rip), %ymm4, %ymm10 | |||
vpor %ymm10, %ymm8, %ymm8 | |||
vmovdqa 128(%rdi), %ymm10 | |||
vpaddw %ymm8, %ymm10, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqa %ymm10, 128(%rdi) | |||
vmovdqa %xmm4, 1984(%rsp) | |||
vpshufb shuf48_16(%rip), %ymm7, %ymm7 | |||
@@ -4220,11 +4178,8 @@ vpand mask_keephigh(%rip), %ymm4, %ymm10 | |||
vpor %ymm10, %ymm5, %ymm5 | |||
vpaddw %ymm5, %ymm3, %ymm3 | |||
vmovdqa %xmm4, 2752(%rsp) | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 384(%rdi) | |||
vpand mask_mod2048(%rip), %ymm6, %ymm6 | |||
vmovdqa %ymm6, 640(%rdi) | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqa %ymm3, 896(%rdi) | |||
vmovdqa 224(%rsp), %ymm5 | |||
vpunpcklwd const0(%rip), %ymm5, %ymm2 | |||
@@ -4304,7 +4259,6 @@ vpand mask_keephigh(%rip), %ymm9, %ymm2 | |||
vpor %ymm2, %ymm4, %ymm4 | |||
vmovdqa 192(%rdi), %ymm2 | |||
vpaddw %ymm4, %ymm2, %ymm2 | |||
vpand mask_mod2048(%rip), %ymm2, %ymm2 | |||
vmovdqa %ymm2, 192(%rdi) | |||
vmovdqa %xmm9, 2016(%rsp) | |||
vpshufb shuf48_16(%rip), %ymm3, %ymm3 | |||
@@ -4331,11 +4285,8 @@ vpand mask_keephigh(%rip), %ymm9, %ymm2 | |||
vpor %ymm2, %ymm11, %ymm11 | |||
vpaddw %ymm11, %ymm10, %ymm10 | |||
vmovdqa %xmm9, 2784(%rsp) | |||
vpand mask_mod2048(%rip), %ymm5, %ymm5 | |||
vmovdqa %ymm5, 448(%rdi) | |||
vpand mask_mod2048(%rip), %ymm6, %ymm6 | |||
vmovdqa %ymm6, 704(%rdi) | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqa %ymm10, 960(%rdi) | |||
vmovdqa 96(%r12), %ymm0 | |||
vpsubw 160(%r12), %ymm0, %ymm0 | |||
@@ -4729,13 +4680,9 @@ vpor %ymm8, %ymm5, %ymm5 | |||
vpaddw 2560(%rsp), %ymm2, %ymm2 | |||
vpaddw %ymm5, %ymm2, %ymm2 | |||
vmovdqa %xmm3, 2560(%rsp) | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 32(%rdi) | |||
vpand mask_mod2048(%rip), %ymm6, %ymm6 | |||
vmovdqa %ymm6, 288(%rdi) | |||
vpand mask_mod2048(%rip), %ymm2, %ymm2 | |||
vmovdqa %ymm2, 544(%rdi) | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqa %ymm9, 800(%rdi) | |||
vmovdqa 32(%rsp), %ymm5 | |||
vpunpcklwd const0(%rip), %ymm5, %ymm4 | |||
@@ -4828,13 +4775,9 @@ vpor %ymm4, %ymm11, %ymm11 | |||
vpaddw 2592(%rsp), %ymm8, %ymm8 | |||
vpaddw %ymm11, %ymm8, %ymm8 | |||
vmovdqa %xmm10, 2592(%rsp) | |||
vpand mask_mod2048(%rip), %ymm5, %ymm5 | |||
vmovdqa %ymm5, 96(%rdi) | |||
vpand mask_mod2048(%rip), %ymm6, %ymm6 | |||
vmovdqa %ymm6, 352(%rdi) | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqa %ymm8, 608(%rdi) | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqa %ymm3, 864(%rdi) | |||
vmovdqa 64(%rsp), %ymm11 | |||
vpunpcklwd const0(%rip), %ymm11, %ymm9 | |||
@@ -4927,13 +4870,9 @@ vpor %ymm9, %ymm5, %ymm5 | |||
vpaddw 2624(%rsp), %ymm4, %ymm4 | |||
vpaddw %ymm5, %ymm4, %ymm4 | |||
vmovdqa %xmm2, 2624(%rsp) | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 160(%rdi) | |||
vpand mask_mod2048(%rip), %ymm6, %ymm6 | |||
vmovdqa %ymm6, 416(%rdi) | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqa %ymm4, 672(%rdi) | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqa %ymm10, 928(%rdi) | |||
vmovdqa 96(%rsp), %ymm5 | |||
vpunpcklwd const0(%rip), %ymm5, %ymm3 | |||
@@ -5026,22 +4965,18 @@ vpor %ymm3, %ymm11, %ymm11 | |||
vpaddw 2656(%rsp), %ymm9, %ymm9 | |||
vpaddw %ymm11, %ymm9, %ymm9 | |||
vmovdqa %xmm8, 2656(%rsp) | |||
vpand mask_mod2048(%rip), %ymm5, %ymm5 | |||
vmovdqa %ymm5, 224(%rdi) | |||
vextracti128 $1, %ymm5, %xmm5 | |||
vpshufb shufmin5_mask3(%rip), %ymm5, %ymm5 | |||
vmovdqa %xmm5, 1792(%rsp) | |||
vpand mask_mod2048(%rip), %ymm6, %ymm6 | |||
vmovdqa %ymm6, 480(%rdi) | |||
vextracti128 $1, %ymm6, %xmm6 | |||
vpshufb shufmin5_mask3(%rip), %ymm6, %ymm6 | |||
vmovdqa %xmm6, 1824(%rsp) | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqa %ymm9, 736(%rdi) | |||
vextracti128 $1, %ymm9, %xmm9 | |||
vpshufb shufmin5_mask3(%rip), %ymm9, %ymm9 | |||
vmovdqa %xmm9, 1856(%rsp) | |||
vpand mask_mod2048(%rip), %ymm2, %ymm2 | |||
vmovdqa %ymm2, 992(%rdi) | |||
vextracti128 $1, %ymm2, %xmm2 | |||
vpshufb shufmin5_mask3(%rip), %ymm2, %ymm2 | |||
@@ -5125,7 +5060,6 @@ vpor %ymm10, %ymm8, %ymm8 | |||
vmovdqa 32(%rdi), %ymm10 | |||
vpaddw 1920(%rsp), %ymm10, %ymm10 | |||
vpaddw %ymm8, %ymm10, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqa %ymm10, 32(%rdi) | |||
vmovdqa %xmm7, 1920(%rsp) | |||
vpshufb shuf48_16(%rip), %ymm9, %ymm9 | |||
@@ -5155,11 +5089,8 @@ vpor %ymm10, %ymm5, %ymm5 | |||
vpaddw 2688(%rsp), %ymm3, %ymm3 | |||
vpaddw %ymm5, %ymm3, %ymm3 | |||
vmovdqa %xmm7, 2688(%rsp) | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 288(%rdi) | |||
vpand mask_mod2048(%rip), %ymm6, %ymm6 | |||
vmovdqa %ymm6, 544(%rdi) | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqa %ymm3, 800(%rdi) | |||
vmovdqa 160(%rsp), %ymm5 | |||
vpunpcklwd const0(%rip), %ymm5, %ymm2 | |||
@@ -5240,7 +5171,6 @@ vpor %ymm2, %ymm7, %ymm7 | |||
vmovdqa 96(%rdi), %ymm2 | |||
vpaddw 1952(%rsp), %ymm2, %ymm2 | |||
vpaddw %ymm7, %ymm2, %ymm2 | |||
vpand mask_mod2048(%rip), %ymm2, %ymm2 | |||
vmovdqa %ymm2, 96(%rdi) | |||
vmovdqa %xmm4, 1952(%rsp) | |||
vpshufb shuf48_16(%rip), %ymm3, %ymm3 | |||
@@ -5270,11 +5200,8 @@ vpor %ymm2, %ymm11, %ymm11 | |||
vpaddw 2720(%rsp), %ymm10, %ymm10 | |||
vpaddw %ymm11, %ymm10, %ymm10 | |||
vmovdqa %xmm4, 2720(%rsp) | |||
vpand mask_mod2048(%rip), %ymm5, %ymm5 | |||
vmovdqa %ymm5, 352(%rdi) | |||
vpand mask_mod2048(%rip), %ymm6, %ymm6 | |||
vmovdqa %ymm6, 608(%rdi) | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqa %ymm10, 864(%rdi) | |||
vmovdqa 192(%rsp), %ymm11 | |||
vpunpcklwd const0(%rip), %ymm11, %ymm8 | |||
@@ -5355,7 +5282,6 @@ vpor %ymm8, %ymm4, %ymm4 | |||
vmovdqa 160(%rdi), %ymm8 | |||
vpaddw 1984(%rsp), %ymm8, %ymm8 | |||
vpaddw %ymm4, %ymm8, %ymm8 | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqa %ymm8, 160(%rdi) | |||
vmovdqa %xmm9, 1984(%rsp) | |||
vpshufb shuf48_16(%rip), %ymm10, %ymm10 | |||
@@ -5385,11 +5311,8 @@ vpor %ymm8, %ymm5, %ymm5 | |||
vpaddw 2752(%rsp), %ymm2, %ymm2 | |||
vpaddw %ymm5, %ymm2, %ymm2 | |||
vmovdqa %xmm9, 2752(%rsp) | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 416(%rdi) | |||
vpand mask_mod2048(%rip), %ymm6, %ymm6 | |||
vmovdqa %ymm6, 672(%rdi) | |||
vpand mask_mod2048(%rip), %ymm2, %ymm2 | |||
vmovdqa %ymm2, 928(%rdi) | |||
vmovdqa 224(%rsp), %ymm5 | |||
vpunpcklwd const0(%rip), %ymm5, %ymm7 | |||
@@ -5479,7 +5402,6 @@ vpor %ymm7, %ymm9, %ymm9 | |||
vmovdqa 224(%rdi), %ymm7 | |||
vpaddw 2016(%rsp), %ymm7, %ymm7 | |||
vpaddw %ymm9, %ymm7, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqa %ymm7, 224(%rdi) | |||
vextracti128 $1, %ymm7, %xmm7 | |||
vpshufb shufmin5_mask3(%rip), %ymm7, %ymm7 | |||
@@ -5512,113 +5434,86 @@ vpor %ymm7, %ymm11, %ymm11 | |||
vpaddw 2784(%rsp), %ymm8, %ymm8 | |||
vpaddw %ymm11, %ymm8, %ymm8 | |||
vmovdqa %xmm3, 2784(%rsp) | |||
vpand mask_mod2048(%rip), %ymm5, %ymm5 | |||
vmovdqa %ymm5, 480(%rdi) | |||
vpand mask_mod2048(%rip), %ymm6, %ymm6 | |||
vmovdqa %ymm6, 736(%rdi) | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqa %ymm8, 992(%rdi) | |||
vmovdqa 0(%rdi), %ymm11 | |||
vpaddw 1888(%rsp), %ymm11, %ymm11 | |||
vpaddw 2816(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 0(%rdi) | |||
vmovdqa 256(%rdi), %ymm11 | |||
vpaddw 2528(%rsp), %ymm11, %ymm11 | |||
vpaddw 2848(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 256(%rdi) | |||
vmovdqa 512(%rdi), %ymm11 | |||
vpaddw 2784(%rsp), %ymm11, %ymm11 | |||
vpaddw 2880(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 512(%rdi) | |||
vmovdqa 64(%rdi), %ymm11 | |||
vpaddw 2048(%rsp), %ymm11, %ymm11 | |||
vpaddw 1920(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 64(%rdi) | |||
vmovdqa 320(%rdi), %ymm11 | |||
vpaddw 2304(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 320(%rdi) | |||
vmovdqa 576(%rdi), %ymm11 | |||
vpaddw 2560(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 576(%rdi) | |||
vmovdqa 128(%rdi), %ymm11 | |||
vpaddw 2080(%rsp), %ymm11, %ymm11 | |||
vpaddw 1952(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 128(%rdi) | |||
vmovdqa 384(%rdi), %ymm11 | |||
vpaddw 2336(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 384(%rdi) | |||
vmovdqa 640(%rdi), %ymm11 | |||
vpaddw 2592(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 640(%rdi) | |||
vmovdqa 192(%rdi), %ymm11 | |||
vpaddw 2112(%rsp), %ymm11, %ymm11 | |||
vpaddw 1984(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 192(%rdi) | |||
vmovdqa 448(%rdi), %ymm11 | |||
vpaddw 2368(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 448(%rdi) | |||
vmovdqa 704(%rdi), %ymm11 | |||
vpaddw 2624(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 704(%rdi) | |||
vmovdqa 256(%rdi), %ymm11 | |||
vpaddw 2144(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 256(%rdi) | |||
vmovdqa 512(%rdi), %ymm11 | |||
vpaddw 2400(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 512(%rdi) | |||
vmovdqa 768(%rdi), %ymm11 | |||
vpaddw 2656(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 768(%rdi) | |||
vmovdqa 320(%rdi), %ymm11 | |||
vpaddw 2176(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 320(%rdi) | |||
vmovdqa 576(%rdi), %ymm11 | |||
vpaddw 2432(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 576(%rdi) | |||
vmovdqa 832(%rdi), %ymm11 | |||
vpaddw 2688(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 832(%rdi) | |||
vmovdqa 384(%rdi), %ymm11 | |||
vpaddw 2208(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 384(%rdi) | |||
vmovdqa 640(%rdi), %ymm11 | |||
vpaddw 2464(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 640(%rdi) | |||
vmovdqa 896(%rdi), %ymm11 | |||
vpaddw 2720(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 896(%rdi) | |||
vmovdqa 448(%rdi), %ymm11 | |||
vpaddw 2240(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 448(%rdi) | |||
vmovdqa 704(%rdi), %ymm11 | |||
vpaddw 2496(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 704(%rdi) | |||
vmovdqa 960(%rdi), %ymm11 | |||
vpaddw 2752(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod2048(%rip), %ymm11, %ymm11 | |||
vmovdqa %ymm11, 960(%rdi) | |||
mov %r8, %rsp | |||
pop %r12 | |||
@@ -4,12 +4,9 @@ | |||
#include "params.h" | |||
#include "poly.h" | |||
void PQCLEAN_NTRUHPS2048509_CLEAN_owcpa_samplemsg(unsigned char msg[NTRU_OWCPA_MSGBYTES], | |||
const unsigned char seed[NTRU_SEEDBYTES]); | |||
void PQCLEAN_NTRUHPS2048509_CLEAN_owcpa_keypair(unsigned char *pk, | |||
unsigned char *sk, | |||
const unsigned char seed[NTRU_SEEDBYTES]); | |||
const unsigned char seed[NTRU_SAMPLE_FG_BYTES]); | |||
void PQCLEAN_NTRUHPS2048509_CLEAN_owcpa_enc(unsigned char *c, | |||
const poly *r, | |||
@@ -23,7 +23,15 @@ void PQCLEAN_NTRUHPS2048509_CLEAN_poly_Sq_mul(poly *r, const poly *a, const poly | |||
} | |||
void PQCLEAN_NTRUHPS2048509_CLEAN_poly_S3_mul(poly *r, const poly *a, const poly *b) { | |||
int i; | |||
/* Our S3 multiplications do not overflow mod q, */ | |||
/* so we can re-purpose PQCLEAN_NTRUHPS2048509_CLEAN_poly_Rq_mul, as long as we */ | |||
/* follow with an explicit reduction mod q. */ | |||
PQCLEAN_NTRUHPS2048509_CLEAN_poly_Rq_mul(r, a, b); | |||
for (i = 0; i < NTRU_N; i++) { | |||
r->coeffs[i] = MODQ(r->coeffs[i]); | |||
} | |||
PQCLEAN_NTRUHPS2048509_CLEAN_poly_mod_3_Phi_n(r); | |||
} | |||
@@ -1,15 +1,284 @@ | |||
#include "poly.h" | |||
/* Polynomial multiplication using */ | |||
/* Toom-4 and two layers of Karatsuba. */ | |||
#define L PAD32(NTRU_N) | |||
#define M (L/4) | |||
#define K (L/16) | |||
static void toom4_k2x2_mul(uint16_t ab[2 * L], const uint16_t a[L], const uint16_t b[L]); | |||
static void toom4_k2x2_eval_0(uint16_t r[9 * K], const uint16_t a[M]); | |||
static void toom4_k2x2_eval_p1(uint16_t r[9 * K], const uint16_t a[M]); | |||
static void toom4_k2x2_eval_m1(uint16_t r[9 * K], const uint16_t a[M]); | |||
static void toom4_k2x2_eval_p2(uint16_t r[9 * K], const uint16_t a[M]); | |||
static void toom4_k2x2_eval_m2(uint16_t r[9 * K], const uint16_t a[M]); | |||
static void toom4_k2x2_eval_p3(uint16_t r[9 * K], const uint16_t a[M]); | |||
static void toom4_k2x2_eval_inf(uint16_t r[9 * K], const uint16_t a[M]); | |||
static inline void k2x2_eval(uint16_t r[9 * K]); | |||
static void toom4_k2x2_basemul(uint16_t r[18 * K], const uint16_t a[9 * K], const uint16_t b[9 * K]); | |||
static inline void schoolbook_KxK(uint16_t r[2 * K], const uint16_t a[K], const uint16_t b[K]); | |||
static void toom4_k2x2_interpolate(uint16_t r[2 * M], const uint16_t a[63 * 2 * K]); | |||
static inline void k2x2_interpolate(uint16_t r[M], const uint16_t a[9 * K]); | |||
void PQCLEAN_NTRUHPS2048509_CLEAN_poly_Rq_mul(poly *r, const poly *a, const poly *b) { | |||
int k, i; | |||
size_t i; | |||
uint16_t ab[2 * L]; | |||
for (k = 0; k < NTRU_N; k++) { | |||
r->coeffs[k] = 0; | |||
for (i = 1; i < NTRU_N - k; i++) { | |||
r->coeffs[k] += a->coeffs[k + i] * b->coeffs[NTRU_N - i]; | |||
} | |||
for (i = 0; i < k + 1; i++) { | |||
r->coeffs[k] += a->coeffs[k - i] * b->coeffs[i]; | |||
for (i = 0; i < NTRU_N; i++) { | |||
ab[i] = a->coeffs[i]; | |||
ab[L + i] = b->coeffs[i]; | |||
} | |||
for (i = NTRU_N; i < L; i++) { | |||
ab[i] = 0; | |||
ab[L + i] = 0; | |||
} | |||
toom4_k2x2_mul(ab, ab, ab + L); | |||
for (i = 0; i < NTRU_N; i++) { | |||
r->coeffs[i] = ab[i] + ab[NTRU_N + i]; | |||
} | |||
} | |||
static void toom4_k2x2_mul(uint16_t ab[2 * L], const uint16_t a[L], const uint16_t b[L]) { | |||
uint16_t tmpA[9 * K]; | |||
uint16_t tmpB[9 * K]; | |||
uint16_t eC[63 * 2 * K]; | |||
toom4_k2x2_eval_0(tmpA, a); | |||
toom4_k2x2_eval_0(tmpB, b); | |||
toom4_k2x2_basemul(eC + 0 * 9 * 2 * K, tmpA, tmpB); | |||
toom4_k2x2_eval_p1(tmpA, a); | |||
toom4_k2x2_eval_p1(tmpB, b); | |||
toom4_k2x2_basemul(eC + 1 * 9 * 2 * K, tmpA, tmpB); | |||
toom4_k2x2_eval_m1(tmpA, a); | |||
toom4_k2x2_eval_m1(tmpB, b); | |||
toom4_k2x2_basemul(eC + 2 * 9 * 2 * K, tmpA, tmpB); | |||
toom4_k2x2_eval_p2(tmpA, a); | |||
toom4_k2x2_eval_p2(tmpB, b); | |||
toom4_k2x2_basemul(eC + 3 * 9 * 2 * K, tmpA, tmpB); | |||
toom4_k2x2_eval_m2(tmpA, a); | |||
toom4_k2x2_eval_m2(tmpB, b); | |||
toom4_k2x2_basemul(eC + 4 * 9 * 2 * K, tmpA, tmpB); | |||
toom4_k2x2_eval_p3(tmpA, a); | |||
toom4_k2x2_eval_p3(tmpB, b); | |||
toom4_k2x2_basemul(eC + 5 * 9 * 2 * K, tmpA, tmpB); | |||
toom4_k2x2_eval_inf(tmpA, a); | |||
toom4_k2x2_eval_inf(tmpB, b); | |||
toom4_k2x2_basemul(eC + 6 * 9 * 2 * K, tmpA, tmpB); | |||
toom4_k2x2_interpolate(ab, eC); | |||
} | |||
static void toom4_k2x2_eval_0(uint16_t r[9 * K], const uint16_t a[M]) { | |||
for (size_t i = 0; i < M; i++) { | |||
r[i] = a[i]; | |||
} | |||
k2x2_eval(r); | |||
} | |||
static void toom4_k2x2_eval_p1(uint16_t r[9 * K], const uint16_t a[M]) { | |||
for (size_t i = 0; i < M; i++) { | |||
r[i] = a[0 * M + i]; | |||
r[i] += a[1 * M + i]; | |||
r[i] += a[2 * M + i]; | |||
r[i] += a[3 * M + i]; | |||
} | |||
k2x2_eval(r); | |||
} | |||
static void toom4_k2x2_eval_m1(uint16_t r[9 * K], const uint16_t a[M]) { | |||
for (size_t i = 0; i < M; i++) { | |||
r[i] = a[0 * M + i]; | |||
r[i] -= a[1 * M + i]; | |||
r[i] += a[2 * M + i]; | |||
r[i] -= a[3 * M + i]; | |||
} | |||
k2x2_eval(r); | |||
} | |||
static void toom4_k2x2_eval_p2(uint16_t r[9 * K], const uint16_t a[M]) { | |||
for (size_t i = 0; i < M; i++) { | |||
r[i] = a[0 * M + i]; | |||
r[i] += 2 * a[1 * M + i]; | |||
r[i] += 4 * a[2 * M + i]; | |||
r[i] += 8 * a[3 * M + i]; | |||
} | |||
k2x2_eval(r); | |||
} | |||
static void toom4_k2x2_eval_m2(uint16_t r[9 * K], const uint16_t a[M]) { | |||
for (size_t i = 0; i < M; i++) { | |||
r[i] = a[0 * M + i]; | |||
r[i] -= 2 * a[1 * M + i]; | |||
r[i] += 4 * a[2 * M + i]; | |||
r[i] -= 8 * a[3 * M + i]; | |||
} | |||
k2x2_eval(r); | |||
} | |||
static void toom4_k2x2_eval_p3(uint16_t r[9 * K], const uint16_t a[M]) { | |||
for (size_t i = 0; i < M; i++) { | |||
r[i] = a[0 * M + i]; | |||
r[i] += 3 * a[1 * M + i]; | |||
r[i] += 9 * a[2 * M + i]; | |||
r[i] += 27 * a[3 * M + i]; | |||
} | |||
k2x2_eval(r); | |||
} | |||
static void toom4_k2x2_eval_inf(uint16_t r[9 * K], const uint16_t a[M]) { | |||
for (size_t i = 0; i < M; i++) { | |||
r[i] = a[3 * M + i]; | |||
} | |||
k2x2_eval(r); | |||
} | |||
static inline void k2x2_eval(uint16_t r[9 * K]) { | |||
/* Input: e + f.Y + g.Y^2 + h.Y^3 */ | |||
/* Output: [ e | f | g | h | e+f | f+h | g+e | h+g | e+f+g+h ] */ | |||
size_t i; | |||
for (i = 0; i < 4 * K; i++) { | |||
r[4 * K + i] = r[i]; | |||
} | |||
for (i = 0; i < K; i++) { | |||
r[4 * K + i] += r[1 * K + i]; | |||
r[5 * K + i] += r[3 * K + i]; | |||
r[6 * K + i] += r[0 * K + i]; | |||
r[7 * K + i] += r[2 * K + i]; | |||
r[8 * K + i] = r[5 * K + i]; | |||
r[8 * K + i] += r[6 * K + i]; | |||
} | |||
} | |||
static void toom4_k2x2_basemul(uint16_t r[18 * K], const uint16_t a[9 * K], const uint16_t b[9 * K]) { | |||
schoolbook_KxK(r + 0 * 2 * K, a + 0 * K, b + 0 * K); | |||
schoolbook_KxK(r + 1 * 2 * K, a + 1 * K, b + 1 * K); | |||
schoolbook_KxK(r + 2 * 2 * K, a + 2 * K, b + 2 * K); | |||
schoolbook_KxK(r + 3 * 2 * K, a + 3 * K, b + 3 * K); | |||
schoolbook_KxK(r + 4 * 2 * K, a + 4 * K, b + 4 * K); | |||
schoolbook_KxK(r + 5 * 2 * K, a + 5 * K, b + 5 * K); | |||
schoolbook_KxK(r + 6 * 2 * K, a + 6 * K, b + 6 * K); | |||
schoolbook_KxK(r + 7 * 2 * K, a + 7 * K, b + 7 * K); | |||
schoolbook_KxK(r + 8 * 2 * K, a + 8 * K, b + 8 * K); | |||
} | |||
static inline void schoolbook_KxK(uint16_t r[2 * K], const uint16_t a[K], const uint16_t b[K]) { | |||
size_t i, j; | |||
for (j = 0; j < K; j++) { | |||
r[j] = a[0] * b[j]; | |||
} | |||
for (i = 1; i < K; i++) { | |||
for (j = 0; j < K - 1; j++) { | |||
r[i + j] += a[i] * b[j]; | |||
} | |||
r[i + K - 1] = a[i] * b[K - 1]; | |||
} | |||
r[2 * K - 1] = 0; | |||
} | |||
static void toom4_k2x2_interpolate(uint16_t r[2 * M], const uint16_t a[7 * 18 * K]) { | |||
size_t i; | |||
uint16_t P1[2 * M]; | |||
uint16_t Pm1[2 * M]; | |||
uint16_t P2[2 * M]; | |||
uint16_t Pm2[2 * M]; | |||
uint16_t *C0 = r; | |||
uint16_t *C2 = r + 2 * M; | |||
uint16_t *C4 = r + 4 * M; | |||
uint16_t *C6 = r + 6 * M; | |||
uint16_t V0, V1, V2; | |||
k2x2_interpolate(C0, a + 0 * 9 * 2 * K); | |||
k2x2_interpolate(P1, a + 1 * 9 * 2 * K); | |||
k2x2_interpolate(Pm1, a + 2 * 9 * 2 * K); | |||
k2x2_interpolate(P2, a + 3 * 9 * 2 * K); | |||
k2x2_interpolate(Pm2, a + 4 * 9 * 2 * K); | |||
k2x2_interpolate(C6, a + 6 * 9 * 2 * K); | |||
for (i = 0; i < 2 * M; i++) { | |||
V0 = ((uint32_t)(P1[i] + Pm1[i])) >> 1; | |||
V0 = V0 - C0[i] - C6[i]; | |||
V1 = ((uint32_t)(P2[i] + Pm2[i] - 2 * C0[i] - 128 * C6[i])) >> 3; | |||
C4[i] = 43691 * (V1 - V0); | |||
C2[i] = V0 - C4[i]; | |||
P1[i] = ((uint32_t)(P1[i] - Pm1[i])) >> 1; | |||
} | |||
/* reuse Pm1 for P3 */ | |||
#define P3 Pm1 | |||
k2x2_interpolate(P3, a + 5 * 9 * 2 * K); | |||
for (i = 0; i < 2 * M; i++) { | |||
V0 = P1[i]; | |||
V1 = 43691 * ((((uint32_t)(P2[i] - Pm2[i])) >> 2) - V0); | |||
V2 = 43691 * (P3[i] - C0[i] - 9 * (C2[i] + 9 * (C4[i] + 9 * C6[i]))); | |||
V2 = ((uint32_t)(V2 - V0)) >> 3; | |||
V2 -= V1; | |||
P3[i] = 52429 * V2; | |||
P2[i] = V1 - V2; | |||
P1[i] = V0 - P2[i] - P3[i]; | |||
} | |||
for (i = 0; i < 2 * M; i++) { | |||
r[1 * M + i] += P1[i]; | |||
r[3 * M + i] += P2[i]; | |||
r[5 * M + i] += P3[i]; | |||
} | |||
} | |||
static inline void k2x2_interpolate(uint16_t r[M], const uint16_t a[9 * K]) { | |||
size_t i; | |||
uint16_t tmp[4 * K]; | |||
for (i = 0; i < 2 * K; i++) { | |||
r[0 * K + i] = a[0 * K + i]; | |||
r[2 * K + i] = a[2 * K + i]; | |||
} | |||
for (i = 0; i < 2 * K; i++) { | |||
r[1 * K + i] += a[8 * K + i] - a[0 * K + i] - a[2 * K + i]; | |||
} | |||
for (i = 0; i < 2 * K; i++) { | |||
r[4 * K + i] = a[4 * K + i]; | |||
r[6 * K + i] = a[6 * K + i]; | |||
} | |||
for (i = 0; i < 2 * K; i++) { | |||
r[5 * K + i] += a[14 * K + i] - a[4 * K + i] - a[6 * K + i]; | |||
} | |||
for (i = 0; i < 2 * K; i++) { | |||
tmp[0 * K + i] = a[12 * K + i]; | |||
tmp[2 * K + i] = a[10 * K + i]; | |||
} | |||
for (i = 0; i < 2 * K; i++) { | |||
tmp[K + i] += a[16 * K + i] - a[12 * K + i] - a[10 * K + i]; | |||
} | |||
for (i = 0; i < 4 * K; i++) { | |||
tmp[0 * K + i] = tmp[0 * K + i] - r[0 * K + i] - r[4 * K + i]; | |||
} | |||
for (i = 0; i < 4 * K; i++) { | |||
r[2 * K + i] += tmp[0 * K + i]; | |||
} | |||
} | |||
@@ -23,9 +23,9 @@ auxiliary-submitters: | |||
- Zhenfei Zhang | |||
implementations: | |||
- name: clean | |||
version: https://github.com/jschanck/ntru/tree/6d1f44f5 reference implementation | |||
version: https://github.com/jschanck/ntru/tree/60cc7277 reference implementation | |||
- name: avx2 | |||
version: https://github.com/jschanck/ntru/tree/6d1f44f5 avx2 implementation | |||
version: https://github.com/jschanck/ntru/tree/60cc7277 avx2 implementation | |||
supported_platforms: | |||
- architecture: x86_64 | |||
operating_systems: | |||
@@ -4,12 +4,9 @@ | |||
#include "params.h" | |||
#include "poly.h" | |||
void PQCLEAN_NTRUHPS2048677_AVX2_owcpa_samplemsg(unsigned char msg[NTRU_OWCPA_MSGBYTES], | |||
const unsigned char seed[NTRU_SEEDBYTES]); | |||
void PQCLEAN_NTRUHPS2048677_AVX2_owcpa_keypair(unsigned char *pk, | |||
unsigned char *sk, | |||
const unsigned char seed[NTRU_SEEDBYTES]); | |||
const unsigned char seed[NTRU_SAMPLE_FG_BYTES]); | |||
void PQCLEAN_NTRUHPS2048677_AVX2_owcpa_enc(unsigned char *c, | |||
const poly *r, | |||
@@ -23,7 +23,15 @@ void PQCLEAN_NTRUHPS2048677_AVX2_poly_Sq_mul(poly *r, const poly *a, const poly | |||
} | |||
void PQCLEAN_NTRUHPS2048677_AVX2_poly_S3_mul(poly *r, const poly *a, const poly *b) { | |||
int i; | |||
/* Our S3 multiplications do not overflow mod q, */ | |||
/* so we can re-purpose PQCLEAN_NTRUHPS2048677_AVX2_poly_Rq_mul, as long as we */ | |||
/* follow with an explicit reduction mod q. */ | |||
PQCLEAN_NTRUHPS2048677_AVX2_poly_Rq_mul(r, a, b); | |||
for (i = 0; i < NTRU_N; i++) { | |||
r->coeffs[i] = MODQ(r->coeffs[i]); | |||
} | |||
PQCLEAN_NTRUHPS2048677_AVX2_poly_mod_3_Phi_n(r); | |||
} | |||
@@ -237,23 +237,6 @@ mask_15_1: | |||
.word 65535 | |||
.word 65535 | |||
.word 0 | |||
mask_mod2048: | |||
.word 2047 | |||
.word 2047 | |||
.word 2047 | |||
.word 2047 | |||
.word 2047 | |||
.word 2047 | |||
.word 2047 | |||
.word 2047 | |||
.word 2047 | |||
.word 2047 | |||
.word 2047 | |||
.word 2047 | |||
.word 2047 | |||
.word 2047 | |||
.word 2047 | |||
.word 2047 | |||
.text | |||
.global PQCLEAN_NTRUHPS2048677_AVX2_poly_Rq_mul | |||
.global _PQCLEAN_NTRUHPS2048677_AVX2_poly_Rq_mul | |||
@@ -5139,31 +5122,24 @@ vpmullw %ymm13, %ymm8, %ymm8 | |||
vpsubw %ymm8, %ymm6, %ymm6 | |||
vmovdqu 0(%rdi), %ymm9 | |||
vpaddw %ymm9, %ymm11, %ymm9 | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqu %ymm9, 0(%rdi) | |||
vmovdqu 352(%rdi), %ymm9 | |||
vpaddw %ymm9, %ymm6, %ymm9 | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqu %ymm9, 352(%rdi) | |||
vmovdqu 704(%rdi), %ymm9 | |||
vpaddw %ymm9, %ymm3, %ymm9 | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqu %ymm9, 704(%rdi) | |||
vmovdqu 1056(%rdi), %ymm9 | |||
vpaddw %ymm9, %ymm4, %ymm9 | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqu %ymm9, 1056(%rdi) | |||
vmovdqu 54(%rdi), %ymm9 | |||
vpaddw %ymm9, %ymm7, %ymm9 | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqu %ymm9, 54(%rdi) | |||
vmovdqu 406(%rdi), %ymm9 | |||
vpaddw %ymm9, %ymm8, %ymm9 | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqu %ymm9, 406(%rdi) | |||
vmovdqu 758(%rdi), %ymm9 | |||
vpaddw %ymm9, %ymm5, %ymm9 | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqu %ymm9, 758(%rdi) | |||
vmovdqa 32(%rsp), %ymm5 | |||
vpunpcklwd const0(%rip), %ymm5, %ymm8 | |||
@@ -5231,31 +5207,24 @@ vpmullw %ymm13, %ymm4, %ymm4 | |||
vpsubw %ymm4, %ymm6, %ymm6 | |||
vmovdqu 88(%rdi), %ymm7 | |||
vpaddw %ymm7, %ymm5, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqu %ymm7, 88(%rdi) | |||
vmovdqu 440(%rdi), %ymm7 | |||
vpaddw %ymm7, %ymm6, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqu %ymm7, 440(%rdi) | |||
vmovdqu 792(%rdi), %ymm7 | |||
vpaddw %ymm7, %ymm10, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqu %ymm7, 792(%rdi) | |||
vmovdqu 1144(%rdi), %ymm7 | |||
vpaddw %ymm7, %ymm9, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqu %ymm7, 1144(%rdi) | |||
vmovdqu 142(%rdi), %ymm7 | |||
vpaddw %ymm7, %ymm3, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqu %ymm7, 142(%rdi) | |||
vmovdqu 494(%rdi), %ymm7 | |||
vpaddw %ymm7, %ymm4, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqu %ymm7, 494(%rdi) | |||
vmovdqu 846(%rdi), %ymm7 | |||
vpaddw %ymm7, %ymm11, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqu %ymm7, 846(%rdi) | |||
vmovdqa 64(%rsp), %ymm11 | |||
vpunpcklwd const0(%rip), %ymm11, %ymm4 | |||
@@ -5323,31 +5292,24 @@ vpmullw %ymm13, %ymm9, %ymm9 | |||
vpsubw %ymm9, %ymm6, %ymm6 | |||
vmovdqu 176(%rdi), %ymm3 | |||
vpaddw %ymm3, %ymm11, %ymm3 | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqu %ymm3, 176(%rdi) | |||
vmovdqu 528(%rdi), %ymm3 | |||
vpaddw %ymm3, %ymm6, %ymm3 | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqu %ymm3, 528(%rdi) | |||
vmovdqu 880(%rdi), %ymm3 | |||
vpaddw %ymm3, %ymm8, %ymm3 | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqu %ymm3, 880(%rdi) | |||
vmovdqu 1232(%rdi), %ymm3 | |||
vpaddw %ymm3, %ymm7, %ymm3 | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqu %ymm3, 1232(%rdi) | |||
vmovdqu 230(%rdi), %ymm3 | |||
vpaddw %ymm3, %ymm10, %ymm3 | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqu %ymm3, 230(%rdi) | |||
vmovdqu 582(%rdi), %ymm3 | |||
vpaddw %ymm3, %ymm9, %ymm3 | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqu %ymm3, 582(%rdi) | |||
vmovdqu 934(%rdi), %ymm3 | |||
vpaddw %ymm3, %ymm5, %ymm3 | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqu %ymm3, 934(%rdi) | |||
vmovdqa 96(%rsp), %ymm5 | |||
vpunpcklwd const0(%rip), %ymm5, %ymm9 | |||
@@ -5415,31 +5377,24 @@ vpmullw %ymm13, %ymm7, %ymm7 | |||
vpsubw %ymm7, %ymm6, %ymm6 | |||
vmovdqu 264(%rdi), %ymm10 | |||
vpaddw %ymm10, %ymm5, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqu %ymm10, 264(%rdi) | |||
vmovdqu 616(%rdi), %ymm10 | |||
vpaddw %ymm10, %ymm6, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqu %ymm10, 616(%rdi) | |||
vmovdqu 968(%rdi), %ymm10 | |||
vpaddw %ymm10, %ymm4, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqu %ymm10, 968(%rdi) | |||
vmovdqu 1320(%rdi), %ymm10 | |||
vpaddw %ymm10, %ymm3, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqu %ymm10, 1320(%rdi) | |||
vmovdqu 318(%rdi), %ymm10 | |||
vpaddw %ymm10, %ymm8, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqu %ymm10, 318(%rdi) | |||
vmovdqu 670(%rdi), %ymm10 | |||
vpaddw %ymm10, %ymm7, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqu %ymm10, 670(%rdi) | |||
vmovdqu 1022(%rdi), %ymm10 | |||
vpaddw %ymm10, %ymm11, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqu %ymm10, 1022(%rdi) | |||
vmovdqa 128(%rsp), %ymm11 | |||
vpunpcklwd const0(%rip), %ymm11, %ymm7 | |||
@@ -5507,31 +5462,24 @@ vpmullw %ymm13, %ymm3, %ymm3 | |||
vpsubw %ymm3, %ymm6, %ymm6 | |||
vmovdqu 352(%rdi), %ymm8 | |||
vpaddw %ymm8, %ymm11, %ymm8 | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqu %ymm8, 352(%rdi) | |||
vmovdqu 704(%rdi), %ymm8 | |||
vpaddw %ymm8, %ymm6, %ymm8 | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqu %ymm8, 704(%rdi) | |||
vmovdqu 1056(%rdi), %ymm8 | |||
vpaddw %ymm8, %ymm9, %ymm8 | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqu %ymm8, 1056(%rdi) | |||
vmovdqu 54(%rdi), %ymm8 | |||
vpaddw %ymm8, %ymm10, %ymm8 | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqu %ymm8, 54(%rdi) | |||
vmovdqu 406(%rdi), %ymm8 | |||
vpaddw %ymm8, %ymm4, %ymm8 | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqu %ymm8, 406(%rdi) | |||
vmovdqu 758(%rdi), %ymm8 | |||
vpaddw %ymm8, %ymm3, %ymm8 | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqu %ymm8, 758(%rdi) | |||
vmovdqu 1110(%rdi), %ymm8 | |||
vpaddw %ymm8, %ymm5, %ymm8 | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqu %ymm8, 1110(%rdi) | |||
vmovdqa 160(%rsp), %ymm5 | |||
vpunpcklwd const0(%rip), %ymm5, %ymm3 | |||
@@ -5599,31 +5547,24 @@ vpmullw %ymm13, %ymm10, %ymm10 | |||
vpsubw %ymm10, %ymm6, %ymm6 | |||
vmovdqu 440(%rdi), %ymm4 | |||
vpaddw %ymm4, %ymm5, %ymm4 | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqu %ymm4, 440(%rdi) | |||
vmovdqu 792(%rdi), %ymm4 | |||
vpaddw %ymm4, %ymm6, %ymm4 | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqu %ymm4, 792(%rdi) | |||
vmovdqu 1144(%rdi), %ymm4 | |||
vpaddw %ymm4, %ymm7, %ymm4 | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqu %ymm4, 1144(%rdi) | |||
vmovdqu 142(%rdi), %ymm4 | |||
vpaddw %ymm4, %ymm8, %ymm4 | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqu %ymm4, 142(%rdi) | |||
vmovdqu 494(%rdi), %ymm4 | |||
vpaddw %ymm4, %ymm9, %ymm4 | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqu %ymm4, 494(%rdi) | |||
vmovdqu 846(%rdi), %ymm4 | |||
vpaddw %ymm4, %ymm10, %ymm4 | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqu %ymm4, 846(%rdi) | |||
vmovdqu 1198(%rdi), %ymm4 | |||
vpaddw %ymm4, %ymm11, %ymm4 | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqu %ymm4, 1198(%rdi) | |||
vmovdqa 192(%rsp), %ymm11 | |||
vpunpcklwd const0(%rip), %ymm11, %ymm10 | |||
@@ -5691,31 +5632,24 @@ vpmullw %ymm13, %ymm8, %ymm8 | |||
vpsubw %ymm8, %ymm6, %ymm6 | |||
vmovdqu 528(%rdi), %ymm9 | |||
vpaddw %ymm9, %ymm11, %ymm9 | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqu %ymm9, 528(%rdi) | |||
vmovdqu 880(%rdi), %ymm9 | |||
vpaddw %ymm9, %ymm6, %ymm9 | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqu %ymm9, 880(%rdi) | |||
vmovdqu 1232(%rdi), %ymm9 | |||
vpaddw %ymm9, %ymm3, %ymm9 | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqu %ymm9, 1232(%rdi) | |||
vmovdqu 230(%rdi), %ymm9 | |||
vpaddw %ymm9, %ymm4, %ymm9 | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqu %ymm9, 230(%rdi) | |||
vmovdqu 582(%rdi), %ymm9 | |||
vpaddw %ymm9, %ymm7, %ymm9 | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqu %ymm9, 582(%rdi) | |||
vmovdqu 934(%rdi), %ymm9 | |||
vpaddw %ymm9, %ymm8, %ymm9 | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqu %ymm9, 934(%rdi) | |||
vmovdqu 1286(%rdi), %ymm9 | |||
vpaddw %ymm9, %ymm5, %ymm9 | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqu %ymm9, 1286(%rdi) | |||
vmovdqa 224(%rsp), %ymm5 | |||
vpunpcklwd const0(%rip), %ymm5, %ymm8 | |||
@@ -5783,31 +5717,24 @@ vpmullw %ymm13, %ymm4, %ymm4 | |||
vpsubw %ymm4, %ymm6, %ymm6 | |||
vmovdqu 616(%rdi), %ymm7 | |||
vpaddw %ymm7, %ymm5, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqu %ymm7, 616(%rdi) | |||
vmovdqu 968(%rdi), %ymm7 | |||
vpaddw %ymm7, %ymm6, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqu %ymm7, 968(%rdi) | |||
vmovdqu 1320(%rdi), %ymm7 | |||
vpaddw %ymm7, %ymm10, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqu %ymm7, 1320(%rdi) | |||
vmovdqu 318(%rdi), %ymm7 | |||
vpaddw %ymm7, %ymm9, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqu %ymm7, 318(%rdi) | |||
vmovdqu 670(%rdi), %ymm7 | |||
vpaddw %ymm7, %ymm3, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqu %ymm7, 670(%rdi) | |||
vmovdqu 1022(%rdi), %ymm7 | |||
vpaddw %ymm7, %ymm4, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqu %ymm7, 1022(%rdi) | |||
vmovdqu 1374(%rdi), %ymm7 | |||
vpaddw %ymm7, %ymm11, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqu %ymm7, 1374(%rdi) | |||
vmovdqa 128(%r12), %ymm0 | |||
vpsubw 224(%r12), %ymm0, %ymm0 | |||
@@ -6176,31 +6103,24 @@ vpmullw %ymm13, %ymm9, %ymm9 | |||
vpsubw %ymm9, %ymm6, %ymm6 | |||
vmovdqu 32(%rdi), %ymm3 | |||
vpaddw %ymm3, %ymm11, %ymm3 | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqu %ymm3, 32(%rdi) | |||
vmovdqu 384(%rdi), %ymm3 | |||
vpaddw %ymm3, %ymm6, %ymm3 | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqu %ymm3, 384(%rdi) | |||
vmovdqu 736(%rdi), %ymm3 | |||
vpaddw %ymm3, %ymm8, %ymm3 | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqu %ymm3, 736(%rdi) | |||
vmovdqu 1088(%rdi), %ymm3 | |||
vpaddw %ymm3, %ymm7, %ymm3 | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqu %ymm3, 1088(%rdi) | |||
vmovdqu 86(%rdi), %ymm3 | |||
vpaddw %ymm3, %ymm10, %ymm3 | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqu %ymm3, 86(%rdi) | |||
vmovdqu 438(%rdi), %ymm3 | |||
vpaddw %ymm3, %ymm9, %ymm3 | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqu %ymm3, 438(%rdi) | |||
vmovdqu 790(%rdi), %ymm3 | |||
vpaddw %ymm3, %ymm5, %ymm3 | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqu %ymm3, 790(%rdi) | |||
vmovdqa 32(%rsp), %ymm5 | |||
vpunpcklwd const0(%rip), %ymm5, %ymm9 | |||
@@ -6268,31 +6188,24 @@ vpmullw %ymm13, %ymm7, %ymm7 | |||
vpsubw %ymm7, %ymm6, %ymm6 | |||
vmovdqu 120(%rdi), %ymm10 | |||
vpaddw %ymm10, %ymm5, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqu %ymm10, 120(%rdi) | |||
vmovdqu 472(%rdi), %ymm10 | |||
vpaddw %ymm10, %ymm6, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqu %ymm10, 472(%rdi) | |||
vmovdqu 824(%rdi), %ymm10 | |||
vpaddw %ymm10, %ymm4, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqu %ymm10, 824(%rdi) | |||
vmovdqu 1176(%rdi), %ymm10 | |||
vpaddw %ymm10, %ymm3, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqu %ymm10, 1176(%rdi) | |||
vmovdqu 174(%rdi), %ymm10 | |||
vpaddw %ymm10, %ymm8, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqu %ymm10, 174(%rdi) | |||
vmovdqu 526(%rdi), %ymm10 | |||
vpaddw %ymm10, %ymm7, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqu %ymm10, 526(%rdi) | |||
vmovdqu 878(%rdi), %ymm10 | |||
vpaddw %ymm10, %ymm11, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqu %ymm10, 878(%rdi) | |||
vmovdqa 64(%rsp), %ymm11 | |||
vpunpcklwd const0(%rip), %ymm11, %ymm7 | |||
@@ -6360,31 +6273,24 @@ vpmullw %ymm13, %ymm3, %ymm3 | |||
vpsubw %ymm3, %ymm6, %ymm6 | |||
vmovdqu 208(%rdi), %ymm8 | |||
vpaddw %ymm8, %ymm11, %ymm8 | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqu %ymm8, 208(%rdi) | |||
vmovdqu 560(%rdi), %ymm8 | |||
vpaddw %ymm8, %ymm6, %ymm8 | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqu %ymm8, 560(%rdi) | |||
vmovdqu 912(%rdi), %ymm8 | |||
vpaddw %ymm8, %ymm9, %ymm8 | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqu %ymm8, 912(%rdi) | |||
vmovdqu 1264(%rdi), %ymm8 | |||
vpaddw %ymm8, %ymm10, %ymm8 | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqu %ymm8, 1264(%rdi) | |||
vmovdqu 262(%rdi), %ymm8 | |||
vpaddw %ymm8, %ymm4, %ymm8 | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqu %ymm8, 262(%rdi) | |||
vmovdqu 614(%rdi), %ymm8 | |||
vpaddw %ymm8, %ymm3, %ymm8 | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqu %ymm8, 614(%rdi) | |||
vmovdqu 966(%rdi), %ymm8 | |||
vpaddw %ymm8, %ymm5, %ymm8 | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqu %ymm8, 966(%rdi) | |||
vmovdqa 96(%rsp), %ymm5 | |||
vpunpcklwd const0(%rip), %ymm5, %ymm3 | |||
@@ -6452,20 +6358,16 @@ vpmullw %ymm13, %ymm10, %ymm10 | |||
vpsubw %ymm10, %ymm6, %ymm6 | |||
vmovdqu 296(%rdi), %ymm4 | |||
vpaddw %ymm4, %ymm5, %ymm4 | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqu %ymm4, 296(%rdi) | |||
vmovdqu 648(%rdi), %ymm4 | |||
vpaddw %ymm4, %ymm6, %ymm4 | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqu %ymm4, 648(%rdi) | |||
vmovdqu 1000(%rdi), %ymm4 | |||
vpaddw %ymm4, %ymm7, %ymm4 | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqu %ymm4, 1000(%rdi) | |||
vmovdqu 1352(%rdi), %ymm4 | |||
vpand mask_1_15(%rip), %ymm8, %ymm3 | |||
vpaddw %ymm4, %ymm3, %ymm4 | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqu %ymm4, 1352(%rdi) | |||
vpshufb rol_rol_16(%rip), %ymm8, %ymm8 | |||
vpermq $216, %ymm8, %ymm8 | |||
@@ -6474,19 +6376,15 @@ vpermq $216, %ymm8, %ymm8 | |||
vpand mask_15_1(%rip), %ymm8, %ymm8 | |||
vmovdqu 0(%rdi), %ymm4 | |||
vpaddw %ymm4, %ymm8, %ymm4 | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqu %ymm4, 0(%rdi) | |||
vmovdqu 350(%rdi), %ymm4 | |||
vpaddw %ymm4, %ymm9, %ymm4 | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqu %ymm4, 350(%rdi) | |||
vmovdqu 702(%rdi), %ymm4 | |||
vpaddw %ymm4, %ymm10, %ymm4 | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqu %ymm4, 702(%rdi) | |||
vmovdqu 1054(%rdi), %ymm4 | |||
vpaddw %ymm4, %ymm11, %ymm4 | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqu %ymm4, 1054(%rdi) | |||
vmovdqa 128(%rsp), %ymm11 | |||
vpunpcklwd const0(%rip), %ymm11, %ymm10 | |||
@@ -6554,31 +6452,24 @@ vpmullw %ymm13, %ymm8, %ymm8 | |||
vpsubw %ymm8, %ymm6, %ymm6 | |||
vmovdqu 384(%rdi), %ymm9 | |||
vpaddw %ymm9, %ymm11, %ymm9 | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqu %ymm9, 384(%rdi) | |||
vmovdqu 736(%rdi), %ymm9 | |||
vpaddw %ymm9, %ymm6, %ymm9 | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqu %ymm9, 736(%rdi) | |||
vmovdqu 1088(%rdi), %ymm9 | |||
vpaddw %ymm9, %ymm3, %ymm9 | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqu %ymm9, 1088(%rdi) | |||
vmovdqu 86(%rdi), %ymm9 | |||
vpaddw %ymm9, %ymm4, %ymm9 | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqu %ymm9, 86(%rdi) | |||
vmovdqu 438(%rdi), %ymm9 | |||
vpaddw %ymm9, %ymm7, %ymm9 | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqu %ymm9, 438(%rdi) | |||
vmovdqu 790(%rdi), %ymm9 | |||
vpaddw %ymm9, %ymm8, %ymm9 | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqu %ymm9, 790(%rdi) | |||
vmovdqu 1142(%rdi), %ymm9 | |||
vpaddw %ymm9, %ymm5, %ymm9 | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqu %ymm9, 1142(%rdi) | |||
vmovdqa 160(%rsp), %ymm5 | |||
vpunpcklwd const0(%rip), %ymm5, %ymm8 | |||
@@ -6646,31 +6537,24 @@ vpmullw %ymm13, %ymm4, %ymm4 | |||
vpsubw %ymm4, %ymm6, %ymm6 | |||
vmovdqu 472(%rdi), %ymm7 | |||
vpaddw %ymm7, %ymm5, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqu %ymm7, 472(%rdi) | |||
vmovdqu 824(%rdi), %ymm7 | |||
vpaddw %ymm7, %ymm6, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqu %ymm7, 824(%rdi) | |||
vmovdqu 1176(%rdi), %ymm7 | |||
vpaddw %ymm7, %ymm10, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqu %ymm7, 1176(%rdi) | |||
vmovdqu 174(%rdi), %ymm7 | |||
vpaddw %ymm7, %ymm9, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqu %ymm7, 174(%rdi) | |||
vmovdqu 526(%rdi), %ymm7 | |||
vpaddw %ymm7, %ymm3, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqu %ymm7, 526(%rdi) | |||
vmovdqu 878(%rdi), %ymm7 | |||
vpaddw %ymm7, %ymm4, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqu %ymm7, 878(%rdi) | |||
vmovdqu 1230(%rdi), %ymm7 | |||
vpaddw %ymm7, %ymm11, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqu %ymm7, 1230(%rdi) | |||
vmovdqa 192(%rsp), %ymm11 | |||
vpunpcklwd const0(%rip), %ymm11, %ymm4 | |||
@@ -6738,31 +6622,24 @@ vpmullw %ymm13, %ymm9, %ymm9 | |||
vpsubw %ymm9, %ymm6, %ymm6 | |||
vmovdqu 560(%rdi), %ymm3 | |||
vpaddw %ymm3, %ymm11, %ymm3 | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqu %ymm3, 560(%rdi) | |||
vmovdqu 912(%rdi), %ymm3 | |||
vpaddw %ymm3, %ymm6, %ymm3 | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqu %ymm3, 912(%rdi) | |||
vmovdqu 1264(%rdi), %ymm3 | |||
vpaddw %ymm3, %ymm8, %ymm3 | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqu %ymm3, 1264(%rdi) | |||
vmovdqu 262(%rdi), %ymm3 | |||
vpaddw %ymm3, %ymm7, %ymm3 | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqu %ymm3, 262(%rdi) | |||
vmovdqu 614(%rdi), %ymm3 | |||
vpaddw %ymm3, %ymm10, %ymm3 | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqu %ymm3, 614(%rdi) | |||
vmovdqu 966(%rdi), %ymm3 | |||
vpaddw %ymm3, %ymm9, %ymm3 | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqu %ymm3, 966(%rdi) | |||
vmovdqu 1318(%rdi), %ymm3 | |||
vpaddw %ymm3, %ymm5, %ymm3 | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqu %ymm3, 1318(%rdi) | |||
vmovdqa 224(%rsp), %ymm5 | |||
vpunpcklwd const0(%rip), %ymm5, %ymm9 | |||
@@ -6830,16 +6707,13 @@ vpmullw %ymm13, %ymm7, %ymm7 | |||
vpsubw %ymm7, %ymm6, %ymm6 | |||
vmovdqu 648(%rdi), %ymm10 | |||
vpaddw %ymm10, %ymm5, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqu %ymm10, 648(%rdi) | |||
vmovdqu 1000(%rdi), %ymm10 | |||
vpaddw %ymm10, %ymm6, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqu %ymm10, 1000(%rdi) | |||
vmovdqu 1352(%rdi), %ymm10 | |||
vpand mask_1_15(%rip), %ymm4, %ymm9 | |||
vpaddw %ymm10, %ymm9, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqu %ymm10, 1352(%rdi) | |||
vpshufb rol_rol_16(%rip), %ymm4, %ymm4 | |||
vpermq $216, %ymm4, %ymm4 | |||
@@ -6848,19 +6722,15 @@ vpermq $216, %ymm4, %ymm4 | |||
vpand mask_15_1(%rip), %ymm4, %ymm4 | |||
vmovdqu 0(%rdi), %ymm10 | |||
vpaddw %ymm10, %ymm4, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqu %ymm10, 0(%rdi) | |||
vmovdqu 350(%rdi), %ymm10 | |||
vpaddw %ymm10, %ymm3, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqu %ymm10, 350(%rdi) | |||
vmovdqu 702(%rdi), %ymm10 | |||
vpaddw %ymm10, %ymm8, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqu %ymm10, 702(%rdi) | |||
vmovdqu 1054(%rdi), %ymm10 | |||
vpaddw %ymm10, %ymm7, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqu %ymm10, 1054(%rdi) | |||
vmovdqa 160(%r12), %ymm0 | |||
vpsubw 256(%r12), %ymm0, %ymm0 | |||
@@ -7229,43 +7099,36 @@ vpmullw %ymm13, %ymm3, %ymm3 | |||
vpsubw %ymm3, %ymm6, %ymm6 | |||
vmovdqu 64(%rdi), %ymm8 | |||
vpaddw %ymm8, %ymm11, %ymm8 | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqu %xmm8, 64(%rdi) | |||
vextracti128 $1, %ymm8, %xmm8 | |||
vmovq %xmm8, 80(%rdi) | |||
vmovdqu 416(%rdi), %ymm8 | |||
vpaddw %ymm8, %ymm6, %ymm8 | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqu %xmm8, 416(%rdi) | |||
vextracti128 $1, %ymm8, %xmm8 | |||
vmovq %xmm8, 432(%rdi) | |||
vmovdqu 768(%rdi), %ymm8 | |||
vpaddw %ymm8, %ymm9, %ymm8 | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqu %xmm8, 768(%rdi) | |||
vextracti128 $1, %ymm8, %xmm8 | |||
vmovq %xmm8, 784(%rdi) | |||
vmovdqu 1120(%rdi), %ymm8 | |||
vpaddw %ymm8, %ymm10, %ymm8 | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqu %xmm8, 1120(%rdi) | |||
vextracti128 $1, %ymm8, %xmm8 | |||
vmovq %xmm8, 1136(%rdi) | |||
vmovdqu 118(%rdi), %ymm8 | |||
vpaddw %ymm8, %ymm4, %ymm8 | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqu %xmm8, 118(%rdi) | |||
vextracti128 $1, %ymm8, %xmm8 | |||
vmovq %xmm8, 134(%rdi) | |||
vmovdqu 470(%rdi), %ymm8 | |||
vpaddw %ymm8, %ymm3, %ymm8 | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqu %xmm8, 470(%rdi) | |||
vextracti128 $1, %ymm8, %xmm8 | |||
vmovq %xmm8, 486(%rdi) | |||
vmovdqu 822(%rdi), %ymm8 | |||
vpaddw %ymm8, %ymm5, %ymm8 | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqu %xmm8, 822(%rdi) | |||
vextracti128 $1, %ymm8, %xmm8 | |||
vmovq %xmm8, 838(%rdi) | |||
@@ -7335,43 +7198,36 @@ vpmullw %ymm13, %ymm10, %ymm10 | |||
vpsubw %ymm10, %ymm6, %ymm6 | |||
vmovdqu 152(%rdi), %ymm4 | |||
vpaddw %ymm4, %ymm5, %ymm4 | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqu %xmm4, 152(%rdi) | |||
vextracti128 $1, %ymm4, %xmm4 | |||
vmovq %xmm4, 168(%rdi) | |||
vmovdqu 504(%rdi), %ymm4 | |||
vpaddw %ymm4, %ymm6, %ymm4 | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqu %xmm4, 504(%rdi) | |||
vextracti128 $1, %ymm4, %xmm4 | |||
vmovq %xmm4, 520(%rdi) | |||
vmovdqu 856(%rdi), %ymm4 | |||
vpaddw %ymm4, %ymm7, %ymm4 | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqu %xmm4, 856(%rdi) | |||
vextracti128 $1, %ymm4, %xmm4 | |||
vmovq %xmm4, 872(%rdi) | |||
vmovdqu 1208(%rdi), %ymm4 | |||
vpaddw %ymm4, %ymm8, %ymm4 | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqu %xmm4, 1208(%rdi) | |||
vextracti128 $1, %ymm4, %xmm4 | |||
vmovq %xmm4, 1224(%rdi) | |||
vmovdqu 206(%rdi), %ymm4 | |||
vpaddw %ymm4, %ymm9, %ymm4 | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqu %xmm4, 206(%rdi) | |||
vextracti128 $1, %ymm4, %xmm4 | |||
vmovq %xmm4, 222(%rdi) | |||
vmovdqu 558(%rdi), %ymm4 | |||
vpaddw %ymm4, %ymm10, %ymm4 | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqu %xmm4, 558(%rdi) | |||
vextracti128 $1, %ymm4, %xmm4 | |||
vmovq %xmm4, 574(%rdi) | |||
vmovdqu 910(%rdi), %ymm4 | |||
vpaddw %ymm4, %ymm11, %ymm4 | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqu %xmm4, 910(%rdi) | |||
vextracti128 $1, %ymm4, %xmm4 | |||
vmovq %xmm4, 926(%rdi) | |||
@@ -7441,43 +7297,36 @@ vpmullw %ymm13, %ymm8, %ymm8 | |||
vpsubw %ymm8, %ymm6, %ymm6 | |||
vmovdqu 240(%rdi), %ymm9 | |||
vpaddw %ymm9, %ymm11, %ymm9 | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqu %xmm9, 240(%rdi) | |||
vextracti128 $1, %ymm9, %xmm9 | |||
vmovq %xmm9, 256(%rdi) | |||
vmovdqu 592(%rdi), %ymm9 | |||
vpaddw %ymm9, %ymm6, %ymm9 | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqu %xmm9, 592(%rdi) | |||
vextracti128 $1, %ymm9, %xmm9 | |||
vmovq %xmm9, 608(%rdi) | |||
vmovdqu 944(%rdi), %ymm9 | |||
vpaddw %ymm9, %ymm3, %ymm9 | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqu %xmm9, 944(%rdi) | |||
vextracti128 $1, %ymm9, %xmm9 | |||
vmovq %xmm9, 960(%rdi) | |||
vmovdqu 1296(%rdi), %ymm9 | |||
vpaddw %ymm9, %ymm4, %ymm9 | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqu %xmm9, 1296(%rdi) | |||
vextracti128 $1, %ymm9, %xmm9 | |||
vmovq %xmm9, 1312(%rdi) | |||
vmovdqu 294(%rdi), %ymm9 | |||
vpaddw %ymm9, %ymm7, %ymm9 | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqu %xmm9, 294(%rdi) | |||
vextracti128 $1, %ymm9, %xmm9 | |||
vmovq %xmm9, 310(%rdi) | |||
vmovdqu 646(%rdi), %ymm9 | |||
vpaddw %ymm9, %ymm8, %ymm9 | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqu %xmm9, 646(%rdi) | |||
vextracti128 $1, %ymm9, %xmm9 | |||
vmovq %xmm9, 662(%rdi) | |||
vmovdqu 998(%rdi), %ymm9 | |||
vpaddw %ymm9, %ymm5, %ymm9 | |||
vpand mask_mod2048(%rip), %ymm9, %ymm9 | |||
vmovdqu %xmm9, 998(%rdi) | |||
vextracti128 $1, %ymm9, %xmm9 | |||
vmovq %xmm9, 1014(%rdi) | |||
@@ -7547,43 +7396,36 @@ vpmullw %ymm13, %ymm4, %ymm4 | |||
vpsubw %ymm4, %ymm6, %ymm6 | |||
vmovdqu 328(%rdi), %ymm7 | |||
vpaddw %ymm7, %ymm5, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqu %xmm7, 328(%rdi) | |||
vextracti128 $1, %ymm7, %xmm7 | |||
vmovq %xmm7, 344(%rdi) | |||
vmovdqu 680(%rdi), %ymm7 | |||
vpaddw %ymm7, %ymm6, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqu %xmm7, 680(%rdi) | |||
vextracti128 $1, %ymm7, %xmm7 | |||
vmovq %xmm7, 696(%rdi) | |||
vmovdqu 1032(%rdi), %ymm7 | |||
vpaddw %ymm7, %ymm10, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqu %xmm7, 1032(%rdi) | |||
vextracti128 $1, %ymm7, %xmm7 | |||
vmovq %xmm7, 1048(%rdi) | |||
vmovdqu 30(%rdi), %ymm7 | |||
vpaddw %ymm7, %ymm9, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqu %xmm7, 30(%rdi) | |||
vextracti128 $1, %ymm7, %xmm7 | |||
vmovq %xmm7, 46(%rdi) | |||
vmovdqu 382(%rdi), %ymm7 | |||
vpaddw %ymm7, %ymm3, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqu %xmm7, 382(%rdi) | |||
vextracti128 $1, %ymm7, %xmm7 | |||
vmovq %xmm7, 398(%rdi) | |||
vmovdqu 734(%rdi), %ymm7 | |||
vpaddw %ymm7, %ymm4, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqu %xmm7, 734(%rdi) | |||
vextracti128 $1, %ymm7, %xmm7 | |||
vmovq %xmm7, 750(%rdi) | |||
vmovdqu 1086(%rdi), %ymm7 | |||
vpaddw %ymm7, %ymm11, %ymm7 | |||
vpand mask_mod2048(%rip), %ymm7, %ymm7 | |||
vmovdqu %xmm7, 1086(%rdi) | |||
vextracti128 $1, %ymm7, %xmm7 | |||
vmovq %xmm7, 1102(%rdi) | |||
@@ -7653,43 +7495,36 @@ vpmullw %ymm13, %ymm9, %ymm9 | |||
vpsubw %ymm9, %ymm6, %ymm6 | |||
vmovdqu 416(%rdi), %ymm3 | |||
vpaddw %ymm3, %ymm11, %ymm3 | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqu %xmm3, 416(%rdi) | |||
vextracti128 $1, %ymm3, %xmm3 | |||
vmovq %xmm3, 432(%rdi) | |||
vmovdqu 768(%rdi), %ymm3 | |||
vpaddw %ymm3, %ymm6, %ymm3 | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqu %xmm3, 768(%rdi) | |||
vextracti128 $1, %ymm3, %xmm3 | |||
vmovq %xmm3, 784(%rdi) | |||
vmovdqu 1120(%rdi), %ymm3 | |||
vpaddw %ymm3, %ymm8, %ymm3 | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqu %xmm3, 1120(%rdi) | |||
vextracti128 $1, %ymm3, %xmm3 | |||
vmovq %xmm3, 1136(%rdi) | |||
vmovdqu 118(%rdi), %ymm3 | |||
vpaddw %ymm3, %ymm7, %ymm3 | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqu %xmm3, 118(%rdi) | |||
vextracti128 $1, %ymm3, %xmm3 | |||
vmovq %xmm3, 134(%rdi) | |||
vmovdqu 470(%rdi), %ymm3 | |||
vpaddw %ymm3, %ymm10, %ymm3 | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqu %xmm3, 470(%rdi) | |||
vextracti128 $1, %ymm3, %xmm3 | |||
vmovq %xmm3, 486(%rdi) | |||
vmovdqu 822(%rdi), %ymm3 | |||
vpaddw %ymm3, %ymm9, %ymm3 | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqu %xmm3, 822(%rdi) | |||
vextracti128 $1, %ymm3, %xmm3 | |||
vmovq %xmm3, 838(%rdi) | |||
vmovdqu 1174(%rdi), %ymm3 | |||
vpaddw %ymm3, %ymm5, %ymm3 | |||
vpand mask_mod2048(%rip), %ymm3, %ymm3 | |||
vmovdqu %xmm3, 1174(%rdi) | |||
vextracti128 $1, %ymm3, %xmm3 | |||
vmovq %xmm3, 1190(%rdi) | |||
@@ -7759,43 +7594,36 @@ vpmullw %ymm13, %ymm7, %ymm7 | |||
vpsubw %ymm7, %ymm6, %ymm6 | |||
vmovdqu 504(%rdi), %ymm10 | |||
vpaddw %ymm10, %ymm5, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqu %xmm10, 504(%rdi) | |||
vextracti128 $1, %ymm10, %xmm10 | |||
vmovq %xmm10, 520(%rdi) | |||
vmovdqu 856(%rdi), %ymm10 | |||
vpaddw %ymm10, %ymm6, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqu %xmm10, 856(%rdi) | |||
vextracti128 $1, %ymm10, %xmm10 | |||
vmovq %xmm10, 872(%rdi) | |||
vmovdqu 1208(%rdi), %ymm10 | |||
vpaddw %ymm10, %ymm4, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqu %xmm10, 1208(%rdi) | |||
vextracti128 $1, %ymm10, %xmm10 | |||
vmovq %xmm10, 1224(%rdi) | |||
vmovdqu 206(%rdi), %ymm10 | |||
vpaddw %ymm10, %ymm3, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqu %xmm10, 206(%rdi) | |||
vextracti128 $1, %ymm10, %xmm10 | |||
vmovq %xmm10, 222(%rdi) | |||
vmovdqu 558(%rdi), %ymm10 | |||
vpaddw %ymm10, %ymm8, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqu %xmm10, 558(%rdi) | |||
vextracti128 $1, %ymm10, %xmm10 | |||
vmovq %xmm10, 574(%rdi) | |||
vmovdqu 910(%rdi), %ymm10 | |||
vpaddw %ymm10, %ymm7, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqu %xmm10, 910(%rdi) | |||
vextracti128 $1, %ymm10, %xmm10 | |||
vmovq %xmm10, 926(%rdi) | |||
vmovdqu 1262(%rdi), %ymm10 | |||
vpaddw %ymm10, %ymm11, %ymm10 | |||
vpand mask_mod2048(%rip), %ymm10, %ymm10 | |||
vmovdqu %xmm10, 1262(%rdi) | |||
vextracti128 $1, %ymm10, %xmm10 | |||
vmovq %xmm10, 1278(%rdi) | |||
@@ -7865,43 +7693,36 @@ vpmullw %ymm13, %ymm3, %ymm3 | |||
vpsubw %ymm3, %ymm6, %ymm6 | |||
vmovdqu 592(%rdi), %ymm8 | |||
vpaddw %ymm8, %ymm11, %ymm8 | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqu %xmm8, 592(%rdi) | |||
vextracti128 $1, %ymm8, %xmm8 | |||
vmovq %xmm8, 608(%rdi) | |||
vmovdqu 944(%rdi), %ymm8 | |||
vpaddw %ymm8, %ymm6, %ymm8 | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqu %xmm8, 944(%rdi) | |||
vextracti128 $1, %ymm8, %xmm8 | |||
vmovq %xmm8, 960(%rdi) | |||
vmovdqu 1296(%rdi), %ymm8 | |||
vpaddw %ymm8, %ymm9, %ymm8 | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqu %xmm8, 1296(%rdi) | |||
vextracti128 $1, %ymm8, %xmm8 | |||
vmovq %xmm8, 1312(%rdi) | |||
vmovdqu 294(%rdi), %ymm8 | |||
vpaddw %ymm8, %ymm10, %ymm8 | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqu %xmm8, 294(%rdi) | |||
vextracti128 $1, %ymm8, %xmm8 | |||
vmovq %xmm8, 310(%rdi) | |||
vmovdqu 646(%rdi), %ymm8 | |||
vpaddw %ymm8, %ymm4, %ymm8 | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqu %xmm8, 646(%rdi) | |||
vextracti128 $1, %ymm8, %xmm8 | |||
vmovq %xmm8, 662(%rdi) | |||
vmovdqu 998(%rdi), %ymm8 | |||
vpaddw %ymm8, %ymm3, %ymm8 | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqu %xmm8, 998(%rdi) | |||
vextracti128 $1, %ymm8, %xmm8 | |||
vmovq %xmm8, 1014(%rdi) | |||
vmovdqu 1350(%rdi), %ymm8 | |||
vpaddw %ymm8, %ymm5, %ymm8 | |||
vpand mask_mod2048(%rip), %ymm8, %ymm8 | |||
vmovdqu %xmm8, 1350(%rdi) | |||
vextracti128 $1, %ymm8, %xmm8 | |||
vmovq %xmm8, 1366(%rdi) | |||
@@ -7971,37 +7792,31 @@ vpmullw %ymm13, %ymm10, %ymm10 | |||
vpsubw %ymm10, %ymm6, %ymm6 | |||
vmovdqu 680(%rdi), %ymm4 | |||
vpaddw %ymm4, %ymm5, %ymm4 | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqu %xmm4, 680(%rdi) | |||
vextracti128 $1, %ymm4, %xmm4 | |||
vmovq %xmm4, 696(%rdi) | |||
vmovdqu 1032(%rdi), %ymm4 | |||
vpaddw %ymm4, %ymm6, %ymm4 | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqu %xmm4, 1032(%rdi) | |||
vextracti128 $1, %ymm4, %xmm4 | |||
vmovq %xmm4, 1048(%rdi) | |||
vmovdqu 30(%rdi), %ymm4 | |||
vpaddw %ymm4, %ymm7, %ymm4 | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqu %xmm4, 30(%rdi) | |||
vextracti128 $1, %ymm4, %xmm4 | |||
vmovq %xmm4, 46(%rdi) | |||
vmovdqu 382(%rdi), %ymm4 | |||
vpaddw %ymm4, %ymm8, %ymm4 | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqu %xmm4, 382(%rdi) | |||
vextracti128 $1, %ymm4, %xmm4 | |||
vmovq %xmm4, 398(%rdi) | |||
vmovdqu 734(%rdi), %ymm4 | |||
vpaddw %ymm4, %ymm9, %ymm4 | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqu %xmm4, 734(%rdi) | |||
vextracti128 $1, %ymm4, %xmm4 | |||
vmovq %xmm4, 750(%rdi) | |||
vmovdqu 1086(%rdi), %ymm4 | |||
vpaddw %ymm4, %ymm10, %ymm4 | |||
vpand mask_mod2048(%rip), %ymm4, %ymm4 | |||
vmovdqu %xmm4, 1086(%rdi) | |||
vextracti128 $1, %ymm4, %xmm4 | |||
vmovq %xmm4, 1102(%rdi) | |||
@@ -4,12 +4,9 @@ | |||
#include "params.h" | |||
#include "poly.h" | |||
void PQCLEAN_NTRUHPS2048677_CLEAN_owcpa_samplemsg(unsigned char msg[NTRU_OWCPA_MSGBYTES], | |||
const unsigned char seed[NTRU_SEEDBYTES]); | |||
void PQCLEAN_NTRUHPS2048677_CLEAN_owcpa_keypair(unsigned char *pk, | |||
unsigned char *sk, | |||
const unsigned char seed[NTRU_SEEDBYTES]); | |||
const unsigned char seed[NTRU_SAMPLE_FG_BYTES]); | |||
void PQCLEAN_NTRUHPS2048677_CLEAN_owcpa_enc(unsigned char *c, | |||
const poly *r, | |||
@@ -23,7 +23,15 @@ void PQCLEAN_NTRUHPS2048677_CLEAN_poly_Sq_mul(poly *r, const poly *a, const poly | |||
} | |||
void PQCLEAN_NTRUHPS2048677_CLEAN_poly_S3_mul(poly *r, const poly *a, const poly *b) { | |||
int i; | |||
/* Our S3 multiplications do not overflow mod q, */ | |||
/* so we can re-purpose PQCLEAN_NTRUHPS2048677_CLEAN_poly_Rq_mul, as long as we */ | |||
/* follow with an explicit reduction mod q. */ | |||
PQCLEAN_NTRUHPS2048677_CLEAN_poly_Rq_mul(r, a, b); | |||
for (i = 0; i < NTRU_N; i++) { | |||
r->coeffs[i] = MODQ(r->coeffs[i]); | |||
} | |||
PQCLEAN_NTRUHPS2048677_CLEAN_poly_mod_3_Phi_n(r); | |||
} | |||
@@ -1,15 +1,284 @@ | |||
#include "poly.h" | |||
/* Polynomial multiplication using */ | |||
/* Toom-4 and two layers of Karatsuba. */ | |||
#define L PAD32(NTRU_N) | |||
#define M (L/4) | |||
#define K (L/16) | |||
static void toom4_k2x2_mul(uint16_t ab[2 * L], const uint16_t a[L], const uint16_t b[L]); | |||
static void toom4_k2x2_eval_0(uint16_t r[9 * K], const uint16_t a[M]); | |||
static void toom4_k2x2_eval_p1(uint16_t r[9 * K], const uint16_t a[M]); | |||
static void toom4_k2x2_eval_m1(uint16_t r[9 * K], const uint16_t a[M]); | |||
static void toom4_k2x2_eval_p2(uint16_t r[9 * K], const uint16_t a[M]); | |||
static void toom4_k2x2_eval_m2(uint16_t r[9 * K], const uint16_t a[M]); | |||
static void toom4_k2x2_eval_p3(uint16_t r[9 * K], const uint16_t a[M]); | |||
static void toom4_k2x2_eval_inf(uint16_t r[9 * K], const uint16_t a[M]); | |||
static inline void k2x2_eval(uint16_t r[9 * K]); | |||
static void toom4_k2x2_basemul(uint16_t r[18 * K], const uint16_t a[9 * K], const uint16_t b[9 * K]); | |||
static inline void schoolbook_KxK(uint16_t r[2 * K], const uint16_t a[K], const uint16_t b[K]); | |||
static void toom4_k2x2_interpolate(uint16_t r[2 * M], const uint16_t a[63 * 2 * K]); | |||
static inline void k2x2_interpolate(uint16_t r[M], const uint16_t a[9 * K]); | |||
void PQCLEAN_NTRUHPS2048677_CLEAN_poly_Rq_mul(poly *r, const poly *a, const poly *b) { | |||
int k, i; | |||
size_t i; | |||
uint16_t ab[2 * L]; | |||
for (k = 0; k < NTRU_N; k++) { | |||
r->coeffs[k] = 0; | |||
for (i = 1; i < NTRU_N - k; i++) { | |||
r->coeffs[k] += a->coeffs[k + i] * b->coeffs[NTRU_N - i]; | |||
} | |||
for (i = 0; i < k + 1; i++) { | |||
r->coeffs[k] += a->coeffs[k - i] * b->coeffs[i]; | |||
for (i = 0; i < NTRU_N; i++) { | |||
ab[i] = a->coeffs[i]; | |||
ab[L + i] = b->coeffs[i]; | |||
} | |||
for (i = NTRU_N; i < L; i++) { | |||
ab[i] = 0; | |||
ab[L + i] = 0; | |||
} | |||
toom4_k2x2_mul(ab, ab, ab + L); | |||
for (i = 0; i < NTRU_N; i++) { | |||
r->coeffs[i] = ab[i] + ab[NTRU_N + i]; | |||
} | |||
} | |||
static void toom4_k2x2_mul(uint16_t ab[2 * L], const uint16_t a[L], const uint16_t b[L]) { | |||
uint16_t tmpA[9 * K]; | |||
uint16_t tmpB[9 * K]; | |||
uint16_t eC[63 * 2 * K]; | |||
toom4_k2x2_eval_0(tmpA, a); | |||
toom4_k2x2_eval_0(tmpB, b); | |||
toom4_k2x2_basemul(eC + 0 * 9 * 2 * K, tmpA, tmpB); | |||
toom4_k2x2_eval_p1(tmpA, a); | |||
toom4_k2x2_eval_p1(tmpB, b); | |||
toom4_k2x2_basemul(eC + 1 * 9 * 2 * K, tmpA, tmpB); | |||
toom4_k2x2_eval_m1(tmpA, a); | |||
toom4_k2x2_eval_m1(tmpB, b); | |||
toom4_k2x2_basemul(eC + 2 * 9 * 2 * K, tmpA, tmpB); | |||
toom4_k2x2_eval_p2(tmpA, a); | |||
toom4_k2x2_eval_p2(tmpB, b); | |||
toom4_k2x2_basemul(eC + 3 * 9 * 2 * K, tmpA, tmpB); | |||
toom4_k2x2_eval_m2(tmpA, a); | |||
toom4_k2x2_eval_m2(tmpB, b); | |||
toom4_k2x2_basemul(eC + 4 * 9 * 2 * K, tmpA, tmpB); | |||
toom4_k2x2_eval_p3(tmpA, a); | |||
toom4_k2x2_eval_p3(tmpB, b); | |||
toom4_k2x2_basemul(eC + 5 * 9 * 2 * K, tmpA, tmpB); | |||
toom4_k2x2_eval_inf(tmpA, a); | |||
toom4_k2x2_eval_inf(tmpB, b); | |||
toom4_k2x2_basemul(eC + 6 * 9 * 2 * K, tmpA, tmpB); | |||
toom4_k2x2_interpolate(ab, eC); | |||
} | |||
static void toom4_k2x2_eval_0(uint16_t r[9 * K], const uint16_t a[M]) { | |||
for (size_t i = 0; i < M; i++) { | |||
r[i] = a[i]; | |||
} | |||
k2x2_eval(r); | |||
} | |||
static void toom4_k2x2_eval_p1(uint16_t r[9 * K], const uint16_t a[M]) { | |||
for (size_t i = 0; i < M; i++) { | |||
r[i] = a[0 * M + i]; | |||
r[i] += a[1 * M + i]; | |||
r[i] += a[2 * M + i]; | |||
r[i] += a[3 * M + i]; | |||
} | |||
k2x2_eval(r); | |||
} | |||
static void toom4_k2x2_eval_m1(uint16_t r[9 * K], const uint16_t a[M]) { | |||
for (size_t i = 0; i < M; i++) { | |||
r[i] = a[0 * M + i]; | |||
r[i] -= a[1 * M + i]; | |||
r[i] += a[2 * M + i]; | |||
r[i] -= a[3 * M + i]; | |||
} | |||
k2x2_eval(r); | |||
} | |||
static void toom4_k2x2_eval_p2(uint16_t r[9 * K], const uint16_t a[M]) { | |||
for (size_t i = 0; i < M; i++) { | |||
r[i] = a[0 * M + i]; | |||
r[i] += 2 * a[1 * M + i]; | |||
r[i] += 4 * a[2 * M + i]; | |||
r[i] += 8 * a[3 * M + i]; | |||
} | |||
k2x2_eval(r); | |||
} | |||
static void toom4_k2x2_eval_m2(uint16_t r[9 * K], const uint16_t a[M]) { | |||
for (size_t i = 0; i < M; i++) { | |||
r[i] = a[0 * M + i]; | |||
r[i] -= 2 * a[1 * M + i]; | |||
r[i] += 4 * a[2 * M + i]; | |||
r[i] -= 8 * a[3 * M + i]; | |||
} | |||
k2x2_eval(r); | |||
} | |||
static void toom4_k2x2_eval_p3(uint16_t r[9 * K], const uint16_t a[M]) { | |||
for (size_t i = 0; i < M; i++) { | |||
r[i] = a[0 * M + i]; | |||
r[i] += 3 * a[1 * M + i]; | |||
r[i] += 9 * a[2 * M + i]; | |||
r[i] += 27 * a[3 * M + i]; | |||
} | |||
k2x2_eval(r); | |||
} | |||
static void toom4_k2x2_eval_inf(uint16_t r[9 * K], const uint16_t a[M]) { | |||
for (size_t i = 0; i < M; i++) { | |||
r[i] = a[3 * M + i]; | |||
} | |||
k2x2_eval(r); | |||
} | |||
static inline void k2x2_eval(uint16_t r[9 * K]) { | |||
/* Input: e + f.Y + g.Y^2 + h.Y^3 */ | |||
/* Output: [ e | f | g | h | e+f | f+h | g+e | h+g | e+f+g+h ] */ | |||
size_t i; | |||
for (i = 0; i < 4 * K; i++) { | |||
r[4 * K + i] = r[i]; | |||
} | |||
for (i = 0; i < K; i++) { | |||
r[4 * K + i] += r[1 * K + i]; | |||
r[5 * K + i] += r[3 * K + i]; | |||
r[6 * K + i] += r[0 * K + i]; | |||
r[7 * K + i] += r[2 * K + i]; | |||
r[8 * K + i] = r[5 * K + i]; | |||
r[8 * K + i] += r[6 * K + i]; | |||
} | |||
} | |||
static void toom4_k2x2_basemul(uint16_t r[18 * K], const uint16_t a[9 * K], const uint16_t b[9 * K]) { | |||
schoolbook_KxK(r + 0 * 2 * K, a + 0 * K, b + 0 * K); | |||
schoolbook_KxK(r + 1 * 2 * K, a + 1 * K, b + 1 * K); | |||
schoolbook_KxK(r + 2 * 2 * K, a + 2 * K, b + 2 * K); | |||
schoolbook_KxK(r + 3 * 2 * K, a + 3 * K, b + 3 * K); | |||
schoolbook_KxK(r + 4 * 2 * K, a + 4 * K, b + 4 * K); | |||
schoolbook_KxK(r + 5 * 2 * K, a + 5 * K, b + 5 * K); | |||
schoolbook_KxK(r + 6 * 2 * K, a + 6 * K, b + 6 * K); | |||
schoolbook_KxK(r + 7 * 2 * K, a + 7 * K, b + 7 * K); | |||
schoolbook_KxK(r + 8 * 2 * K, a + 8 * K, b + 8 * K); | |||
} | |||
static inline void schoolbook_KxK(uint16_t r[2 * K], const uint16_t a[K], const uint16_t b[K]) { | |||
size_t i, j; | |||
for (j = 0; j < K; j++) { | |||
r[j] = a[0] * b[j]; | |||
} | |||
for (i = 1; i < K; i++) { | |||
for (j = 0; j < K - 1; j++) { | |||
r[i + j] += a[i] * b[j]; | |||
} | |||
r[i + K - 1] = a[i] * b[K - 1]; | |||
} | |||
r[2 * K - 1] = 0; | |||
} | |||
static void toom4_k2x2_interpolate(uint16_t r[2 * M], const uint16_t a[7 * 18 * K]) { | |||
size_t i; | |||
uint16_t P1[2 * M]; | |||
uint16_t Pm1[2 * M]; | |||
uint16_t P2[2 * M]; | |||
uint16_t Pm2[2 * M]; | |||
uint16_t *C0 = r; | |||
uint16_t *C2 = r + 2 * M; | |||
uint16_t *C4 = r + 4 * M; | |||
uint16_t *C6 = r + 6 * M; | |||
uint16_t V0, V1, V2; | |||
k2x2_interpolate(C0, a + 0 * 9 * 2 * K); | |||
k2x2_interpolate(P1, a + 1 * 9 * 2 * K); | |||
k2x2_interpolate(Pm1, a + 2 * 9 * 2 * K); | |||
k2x2_interpolate(P2, a + 3 * 9 * 2 * K); | |||
k2x2_interpolate(Pm2, a + 4 * 9 * 2 * K); | |||
k2x2_interpolate(C6, a + 6 * 9 * 2 * K); | |||
for (i = 0; i < 2 * M; i++) { | |||
V0 = ((uint32_t)(P1[i] + Pm1[i])) >> 1; | |||
V0 = V0 - C0[i] - C6[i]; | |||
V1 = ((uint32_t)(P2[i] + Pm2[i] - 2 * C0[i] - 128 * C6[i])) >> 3; | |||
C4[i] = 43691 * (V1 - V0); | |||
C2[i] = V0 - C4[i]; | |||
P1[i] = ((uint32_t)(P1[i] - Pm1[i])) >> 1; | |||
} | |||
/* reuse Pm1 for P3 */ | |||
#define P3 Pm1 | |||
k2x2_interpolate(P3, a + 5 * 9 * 2 * K); | |||
for (i = 0; i < 2 * M; i++) { | |||
V0 = P1[i]; | |||
V1 = 43691 * ((((uint32_t)(P2[i] - Pm2[i])) >> 2) - V0); | |||
V2 = 43691 * (P3[i] - C0[i] - 9 * (C2[i] + 9 * (C4[i] + 9 * C6[i]))); | |||
V2 = ((uint32_t)(V2 - V0)) >> 3; | |||
V2 -= V1; | |||
P3[i] = 52429 * V2; | |||
P2[i] = V1 - V2; | |||
P1[i] = V0 - P2[i] - P3[i]; | |||
} | |||
for (i = 0; i < 2 * M; i++) { | |||
r[1 * M + i] += P1[i]; | |||
r[3 * M + i] += P2[i]; | |||
r[5 * M + i] += P3[i]; | |||
} | |||
} | |||
static inline void k2x2_interpolate(uint16_t r[M], const uint16_t a[9 * K]) { | |||
size_t i; | |||
uint16_t tmp[4 * K]; | |||
for (i = 0; i < 2 * K; i++) { | |||
r[0 * K + i] = a[0 * K + i]; | |||
r[2 * K + i] = a[2 * K + i]; | |||
} | |||
for (i = 0; i < 2 * K; i++) { | |||
r[1 * K + i] += a[8 * K + i] - a[0 * K + i] - a[2 * K + i]; | |||
} | |||
for (i = 0; i < 2 * K; i++) { | |||
r[4 * K + i] = a[4 * K + i]; | |||
r[6 * K + i] = a[6 * K + i]; | |||
} | |||
for (i = 0; i < 2 * K; i++) { | |||
r[5 * K + i] += a[14 * K + i] - a[4 * K + i] - a[6 * K + i]; | |||
} | |||
for (i = 0; i < 2 * K; i++) { | |||
tmp[0 * K + i] = a[12 * K + i]; | |||
tmp[2 * K + i] = a[10 * K + i]; | |||
} | |||
for (i = 0; i < 2 * K; i++) { | |||
tmp[K + i] += a[16 * K + i] - a[12 * K + i] - a[10 * K + i]; | |||
} | |||
for (i = 0; i < 4 * K; i++) { | |||
tmp[0 * K + i] = tmp[0 * K + i] - r[0 * K + i] - r[4 * K + i]; | |||
} | |||
for (i = 0; i < 4 * K; i++) { | |||
r[2 * K + i] += tmp[0 * K + i]; | |||
} | |||
} | |||
@@ -23,9 +23,9 @@ auxiliary-submitters: | |||
- Zhenfei Zhang | |||
implementations: | |||
- name: clean | |||
version: https://github.com/jschanck/ntru/tree/6d1f44f5 reference implementation | |||
version: https://github.com/jschanck/ntru/tree/60cc7277 reference implementation | |||
- name: avx2 | |||
version: https://github.com/jschanck/ntru/tree/6d1f44f5 avx2 implementation | |||
version: https://github.com/jschanck/ntru/tree/60cc7277 avx2 implementation | |||
supported_platforms: | |||
- architecture: x86_64 | |||
operating_systems: | |||
@@ -4,12 +4,9 @@ | |||
#include "params.h" | |||
#include "poly.h" | |||
void PQCLEAN_NTRUHPS4096821_AVX2_owcpa_samplemsg(unsigned char msg[NTRU_OWCPA_MSGBYTES], | |||
const unsigned char seed[NTRU_SEEDBYTES]); | |||
void PQCLEAN_NTRUHPS4096821_AVX2_owcpa_keypair(unsigned char *pk, | |||
unsigned char *sk, | |||
const unsigned char seed[NTRU_SEEDBYTES]); | |||
const unsigned char seed[NTRU_SAMPLE_FG_BYTES]); | |||
void PQCLEAN_NTRUHPS4096821_AVX2_owcpa_enc(unsigned char *c, | |||
const poly *r, | |||
@@ -23,7 +23,15 @@ void PQCLEAN_NTRUHPS4096821_AVX2_poly_Sq_mul(poly *r, const poly *a, const poly | |||
} | |||
void PQCLEAN_NTRUHPS4096821_AVX2_poly_S3_mul(poly *r, const poly *a, const poly *b) { | |||
int i; | |||
/* Our S3 multiplications do not overflow mod q, */ | |||
/* so we can re-purpose PQCLEAN_NTRUHPS4096821_AVX2_poly_Rq_mul, as long as we */ | |||
/* follow with an explicit reduction mod q. */ | |||
PQCLEAN_NTRUHPS4096821_AVX2_poly_Rq_mul(r, a, b); | |||
for (i = 0; i < NTRU_N; i++) { | |||
r->coeffs[i] = MODQ(r->coeffs[i]); | |||
} | |||
PQCLEAN_NTRUHPS4096821_AVX2_poly_mod_3_Phi_n(r); | |||
} | |||
@@ -4,12 +4,9 @@ | |||
#include "params.h" | |||
#include "poly.h" | |||
void PQCLEAN_NTRUHPS4096821_CLEAN_owcpa_samplemsg(unsigned char msg[NTRU_OWCPA_MSGBYTES], | |||
const unsigned char seed[NTRU_SEEDBYTES]); | |||
void PQCLEAN_NTRUHPS4096821_CLEAN_owcpa_keypair(unsigned char *pk, | |||
unsigned char *sk, | |||
const unsigned char seed[NTRU_SEEDBYTES]); | |||
const unsigned char seed[NTRU_SAMPLE_FG_BYTES]); | |||
void PQCLEAN_NTRUHPS4096821_CLEAN_owcpa_enc(unsigned char *c, | |||
const poly *r, | |||
@@ -23,7 +23,15 @@ void PQCLEAN_NTRUHPS4096821_CLEAN_poly_Sq_mul(poly *r, const poly *a, const poly | |||
} | |||
void PQCLEAN_NTRUHPS4096821_CLEAN_poly_S3_mul(poly *r, const poly *a, const poly *b) { | |||
int i; | |||
/* Our S3 multiplications do not overflow mod q, */ | |||
/* so we can re-purpose PQCLEAN_NTRUHPS4096821_CLEAN_poly_Rq_mul, as long as we */ | |||
/* follow with an explicit reduction mod q. */ | |||
PQCLEAN_NTRUHPS4096821_CLEAN_poly_Rq_mul(r, a, b); | |||
for (i = 0; i < NTRU_N; i++) { | |||
r->coeffs[i] = MODQ(r->coeffs[i]); | |||
} | |||
PQCLEAN_NTRUHPS4096821_CLEAN_poly_mod_3_Phi_n(r); | |||
} | |||
@@ -1,15 +1,284 @@ | |||
#include "poly.h" | |||
/* Polynomial multiplication using */ | |||
/* Toom-4 and two layers of Karatsuba. */ | |||
#define L PAD32(NTRU_N) | |||
#define M (L/4) | |||
#define K (L/16) | |||
static void toom4_k2x2_mul(uint16_t ab[2 * L], const uint16_t a[L], const uint16_t b[L]); | |||
static void toom4_k2x2_eval_0(uint16_t r[9 * K], const uint16_t a[M]); | |||
static void toom4_k2x2_eval_p1(uint16_t r[9 * K], const uint16_t a[M]); | |||
static void toom4_k2x2_eval_m1(uint16_t r[9 * K], const uint16_t a[M]); | |||
static void toom4_k2x2_eval_p2(uint16_t r[9 * K], const uint16_t a[M]); | |||
static void toom4_k2x2_eval_m2(uint16_t r[9 * K], const uint16_t a[M]); | |||
static void toom4_k2x2_eval_p3(uint16_t r[9 * K], const uint16_t a[M]); | |||
static void toom4_k2x2_eval_inf(uint16_t r[9 * K], const uint16_t a[M]); | |||
static inline void k2x2_eval(uint16_t r[9 * K]); | |||
static void toom4_k2x2_basemul(uint16_t r[18 * K], const uint16_t a[9 * K], const uint16_t b[9 * K]); | |||
static inline void schoolbook_KxK(uint16_t r[2 * K], const uint16_t a[K], const uint16_t b[K]); | |||
static void toom4_k2x2_interpolate(uint16_t r[2 * M], const uint16_t a[63 * 2 * K]); | |||
static inline void k2x2_interpolate(uint16_t r[M], const uint16_t a[9 * K]); | |||
void PQCLEAN_NTRUHPS4096821_CLEAN_poly_Rq_mul(poly *r, const poly *a, const poly *b) { | |||
int k, i; | |||
size_t i; | |||
uint16_t ab[2 * L]; | |||
for (k = 0; k < NTRU_N; k++) { | |||
r->coeffs[k] = 0; | |||
for (i = 1; i < NTRU_N - k; i++) { | |||
r->coeffs[k] += a->coeffs[k + i] * b->coeffs[NTRU_N - i]; | |||
} | |||
for (i = 0; i < k + 1; i++) { | |||
r->coeffs[k] += a->coeffs[k - i] * b->coeffs[i]; | |||
for (i = 0; i < NTRU_N; i++) { | |||
ab[i] = a->coeffs[i]; | |||
ab[L + i] = b->coeffs[i]; | |||
} | |||
for (i = NTRU_N; i < L; i++) { | |||
ab[i] = 0; | |||
ab[L + i] = 0; | |||
} | |||
toom4_k2x2_mul(ab, ab, ab + L); | |||
for (i = 0; i < NTRU_N; i++) { | |||
r->coeffs[i] = ab[i] + ab[NTRU_N + i]; | |||
} | |||
} | |||
static void toom4_k2x2_mul(uint16_t ab[2 * L], const uint16_t a[L], const uint16_t b[L]) { | |||
uint16_t tmpA[9 * K]; | |||
uint16_t tmpB[9 * K]; | |||
uint16_t eC[63 * 2 * K]; | |||
toom4_k2x2_eval_0(tmpA, a); | |||
toom4_k2x2_eval_0(tmpB, b); | |||
toom4_k2x2_basemul(eC + 0 * 9 * 2 * K, tmpA, tmpB); | |||
toom4_k2x2_eval_p1(tmpA, a); | |||
toom4_k2x2_eval_p1(tmpB, b); | |||
toom4_k2x2_basemul(eC + 1 * 9 * 2 * K, tmpA, tmpB); | |||
toom4_k2x2_eval_m1(tmpA, a); | |||
toom4_k2x2_eval_m1(tmpB, b); | |||
toom4_k2x2_basemul(eC + 2 * 9 * 2 * K, tmpA, tmpB); | |||
toom4_k2x2_eval_p2(tmpA, a); | |||
toom4_k2x2_eval_p2(tmpB, b); | |||
toom4_k2x2_basemul(eC + 3 * 9 * 2 * K, tmpA, tmpB); | |||
toom4_k2x2_eval_m2(tmpA, a); | |||
toom4_k2x2_eval_m2(tmpB, b); | |||
toom4_k2x2_basemul(eC + 4 * 9 * 2 * K, tmpA, tmpB); | |||
toom4_k2x2_eval_p3(tmpA, a); | |||
toom4_k2x2_eval_p3(tmpB, b); | |||
toom4_k2x2_basemul(eC + 5 * 9 * 2 * K, tmpA, tmpB); | |||
toom4_k2x2_eval_inf(tmpA, a); | |||
toom4_k2x2_eval_inf(tmpB, b); | |||
toom4_k2x2_basemul(eC + 6 * 9 * 2 * K, tmpA, tmpB); | |||
toom4_k2x2_interpolate(ab, eC); | |||
} | |||
static void toom4_k2x2_eval_0(uint16_t r[9 * K], const uint16_t a[M]) { | |||
for (size_t i = 0; i < M; i++) { | |||
r[i] = a[i]; | |||
} | |||
k2x2_eval(r); | |||
} | |||
static void toom4_k2x2_eval_p1(uint16_t r[9 * K], const uint16_t a[M]) { | |||
for (size_t i = 0; i < M; i++) { | |||
r[i] = a[0 * M + i]; | |||
r[i] += a[1 * M + i]; | |||
r[i] += a[2 * M + i]; | |||
r[i] += a[3 * M + i]; | |||
} | |||
k2x2_eval(r); | |||
} | |||
static void toom4_k2x2_eval_m1(uint16_t r[9 * K], const uint16_t a[M]) { | |||
for (size_t i = 0; i < M; i++) { | |||
r[i] = a[0 * M + i]; | |||
r[i] -= a[1 * M + i]; | |||
r[i] += a[2 * M + i]; | |||
r[i] -= a[3 * M + i]; | |||
} | |||
k2x2_eval(r); | |||
} | |||
static void toom4_k2x2_eval_p2(uint16_t r[9 * K], const uint16_t a[M]) { | |||
for (size_t i = 0; i < M; i++) { | |||
r[i] = a[0 * M + i]; | |||
r[i] += 2 * a[1 * M + i]; | |||
r[i] += 4 * a[2 * M + i]; | |||
r[i] += 8 * a[3 * M + i]; | |||
} | |||
k2x2_eval(r); | |||
} | |||
static void toom4_k2x2_eval_m2(uint16_t r[9 * K], const uint16_t a[M]) { | |||
for (size_t i = 0; i < M; i++) { | |||
r[i] = a[0 * M + i]; | |||
r[i] -= 2 * a[1 * M + i]; | |||
r[i] += 4 * a[2 * M + i]; | |||
r[i] -= 8 * a[3 * M + i]; | |||
} | |||
k2x2_eval(r); | |||
} | |||
static void toom4_k2x2_eval_p3(uint16_t r[9 * K], const uint16_t a[M]) { | |||
for (size_t i = 0; i < M; i++) { | |||
r[i] = a[0 * M + i]; | |||
r[i] += 3 * a[1 * M + i]; | |||
r[i] += 9 * a[2 * M + i]; | |||
r[i] += 27 * a[3 * M + i]; | |||
} | |||
k2x2_eval(r); | |||
} | |||
static void toom4_k2x2_eval_inf(uint16_t r[9 * K], const uint16_t a[M]) { | |||
for (size_t i = 0; i < M; i++) { | |||
r[i] = a[3 * M + i]; | |||
} | |||
k2x2_eval(r); | |||
} | |||
static inline void k2x2_eval(uint16_t r[9 * K]) { | |||
/* Input: e + f.Y + g.Y^2 + h.Y^3 */ | |||
/* Output: [ e | f | g | h | e+f | f+h | g+e | h+g | e+f+g+h ] */ | |||
size_t i; | |||
for (i = 0; i < 4 * K; i++) { | |||
r[4 * K + i] = r[i]; | |||
} | |||
for (i = 0; i < K; i++) { | |||
r[4 * K + i] += r[1 * K + i]; | |||
r[5 * K + i] += r[3 * K + i]; | |||
r[6 * K + i] += r[0 * K + i]; | |||
r[7 * K + i] += r[2 * K + i]; | |||
r[8 * K + i] = r[5 * K + i]; | |||
r[8 * K + i] += r[6 * K + i]; | |||
} | |||
} | |||
static void toom4_k2x2_basemul(uint16_t r[18 * K], const uint16_t a[9 * K], const uint16_t b[9 * K]) { | |||
schoolbook_KxK(r + 0 * 2 * K, a + 0 * K, b + 0 * K); | |||
schoolbook_KxK(r + 1 * 2 * K, a + 1 * K, b + 1 * K); | |||
schoolbook_KxK(r + 2 * 2 * K, a + 2 * K, b + 2 * K); | |||
schoolbook_KxK(r + 3 * 2 * K, a + 3 * K, b + 3 * K); | |||
schoolbook_KxK(r + 4 * 2 * K, a + 4 * K, b + 4 * K); | |||
schoolbook_KxK(r + 5 * 2 * K, a + 5 * K, b + 5 * K); | |||
schoolbook_KxK(r + 6 * 2 * K, a + 6 * K, b + 6 * K); | |||
schoolbook_KxK(r + 7 * 2 * K, a + 7 * K, b + 7 * K); | |||
schoolbook_KxK(r + 8 * 2 * K, a + 8 * K, b + 8 * K); | |||
} | |||
static inline void schoolbook_KxK(uint16_t r[2 * K], const uint16_t a[K], const uint16_t b[K]) { | |||
size_t i, j; | |||
for (j = 0; j < K; j++) { | |||
r[j] = a[0] * b[j]; | |||
} | |||
for (i = 1; i < K; i++) { | |||
for (j = 0; j < K - 1; j++) { | |||
r[i + j] += a[i] * b[j]; | |||
} | |||
r[i + K - 1] = a[i] * b[K - 1]; | |||
} | |||
r[2 * K - 1] = 0; | |||
} | |||
static void toom4_k2x2_interpolate(uint16_t r[2 * M], const uint16_t a[7 * 18 * K]) { | |||
size_t i; | |||
uint16_t P1[2 * M]; | |||
uint16_t Pm1[2 * M]; | |||
uint16_t P2[2 * M]; | |||
uint16_t Pm2[2 * M]; | |||
uint16_t *C0 = r; | |||
uint16_t *C2 = r + 2 * M; | |||
uint16_t *C4 = r + 4 * M; | |||
uint16_t *C6 = r + 6 * M; | |||
uint16_t V0, V1, V2; | |||
k2x2_interpolate(C0, a + 0 * 9 * 2 * K); | |||
k2x2_interpolate(P1, a + 1 * 9 * 2 * K); | |||
k2x2_interpolate(Pm1, a + 2 * 9 * 2 * K); | |||
k2x2_interpolate(P2, a + 3 * 9 * 2 * K); | |||
k2x2_interpolate(Pm2, a + 4 * 9 * 2 * K); | |||
k2x2_interpolate(C6, a + 6 * 9 * 2 * K); | |||
for (i = 0; i < 2 * M; i++) { | |||
V0 = ((uint32_t)(P1[i] + Pm1[i])) >> 1; | |||
V0 = V0 - C0[i] - C6[i]; | |||
V1 = ((uint32_t)(P2[i] + Pm2[i] - 2 * C0[i] - 128 * C6[i])) >> 3; | |||
C4[i] = 43691 * (V1 - V0); | |||
C2[i] = V0 - C4[i]; | |||
P1[i] = ((uint32_t)(P1[i] - Pm1[i])) >> 1; | |||
} | |||
/* reuse Pm1 for P3 */ | |||
#define P3 Pm1 | |||
k2x2_interpolate(P3, a + 5 * 9 * 2 * K); | |||
for (i = 0; i < 2 * M; i++) { | |||
V0 = P1[i]; | |||
V1 = 43691 * ((((uint32_t)(P2[i] - Pm2[i])) >> 2) - V0); | |||
V2 = 43691 * (P3[i] - C0[i] - 9 * (C2[i] + 9 * (C4[i] + 9 * C6[i]))); | |||
V2 = ((uint32_t)(V2 - V0)) >> 3; | |||
V2 -= V1; | |||
P3[i] = 52429 * V2; | |||
P2[i] = V1 - V2; | |||
P1[i] = V0 - P2[i] - P3[i]; | |||
} | |||
for (i = 0; i < 2 * M; i++) { | |||
r[1 * M + i] += P1[i]; | |||
r[3 * M + i] += P2[i]; | |||
r[5 * M + i] += P3[i]; | |||
} | |||
} | |||
static inline void k2x2_interpolate(uint16_t r[M], const uint16_t a[9 * K]) { | |||
size_t i; | |||
uint16_t tmp[4 * K]; | |||
for (i = 0; i < 2 * K; i++) { | |||
r[0 * K + i] = a[0 * K + i]; | |||
r[2 * K + i] = a[2 * K + i]; | |||
} | |||
for (i = 0; i < 2 * K; i++) { | |||
r[1 * K + i] += a[8 * K + i] - a[0 * K + i] - a[2 * K + i]; | |||
} | |||
for (i = 0; i < 2 * K; i++) { | |||
r[4 * K + i] = a[4 * K + i]; | |||
r[6 * K + i] = a[6 * K + i]; | |||
} | |||
for (i = 0; i < 2 * K; i++) { | |||
r[5 * K + i] += a[14 * K + i] - a[4 * K + i] - a[6 * K + i]; | |||
} | |||
for (i = 0; i < 2 * K; i++) { | |||
tmp[0 * K + i] = a[12 * K + i]; | |||
tmp[2 * K + i] = a[10 * K + i]; | |||
} | |||
for (i = 0; i < 2 * K; i++) { | |||
tmp[K + i] += a[16 * K + i] - a[12 * K + i] - a[10 * K + i]; | |||
} | |||
for (i = 0; i < 4 * K; i++) { | |||
tmp[0 * K + i] = tmp[0 * K + i] - r[0 * K + i] - r[4 * K + i]; | |||
} | |||
for (i = 0; i < 4 * K; i++) { | |||
r[2 * K + i] += tmp[0 * K + i]; | |||
} | |||
} | |||
@@ -23,9 +23,9 @@ auxiliary-submitters: | |||
- Zhenfei Zhang | |||
implementations: | |||
- name: clean | |||
version: https://github.com/jschanck/ntru/tree/6d1f44f5 reference implementation | |||
version: https://github.com/jschanck/ntru/tree/60cc7277 reference implementation | |||
- name: avx2 | |||
version: https://github.com/jschanck/ntru/tree/6d1f44f5 avx2 implementation | |||
version: https://github.com/jschanck/ntru/tree/60cc7277 avx2 implementation | |||
supported_platforms: | |||
- architecture: x86_64 | |||
operating_systems: | |||
@@ -4,12 +4,9 @@ | |||
#include "params.h" | |||
#include "poly.h" | |||
void PQCLEAN_NTRUHRSS701_AVX2_owcpa_samplemsg(unsigned char msg[NTRU_OWCPA_MSGBYTES], | |||
const unsigned char seed[NTRU_SEEDBYTES]); | |||
void PQCLEAN_NTRUHRSS701_AVX2_owcpa_keypair(unsigned char *pk, | |||
unsigned char *sk, | |||
const unsigned char seed[NTRU_SEEDBYTES]); | |||
const unsigned char seed[NTRU_SAMPLE_FG_BYTES]); | |||
void PQCLEAN_NTRUHRSS701_AVX2_owcpa_enc(unsigned char *c, | |||
const poly *r, | |||
@@ -23,7 +23,15 @@ void PQCLEAN_NTRUHRSS701_AVX2_poly_Sq_mul(poly *r, const poly *a, const poly *b) | |||
} | |||
void PQCLEAN_NTRUHRSS701_AVX2_poly_S3_mul(poly *r, const poly *a, const poly *b) { | |||
int i; | |||
/* Our S3 multiplications do not overflow mod q, */ | |||
/* so we can re-purpose PQCLEAN_NTRUHRSS701_AVX2_poly_Rq_mul, as long as we */ | |||
/* follow with an explicit reduction mod q. */ | |||
PQCLEAN_NTRUHRSS701_AVX2_poly_Rq_mul(r, a, b); | |||
for (i = 0; i < NTRU_N; i++) { | |||
r->coeffs[i] = MODQ(r->coeffs[i]); | |||
} | |||
PQCLEAN_NTRUHRSS701_AVX2_poly_mod_3_Phi_n(r); | |||
} | |||
@@ -237,23 +237,6 @@ shuf_128_to_64: | |||
.byte 255 | |||
.byte 255 | |||
.byte 255 | |||
const_1s: | |||
.word 1 | |||
.word 1 | |||
.word 1 | |||
.word 1 | |||
.word 1 | |||
.word 1 | |||
.word 1 | |||
.word 1 | |||
.word 1 | |||
.word 1 | |||
.word 1 | |||
.word 1 | |||
.word 1 | |||
.word 1 | |||
.word 1 | |||
.word 1 | |||
const_modq: | |||
.word 8191 | |||
.word 8191 | |||
@@ -288,57 +271,23 @@ mask_n: | |||
.word 0 | |||
.word 0 | |||
.word 0 | |||
mask_mod8192: | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
mask_mod8192_omit_lowest: | |||
.word 0 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
mask_mod8192_only_lowest: | |||
.word 8191 | |||
.word 0 | |||
.word 0 | |||
.word 0 | |||
.word 0 | |||
.word 0 | |||
.word 0 | |||
.word 0 | |||
.word 0 | |||
.word 0 | |||
.word 0 | |||
.word 0 | |||
.word 0 | |||
.word 0 | |||
.word 0 | |||
mask_omit_lowest: | |||
.word 0 | |||
.word 0xFFFF | |||
.word 0xFFFF | |||
.word 0xFFFF | |||
.word 0xFFFF | |||
.word 0xFFFF | |||
.word 0xFFFF | |||
.word 0xFFFF | |||
.word 0xFFFF | |||
.word 0xFFFF | |||
.word 0xFFFF | |||
.word 0xFFFF | |||
.word 0xFFFF | |||
.word 0xFFFF | |||
.word 0xFFFF | |||
.word 0xFFFF | |||
shuf_5_to_0_zerorest: | |||
.byte 10 | |||
.byte 11 | |||
@@ -2161,7 +2110,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 0(%rsp) | |||
vpaddw 32(%rsp), %ymm1, %ymm2 | |||
@@ -2185,7 +2133,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 32(%rsp) | |||
vpaddw 64(%rsp), %ymm1, %ymm2 | |||
@@ -2209,7 +2156,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 64(%rsp) | |||
vpaddw 96(%rsp), %ymm1, %ymm2 | |||
@@ -2233,7 +2179,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 96(%rsp) | |||
vpaddw 128(%rsp), %ymm1, %ymm2 | |||
@@ -2257,7 +2202,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 128(%rsp) | |||
vpaddw 160(%rsp), %ymm1, %ymm2 | |||
@@ -2281,7 +2225,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 160(%rsp) | |||
vpaddw 192(%rsp), %ymm1, %ymm2 | |||
@@ -2305,7 +2248,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 192(%rsp) | |||
vpaddw 224(%rsp), %ymm1, %ymm2 | |||
@@ -2329,7 +2271,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 224(%rsp) | |||
vpaddw 256(%rsp), %ymm1, %ymm2 | |||
@@ -2353,7 +2294,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 256(%rsp) | |||
vpaddw 288(%rsp), %ymm1, %ymm2 | |||
@@ -2377,7 +2317,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 288(%rsp) | |||
vpaddw 320(%rsp), %ymm1, %ymm2 | |||
@@ -2401,7 +2340,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 320(%rsp) | |||
vpaddw 352(%rsp), %ymm1, %ymm2 | |||
@@ -2425,7 +2363,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 352(%rsp) | |||
vpaddw 384(%rsp), %ymm1, %ymm2 | |||
@@ -2449,7 +2386,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 384(%rsp) | |||
vpaddw 416(%rsp), %ymm1, %ymm2 | |||
@@ -2473,7 +2409,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 416(%rsp) | |||
vpaddw 448(%rsp), %ymm1, %ymm2 | |||
@@ -2497,7 +2432,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 448(%rsp) | |||
vpaddw 480(%rsp), %ymm1, %ymm2 | |||
@@ -2521,7 +2455,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 480(%rsp) | |||
vpaddw 512(%rsp), %ymm1, %ymm2 | |||
@@ -2545,7 +2478,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 512(%rsp) | |||
vpaddw 544(%rsp), %ymm1, %ymm2 | |||
@@ -2569,7 +2501,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 544(%rsp) | |||
vpaddw 576(%rsp), %ymm1, %ymm2 | |||
@@ -2593,7 +2524,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 576(%rsp) | |||
vpaddw 608(%rsp), %ymm1, %ymm2 | |||
@@ -2617,7 +2547,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 608(%rsp) | |||
vpaddw 640(%rsp), %ymm1, %ymm2 | |||
@@ -2641,7 +2570,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 640(%rsp) | |||
vpaddw 672(%rsp), %ymm1, %ymm2 | |||
@@ -2665,7 +2593,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 672(%rsp) | |||
vpaddw 704(%rsp), %ymm1, %ymm2 | |||
@@ -2689,7 +2616,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 704(%rsp) | |||
vpaddw 736(%rsp), %ymm1, %ymm2 | |||
@@ -2713,7 +2639,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 736(%rsp) | |||
vpaddw 768(%rsp), %ymm1, %ymm2 | |||
@@ -2737,7 +2662,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 768(%rsp) | |||
vpaddw 800(%rsp), %ymm1, %ymm2 | |||
@@ -2761,7 +2685,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 800(%rsp) | |||
vpaddw 832(%rsp), %ymm1, %ymm2 | |||
@@ -2785,7 +2708,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 832(%rsp) | |||
vpaddw 864(%rsp), %ymm1, %ymm2 | |||
@@ -2809,7 +2731,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 864(%rsp) | |||
vpaddw 896(%rsp), %ymm1, %ymm2 | |||
@@ -2833,7 +2754,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 896(%rsp) | |||
vpaddw 928(%rsp), %ymm1, %ymm2 | |||
@@ -2857,7 +2777,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 928(%rsp) | |||
vpaddw 960(%rsp), %ymm1, %ymm2 | |||
@@ -2881,7 +2800,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 960(%rsp) | |||
vpaddw 992(%rsp), %ymm1, %ymm2 | |||
@@ -2905,7 +2823,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 992(%rsp) | |||
vpaddw 1024(%rsp), %ymm1, %ymm2 | |||
@@ -2929,7 +2846,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 1024(%rsp) | |||
vpaddw 1056(%rsp), %ymm1, %ymm2 | |||
@@ -2953,7 +2869,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 1056(%rsp) | |||
vpaddw 1088(%rsp), %ymm1, %ymm2 | |||
@@ -2977,7 +2892,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 1088(%rsp) | |||
vpaddw 1120(%rsp), %ymm1, %ymm2 | |||
@@ -3001,7 +2915,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 1120(%rsp) | |||
vpaddw 1152(%rsp), %ymm1, %ymm2 | |||
@@ -3025,7 +2938,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 1152(%rsp) | |||
vpaddw 1184(%rsp), %ymm1, %ymm2 | |||
@@ -3049,7 +2961,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 1184(%rsp) | |||
vpaddw 1216(%rsp), %ymm1, %ymm2 | |||
@@ -3073,7 +2984,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 1216(%rsp) | |||
vpaddw 1248(%rsp), %ymm1, %ymm2 | |||
@@ -3097,7 +3007,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 1248(%rsp) | |||
vpaddw 1280(%rsp), %ymm1, %ymm2 | |||
@@ -3121,7 +3030,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 1280(%rsp) | |||
vpaddw 1312(%rsp), %ymm1, %ymm2 | |||
@@ -3145,7 +3053,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 1312(%rsp) | |||
vpaddw 1344(%rsp), %ymm1, %ymm2 | |||
@@ -3169,7 +3076,6 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 1344(%rsp) | |||
vpaddw 1376(%rsp), %ymm1, %ymm2 | |||
@@ -3193,184 +3099,140 @@ vpxor %ymm14, %ymm2, %ymm3 | |||
vpsrlq $1, %ymm3, %ymm2 | |||
vpsubw %ymm2, %ymm0, %ymm2 | |||
vpand const_modq(%rip), %ymm2, %ymm2 | |||
vpand const_1s(%rip), %ymm3, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm3 | |||
vmovdqa %ymm3, 1376(%rsp) | |||
vmovdqu 1374(%rsp), %ymm0 | |||
vpsubw 1376(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 1376(%rdi) | |||
vextracti128 $1, %ymm0, %xmm4 | |||
vpshufb shuf_5_to_0_zerorest(%rip), %ymm4, %ymm4 | |||
vpsubw 0(%rsp), %ymm4, %ymm4 | |||
vpand mask_mod8192_only_lowest(%rip), %ymm4, %ymm4 | |||
vpand coeff_0(%rip), %ymm4, %ymm4 | |||
vmovdqu 1342(%rsp), %ymm0 | |||
vpsubw 1344(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 1344(%rdi) | |||
vmovdqu 1310(%rsp), %ymm0 | |||
vpsubw 1312(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 1312(%rdi) | |||
vmovdqu 1278(%rsp), %ymm0 | |||
vpsubw 1280(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 1280(%rdi) | |||
vmovdqu 1246(%rsp), %ymm0 | |||
vpsubw 1248(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 1248(%rdi) | |||
vmovdqu 1214(%rsp), %ymm0 | |||
vpsubw 1216(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 1216(%rdi) | |||
vmovdqu 1182(%rsp), %ymm0 | |||
vpsubw 1184(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 1184(%rdi) | |||
vmovdqu 1150(%rsp), %ymm0 | |||
vpsubw 1152(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 1152(%rdi) | |||
vmovdqu 1118(%rsp), %ymm0 | |||
vpsubw 1120(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 1120(%rdi) | |||
vmovdqu 1086(%rsp), %ymm0 | |||
vpsubw 1088(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 1088(%rdi) | |||
vmovdqu 1054(%rsp), %ymm0 | |||
vpsubw 1056(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 1056(%rdi) | |||
vmovdqu 1022(%rsp), %ymm0 | |||
vpsubw 1024(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 1024(%rdi) | |||
vmovdqu 990(%rsp), %ymm0 | |||
vpsubw 992(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 992(%rdi) | |||
vmovdqu 958(%rsp), %ymm0 | |||
vpsubw 960(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 960(%rdi) | |||
vmovdqu 926(%rsp), %ymm0 | |||
vpsubw 928(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 928(%rdi) | |||
vmovdqu 894(%rsp), %ymm0 | |||
vpsubw 896(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 896(%rdi) | |||
vmovdqu 862(%rsp), %ymm0 | |||
vpsubw 864(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 864(%rdi) | |||
vmovdqu 830(%rsp), %ymm0 | |||
vpsubw 832(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 832(%rdi) | |||
vmovdqu 798(%rsp), %ymm0 | |||
vpsubw 800(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 800(%rdi) | |||
vmovdqu 766(%rsp), %ymm0 | |||
vpsubw 768(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 768(%rdi) | |||
vmovdqu 734(%rsp), %ymm0 | |||
vpsubw 736(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 736(%rdi) | |||
vmovdqu 702(%rsp), %ymm0 | |||
vpsubw 704(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 704(%rdi) | |||
vmovdqu 670(%rsp), %ymm0 | |||
vpsubw 672(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 672(%rdi) | |||
vmovdqu 638(%rsp), %ymm0 | |||
vpsubw 640(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 640(%rdi) | |||
vmovdqu 606(%rsp), %ymm0 | |||
vpsubw 608(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 608(%rdi) | |||
vmovdqu 574(%rsp), %ymm0 | |||
vpsubw 576(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 576(%rdi) | |||
vmovdqu 542(%rsp), %ymm0 | |||
vpsubw 544(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 544(%rdi) | |||
vmovdqu 510(%rsp), %ymm0 | |||
vpsubw 512(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 512(%rdi) | |||
vmovdqu 478(%rsp), %ymm0 | |||
vpsubw 480(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 480(%rdi) | |||
vmovdqu 446(%rsp), %ymm0 | |||
vpsubw 448(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 448(%rdi) | |||
vmovdqu 414(%rsp), %ymm0 | |||
vpsubw 416(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 416(%rdi) | |||
vmovdqu 382(%rsp), %ymm0 | |||
vpsubw 384(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 384(%rdi) | |||
vmovdqu 350(%rsp), %ymm0 | |||
vpsubw 352(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 352(%rdi) | |||
vmovdqu 318(%rsp), %ymm0 | |||
vpsubw 320(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 320(%rdi) | |||
vmovdqu 286(%rsp), %ymm0 | |||
vpsubw 288(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 288(%rdi) | |||
vmovdqu 254(%rsp), %ymm0 | |||
vpsubw 256(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 256(%rdi) | |||
vmovdqu 222(%rsp), %ymm0 | |||
vpsubw 224(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 224(%rdi) | |||
vmovdqu 190(%rsp), %ymm0 | |||
vpsubw 192(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 192(%rdi) | |||
vmovdqu 158(%rsp), %ymm0 | |||
vpsubw 160(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 160(%rdi) | |||
vmovdqu 126(%rsp), %ymm0 | |||
vpsubw 128(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 128(%rdi) | |||
vmovdqu 94(%rsp), %ymm0 | |||
vpsubw 96(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 96(%rdi) | |||
vmovdqu 62(%rsp), %ymm0 | |||
vpsubw 64(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 64(%rdi) | |||
vmovdqu 30(%rsp), %ymm0 | |||
vpsubw 32(%rsp), %ymm0, %ymm1 | |||
vpand mask_mod8192(%rip), %ymm1, %ymm1 | |||
vmovdqa %ymm1, 32(%rdi) | |||
vmovdqa 0(%rsp), %ymm3 | |||
vpsrlq $48, %ymm3, %ymm0 | |||
@@ -3378,7 +3240,7 @@ vpermq $147, %ymm0, %ymm0 | |||
vpsllq $16, %ymm3, %ymm2 | |||
vpxor %ymm0, %ymm2, %ymm2 | |||
vpsubw %ymm3, %ymm2, %ymm3 | |||
vpand mask_mod8192_omit_lowest(%rip), %ymm3, %ymm3 | |||
vpand mask_omit_lowest(%rip), %ymm3, %ymm3 | |||
vpxor %ymm3, %ymm4, %ymm3 | |||
vmovdqa %ymm3, 0(%rdi) | |||
mov %r8, %rsp | |||
@@ -303,23 +303,6 @@ mask_keephigh: | |||
.word 65535 | |||
.word 65535 | |||
.word 65535 | |||
mask_mod8192: | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.word 8191 | |||
.text | |||
.global PQCLEAN_NTRUHRSS701_AVX2_poly_Rq_mul | |||
.global _PQCLEAN_NTRUHRSS701_AVX2_poly_Rq_mul | |||
@@ -5213,13 +5196,9 @@ vpand mask_keephigh(%rip), %ymm9, %ymm10 | |||
vpor %ymm10, %ymm5, %ymm5 | |||
vpaddw %ymm5, %ymm3, %ymm3 | |||
vmovdqa %xmm9, 2560(%rsp) | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 0(%rdi) | |||
vpand mask_mod8192(%rip), %ymm6, %ymm6 | |||
vmovdqu %ymm6, 352(%rdi) | |||
vpand mask_mod8192(%rip), %ymm3, %ymm3 | |||
vmovdqu %ymm3, 704(%rdi) | |||
vpand mask_mod8192(%rip), %ymm4, %ymm4 | |||
vmovdqu %ymm4, 1056(%rdi) | |||
vmovdqa 32(%rsp), %ymm5 | |||
vpunpcklwd const0(%rip), %ymm5, %ymm8 | |||
@@ -5309,13 +5288,9 @@ vpand mask_keephigh(%rip), %ymm7, %ymm8 | |||
vpor %ymm8, %ymm11, %ymm11 | |||
vpaddw %ymm11, %ymm10, %ymm10 | |||
vmovdqa %xmm7, 2592(%rsp) | |||
vpand mask_mod8192(%rip), %ymm5, %ymm5 | |||
vmovdqu %ymm5, 88(%rdi) | |||
vpand mask_mod8192(%rip), %ymm6, %ymm6 | |||
vmovdqu %ymm6, 440(%rdi) | |||
vpand mask_mod8192(%rip), %ymm10, %ymm10 | |||
vmovdqu %ymm10, 792(%rdi) | |||
vpand mask_mod8192(%rip), %ymm9, %ymm9 | |||
vmovdqu %ymm9, 1144(%rdi) | |||
vmovdqa 64(%rsp), %ymm11 | |||
vpunpcklwd const0(%rip), %ymm11, %ymm4 | |||
@@ -5405,13 +5380,9 @@ vpand mask_keephigh(%rip), %ymm3, %ymm4 | |||
vpor %ymm4, %ymm5, %ymm5 | |||
vpaddw %ymm5, %ymm8, %ymm8 | |||
vmovdqa %xmm3, 2624(%rsp) | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 176(%rdi) | |||
vpand mask_mod8192(%rip), %ymm6, %ymm6 | |||
vmovdqu %ymm6, 528(%rdi) | |||
vpand mask_mod8192(%rip), %ymm8, %ymm8 | |||
vmovdqu %ymm8, 880(%rdi) | |||
vpand mask_mod8192(%rip), %ymm7, %ymm7 | |||
vmovdqu %ymm7, 1232(%rdi) | |||
vmovdqa 96(%rsp), %ymm5 | |||
vpunpcklwd const0(%rip), %ymm5, %ymm9 | |||
@@ -5501,13 +5472,9 @@ vpand mask_keephigh(%rip), %ymm10, %ymm9 | |||
vpor %ymm9, %ymm11, %ymm11 | |||
vpaddw %ymm11, %ymm4, %ymm4 | |||
vmovdqa %xmm10, 2656(%rsp) | |||
vpand mask_mod8192(%rip), %ymm5, %ymm5 | |||
vmovdqu %ymm5, 264(%rdi) | |||
vpand mask_mod8192(%rip), %ymm6, %ymm6 | |||
vmovdqu %ymm6, 616(%rdi) | |||
vpand mask_mod8192(%rip), %ymm4, %ymm4 | |||
vmovdqu %ymm4, 968(%rdi) | |||
vpand mask_mod8192(%rip), %ymm3, %ymm3 | |||
vmovdqu %ymm3, 1320(%rdi) | |||
vmovdqa 128(%rsp), %ymm11 | |||
vpunpcklwd const0(%rip), %ymm11, %ymm7 | |||
@@ -5587,7 +5554,6 @@ vpand mask_keephigh(%rip), %ymm2, %ymm7 | |||
vpor %ymm7, %ymm10, %ymm10 | |||
vmovdqu 0(%rdi), %ymm7 | |||
vpaddw %ymm10, %ymm7, %ymm7 | |||
vpand mask_mod8192(%rip), %ymm7, %ymm7 | |||
vmovdqu %ymm7, 0(%rdi) | |||
vmovdqa %xmm2, 1920(%rsp) | |||
vpshufb shuf48_16(%rip), %ymm4, %ymm4 | |||
@@ -5614,11 +5580,8 @@ vpand mask_keephigh(%rip), %ymm2, %ymm7 | |||
vpor %ymm7, %ymm5, %ymm5 | |||
vpaddw %ymm5, %ymm9, %ymm9 | |||
vmovdqa %xmm2, 2688(%rsp) | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 352(%rdi) | |||
vpand mask_mod8192(%rip), %ymm6, %ymm6 | |||
vmovdqu %ymm6, 704(%rdi) | |||
vpand mask_mod8192(%rip), %ymm9, %ymm9 | |||
vmovdqu %ymm9, 1056(%rdi) | |||
vmovdqa 160(%rsp), %ymm5 | |||
vpunpcklwd const0(%rip), %ymm5, %ymm3 | |||
@@ -5698,7 +5661,6 @@ vpand mask_keephigh(%rip), %ymm8, %ymm3 | |||
vpor %ymm3, %ymm2, %ymm2 | |||
vmovdqu 88(%rdi), %ymm3 | |||
vpaddw %ymm2, %ymm3, %ymm3 | |||
vpand mask_mod8192(%rip), %ymm3, %ymm3 | |||
vmovdqu %ymm3, 88(%rdi) | |||
vmovdqa %xmm8, 1952(%rsp) | |||
vpshufb shuf48_16(%rip), %ymm9, %ymm9 | |||
@@ -5725,11 +5687,8 @@ vpand mask_keephigh(%rip), %ymm8, %ymm3 | |||
vpor %ymm3, %ymm11, %ymm11 | |||
vpaddw %ymm11, %ymm7, %ymm7 | |||
vmovdqa %xmm8, 2720(%rsp) | |||
vpand mask_mod8192(%rip), %ymm5, %ymm5 | |||
vmovdqu %ymm5, 440(%rdi) | |||
vpand mask_mod8192(%rip), %ymm6, %ymm6 | |||
vmovdqu %ymm6, 792(%rdi) | |||
vpand mask_mod8192(%rip), %ymm7, %ymm7 | |||
vmovdqu %ymm7, 1144(%rdi) | |||
vmovdqa 192(%rsp), %ymm11 | |||
vpunpcklwd const0(%rip), %ymm11, %ymm10 | |||
@@ -5809,7 +5768,6 @@ vpand mask_keephigh(%rip), %ymm4, %ymm10 | |||
vpor %ymm10, %ymm8, %ymm8 | |||
vmovdqu 176(%rdi), %ymm10 | |||
vpaddw %ymm8, %ymm10, %ymm10 | |||
vpand mask_mod8192(%rip), %ymm10, %ymm10 | |||
vmovdqu %ymm10, 176(%rdi) | |||
vmovdqa %xmm4, 1984(%rsp) | |||
vpshufb shuf48_16(%rip), %ymm7, %ymm7 | |||
@@ -5836,11 +5794,8 @@ vpand mask_keephigh(%rip), %ymm4, %ymm10 | |||
vpor %ymm10, %ymm5, %ymm5 | |||
vpaddw %ymm5, %ymm3, %ymm3 | |||
vmovdqa %xmm4, 2752(%rsp) | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 528(%rdi) | |||
vpand mask_mod8192(%rip), %ymm6, %ymm6 | |||
vmovdqu %ymm6, 880(%rdi) | |||
vpand mask_mod8192(%rip), %ymm3, %ymm3 | |||
vmovdqu %ymm3, 1232(%rdi) | |||
vmovdqa 224(%rsp), %ymm5 | |||
vpunpcklwd const0(%rip), %ymm5, %ymm2 | |||
@@ -5920,7 +5875,6 @@ vpand mask_keephigh(%rip), %ymm9, %ymm2 | |||
vpor %ymm2, %ymm4, %ymm4 | |||
vmovdqu 264(%rdi), %ymm2 | |||
vpaddw %ymm4, %ymm2, %ymm2 | |||
vpand mask_mod8192(%rip), %ymm2, %ymm2 | |||
vmovdqu %ymm2, 264(%rdi) | |||
vmovdqa %xmm9, 2016(%rsp) | |||
vpshufb shuf48_16(%rip), %ymm3, %ymm3 | |||
@@ -5947,11 +5901,8 @@ vpand mask_keephigh(%rip), %ymm9, %ymm2 | |||
vpor %ymm2, %ymm11, %ymm11 | |||
vpaddw %ymm11, %ymm10, %ymm10 | |||
vmovdqa %xmm9, 2784(%rsp) | |||
vpand mask_mod8192(%rip), %ymm5, %ymm5 | |||
vmovdqu %ymm5, 616(%rdi) | |||
vpand mask_mod8192(%rip), %ymm6, %ymm6 | |||
vmovdqu %ymm6, 968(%rdi) | |||
vpand mask_mod8192(%rip), %ymm10, %ymm10 | |||
vmovdqu %ymm10, 1320(%rdi) | |||
vmovdqa 128(%r12), %ymm0 | |||
vpsubw 224(%r12), %ymm0, %ymm0 | |||
@@ -6345,13 +6296,9 @@ vpor %ymm8, %ymm5, %ymm5 | |||
vpaddw 2560(%rsp), %ymm2, %ymm2 | |||
vpaddw %ymm5, %ymm2, %ymm2 | |||
vmovdqa %xmm3, 2560(%rsp) | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 32(%rdi) | |||
vpand mask_mod8192(%rip), %ymm6, %ymm6 | |||
vmovdqu %ymm6, 384(%rdi) | |||
vpand mask_mod8192(%rip), %ymm2, %ymm2 | |||
vmovdqu %ymm2, 736(%rdi) | |||
vpand mask_mod8192(%rip), %ymm9, %ymm9 | |||
vmovdqu %ymm9, 1088(%rdi) | |||
vmovdqa 32(%rsp), %ymm5 | |||
vpunpcklwd const0(%rip), %ymm5, %ymm4 | |||
@@ -6444,13 +6391,9 @@ vpor %ymm4, %ymm11, %ymm11 | |||
vpaddw 2592(%rsp), %ymm8, %ymm8 | |||
vpaddw %ymm11, %ymm8, %ymm8 | |||
vmovdqa %xmm10, 2592(%rsp) | |||
vpand mask_mod8192(%rip), %ymm5, %ymm5 | |||
vmovdqu %ymm5, 120(%rdi) | |||
vpand mask_mod8192(%rip), %ymm6, %ymm6 | |||
vmovdqu %ymm6, 472(%rdi) | |||
vpand mask_mod8192(%rip), %ymm8, %ymm8 | |||
vmovdqu %ymm8, 824(%rdi) | |||
vpand mask_mod8192(%rip), %ymm3, %ymm3 | |||
vmovdqu %ymm3, 1176(%rdi) | |||
vmovdqa 64(%rsp), %ymm11 | |||
vpunpcklwd const0(%rip), %ymm11, %ymm9 | |||
@@ -6543,13 +6486,9 @@ vpor %ymm9, %ymm5, %ymm5 | |||
vpaddw 2624(%rsp), %ymm4, %ymm4 | |||
vpaddw %ymm5, %ymm4, %ymm4 | |||
vmovdqa %xmm2, 2624(%rsp) | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 208(%rdi) | |||
vpand mask_mod8192(%rip), %ymm6, %ymm6 | |||
vmovdqu %ymm6, 560(%rdi) | |||
vpand mask_mod8192(%rip), %ymm4, %ymm4 | |||
vmovdqu %ymm4, 912(%rdi) | |||
vpand mask_mod8192(%rip), %ymm10, %ymm10 | |||
vmovdqu %ymm10, 1264(%rdi) | |||
vmovdqa 96(%rsp), %ymm5 | |||
vpunpcklwd const0(%rip), %ymm5, %ymm3 | |||
@@ -6642,13 +6581,9 @@ vpor %ymm3, %ymm11, %ymm11 | |||
vpaddw 2656(%rsp), %ymm9, %ymm9 | |||
vpaddw %ymm11, %ymm9, %ymm9 | |||
vmovdqa %xmm8, 2656(%rsp) | |||
vpand mask_mod8192(%rip), %ymm5, %ymm5 | |||
vmovdqu %ymm5, 296(%rdi) | |||
vpand mask_mod8192(%rip), %ymm6, %ymm6 | |||
vmovdqu %ymm6, 648(%rdi) | |||
vpand mask_mod8192(%rip), %ymm9, %ymm9 | |||
vmovdqu %ymm9, 1000(%rdi) | |||
vpand mask_mod8192(%rip), %ymm2, %ymm2 | |||
vmovdqu %ymm2, 1352(%rdi) | |||
vmovdqa 128(%rsp), %ymm11 | |||
vpunpcklwd const0(%rip), %ymm11, %ymm10 | |||
@@ -6729,7 +6664,6 @@ vpor %ymm10, %ymm8, %ymm8 | |||
vmovdqu 32(%rdi), %ymm10 | |||
vpaddw 1920(%rsp), %ymm10, %ymm10 | |||
vpaddw %ymm8, %ymm10, %ymm10 | |||
vpand mask_mod8192(%rip), %ymm10, %ymm10 | |||
vmovdqu %ymm10, 32(%rdi) | |||
vmovdqa %xmm7, 1920(%rsp) | |||
vpshufb shuf48_16(%rip), %ymm9, %ymm9 | |||
@@ -6759,11 +6693,8 @@ vpor %ymm10, %ymm5, %ymm5 | |||
vpaddw 2688(%rsp), %ymm3, %ymm3 | |||
vpaddw %ymm5, %ymm3, %ymm3 | |||
vmovdqa %xmm7, 2688(%rsp) | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 384(%rdi) | |||
vpand mask_mod8192(%rip), %ymm6, %ymm6 | |||
vmovdqu %ymm6, 736(%rdi) | |||
vpand mask_mod8192(%rip), %ymm3, %ymm3 | |||
vmovdqu %ymm3, 1088(%rdi) | |||
vmovdqa 160(%rsp), %ymm5 | |||
vpunpcklwd const0(%rip), %ymm5, %ymm2 | |||
@@ -6844,7 +6775,6 @@ vpor %ymm2, %ymm7, %ymm7 | |||
vmovdqu 120(%rdi), %ymm2 | |||
vpaddw 1952(%rsp), %ymm2, %ymm2 | |||
vpaddw %ymm7, %ymm2, %ymm2 | |||
vpand mask_mod8192(%rip), %ymm2, %ymm2 | |||
vmovdqu %ymm2, 120(%rdi) | |||
vmovdqa %xmm4, 1952(%rsp) | |||
vpshufb shuf48_16(%rip), %ymm3, %ymm3 | |||
@@ -6874,11 +6804,8 @@ vpor %ymm2, %ymm11, %ymm11 | |||
vpaddw 2720(%rsp), %ymm10, %ymm10 | |||
vpaddw %ymm11, %ymm10, %ymm10 | |||
vmovdqa %xmm4, 2720(%rsp) | |||
vpand mask_mod8192(%rip), %ymm5, %ymm5 | |||
vmovdqu %ymm5, 472(%rdi) | |||
vpand mask_mod8192(%rip), %ymm6, %ymm6 | |||
vmovdqu %ymm6, 824(%rdi) | |||
vpand mask_mod8192(%rip), %ymm10, %ymm10 | |||
vmovdqu %ymm10, 1176(%rdi) | |||
vmovdqa 192(%rsp), %ymm11 | |||
vpunpcklwd const0(%rip), %ymm11, %ymm8 | |||
@@ -6959,7 +6886,6 @@ vpor %ymm8, %ymm4, %ymm4 | |||
vmovdqu 208(%rdi), %ymm8 | |||
vpaddw 1984(%rsp), %ymm8, %ymm8 | |||
vpaddw %ymm4, %ymm8, %ymm8 | |||
vpand mask_mod8192(%rip), %ymm8, %ymm8 | |||
vmovdqu %ymm8, 208(%rdi) | |||
vmovdqa %xmm9, 1984(%rsp) | |||
vpshufb shuf48_16(%rip), %ymm10, %ymm10 | |||
@@ -6989,11 +6915,8 @@ vpor %ymm8, %ymm5, %ymm5 | |||
vpaddw 2752(%rsp), %ymm2, %ymm2 | |||
vpaddw %ymm5, %ymm2, %ymm2 | |||
vmovdqa %xmm9, 2752(%rsp) | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 560(%rdi) | |||
vpand mask_mod8192(%rip), %ymm6, %ymm6 | |||
vmovdqu %ymm6, 912(%rdi) | |||
vpand mask_mod8192(%rip), %ymm2, %ymm2 | |||
vmovdqu %ymm2, 1264(%rdi) | |||
vmovdqa 224(%rsp), %ymm5 | |||
vpunpcklwd const0(%rip), %ymm5, %ymm7 | |||
@@ -7074,7 +6997,6 @@ vpor %ymm7, %ymm9, %ymm9 | |||
vmovdqu 296(%rdi), %ymm7 | |||
vpaddw 2016(%rsp), %ymm7, %ymm7 | |||
vpaddw %ymm9, %ymm7, %ymm7 | |||
vpand mask_mod8192(%rip), %ymm7, %ymm7 | |||
vmovdqu %ymm7, 296(%rdi) | |||
vmovdqa %xmm3, 2016(%rsp) | |||
vpshufb shuf48_16(%rip), %ymm2, %ymm2 | |||
@@ -7104,11 +7026,8 @@ vpor %ymm7, %ymm11, %ymm11 | |||
vpaddw 2784(%rsp), %ymm8, %ymm8 | |||
vpaddw %ymm11, %ymm8, %ymm8 | |||
vmovdqa %xmm3, 2784(%rsp) | |||
vpand mask_mod8192(%rip), %ymm5, %ymm5 | |||
vmovdqu %ymm5, 648(%rdi) | |||
vpand mask_mod8192(%rip), %ymm6, %ymm6 | |||
vmovdqu %ymm6, 1000(%rdi) | |||
vpand mask_mod8192(%rip), %ymm8, %ymm8 | |||
vmovdqu %ymm8, 1352(%rdi) | |||
vmovdqa 160(%r12), %ymm0 | |||
vpsubw 256(%r12), %ymm0, %ymm0 | |||
@@ -7502,19 +7421,15 @@ vpor %ymm4, %ymm5, %ymm5 | |||
vpaddw 2560(%rsp), %ymm7, %ymm7 | |||
vpaddw %ymm5, %ymm7, %ymm7 | |||
vmovdqa %xmm2, 2560(%rsp) | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %xmm11, 64(%rdi) | |||
vextracti128 $1, %ymm11, %xmm11 | |||
vmovq %xmm11, 80(%rdi) | |||
vpand mask_mod8192(%rip), %ymm6, %ymm6 | |||
vmovdqu %xmm6, 416(%rdi) | |||
vextracti128 $1, %ymm6, %xmm6 | |||
vmovq %xmm6, 432(%rdi) | |||
vpand mask_mod8192(%rip), %ymm7, %ymm7 | |||
vmovdqu %xmm7, 768(%rdi) | |||
vextracti128 $1, %ymm7, %xmm7 | |||
vmovq %xmm7, 784(%rdi) | |||
vpand mask_mod8192(%rip), %ymm3, %ymm3 | |||
vmovdqu %xmm3, 1120(%rdi) | |||
vextracti128 $1, %ymm3, %xmm3 | |||
vmovq %xmm3, 1136(%rdi) | |||
@@ -7609,19 +7524,15 @@ vpor %ymm9, %ymm11, %ymm11 | |||
vpaddw 2592(%rsp), %ymm4, %ymm4 | |||
vpaddw %ymm11, %ymm4, %ymm4 | |||
vmovdqa %xmm8, 2592(%rsp) | |||
vpand mask_mod8192(%rip), %ymm5, %ymm5 | |||
vmovdqu %xmm5, 152(%rdi) | |||
vextracti128 $1, %ymm5, %xmm5 | |||
vmovq %xmm5, 168(%rdi) | |||
vpand mask_mod8192(%rip), %ymm6, %ymm6 | |||
vmovdqu %xmm6, 504(%rdi) | |||
vextracti128 $1, %ymm6, %xmm6 | |||
vmovq %xmm6, 520(%rdi) | |||
vpand mask_mod8192(%rip), %ymm4, %ymm4 | |||
vmovdqu %xmm4, 856(%rdi) | |||
vextracti128 $1, %ymm4, %xmm4 | |||
vmovq %xmm4, 872(%rdi) | |||
vpand mask_mod8192(%rip), %ymm2, %ymm2 | |||
vmovdqu %xmm2, 1208(%rdi) | |||
vextracti128 $1, %ymm2, %xmm2 | |||
vmovq %xmm2, 1224(%rdi) | |||
@@ -7716,19 +7627,15 @@ vpor %ymm3, %ymm5, %ymm5 | |||
vpaddw 2624(%rsp), %ymm9, %ymm9 | |||
vpaddw %ymm5, %ymm9, %ymm9 | |||
vmovdqa %xmm7, 2624(%rsp) | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %xmm11, 240(%rdi) | |||
vextracti128 $1, %ymm11, %xmm11 | |||
vmovq %xmm11, 256(%rdi) | |||
vpand mask_mod8192(%rip), %ymm6, %ymm6 | |||
vmovdqu %xmm6, 592(%rdi) | |||
vextracti128 $1, %ymm6, %xmm6 | |||
vmovq %xmm6, 608(%rdi) | |||
vpand mask_mod8192(%rip), %ymm9, %ymm9 | |||
vmovdqu %xmm9, 944(%rdi) | |||
vextracti128 $1, %ymm9, %xmm9 | |||
vmovq %xmm9, 960(%rdi) | |||
vpand mask_mod8192(%rip), %ymm8, %ymm8 | |||
vmovdqu %xmm8, 1296(%rdi) | |||
vextracti128 $1, %ymm8, %xmm8 | |||
vmovq %xmm8, 1312(%rdi) | |||
@@ -7823,25 +7730,21 @@ vpor %ymm2, %ymm11, %ymm11 | |||
vpaddw 2656(%rsp), %ymm3, %ymm3 | |||
vpaddw %ymm11, %ymm3, %ymm3 | |||
vmovdqa %xmm4, 2656(%rsp) | |||
vpand mask_mod8192(%rip), %ymm5, %ymm5 | |||
vmovdqu %xmm5, 328(%rdi) | |||
vextracti128 $1, %ymm5, %xmm5 | |||
vmovq %xmm5, 344(%rdi) | |||
vpshufb shufmin1_mask3(%rip), %ymm5, %ymm5 | |||
vmovdqa %xmm5, 1792(%rsp) | |||
vpand mask_mod8192(%rip), %ymm6, %ymm6 | |||
vmovdqu %xmm6, 680(%rdi) | |||
vextracti128 $1, %ymm6, %xmm6 | |||
vmovq %xmm6, 696(%rdi) | |||
vpshufb shufmin1_mask3(%rip), %ymm6, %ymm6 | |||
vmovdqa %xmm6, 1824(%rsp) | |||
vpand mask_mod8192(%rip), %ymm3, %ymm3 | |||
vmovdqu %xmm3, 1032(%rdi) | |||
vextracti128 $1, %ymm3, %xmm3 | |||
vmovq %xmm3, 1048(%rdi) | |||
vpshufb shufmin1_mask3(%rip), %ymm3, %ymm3 | |||
vmovdqa %xmm3, 1856(%rsp) | |||
vpand mask_mod8192(%rip), %ymm7, %ymm7 | |||
vmovdqu %xmm7, 1384(%rdi) | |||
vextracti128 $1, %ymm7, %xmm7 | |||
vmovq %xmm7, 1400(%rdi) | |||
@@ -7926,7 +7829,6 @@ vpor %ymm8, %ymm4, %ymm4 | |||
vmovdqu 64(%rdi), %ymm8 | |||
vpaddw 1920(%rsp), %ymm8, %ymm8 | |||
vpaddw %ymm4, %ymm8, %ymm8 | |||
vpand mask_mod8192(%rip), %ymm8, %ymm8 | |||
vmovdqu %xmm8, 64(%rdi) | |||
vextracti128 $1, %ymm8, %xmm8 | |||
vmovq %xmm8, 80(%rdi) | |||
@@ -7958,15 +7860,12 @@ vpor %ymm8, %ymm5, %ymm5 | |||
vpaddw 2688(%rsp), %ymm2, %ymm2 | |||
vpaddw %ymm5, %ymm2, %ymm2 | |||
vmovdqa %xmm10, 2688(%rsp) | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %xmm11, 416(%rdi) | |||
vextracti128 $1, %ymm11, %xmm11 | |||
vmovq %xmm11, 432(%rdi) | |||
vpand mask_mod8192(%rip), %ymm6, %ymm6 | |||
vmovdqu %xmm6, 768(%rdi) | |||
vextracti128 $1, %ymm6, %xmm6 | |||
vmovq %xmm6, 784(%rdi) | |||
vpand mask_mod8192(%rip), %ymm2, %ymm2 | |||
vmovdqu %xmm2, 1120(%rdi) | |||
vextracti128 $1, %ymm2, %xmm2 | |||
vmovq %xmm2, 1136(%rdi) | |||
@@ -8049,7 +7948,6 @@ vpor %ymm7, %ymm10, %ymm10 | |||
vmovdqu 152(%rdi), %ymm7 | |||
vpaddw 1952(%rsp), %ymm7, %ymm7 | |||
vpaddw %ymm10, %ymm7, %ymm7 | |||
vpand mask_mod8192(%rip), %ymm7, %ymm7 | |||
vmovdqu %xmm7, 152(%rdi) | |||
vextracti128 $1, %ymm7, %xmm7 | |||
vmovq %xmm7, 168(%rdi) | |||
@@ -8081,15 +7979,12 @@ vpor %ymm7, %ymm11, %ymm11 | |||
vpaddw 2720(%rsp), %ymm8, %ymm8 | |||
vpaddw %ymm11, %ymm8, %ymm8 | |||
vmovdqa %xmm9, 2720(%rsp) | |||
vpand mask_mod8192(%rip), %ymm5, %ymm5 | |||
vmovdqu %xmm5, 504(%rdi) | |||
vextracti128 $1, %ymm5, %xmm5 | |||
vmovq %xmm5, 520(%rdi) | |||
vpand mask_mod8192(%rip), %ymm6, %ymm6 | |||
vmovdqu %xmm6, 856(%rdi) | |||
vextracti128 $1, %ymm6, %xmm6 | |||
vmovq %xmm6, 872(%rdi) | |||
vpand mask_mod8192(%rip), %ymm8, %ymm8 | |||
vmovdqu %xmm8, 1208(%rdi) | |||
vextracti128 $1, %ymm8, %xmm8 | |||
vmovq %xmm8, 1224(%rdi) | |||
@@ -8172,7 +8067,6 @@ vpor %ymm4, %ymm9, %ymm9 | |||
vmovdqu 240(%rdi), %ymm4 | |||
vpaddw 1984(%rsp), %ymm4, %ymm4 | |||
vpaddw %ymm9, %ymm4, %ymm4 | |||
vpand mask_mod8192(%rip), %ymm4, %ymm4 | |||
vmovdqu %xmm4, 240(%rdi) | |||
vextracti128 $1, %ymm4, %xmm4 | |||
vmovq %xmm4, 256(%rdi) | |||
@@ -8204,15 +8098,12 @@ vpor %ymm4, %ymm5, %ymm5 | |||
vpaddw 2752(%rsp), %ymm7, %ymm7 | |||
vpaddw %ymm5, %ymm7, %ymm7 | |||
vmovdqa %xmm3, 2752(%rsp) | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %xmm11, 592(%rdi) | |||
vextracti128 $1, %ymm11, %xmm11 | |||
vmovq %xmm11, 608(%rdi) | |||
vpand mask_mod8192(%rip), %ymm6, %ymm6 | |||
vmovdqu %xmm6, 944(%rdi) | |||
vextracti128 $1, %ymm6, %xmm6 | |||
vmovq %xmm6, 960(%rdi) | |||
vpand mask_mod8192(%rip), %ymm7, %ymm7 | |||
vmovdqu %xmm7, 1296(%rdi) | |||
vextracti128 $1, %ymm7, %xmm7 | |||
vmovq %xmm7, 1312(%rdi) | |||
@@ -8304,7 +8195,6 @@ vpor %ymm10, %ymm3, %ymm3 | |||
vmovdqu 328(%rdi), %ymm10 | |||
vpaddw 2016(%rsp), %ymm10, %ymm10 | |||
vpaddw %ymm3, %ymm10, %ymm10 | |||
vpand mask_mod8192(%rip), %ymm10, %ymm10 | |||
vmovdqu %xmm10, 328(%rdi) | |||
vextracti128 $1, %ymm10, %xmm10 | |||
vmovq %xmm10, 344(%rdi) | |||
@@ -8338,119 +8228,92 @@ vpor %ymm10, %ymm11, %ymm11 | |||
vpaddw 2784(%rsp), %ymm4, %ymm4 | |||
vpaddw %ymm11, %ymm4, %ymm4 | |||
vmovdqa %xmm2, 2784(%rsp) | |||
vpand mask_mod8192(%rip), %ymm5, %ymm5 | |||
vmovdqu %xmm5, 680(%rdi) | |||
vextracti128 $1, %ymm5, %xmm5 | |||
vmovq %xmm5, 696(%rdi) | |||
vpand mask_mod8192(%rip), %ymm6, %ymm6 | |||
vmovdqu %xmm6, 1032(%rdi) | |||
vextracti128 $1, %ymm6, %xmm6 | |||
vmovq %xmm6, 1048(%rdi) | |||
vpand mask_mod8192(%rip), %ymm4, %ymm4 | |||
vmovdqu %xmm4, 1384(%rdi) | |||
vextracti128 $1, %ymm4, %xmm4 | |||
vmovq %xmm4, 1400(%rdi) | |||
vmovdqu 0(%rdi), %ymm11 | |||
vpaddw 1888(%rsp), %ymm11, %ymm11 | |||
vpaddw 2816(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 0(%rdi) | |||
vmovdqu 352(%rdi), %ymm11 | |||
vpaddw 2528(%rsp), %ymm11, %ymm11 | |||
vpaddw 2848(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 352(%rdi) | |||
vmovdqu 704(%rdi), %ymm11 | |||
vpaddw 2784(%rsp), %ymm11, %ymm11 | |||
vpaddw 2880(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 704(%rdi) | |||
vmovdqu 88(%rdi), %ymm11 | |||
vpaddw 2048(%rsp), %ymm11, %ymm11 | |||
vpaddw 1920(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 88(%rdi) | |||
vmovdqu 440(%rdi), %ymm11 | |||
vpaddw 2304(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 440(%rdi) | |||
vmovdqu 792(%rdi), %ymm11 | |||
vpaddw 2560(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 792(%rdi) | |||
vmovdqu 176(%rdi), %ymm11 | |||
vpaddw 2080(%rsp), %ymm11, %ymm11 | |||
vpaddw 1952(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 176(%rdi) | |||
vmovdqu 528(%rdi), %ymm11 | |||
vpaddw 2336(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 528(%rdi) | |||
vmovdqu 880(%rdi), %ymm11 | |||
vpaddw 2592(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 880(%rdi) | |||
vmovdqu 264(%rdi), %ymm11 | |||
vpaddw 2112(%rsp), %ymm11, %ymm11 | |||
vpaddw 1984(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 264(%rdi) | |||
vmovdqu 616(%rdi), %ymm11 | |||
vpaddw 2368(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 616(%rdi) | |||
vmovdqu 968(%rdi), %ymm11 | |||
vpaddw 2624(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 968(%rdi) | |||
vmovdqu 352(%rdi), %ymm11 | |||
vpaddw 2144(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 352(%rdi) | |||
vmovdqu 704(%rdi), %ymm11 | |||
vpaddw 2400(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 704(%rdi) | |||
vmovdqu 1056(%rdi), %ymm11 | |||
vpaddw 2656(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 1056(%rdi) | |||
vmovdqu 440(%rdi), %ymm11 | |||
vpaddw 2176(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 440(%rdi) | |||
vmovdqu 792(%rdi), %ymm11 | |||
vpaddw 2432(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 792(%rdi) | |||
vmovdqu 1144(%rdi), %ymm11 | |||
vpaddw 2688(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 1144(%rdi) | |||
vmovdqu 528(%rdi), %ymm11 | |||
vpaddw 2208(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 528(%rdi) | |||
vmovdqu 880(%rdi), %ymm11 | |||
vpaddw 2464(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 880(%rdi) | |||
vmovdqu 1232(%rdi), %ymm11 | |||
vpaddw 2720(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 1232(%rdi) | |||
vmovdqu 616(%rdi), %ymm11 | |||
vpaddw 2240(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 616(%rdi) | |||
vmovdqu 968(%rdi), %ymm11 | |||
vpaddw 2496(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 968(%rdi) | |||
vmovdqu 1320(%rdi), %ymm11 | |||
vpaddw 2752(%rsp), %ymm11, %ymm11 | |||
vpand mask_mod8192(%rip), %ymm11, %ymm11 | |||
vmovdqu %ymm11, 1320(%rdi) | |||
mov %r8, %rsp | |||
pop %r12 | |||
@@ -4,12 +4,9 @@ | |||
#include "params.h" | |||
#include "poly.h" | |||
void PQCLEAN_NTRUHRSS701_CLEAN_owcpa_samplemsg(unsigned char msg[NTRU_OWCPA_MSGBYTES], | |||
const unsigned char seed[NTRU_SEEDBYTES]); | |||
void PQCLEAN_NTRUHRSS701_CLEAN_owcpa_keypair(unsigned char *pk, | |||
unsigned char *sk, | |||
const unsigned char seed[NTRU_SEEDBYTES]); | |||
const unsigned char seed[NTRU_SAMPLE_FG_BYTES]); | |||
void PQCLEAN_NTRUHRSS701_CLEAN_owcpa_enc(unsigned char *c, | |||
const poly *r, | |||
@@ -23,7 +23,15 @@ void PQCLEAN_NTRUHRSS701_CLEAN_poly_Sq_mul(poly *r, const poly *a, const poly *b | |||
} | |||
void PQCLEAN_NTRUHRSS701_CLEAN_poly_S3_mul(poly *r, const poly *a, const poly *b) { | |||
int i; | |||
/* Our S3 multiplications do not overflow mod q, */ | |||
/* so we can re-purpose PQCLEAN_NTRUHRSS701_CLEAN_poly_Rq_mul, as long as we */ | |||
/* follow with an explicit reduction mod q. */ | |||
PQCLEAN_NTRUHRSS701_CLEAN_poly_Rq_mul(r, a, b); | |||
for (i = 0; i < NTRU_N; i++) { | |||
r->coeffs[i] = MODQ(r->coeffs[i]); | |||
} | |||
PQCLEAN_NTRUHRSS701_CLEAN_poly_mod_3_Phi_n(r); | |||
} | |||
@@ -1,15 +1,284 @@ | |||
#include "poly.h" | |||
/* Polynomial multiplication using */ | |||
/* Toom-4 and two layers of Karatsuba. */ | |||
#define L PAD32(NTRU_N) | |||
#define M (L/4) | |||
#define K (L/16) | |||
static void toom4_k2x2_mul(uint16_t ab[2 * L], const uint16_t a[L], const uint16_t b[L]); | |||
static void toom4_k2x2_eval_0(uint16_t r[9 * K], const uint16_t a[M]); | |||
static void toom4_k2x2_eval_p1(uint16_t r[9 * K], const uint16_t a[M]); | |||
static void toom4_k2x2_eval_m1(uint16_t r[9 * K], const uint16_t a[M]); | |||
static void toom4_k2x2_eval_p2(uint16_t r[9 * K], const uint16_t a[M]); | |||
static void toom4_k2x2_eval_m2(uint16_t r[9 * K], const uint16_t a[M]); | |||
static void toom4_k2x2_eval_p3(uint16_t r[9 * K], const uint16_t a[M]); | |||
static void toom4_k2x2_eval_inf(uint16_t r[9 * K], const uint16_t a[M]); | |||
static inline void k2x2_eval(uint16_t r[9 * K]); | |||
static void toom4_k2x2_basemul(uint16_t r[18 * K], const uint16_t a[9 * K], const uint16_t b[9 * K]); | |||
static inline void schoolbook_KxK(uint16_t r[2 * K], const uint16_t a[K], const uint16_t b[K]); | |||
static void toom4_k2x2_interpolate(uint16_t r[2 * M], const uint16_t a[63 * 2 * K]); | |||
static inline void k2x2_interpolate(uint16_t r[M], const uint16_t a[9 * K]); | |||
void PQCLEAN_NTRUHRSS701_CLEAN_poly_Rq_mul(poly *r, const poly *a, const poly *b) { | |||
int k, i; | |||
size_t i; | |||
uint16_t ab[2 * L]; | |||
for (k = 0; k < NTRU_N; k++) { | |||
r->coeffs[k] = 0; | |||
for (i = 1; i < NTRU_N - k; i++) { | |||
r->coeffs[k] += a->coeffs[k + i] * b->coeffs[NTRU_N - i]; | |||
} | |||
for (i = 0; i < k + 1; i++) { | |||
r->coeffs[k] += a->coeffs[k - i] * b->coeffs[i]; | |||
for (i = 0; i < NTRU_N; i++) { | |||
ab[i] = a->coeffs[i]; | |||
ab[L + i] = b->coeffs[i]; | |||
} | |||
for (i = NTRU_N; i < L; i++) { | |||
ab[i] = 0; | |||
ab[L + i] = 0; | |||
} | |||
toom4_k2x2_mul(ab, ab, ab + L); | |||
for (i = 0; i < NTRU_N; i++) { | |||
r->coeffs[i] = ab[i] + ab[NTRU_N + i]; | |||
} | |||
} | |||
static void toom4_k2x2_mul(uint16_t ab[2 * L], const uint16_t a[L], const uint16_t b[L]) { | |||
uint16_t tmpA[9 * K]; | |||
uint16_t tmpB[9 * K]; | |||
uint16_t eC[63 * 2 * K]; | |||
toom4_k2x2_eval_0(tmpA, a); | |||
toom4_k2x2_eval_0(tmpB, b); | |||
toom4_k2x2_basemul(eC + 0 * 9 * 2 * K, tmpA, tmpB); | |||
toom4_k2x2_eval_p1(tmpA, a); | |||
toom4_k2x2_eval_p1(tmpB, b); | |||
toom4_k2x2_basemul(eC + 1 * 9 * 2 * K, tmpA, tmpB); | |||
toom4_k2x2_eval_m1(tmpA, a); | |||
toom4_k2x2_eval_m1(tmpB, b); | |||
toom4_k2x2_basemul(eC + 2 * 9 * 2 * K, tmpA, tmpB); | |||
toom4_k2x2_eval_p2(tmpA, a); | |||
toom4_k2x2_eval_p2(tmpB, b); | |||
toom4_k2x2_basemul(eC + 3 * 9 * 2 * K, tmpA, tmpB); | |||
toom4_k2x2_eval_m2(tmpA, a); | |||
toom4_k2x2_eval_m2(tmpB, b); | |||
toom4_k2x2_basemul(eC + 4 * 9 * 2 * K, tmpA, tmpB); | |||
toom4_k2x2_eval_p3(tmpA, a); | |||
toom4_k2x2_eval_p3(tmpB, b); | |||
toom4_k2x2_basemul(eC + 5 * 9 * 2 * K, tmpA, tmpB); | |||
toom4_k2x2_eval_inf(tmpA, a); | |||
toom4_k2x2_eval_inf(tmpB, b); | |||
toom4_k2x2_basemul(eC + 6 * 9 * 2 * K, tmpA, tmpB); | |||
toom4_k2x2_interpolate(ab, eC); | |||
} | |||
static void toom4_k2x2_eval_0(uint16_t r[9 * K], const uint16_t a[M]) { | |||
for (size_t i = 0; i < M; i++) { | |||
r[i] = a[i]; | |||
} | |||
k2x2_eval(r); | |||
} | |||
static void toom4_k2x2_eval_p1(uint16_t r[9 * K], const uint16_t a[M]) { | |||
for (size_t i = 0; i < M; i++) { | |||
r[i] = a[0 * M + i]; | |||
r[i] += a[1 * M + i]; | |||
r[i] += a[2 * M + i]; | |||
r[i] += a[3 * M + i]; | |||
} | |||
k2x2_eval(r); | |||
} | |||
static void toom4_k2x2_eval_m1(uint16_t r[9 * K], const uint16_t a[M]) { | |||
for (size_t i = 0; i < M; i++) { | |||
r[i] = a[0 * M + i]; | |||
r[i] -= a[1 * M + i]; | |||
r[i] += a[2 * M + i]; | |||
r[i] -= a[3 * M + i]; | |||
} | |||
k2x2_eval(r); | |||
} | |||
static void toom4_k2x2_eval_p2(uint16_t r[9 * K], const uint16_t a[M]) { | |||
for (size_t i = 0; i < M; i++) { | |||
r[i] = a[0 * M + i]; | |||
r[i] += 2 * a[1 * M + i]; | |||
r[i] += 4 * a[2 * M + i]; | |||
r[i] += 8 * a[3 * M + i]; | |||
} | |||
k2x2_eval(r); | |||
} | |||
static void toom4_k2x2_eval_m2(uint16_t r[9 * K], const uint16_t a[M]) { | |||
for (size_t i = 0; i < M; i++) { | |||
r[i] = a[0 * M + i]; | |||
r[i] -= 2 * a[1 * M + i]; | |||
r[i] += 4 * a[2 * M + i]; | |||
r[i] -= 8 * a[3 * M + i]; | |||
} | |||
k2x2_eval(r); | |||
} | |||
static void toom4_k2x2_eval_p3(uint16_t r[9 * K], const uint16_t a[M]) { | |||
for (size_t i = 0; i < M; i++) { | |||
r[i] = a[0 * M + i]; | |||
r[i] += 3 * a[1 * M + i]; | |||
r[i] += 9 * a[2 * M + i]; | |||
r[i] += 27 * a[3 * M + i]; | |||
} | |||
k2x2_eval(r); | |||
} | |||
static void toom4_k2x2_eval_inf(uint16_t r[9 * K], const uint16_t a[M]) { | |||
for (size_t i = 0; i < M; i++) { | |||
r[i] = a[3 * M + i]; | |||
} | |||
k2x2_eval(r); | |||
} | |||
static inline void k2x2_eval(uint16_t r[9 * K]) { | |||
/* Input: e + f.Y + g.Y^2 + h.Y^3 */ | |||
/* Output: [ e | f | g | h | e+f | f+h | g+e | h+g | e+f+g+h ] */ | |||
size_t i; | |||
for (i = 0; i < 4 * K; i++) { | |||
r[4 * K + i] = r[i]; | |||
} | |||
for (i = 0; i < K; i++) { | |||
r[4 * K + i] += r[1 * K + i]; | |||
r[5 * K + i] += r[3 * K + i]; | |||
r[6 * K + i] += r[0 * K + i]; | |||
r[7 * K + i] += r[2 * K + i]; | |||
r[8 * K + i] = r[5 * K + i]; | |||
r[8 * K + i] += r[6 * K + i]; | |||
} | |||
} | |||
static void toom4_k2x2_basemul(uint16_t r[18 * K], const uint16_t a[9 * K], const uint16_t b[9 * K]) { | |||
schoolbook_KxK(r + 0 * 2 * K, a + 0 * K, b + 0 * K); | |||
schoolbook_KxK(r + 1 * 2 * K, a + 1 * K, b + 1 * K); | |||
schoolbook_KxK(r + 2 * 2 * K, a + 2 * K, b + 2 * K); | |||
schoolbook_KxK(r + 3 * 2 * K, a + 3 * K, b + 3 * K); | |||
schoolbook_KxK(r + 4 * 2 * K, a + 4 * K, b + 4 * K); | |||
schoolbook_KxK(r + 5 * 2 * K, a + 5 * K, b + 5 * K); | |||
schoolbook_KxK(r + 6 * 2 * K, a + 6 * K, b + 6 * K); | |||
schoolbook_KxK(r + 7 * 2 * K, a + 7 * K, b + 7 * K); | |||
schoolbook_KxK(r + 8 * 2 * K, a + 8 * K, b + 8 * K); | |||
} | |||
static inline void schoolbook_KxK(uint16_t r[2 * K], const uint16_t a[K], const uint16_t b[K]) { | |||
size_t i, j; | |||
for (j = 0; j < K; j++) { | |||
r[j] = a[0] * b[j]; | |||
} | |||
for (i = 1; i < K; i++) { | |||
for (j = 0; j < K - 1; j++) { | |||
r[i + j] += a[i] * b[j]; | |||
} | |||
r[i + K - 1] = a[i] * b[K - 1]; | |||
} | |||
r[2 * K - 1] = 0; | |||
} | |||
static void toom4_k2x2_interpolate(uint16_t r[2 * M], const uint16_t a[7 * 18 * K]) { | |||
size_t i; | |||
uint16_t P1[2 * M]; | |||
uint16_t Pm1[2 * M]; | |||
uint16_t P2[2 * M]; | |||
uint16_t Pm2[2 * M]; | |||
uint16_t *C0 = r; | |||
uint16_t *C2 = r + 2 * M; | |||
uint16_t *C4 = r + 4 * M; | |||
uint16_t *C6 = r + 6 * M; | |||
uint16_t V0, V1, V2; | |||
k2x2_interpolate(C0, a + 0 * 9 * 2 * K); | |||
k2x2_interpolate(P1, a + 1 * 9 * 2 * K); | |||
k2x2_interpolate(Pm1, a + 2 * 9 * 2 * K); | |||
k2x2_interpolate(P2, a + 3 * 9 * 2 * K); | |||
k2x2_interpolate(Pm2, a + 4 * 9 * 2 * K); | |||
k2x2_interpolate(C6, a + 6 * 9 * 2 * K); | |||
for (i = 0; i < 2 * M; i++) { | |||
V0 = ((uint32_t)(P1[i] + Pm1[i])) >> 1; | |||
V0 = V0 - C0[i] - C6[i]; | |||
V1 = ((uint32_t)(P2[i] + Pm2[i] - 2 * C0[i] - 128 * C6[i])) >> 3; | |||
C4[i] = 43691 * (V1 - V0); | |||
C2[i] = V0 - C4[i]; | |||
P1[i] = ((uint32_t)(P1[i] - Pm1[i])) >> 1; | |||
} | |||
/* reuse Pm1 for P3 */ | |||
#define P3 Pm1 | |||
k2x2_interpolate(P3, a + 5 * 9 * 2 * K); | |||
for (i = 0; i < 2 * M; i++) { | |||
V0 = P1[i]; | |||
V1 = 43691 * ((((uint32_t)(P2[i] - Pm2[i])) >> 2) - V0); | |||
V2 = 43691 * (P3[i] - C0[i] - 9 * (C2[i] + 9 * (C4[i] + 9 * C6[i]))); | |||
V2 = ((uint32_t)(V2 - V0)) >> 3; | |||
V2 -= V1; | |||
P3[i] = 52429 * V2; | |||
P2[i] = V1 - V2; | |||
P1[i] = V0 - P2[i] - P3[i]; | |||
} | |||
for (i = 0; i < 2 * M; i++) { | |||
r[1 * M + i] += P1[i]; | |||
r[3 * M + i] += P2[i]; | |||
r[5 * M + i] += P3[i]; | |||
} | |||
} | |||
static inline void k2x2_interpolate(uint16_t r[M], const uint16_t a[9 * K]) { | |||
size_t i; | |||
uint16_t tmp[4 * K]; | |||
for (i = 0; i < 2 * K; i++) { | |||
r[0 * K + i] = a[0 * K + i]; | |||
r[2 * K + i] = a[2 * K + i]; | |||
} | |||
for (i = 0; i < 2 * K; i++) { | |||
r[1 * K + i] += a[8 * K + i] - a[0 * K + i] - a[2 * K + i]; | |||
} | |||
for (i = 0; i < 2 * K; i++) { | |||
r[4 * K + i] = a[4 * K + i]; | |||
r[6 * K + i] = a[6 * K + i]; | |||
} | |||
for (i = 0; i < 2 * K; i++) { | |||
r[5 * K + i] += a[14 * K + i] - a[4 * K + i] - a[6 * K + i]; | |||
} | |||
for (i = 0; i < 2 * K; i++) { | |||
tmp[0 * K + i] = a[12 * K + i]; | |||
tmp[2 * K + i] = a[10 * K + i]; | |||
} | |||
for (i = 0; i < 2 * K; i++) { | |||
tmp[K + i] += a[16 * K + i] - a[12 * K + i] - a[10 * K + i]; | |||
} | |||
for (i = 0; i < 4 * K; i++) { | |||
tmp[0 * K + i] = tmp[0 * K + i] - r[0 * K + i] - r[4 * K + i]; | |||
} | |||
for (i = 0; i < 4 * K; i++) { | |||
r[2 * K + i] += tmp[0 * K + i]; | |||
} | |||
} | |||