ntru: faster multiplication for reference implementations

This commit is contained in:
John M. Schanck 2020-11-05 18:06:01 -05:00
parent 3c45712da6
commit 941e0bfe21
29 changed files with 1214 additions and 904 deletions

View File

@ -23,9 +23,9 @@ auxiliary-submitters:
- Zhenfei Zhang - Zhenfei Zhang
implementations: implementations:
- name: clean - name: clean
version: https://github.com/jschanck/ntru/tree/6d1f44f5 reference implementation version: https://github.com/jschanck/ntru/tree/60cc7277 reference implementation
- name: avx2 - name: avx2
version: https://github.com/jschanck/ntru/tree/6d1f44f5 avx2 implementation version: https://github.com/jschanck/ntru/tree/60cc7277 avx2 implementation
supported_platforms: supported_platforms:
- architecture: x86_64 - architecture: x86_64
operating_systems: operating_systems:

View File

@ -4,12 +4,9 @@
#include "params.h" #include "params.h"
#include "poly.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, void PQCLEAN_NTRUHPS2048509_AVX2_owcpa_keypair(unsigned char *pk,
unsigned char *sk, 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, void PQCLEAN_NTRUHPS2048509_AVX2_owcpa_enc(unsigned char *c,
const poly *r, const poly *r,

View File

@ -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) { 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); 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); PQCLEAN_NTRUHPS2048509_AVX2_poly_mod_3_Phi_n(r);
} }

View File

@ -253,23 +253,6 @@ mask_keephigh:
.word 65535 .word 65535
.word 65535 .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 .text
.global PQCLEAN_NTRUHPS2048509_AVX2_poly_Rq_mul .global PQCLEAN_NTRUHPS2048509_AVX2_poly_Rq_mul
.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 vpor %ymm10, %ymm5, %ymm5
vpaddw %ymm5, %ymm3, %ymm3 vpaddw %ymm5, %ymm3, %ymm3
vmovdqa %xmm9, 2560(%rsp) vmovdqa %xmm9, 2560(%rsp)
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 0(%rdi) vmovdqa %ymm11, 0(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 256(%rdi) vmovdqa %ymm6, 256(%rdi)
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqa %ymm3, 512(%rdi) vmovdqa %ymm3, 512(%rdi)
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqa %ymm4, 768(%rdi) vmovdqa %ymm4, 768(%rdi)
vmovdqa 32(%rsp), %ymm5 vmovdqa 32(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm8 vpunpcklwd const0(%rip), %ymm5, %ymm8
@ -3693,13 +3672,9 @@ vpand mask_keephigh(%rip), %ymm7, %ymm8
vpor %ymm8, %ymm11, %ymm11 vpor %ymm8, %ymm11, %ymm11
vpaddw %ymm11, %ymm10, %ymm10 vpaddw %ymm11, %ymm10, %ymm10
vmovdqa %xmm7, 2592(%rsp) vmovdqa %xmm7, 2592(%rsp)
vpand mask_mod2048(%rip), %ymm5, %ymm5
vmovdqa %ymm5, 64(%rdi) vmovdqa %ymm5, 64(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 320(%rdi) vmovdqa %ymm6, 320(%rdi)
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqa %ymm10, 576(%rdi) vmovdqa %ymm10, 576(%rdi)
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqa %ymm9, 832(%rdi) vmovdqa %ymm9, 832(%rdi)
vmovdqa 64(%rsp), %ymm11 vmovdqa 64(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm4 vpunpcklwd const0(%rip), %ymm11, %ymm4
@ -3789,13 +3764,9 @@ vpand mask_keephigh(%rip), %ymm3, %ymm4
vpor %ymm4, %ymm5, %ymm5 vpor %ymm4, %ymm5, %ymm5
vpaddw %ymm5, %ymm8, %ymm8 vpaddw %ymm5, %ymm8, %ymm8
vmovdqa %xmm3, 2624(%rsp) vmovdqa %xmm3, 2624(%rsp)
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 128(%rdi) vmovdqa %ymm11, 128(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 384(%rdi) vmovdqa %ymm6, 384(%rdi)
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqa %ymm8, 640(%rdi) vmovdqa %ymm8, 640(%rdi)
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqa %ymm7, 896(%rdi) vmovdqa %ymm7, 896(%rdi)
vmovdqa 96(%rsp), %ymm5 vmovdqa 96(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm9 vpunpcklwd const0(%rip), %ymm5, %ymm9
@ -3885,13 +3856,9 @@ vpand mask_keephigh(%rip), %ymm10, %ymm9
vpor %ymm9, %ymm11, %ymm11 vpor %ymm9, %ymm11, %ymm11
vpaddw %ymm11, %ymm4, %ymm4 vpaddw %ymm11, %ymm4, %ymm4
vmovdqa %xmm10, 2656(%rsp) vmovdqa %xmm10, 2656(%rsp)
vpand mask_mod2048(%rip), %ymm5, %ymm5
vmovdqa %ymm5, 192(%rdi) vmovdqa %ymm5, 192(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 448(%rdi) vmovdqa %ymm6, 448(%rdi)
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqa %ymm4, 704(%rdi) vmovdqa %ymm4, 704(%rdi)
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqa %ymm3, 960(%rdi) vmovdqa %ymm3, 960(%rdi)
vmovdqa 128(%rsp), %ymm11 vmovdqa 128(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm7 vpunpcklwd const0(%rip), %ymm11, %ymm7
@ -3971,7 +3938,6 @@ vpand mask_keephigh(%rip), %ymm2, %ymm7
vpor %ymm7, %ymm10, %ymm10 vpor %ymm7, %ymm10, %ymm10
vmovdqa 0(%rdi), %ymm7 vmovdqa 0(%rdi), %ymm7
vpaddw %ymm10, %ymm7, %ymm7 vpaddw %ymm10, %ymm7, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqa %ymm7, 0(%rdi) vmovdqa %ymm7, 0(%rdi)
vmovdqa %xmm2, 1920(%rsp) vmovdqa %xmm2, 1920(%rsp)
vpshufb shuf48_16(%rip), %ymm4, %ymm4 vpshufb shuf48_16(%rip), %ymm4, %ymm4
@ -3998,11 +3964,8 @@ vpand mask_keephigh(%rip), %ymm2, %ymm7
vpor %ymm7, %ymm5, %ymm5 vpor %ymm7, %ymm5, %ymm5
vpaddw %ymm5, %ymm9, %ymm9 vpaddw %ymm5, %ymm9, %ymm9
vmovdqa %xmm2, 2688(%rsp) vmovdqa %xmm2, 2688(%rsp)
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 256(%rdi) vmovdqa %ymm11, 256(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 512(%rdi) vmovdqa %ymm6, 512(%rdi)
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqa %ymm9, 768(%rdi) vmovdqa %ymm9, 768(%rdi)
vmovdqa 160(%rsp), %ymm5 vmovdqa 160(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm3 vpunpcklwd const0(%rip), %ymm5, %ymm3
@ -4082,7 +4045,6 @@ vpand mask_keephigh(%rip), %ymm8, %ymm3
vpor %ymm3, %ymm2, %ymm2 vpor %ymm3, %ymm2, %ymm2
vmovdqa 64(%rdi), %ymm3 vmovdqa 64(%rdi), %ymm3
vpaddw %ymm2, %ymm3, %ymm3 vpaddw %ymm2, %ymm3, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqa %ymm3, 64(%rdi) vmovdqa %ymm3, 64(%rdi)
vmovdqa %xmm8, 1952(%rsp) vmovdqa %xmm8, 1952(%rsp)
vpshufb shuf48_16(%rip), %ymm9, %ymm9 vpshufb shuf48_16(%rip), %ymm9, %ymm9
@ -4109,11 +4071,8 @@ vpand mask_keephigh(%rip), %ymm8, %ymm3
vpor %ymm3, %ymm11, %ymm11 vpor %ymm3, %ymm11, %ymm11
vpaddw %ymm11, %ymm7, %ymm7 vpaddw %ymm11, %ymm7, %ymm7
vmovdqa %xmm8, 2720(%rsp) vmovdqa %xmm8, 2720(%rsp)
vpand mask_mod2048(%rip), %ymm5, %ymm5
vmovdqa %ymm5, 320(%rdi) vmovdqa %ymm5, 320(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 576(%rdi) vmovdqa %ymm6, 576(%rdi)
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqa %ymm7, 832(%rdi) vmovdqa %ymm7, 832(%rdi)
vmovdqa 192(%rsp), %ymm11 vmovdqa 192(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm10 vpunpcklwd const0(%rip), %ymm11, %ymm10
@ -4193,7 +4152,6 @@ vpand mask_keephigh(%rip), %ymm4, %ymm10
vpor %ymm10, %ymm8, %ymm8 vpor %ymm10, %ymm8, %ymm8
vmovdqa 128(%rdi), %ymm10 vmovdqa 128(%rdi), %ymm10
vpaddw %ymm8, %ymm10, %ymm10 vpaddw %ymm8, %ymm10, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqa %ymm10, 128(%rdi) vmovdqa %ymm10, 128(%rdi)
vmovdqa %xmm4, 1984(%rsp) vmovdqa %xmm4, 1984(%rsp)
vpshufb shuf48_16(%rip), %ymm7, %ymm7 vpshufb shuf48_16(%rip), %ymm7, %ymm7
@ -4220,11 +4178,8 @@ vpand mask_keephigh(%rip), %ymm4, %ymm10
vpor %ymm10, %ymm5, %ymm5 vpor %ymm10, %ymm5, %ymm5
vpaddw %ymm5, %ymm3, %ymm3 vpaddw %ymm5, %ymm3, %ymm3
vmovdqa %xmm4, 2752(%rsp) vmovdqa %xmm4, 2752(%rsp)
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 384(%rdi) vmovdqa %ymm11, 384(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 640(%rdi) vmovdqa %ymm6, 640(%rdi)
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqa %ymm3, 896(%rdi) vmovdqa %ymm3, 896(%rdi)
vmovdqa 224(%rsp), %ymm5 vmovdqa 224(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm2 vpunpcklwd const0(%rip), %ymm5, %ymm2
@ -4304,7 +4259,6 @@ vpand mask_keephigh(%rip), %ymm9, %ymm2
vpor %ymm2, %ymm4, %ymm4 vpor %ymm2, %ymm4, %ymm4
vmovdqa 192(%rdi), %ymm2 vmovdqa 192(%rdi), %ymm2
vpaddw %ymm4, %ymm2, %ymm2 vpaddw %ymm4, %ymm2, %ymm2
vpand mask_mod2048(%rip), %ymm2, %ymm2
vmovdqa %ymm2, 192(%rdi) vmovdqa %ymm2, 192(%rdi)
vmovdqa %xmm9, 2016(%rsp) vmovdqa %xmm9, 2016(%rsp)
vpshufb shuf48_16(%rip), %ymm3, %ymm3 vpshufb shuf48_16(%rip), %ymm3, %ymm3
@ -4331,11 +4285,8 @@ vpand mask_keephigh(%rip), %ymm9, %ymm2
vpor %ymm2, %ymm11, %ymm11 vpor %ymm2, %ymm11, %ymm11
vpaddw %ymm11, %ymm10, %ymm10 vpaddw %ymm11, %ymm10, %ymm10
vmovdqa %xmm9, 2784(%rsp) vmovdqa %xmm9, 2784(%rsp)
vpand mask_mod2048(%rip), %ymm5, %ymm5
vmovdqa %ymm5, 448(%rdi) vmovdqa %ymm5, 448(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 704(%rdi) vmovdqa %ymm6, 704(%rdi)
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqa %ymm10, 960(%rdi) vmovdqa %ymm10, 960(%rdi)
vmovdqa 96(%r12), %ymm0 vmovdqa 96(%r12), %ymm0
vpsubw 160(%r12), %ymm0, %ymm0 vpsubw 160(%r12), %ymm0, %ymm0
@ -4729,13 +4680,9 @@ vpor %ymm8, %ymm5, %ymm5
vpaddw 2560(%rsp), %ymm2, %ymm2 vpaddw 2560(%rsp), %ymm2, %ymm2
vpaddw %ymm5, %ymm2, %ymm2 vpaddw %ymm5, %ymm2, %ymm2
vmovdqa %xmm3, 2560(%rsp) vmovdqa %xmm3, 2560(%rsp)
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 32(%rdi) vmovdqa %ymm11, 32(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 288(%rdi) vmovdqa %ymm6, 288(%rdi)
vpand mask_mod2048(%rip), %ymm2, %ymm2
vmovdqa %ymm2, 544(%rdi) vmovdqa %ymm2, 544(%rdi)
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqa %ymm9, 800(%rdi) vmovdqa %ymm9, 800(%rdi)
vmovdqa 32(%rsp), %ymm5 vmovdqa 32(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm4 vpunpcklwd const0(%rip), %ymm5, %ymm4
@ -4828,13 +4775,9 @@ vpor %ymm4, %ymm11, %ymm11
vpaddw 2592(%rsp), %ymm8, %ymm8 vpaddw 2592(%rsp), %ymm8, %ymm8
vpaddw %ymm11, %ymm8, %ymm8 vpaddw %ymm11, %ymm8, %ymm8
vmovdqa %xmm10, 2592(%rsp) vmovdqa %xmm10, 2592(%rsp)
vpand mask_mod2048(%rip), %ymm5, %ymm5
vmovdqa %ymm5, 96(%rdi) vmovdqa %ymm5, 96(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 352(%rdi) vmovdqa %ymm6, 352(%rdi)
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqa %ymm8, 608(%rdi) vmovdqa %ymm8, 608(%rdi)
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqa %ymm3, 864(%rdi) vmovdqa %ymm3, 864(%rdi)
vmovdqa 64(%rsp), %ymm11 vmovdqa 64(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm9 vpunpcklwd const0(%rip), %ymm11, %ymm9
@ -4927,13 +4870,9 @@ vpor %ymm9, %ymm5, %ymm5
vpaddw 2624(%rsp), %ymm4, %ymm4 vpaddw 2624(%rsp), %ymm4, %ymm4
vpaddw %ymm5, %ymm4, %ymm4 vpaddw %ymm5, %ymm4, %ymm4
vmovdqa %xmm2, 2624(%rsp) vmovdqa %xmm2, 2624(%rsp)
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 160(%rdi) vmovdqa %ymm11, 160(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 416(%rdi) vmovdqa %ymm6, 416(%rdi)
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqa %ymm4, 672(%rdi) vmovdqa %ymm4, 672(%rdi)
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqa %ymm10, 928(%rdi) vmovdqa %ymm10, 928(%rdi)
vmovdqa 96(%rsp), %ymm5 vmovdqa 96(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm3 vpunpcklwd const0(%rip), %ymm5, %ymm3
@ -5026,22 +4965,18 @@ vpor %ymm3, %ymm11, %ymm11
vpaddw 2656(%rsp), %ymm9, %ymm9 vpaddw 2656(%rsp), %ymm9, %ymm9
vpaddw %ymm11, %ymm9, %ymm9 vpaddw %ymm11, %ymm9, %ymm9
vmovdqa %xmm8, 2656(%rsp) vmovdqa %xmm8, 2656(%rsp)
vpand mask_mod2048(%rip), %ymm5, %ymm5
vmovdqa %ymm5, 224(%rdi) vmovdqa %ymm5, 224(%rdi)
vextracti128 $1, %ymm5, %xmm5 vextracti128 $1, %ymm5, %xmm5
vpshufb shufmin5_mask3(%rip), %ymm5, %ymm5 vpshufb shufmin5_mask3(%rip), %ymm5, %ymm5
vmovdqa %xmm5, 1792(%rsp) vmovdqa %xmm5, 1792(%rsp)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 480(%rdi) vmovdqa %ymm6, 480(%rdi)
vextracti128 $1, %ymm6, %xmm6 vextracti128 $1, %ymm6, %xmm6
vpshufb shufmin5_mask3(%rip), %ymm6, %ymm6 vpshufb shufmin5_mask3(%rip), %ymm6, %ymm6
vmovdqa %xmm6, 1824(%rsp) vmovdqa %xmm6, 1824(%rsp)
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqa %ymm9, 736(%rdi) vmovdqa %ymm9, 736(%rdi)
vextracti128 $1, %ymm9, %xmm9 vextracti128 $1, %ymm9, %xmm9
vpshufb shufmin5_mask3(%rip), %ymm9, %ymm9 vpshufb shufmin5_mask3(%rip), %ymm9, %ymm9
vmovdqa %xmm9, 1856(%rsp) vmovdqa %xmm9, 1856(%rsp)
vpand mask_mod2048(%rip), %ymm2, %ymm2
vmovdqa %ymm2, 992(%rdi) vmovdqa %ymm2, 992(%rdi)
vextracti128 $1, %ymm2, %xmm2 vextracti128 $1, %ymm2, %xmm2
vpshufb shufmin5_mask3(%rip), %ymm2, %ymm2 vpshufb shufmin5_mask3(%rip), %ymm2, %ymm2
@ -5125,7 +5060,6 @@ vpor %ymm10, %ymm8, %ymm8
vmovdqa 32(%rdi), %ymm10 vmovdqa 32(%rdi), %ymm10
vpaddw 1920(%rsp), %ymm10, %ymm10 vpaddw 1920(%rsp), %ymm10, %ymm10
vpaddw %ymm8, %ymm10, %ymm10 vpaddw %ymm8, %ymm10, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqa %ymm10, 32(%rdi) vmovdqa %ymm10, 32(%rdi)
vmovdqa %xmm7, 1920(%rsp) vmovdqa %xmm7, 1920(%rsp)
vpshufb shuf48_16(%rip), %ymm9, %ymm9 vpshufb shuf48_16(%rip), %ymm9, %ymm9
@ -5155,11 +5089,8 @@ vpor %ymm10, %ymm5, %ymm5
vpaddw 2688(%rsp), %ymm3, %ymm3 vpaddw 2688(%rsp), %ymm3, %ymm3
vpaddw %ymm5, %ymm3, %ymm3 vpaddw %ymm5, %ymm3, %ymm3
vmovdqa %xmm7, 2688(%rsp) vmovdqa %xmm7, 2688(%rsp)
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 288(%rdi) vmovdqa %ymm11, 288(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 544(%rdi) vmovdqa %ymm6, 544(%rdi)
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqa %ymm3, 800(%rdi) vmovdqa %ymm3, 800(%rdi)
vmovdqa 160(%rsp), %ymm5 vmovdqa 160(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm2 vpunpcklwd const0(%rip), %ymm5, %ymm2
@ -5240,7 +5171,6 @@ vpor %ymm2, %ymm7, %ymm7
vmovdqa 96(%rdi), %ymm2 vmovdqa 96(%rdi), %ymm2
vpaddw 1952(%rsp), %ymm2, %ymm2 vpaddw 1952(%rsp), %ymm2, %ymm2
vpaddw %ymm7, %ymm2, %ymm2 vpaddw %ymm7, %ymm2, %ymm2
vpand mask_mod2048(%rip), %ymm2, %ymm2
vmovdqa %ymm2, 96(%rdi) vmovdqa %ymm2, 96(%rdi)
vmovdqa %xmm4, 1952(%rsp) vmovdqa %xmm4, 1952(%rsp)
vpshufb shuf48_16(%rip), %ymm3, %ymm3 vpshufb shuf48_16(%rip), %ymm3, %ymm3
@ -5270,11 +5200,8 @@ vpor %ymm2, %ymm11, %ymm11
vpaddw 2720(%rsp), %ymm10, %ymm10 vpaddw 2720(%rsp), %ymm10, %ymm10
vpaddw %ymm11, %ymm10, %ymm10 vpaddw %ymm11, %ymm10, %ymm10
vmovdqa %xmm4, 2720(%rsp) vmovdqa %xmm4, 2720(%rsp)
vpand mask_mod2048(%rip), %ymm5, %ymm5
vmovdqa %ymm5, 352(%rdi) vmovdqa %ymm5, 352(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 608(%rdi) vmovdqa %ymm6, 608(%rdi)
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqa %ymm10, 864(%rdi) vmovdqa %ymm10, 864(%rdi)
vmovdqa 192(%rsp), %ymm11 vmovdqa 192(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm8 vpunpcklwd const0(%rip), %ymm11, %ymm8
@ -5355,7 +5282,6 @@ vpor %ymm8, %ymm4, %ymm4
vmovdqa 160(%rdi), %ymm8 vmovdqa 160(%rdi), %ymm8
vpaddw 1984(%rsp), %ymm8, %ymm8 vpaddw 1984(%rsp), %ymm8, %ymm8
vpaddw %ymm4, %ymm8, %ymm8 vpaddw %ymm4, %ymm8, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqa %ymm8, 160(%rdi) vmovdqa %ymm8, 160(%rdi)
vmovdqa %xmm9, 1984(%rsp) vmovdqa %xmm9, 1984(%rsp)
vpshufb shuf48_16(%rip), %ymm10, %ymm10 vpshufb shuf48_16(%rip), %ymm10, %ymm10
@ -5385,11 +5311,8 @@ vpor %ymm8, %ymm5, %ymm5
vpaddw 2752(%rsp), %ymm2, %ymm2 vpaddw 2752(%rsp), %ymm2, %ymm2
vpaddw %ymm5, %ymm2, %ymm2 vpaddw %ymm5, %ymm2, %ymm2
vmovdqa %xmm9, 2752(%rsp) vmovdqa %xmm9, 2752(%rsp)
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 416(%rdi) vmovdqa %ymm11, 416(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 672(%rdi) vmovdqa %ymm6, 672(%rdi)
vpand mask_mod2048(%rip), %ymm2, %ymm2
vmovdqa %ymm2, 928(%rdi) vmovdqa %ymm2, 928(%rdi)
vmovdqa 224(%rsp), %ymm5 vmovdqa 224(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm7 vpunpcklwd const0(%rip), %ymm5, %ymm7
@ -5479,7 +5402,6 @@ vpor %ymm7, %ymm9, %ymm9
vmovdqa 224(%rdi), %ymm7 vmovdqa 224(%rdi), %ymm7
vpaddw 2016(%rsp), %ymm7, %ymm7 vpaddw 2016(%rsp), %ymm7, %ymm7
vpaddw %ymm9, %ymm7, %ymm7 vpaddw %ymm9, %ymm7, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqa %ymm7, 224(%rdi) vmovdqa %ymm7, 224(%rdi)
vextracti128 $1, %ymm7, %xmm7 vextracti128 $1, %ymm7, %xmm7
vpshufb shufmin5_mask3(%rip), %ymm7, %ymm7 vpshufb shufmin5_mask3(%rip), %ymm7, %ymm7
@ -5512,113 +5434,86 @@ vpor %ymm7, %ymm11, %ymm11
vpaddw 2784(%rsp), %ymm8, %ymm8 vpaddw 2784(%rsp), %ymm8, %ymm8
vpaddw %ymm11, %ymm8, %ymm8 vpaddw %ymm11, %ymm8, %ymm8
vmovdqa %xmm3, 2784(%rsp) vmovdqa %xmm3, 2784(%rsp)
vpand mask_mod2048(%rip), %ymm5, %ymm5
vmovdqa %ymm5, 480(%rdi) vmovdqa %ymm5, 480(%rdi)
vpand mask_mod2048(%rip), %ymm6, %ymm6
vmovdqa %ymm6, 736(%rdi) vmovdqa %ymm6, 736(%rdi)
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqa %ymm8, 992(%rdi) vmovdqa %ymm8, 992(%rdi)
vmovdqa 0(%rdi), %ymm11 vmovdqa 0(%rdi), %ymm11
vpaddw 1888(%rsp), %ymm11, %ymm11 vpaddw 1888(%rsp), %ymm11, %ymm11
vpaddw 2816(%rsp), %ymm11, %ymm11 vpaddw 2816(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 0(%rdi) vmovdqa %ymm11, 0(%rdi)
vmovdqa 256(%rdi), %ymm11 vmovdqa 256(%rdi), %ymm11
vpaddw 2528(%rsp), %ymm11, %ymm11 vpaddw 2528(%rsp), %ymm11, %ymm11
vpaddw 2848(%rsp), %ymm11, %ymm11 vpaddw 2848(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 256(%rdi) vmovdqa %ymm11, 256(%rdi)
vmovdqa 512(%rdi), %ymm11 vmovdqa 512(%rdi), %ymm11
vpaddw 2784(%rsp), %ymm11, %ymm11 vpaddw 2784(%rsp), %ymm11, %ymm11
vpaddw 2880(%rsp), %ymm11, %ymm11 vpaddw 2880(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 512(%rdi) vmovdqa %ymm11, 512(%rdi)
vmovdqa 64(%rdi), %ymm11 vmovdqa 64(%rdi), %ymm11
vpaddw 2048(%rsp), %ymm11, %ymm11 vpaddw 2048(%rsp), %ymm11, %ymm11
vpaddw 1920(%rsp), %ymm11, %ymm11 vpaddw 1920(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 64(%rdi) vmovdqa %ymm11, 64(%rdi)
vmovdqa 320(%rdi), %ymm11 vmovdqa 320(%rdi), %ymm11
vpaddw 2304(%rsp), %ymm11, %ymm11 vpaddw 2304(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 320(%rdi) vmovdqa %ymm11, 320(%rdi)
vmovdqa 576(%rdi), %ymm11 vmovdqa 576(%rdi), %ymm11
vpaddw 2560(%rsp), %ymm11, %ymm11 vpaddw 2560(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 576(%rdi) vmovdqa %ymm11, 576(%rdi)
vmovdqa 128(%rdi), %ymm11 vmovdqa 128(%rdi), %ymm11
vpaddw 2080(%rsp), %ymm11, %ymm11 vpaddw 2080(%rsp), %ymm11, %ymm11
vpaddw 1952(%rsp), %ymm11, %ymm11 vpaddw 1952(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 128(%rdi) vmovdqa %ymm11, 128(%rdi)
vmovdqa 384(%rdi), %ymm11 vmovdqa 384(%rdi), %ymm11
vpaddw 2336(%rsp), %ymm11, %ymm11 vpaddw 2336(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 384(%rdi) vmovdqa %ymm11, 384(%rdi)
vmovdqa 640(%rdi), %ymm11 vmovdqa 640(%rdi), %ymm11
vpaddw 2592(%rsp), %ymm11, %ymm11 vpaddw 2592(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 640(%rdi) vmovdqa %ymm11, 640(%rdi)
vmovdqa 192(%rdi), %ymm11 vmovdqa 192(%rdi), %ymm11
vpaddw 2112(%rsp), %ymm11, %ymm11 vpaddw 2112(%rsp), %ymm11, %ymm11
vpaddw 1984(%rsp), %ymm11, %ymm11 vpaddw 1984(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 192(%rdi) vmovdqa %ymm11, 192(%rdi)
vmovdqa 448(%rdi), %ymm11 vmovdqa 448(%rdi), %ymm11
vpaddw 2368(%rsp), %ymm11, %ymm11 vpaddw 2368(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 448(%rdi) vmovdqa %ymm11, 448(%rdi)
vmovdqa 704(%rdi), %ymm11 vmovdqa 704(%rdi), %ymm11
vpaddw 2624(%rsp), %ymm11, %ymm11 vpaddw 2624(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 704(%rdi) vmovdqa %ymm11, 704(%rdi)
vmovdqa 256(%rdi), %ymm11 vmovdqa 256(%rdi), %ymm11
vpaddw 2144(%rsp), %ymm11, %ymm11 vpaddw 2144(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 256(%rdi) vmovdqa %ymm11, 256(%rdi)
vmovdqa 512(%rdi), %ymm11 vmovdqa 512(%rdi), %ymm11
vpaddw 2400(%rsp), %ymm11, %ymm11 vpaddw 2400(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 512(%rdi) vmovdqa %ymm11, 512(%rdi)
vmovdqa 768(%rdi), %ymm11 vmovdqa 768(%rdi), %ymm11
vpaddw 2656(%rsp), %ymm11, %ymm11 vpaddw 2656(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 768(%rdi) vmovdqa %ymm11, 768(%rdi)
vmovdqa 320(%rdi), %ymm11 vmovdqa 320(%rdi), %ymm11
vpaddw 2176(%rsp), %ymm11, %ymm11 vpaddw 2176(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 320(%rdi) vmovdqa %ymm11, 320(%rdi)
vmovdqa 576(%rdi), %ymm11 vmovdqa 576(%rdi), %ymm11
vpaddw 2432(%rsp), %ymm11, %ymm11 vpaddw 2432(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 576(%rdi) vmovdqa %ymm11, 576(%rdi)
vmovdqa 832(%rdi), %ymm11 vmovdqa 832(%rdi), %ymm11
vpaddw 2688(%rsp), %ymm11, %ymm11 vpaddw 2688(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 832(%rdi) vmovdqa %ymm11, 832(%rdi)
vmovdqa 384(%rdi), %ymm11 vmovdqa 384(%rdi), %ymm11
vpaddw 2208(%rsp), %ymm11, %ymm11 vpaddw 2208(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 384(%rdi) vmovdqa %ymm11, 384(%rdi)
vmovdqa 640(%rdi), %ymm11 vmovdqa 640(%rdi), %ymm11
vpaddw 2464(%rsp), %ymm11, %ymm11 vpaddw 2464(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 640(%rdi) vmovdqa %ymm11, 640(%rdi)
vmovdqa 896(%rdi), %ymm11 vmovdqa 896(%rdi), %ymm11
vpaddw 2720(%rsp), %ymm11, %ymm11 vpaddw 2720(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 896(%rdi) vmovdqa %ymm11, 896(%rdi)
vmovdqa 448(%rdi), %ymm11 vmovdqa 448(%rdi), %ymm11
vpaddw 2240(%rsp), %ymm11, %ymm11 vpaddw 2240(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 448(%rdi) vmovdqa %ymm11, 448(%rdi)
vmovdqa 704(%rdi), %ymm11 vmovdqa 704(%rdi), %ymm11
vpaddw 2496(%rsp), %ymm11, %ymm11 vpaddw 2496(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 704(%rdi) vmovdqa %ymm11, 704(%rdi)
vmovdqa 960(%rdi), %ymm11 vmovdqa 960(%rdi), %ymm11
vpaddw 2752(%rsp), %ymm11, %ymm11 vpaddw 2752(%rsp), %ymm11, %ymm11
vpand mask_mod2048(%rip), %ymm11, %ymm11
vmovdqa %ymm11, 960(%rdi) vmovdqa %ymm11, 960(%rdi)
mov %r8, %rsp mov %r8, %rsp
pop %r12 pop %r12

View File

@ -4,12 +4,9 @@
#include "params.h" #include "params.h"
#include "poly.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, void PQCLEAN_NTRUHPS2048509_CLEAN_owcpa_keypair(unsigned char *pk,
unsigned char *sk, 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, void PQCLEAN_NTRUHPS2048509_CLEAN_owcpa_enc(unsigned char *c,
const poly *r, const poly *r,

View File

@ -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) { 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); 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); PQCLEAN_NTRUHPS2048509_CLEAN_poly_mod_3_Phi_n(r);
} }

View File

@ -1,15 +1,284 @@
#include "poly.h" #include "poly.h"
void PQCLEAN_NTRUHPS2048509_CLEAN_poly_Rq_mul(poly *r, const poly *a, const poly *b) { /* Polynomial multiplication using */
int k, i; /* Toom-4 and two layers of Karatsuba. */
for (k = 0; k < NTRU_N; k++) { #define L PAD32(NTRU_N)
r->coeffs[k] = 0; #define M (L/4)
for (i = 1; i < NTRU_N - k; i++) { #define K (L/16)
r->coeffs[k] += a->coeffs[k + i] * b->coeffs[NTRU_N - i];
} static void toom4_k2x2_mul(uint16_t ab[2 * L], const uint16_t a[L], const uint16_t b[L]);
for (i = 0; i < k + 1; i++) {
r->coeffs[k] += a->coeffs[k - i] * b->coeffs[i]; 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) {
size_t i;
uint16_t ab[2 * L];
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];
}
}

View File

@ -23,9 +23,9 @@ auxiliary-submitters:
- Zhenfei Zhang - Zhenfei Zhang
implementations: implementations:
- name: clean - name: clean
version: https://github.com/jschanck/ntru/tree/6d1f44f5 reference implementation version: https://github.com/jschanck/ntru/tree/60cc7277 reference implementation
- name: avx2 - name: avx2
version: https://github.com/jschanck/ntru/tree/6d1f44f5 avx2 implementation version: https://github.com/jschanck/ntru/tree/60cc7277 avx2 implementation
supported_platforms: supported_platforms:
- architecture: x86_64 - architecture: x86_64
operating_systems: operating_systems:

View File

@ -4,12 +4,9 @@
#include "params.h" #include "params.h"
#include "poly.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, void PQCLEAN_NTRUHPS2048677_AVX2_owcpa_keypair(unsigned char *pk,
unsigned char *sk, 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, void PQCLEAN_NTRUHPS2048677_AVX2_owcpa_enc(unsigned char *c,
const poly *r, const poly *r,

View File

@ -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) { 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); 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); PQCLEAN_NTRUHPS2048677_AVX2_poly_mod_3_Phi_n(r);
} }

View File

@ -237,23 +237,6 @@ mask_15_1:
.word 65535 .word 65535
.word 65535 .word 65535
.word 0 .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 .text
.global PQCLEAN_NTRUHPS2048677_AVX2_poly_Rq_mul .global PQCLEAN_NTRUHPS2048677_AVX2_poly_Rq_mul
.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 vpsubw %ymm8, %ymm6, %ymm6
vmovdqu 0(%rdi), %ymm9 vmovdqu 0(%rdi), %ymm9
vpaddw %ymm9, %ymm11, %ymm9 vpaddw %ymm9, %ymm11, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 0(%rdi) vmovdqu %ymm9, 0(%rdi)
vmovdqu 352(%rdi), %ymm9 vmovdqu 352(%rdi), %ymm9
vpaddw %ymm9, %ymm6, %ymm9 vpaddw %ymm9, %ymm6, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 352(%rdi) vmovdqu %ymm9, 352(%rdi)
vmovdqu 704(%rdi), %ymm9 vmovdqu 704(%rdi), %ymm9
vpaddw %ymm9, %ymm3, %ymm9 vpaddw %ymm9, %ymm3, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 704(%rdi) vmovdqu %ymm9, 704(%rdi)
vmovdqu 1056(%rdi), %ymm9 vmovdqu 1056(%rdi), %ymm9
vpaddw %ymm9, %ymm4, %ymm9 vpaddw %ymm9, %ymm4, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 1056(%rdi) vmovdqu %ymm9, 1056(%rdi)
vmovdqu 54(%rdi), %ymm9 vmovdqu 54(%rdi), %ymm9
vpaddw %ymm9, %ymm7, %ymm9 vpaddw %ymm9, %ymm7, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 54(%rdi) vmovdqu %ymm9, 54(%rdi)
vmovdqu 406(%rdi), %ymm9 vmovdqu 406(%rdi), %ymm9
vpaddw %ymm9, %ymm8, %ymm9 vpaddw %ymm9, %ymm8, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 406(%rdi) vmovdqu %ymm9, 406(%rdi)
vmovdqu 758(%rdi), %ymm9 vmovdqu 758(%rdi), %ymm9
vpaddw %ymm9, %ymm5, %ymm9 vpaddw %ymm9, %ymm5, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 758(%rdi) vmovdqu %ymm9, 758(%rdi)
vmovdqa 32(%rsp), %ymm5 vmovdqa 32(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm8 vpunpcklwd const0(%rip), %ymm5, %ymm8
@ -5231,31 +5207,24 @@ vpmullw %ymm13, %ymm4, %ymm4
vpsubw %ymm4, %ymm6, %ymm6 vpsubw %ymm4, %ymm6, %ymm6
vmovdqu 88(%rdi), %ymm7 vmovdqu 88(%rdi), %ymm7
vpaddw %ymm7, %ymm5, %ymm7 vpaddw %ymm7, %ymm5, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 88(%rdi) vmovdqu %ymm7, 88(%rdi)
vmovdqu 440(%rdi), %ymm7 vmovdqu 440(%rdi), %ymm7
vpaddw %ymm7, %ymm6, %ymm7 vpaddw %ymm7, %ymm6, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 440(%rdi) vmovdqu %ymm7, 440(%rdi)
vmovdqu 792(%rdi), %ymm7 vmovdqu 792(%rdi), %ymm7
vpaddw %ymm7, %ymm10, %ymm7 vpaddw %ymm7, %ymm10, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 792(%rdi) vmovdqu %ymm7, 792(%rdi)
vmovdqu 1144(%rdi), %ymm7 vmovdqu 1144(%rdi), %ymm7
vpaddw %ymm7, %ymm9, %ymm7 vpaddw %ymm7, %ymm9, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 1144(%rdi) vmovdqu %ymm7, 1144(%rdi)
vmovdqu 142(%rdi), %ymm7 vmovdqu 142(%rdi), %ymm7
vpaddw %ymm7, %ymm3, %ymm7 vpaddw %ymm7, %ymm3, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 142(%rdi) vmovdqu %ymm7, 142(%rdi)
vmovdqu 494(%rdi), %ymm7 vmovdqu 494(%rdi), %ymm7
vpaddw %ymm7, %ymm4, %ymm7 vpaddw %ymm7, %ymm4, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 494(%rdi) vmovdqu %ymm7, 494(%rdi)
vmovdqu 846(%rdi), %ymm7 vmovdqu 846(%rdi), %ymm7
vpaddw %ymm7, %ymm11, %ymm7 vpaddw %ymm7, %ymm11, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 846(%rdi) vmovdqu %ymm7, 846(%rdi)
vmovdqa 64(%rsp), %ymm11 vmovdqa 64(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm4 vpunpcklwd const0(%rip), %ymm11, %ymm4
@ -5323,31 +5292,24 @@ vpmullw %ymm13, %ymm9, %ymm9
vpsubw %ymm9, %ymm6, %ymm6 vpsubw %ymm9, %ymm6, %ymm6
vmovdqu 176(%rdi), %ymm3 vmovdqu 176(%rdi), %ymm3
vpaddw %ymm3, %ymm11, %ymm3 vpaddw %ymm3, %ymm11, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 176(%rdi) vmovdqu %ymm3, 176(%rdi)
vmovdqu 528(%rdi), %ymm3 vmovdqu 528(%rdi), %ymm3
vpaddw %ymm3, %ymm6, %ymm3 vpaddw %ymm3, %ymm6, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 528(%rdi) vmovdqu %ymm3, 528(%rdi)
vmovdqu 880(%rdi), %ymm3 vmovdqu 880(%rdi), %ymm3
vpaddw %ymm3, %ymm8, %ymm3 vpaddw %ymm3, %ymm8, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 880(%rdi) vmovdqu %ymm3, 880(%rdi)
vmovdqu 1232(%rdi), %ymm3 vmovdqu 1232(%rdi), %ymm3
vpaddw %ymm3, %ymm7, %ymm3 vpaddw %ymm3, %ymm7, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 1232(%rdi) vmovdqu %ymm3, 1232(%rdi)
vmovdqu 230(%rdi), %ymm3 vmovdqu 230(%rdi), %ymm3
vpaddw %ymm3, %ymm10, %ymm3 vpaddw %ymm3, %ymm10, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 230(%rdi) vmovdqu %ymm3, 230(%rdi)
vmovdqu 582(%rdi), %ymm3 vmovdqu 582(%rdi), %ymm3
vpaddw %ymm3, %ymm9, %ymm3 vpaddw %ymm3, %ymm9, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 582(%rdi) vmovdqu %ymm3, 582(%rdi)
vmovdqu 934(%rdi), %ymm3 vmovdqu 934(%rdi), %ymm3
vpaddw %ymm3, %ymm5, %ymm3 vpaddw %ymm3, %ymm5, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 934(%rdi) vmovdqu %ymm3, 934(%rdi)
vmovdqa 96(%rsp), %ymm5 vmovdqa 96(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm9 vpunpcklwd const0(%rip), %ymm5, %ymm9
@ -5415,31 +5377,24 @@ vpmullw %ymm13, %ymm7, %ymm7
vpsubw %ymm7, %ymm6, %ymm6 vpsubw %ymm7, %ymm6, %ymm6
vmovdqu 264(%rdi), %ymm10 vmovdqu 264(%rdi), %ymm10
vpaddw %ymm10, %ymm5, %ymm10 vpaddw %ymm10, %ymm5, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 264(%rdi) vmovdqu %ymm10, 264(%rdi)
vmovdqu 616(%rdi), %ymm10 vmovdqu 616(%rdi), %ymm10
vpaddw %ymm10, %ymm6, %ymm10 vpaddw %ymm10, %ymm6, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 616(%rdi) vmovdqu %ymm10, 616(%rdi)
vmovdqu 968(%rdi), %ymm10 vmovdqu 968(%rdi), %ymm10
vpaddw %ymm10, %ymm4, %ymm10 vpaddw %ymm10, %ymm4, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 968(%rdi) vmovdqu %ymm10, 968(%rdi)
vmovdqu 1320(%rdi), %ymm10 vmovdqu 1320(%rdi), %ymm10
vpaddw %ymm10, %ymm3, %ymm10 vpaddw %ymm10, %ymm3, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 1320(%rdi) vmovdqu %ymm10, 1320(%rdi)
vmovdqu 318(%rdi), %ymm10 vmovdqu 318(%rdi), %ymm10
vpaddw %ymm10, %ymm8, %ymm10 vpaddw %ymm10, %ymm8, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 318(%rdi) vmovdqu %ymm10, 318(%rdi)
vmovdqu 670(%rdi), %ymm10 vmovdqu 670(%rdi), %ymm10
vpaddw %ymm10, %ymm7, %ymm10 vpaddw %ymm10, %ymm7, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 670(%rdi) vmovdqu %ymm10, 670(%rdi)
vmovdqu 1022(%rdi), %ymm10 vmovdqu 1022(%rdi), %ymm10
vpaddw %ymm10, %ymm11, %ymm10 vpaddw %ymm10, %ymm11, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 1022(%rdi) vmovdqu %ymm10, 1022(%rdi)
vmovdqa 128(%rsp), %ymm11 vmovdqa 128(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm7 vpunpcklwd const0(%rip), %ymm11, %ymm7
@ -5507,31 +5462,24 @@ vpmullw %ymm13, %ymm3, %ymm3
vpsubw %ymm3, %ymm6, %ymm6 vpsubw %ymm3, %ymm6, %ymm6
vmovdqu 352(%rdi), %ymm8 vmovdqu 352(%rdi), %ymm8
vpaddw %ymm8, %ymm11, %ymm8 vpaddw %ymm8, %ymm11, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 352(%rdi) vmovdqu %ymm8, 352(%rdi)
vmovdqu 704(%rdi), %ymm8 vmovdqu 704(%rdi), %ymm8
vpaddw %ymm8, %ymm6, %ymm8 vpaddw %ymm8, %ymm6, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 704(%rdi) vmovdqu %ymm8, 704(%rdi)
vmovdqu 1056(%rdi), %ymm8 vmovdqu 1056(%rdi), %ymm8
vpaddw %ymm8, %ymm9, %ymm8 vpaddw %ymm8, %ymm9, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 1056(%rdi) vmovdqu %ymm8, 1056(%rdi)
vmovdqu 54(%rdi), %ymm8 vmovdqu 54(%rdi), %ymm8
vpaddw %ymm8, %ymm10, %ymm8 vpaddw %ymm8, %ymm10, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 54(%rdi) vmovdqu %ymm8, 54(%rdi)
vmovdqu 406(%rdi), %ymm8 vmovdqu 406(%rdi), %ymm8
vpaddw %ymm8, %ymm4, %ymm8 vpaddw %ymm8, %ymm4, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 406(%rdi) vmovdqu %ymm8, 406(%rdi)
vmovdqu 758(%rdi), %ymm8 vmovdqu 758(%rdi), %ymm8
vpaddw %ymm8, %ymm3, %ymm8 vpaddw %ymm8, %ymm3, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 758(%rdi) vmovdqu %ymm8, 758(%rdi)
vmovdqu 1110(%rdi), %ymm8 vmovdqu 1110(%rdi), %ymm8
vpaddw %ymm8, %ymm5, %ymm8 vpaddw %ymm8, %ymm5, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 1110(%rdi) vmovdqu %ymm8, 1110(%rdi)
vmovdqa 160(%rsp), %ymm5 vmovdqa 160(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm3 vpunpcklwd const0(%rip), %ymm5, %ymm3
@ -5599,31 +5547,24 @@ vpmullw %ymm13, %ymm10, %ymm10
vpsubw %ymm10, %ymm6, %ymm6 vpsubw %ymm10, %ymm6, %ymm6
vmovdqu 440(%rdi), %ymm4 vmovdqu 440(%rdi), %ymm4
vpaddw %ymm4, %ymm5, %ymm4 vpaddw %ymm4, %ymm5, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 440(%rdi) vmovdqu %ymm4, 440(%rdi)
vmovdqu 792(%rdi), %ymm4 vmovdqu 792(%rdi), %ymm4
vpaddw %ymm4, %ymm6, %ymm4 vpaddw %ymm4, %ymm6, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 792(%rdi) vmovdqu %ymm4, 792(%rdi)
vmovdqu 1144(%rdi), %ymm4 vmovdqu 1144(%rdi), %ymm4
vpaddw %ymm4, %ymm7, %ymm4 vpaddw %ymm4, %ymm7, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 1144(%rdi) vmovdqu %ymm4, 1144(%rdi)
vmovdqu 142(%rdi), %ymm4 vmovdqu 142(%rdi), %ymm4
vpaddw %ymm4, %ymm8, %ymm4 vpaddw %ymm4, %ymm8, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 142(%rdi) vmovdqu %ymm4, 142(%rdi)
vmovdqu 494(%rdi), %ymm4 vmovdqu 494(%rdi), %ymm4
vpaddw %ymm4, %ymm9, %ymm4 vpaddw %ymm4, %ymm9, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 494(%rdi) vmovdqu %ymm4, 494(%rdi)
vmovdqu 846(%rdi), %ymm4 vmovdqu 846(%rdi), %ymm4
vpaddw %ymm4, %ymm10, %ymm4 vpaddw %ymm4, %ymm10, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 846(%rdi) vmovdqu %ymm4, 846(%rdi)
vmovdqu 1198(%rdi), %ymm4 vmovdqu 1198(%rdi), %ymm4
vpaddw %ymm4, %ymm11, %ymm4 vpaddw %ymm4, %ymm11, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 1198(%rdi) vmovdqu %ymm4, 1198(%rdi)
vmovdqa 192(%rsp), %ymm11 vmovdqa 192(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm10 vpunpcklwd const0(%rip), %ymm11, %ymm10
@ -5691,31 +5632,24 @@ vpmullw %ymm13, %ymm8, %ymm8
vpsubw %ymm8, %ymm6, %ymm6 vpsubw %ymm8, %ymm6, %ymm6
vmovdqu 528(%rdi), %ymm9 vmovdqu 528(%rdi), %ymm9
vpaddw %ymm9, %ymm11, %ymm9 vpaddw %ymm9, %ymm11, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 528(%rdi) vmovdqu %ymm9, 528(%rdi)
vmovdqu 880(%rdi), %ymm9 vmovdqu 880(%rdi), %ymm9
vpaddw %ymm9, %ymm6, %ymm9 vpaddw %ymm9, %ymm6, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 880(%rdi) vmovdqu %ymm9, 880(%rdi)
vmovdqu 1232(%rdi), %ymm9 vmovdqu 1232(%rdi), %ymm9
vpaddw %ymm9, %ymm3, %ymm9 vpaddw %ymm9, %ymm3, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 1232(%rdi) vmovdqu %ymm9, 1232(%rdi)
vmovdqu 230(%rdi), %ymm9 vmovdqu 230(%rdi), %ymm9
vpaddw %ymm9, %ymm4, %ymm9 vpaddw %ymm9, %ymm4, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 230(%rdi) vmovdqu %ymm9, 230(%rdi)
vmovdqu 582(%rdi), %ymm9 vmovdqu 582(%rdi), %ymm9
vpaddw %ymm9, %ymm7, %ymm9 vpaddw %ymm9, %ymm7, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 582(%rdi) vmovdqu %ymm9, 582(%rdi)
vmovdqu 934(%rdi), %ymm9 vmovdqu 934(%rdi), %ymm9
vpaddw %ymm9, %ymm8, %ymm9 vpaddw %ymm9, %ymm8, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 934(%rdi) vmovdqu %ymm9, 934(%rdi)
vmovdqu 1286(%rdi), %ymm9 vmovdqu 1286(%rdi), %ymm9
vpaddw %ymm9, %ymm5, %ymm9 vpaddw %ymm9, %ymm5, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 1286(%rdi) vmovdqu %ymm9, 1286(%rdi)
vmovdqa 224(%rsp), %ymm5 vmovdqa 224(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm8 vpunpcklwd const0(%rip), %ymm5, %ymm8
@ -5783,31 +5717,24 @@ vpmullw %ymm13, %ymm4, %ymm4
vpsubw %ymm4, %ymm6, %ymm6 vpsubw %ymm4, %ymm6, %ymm6
vmovdqu 616(%rdi), %ymm7 vmovdqu 616(%rdi), %ymm7
vpaddw %ymm7, %ymm5, %ymm7 vpaddw %ymm7, %ymm5, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 616(%rdi) vmovdqu %ymm7, 616(%rdi)
vmovdqu 968(%rdi), %ymm7 vmovdqu 968(%rdi), %ymm7
vpaddw %ymm7, %ymm6, %ymm7 vpaddw %ymm7, %ymm6, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 968(%rdi) vmovdqu %ymm7, 968(%rdi)
vmovdqu 1320(%rdi), %ymm7 vmovdqu 1320(%rdi), %ymm7
vpaddw %ymm7, %ymm10, %ymm7 vpaddw %ymm7, %ymm10, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 1320(%rdi) vmovdqu %ymm7, 1320(%rdi)
vmovdqu 318(%rdi), %ymm7 vmovdqu 318(%rdi), %ymm7
vpaddw %ymm7, %ymm9, %ymm7 vpaddw %ymm7, %ymm9, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 318(%rdi) vmovdqu %ymm7, 318(%rdi)
vmovdqu 670(%rdi), %ymm7 vmovdqu 670(%rdi), %ymm7
vpaddw %ymm7, %ymm3, %ymm7 vpaddw %ymm7, %ymm3, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 670(%rdi) vmovdqu %ymm7, 670(%rdi)
vmovdqu 1022(%rdi), %ymm7 vmovdqu 1022(%rdi), %ymm7
vpaddw %ymm7, %ymm4, %ymm7 vpaddw %ymm7, %ymm4, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 1022(%rdi) vmovdqu %ymm7, 1022(%rdi)
vmovdqu 1374(%rdi), %ymm7 vmovdqu 1374(%rdi), %ymm7
vpaddw %ymm7, %ymm11, %ymm7 vpaddw %ymm7, %ymm11, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 1374(%rdi) vmovdqu %ymm7, 1374(%rdi)
vmovdqa 128(%r12), %ymm0 vmovdqa 128(%r12), %ymm0
vpsubw 224(%r12), %ymm0, %ymm0 vpsubw 224(%r12), %ymm0, %ymm0
@ -6176,31 +6103,24 @@ vpmullw %ymm13, %ymm9, %ymm9
vpsubw %ymm9, %ymm6, %ymm6 vpsubw %ymm9, %ymm6, %ymm6
vmovdqu 32(%rdi), %ymm3 vmovdqu 32(%rdi), %ymm3
vpaddw %ymm3, %ymm11, %ymm3 vpaddw %ymm3, %ymm11, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 32(%rdi) vmovdqu %ymm3, 32(%rdi)
vmovdqu 384(%rdi), %ymm3 vmovdqu 384(%rdi), %ymm3
vpaddw %ymm3, %ymm6, %ymm3 vpaddw %ymm3, %ymm6, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 384(%rdi) vmovdqu %ymm3, 384(%rdi)
vmovdqu 736(%rdi), %ymm3 vmovdqu 736(%rdi), %ymm3
vpaddw %ymm3, %ymm8, %ymm3 vpaddw %ymm3, %ymm8, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 736(%rdi) vmovdqu %ymm3, 736(%rdi)
vmovdqu 1088(%rdi), %ymm3 vmovdqu 1088(%rdi), %ymm3
vpaddw %ymm3, %ymm7, %ymm3 vpaddw %ymm3, %ymm7, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 1088(%rdi) vmovdqu %ymm3, 1088(%rdi)
vmovdqu 86(%rdi), %ymm3 vmovdqu 86(%rdi), %ymm3
vpaddw %ymm3, %ymm10, %ymm3 vpaddw %ymm3, %ymm10, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 86(%rdi) vmovdqu %ymm3, 86(%rdi)
vmovdqu 438(%rdi), %ymm3 vmovdqu 438(%rdi), %ymm3
vpaddw %ymm3, %ymm9, %ymm3 vpaddw %ymm3, %ymm9, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 438(%rdi) vmovdqu %ymm3, 438(%rdi)
vmovdqu 790(%rdi), %ymm3 vmovdqu 790(%rdi), %ymm3
vpaddw %ymm3, %ymm5, %ymm3 vpaddw %ymm3, %ymm5, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 790(%rdi) vmovdqu %ymm3, 790(%rdi)
vmovdqa 32(%rsp), %ymm5 vmovdqa 32(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm9 vpunpcklwd const0(%rip), %ymm5, %ymm9
@ -6268,31 +6188,24 @@ vpmullw %ymm13, %ymm7, %ymm7
vpsubw %ymm7, %ymm6, %ymm6 vpsubw %ymm7, %ymm6, %ymm6
vmovdqu 120(%rdi), %ymm10 vmovdqu 120(%rdi), %ymm10
vpaddw %ymm10, %ymm5, %ymm10 vpaddw %ymm10, %ymm5, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 120(%rdi) vmovdqu %ymm10, 120(%rdi)
vmovdqu 472(%rdi), %ymm10 vmovdqu 472(%rdi), %ymm10
vpaddw %ymm10, %ymm6, %ymm10 vpaddw %ymm10, %ymm6, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 472(%rdi) vmovdqu %ymm10, 472(%rdi)
vmovdqu 824(%rdi), %ymm10 vmovdqu 824(%rdi), %ymm10
vpaddw %ymm10, %ymm4, %ymm10 vpaddw %ymm10, %ymm4, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 824(%rdi) vmovdqu %ymm10, 824(%rdi)
vmovdqu 1176(%rdi), %ymm10 vmovdqu 1176(%rdi), %ymm10
vpaddw %ymm10, %ymm3, %ymm10 vpaddw %ymm10, %ymm3, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 1176(%rdi) vmovdqu %ymm10, 1176(%rdi)
vmovdqu 174(%rdi), %ymm10 vmovdqu 174(%rdi), %ymm10
vpaddw %ymm10, %ymm8, %ymm10 vpaddw %ymm10, %ymm8, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 174(%rdi) vmovdqu %ymm10, 174(%rdi)
vmovdqu 526(%rdi), %ymm10 vmovdqu 526(%rdi), %ymm10
vpaddw %ymm10, %ymm7, %ymm10 vpaddw %ymm10, %ymm7, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 526(%rdi) vmovdqu %ymm10, 526(%rdi)
vmovdqu 878(%rdi), %ymm10 vmovdqu 878(%rdi), %ymm10
vpaddw %ymm10, %ymm11, %ymm10 vpaddw %ymm10, %ymm11, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 878(%rdi) vmovdqu %ymm10, 878(%rdi)
vmovdqa 64(%rsp), %ymm11 vmovdqa 64(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm7 vpunpcklwd const0(%rip), %ymm11, %ymm7
@ -6360,31 +6273,24 @@ vpmullw %ymm13, %ymm3, %ymm3
vpsubw %ymm3, %ymm6, %ymm6 vpsubw %ymm3, %ymm6, %ymm6
vmovdqu 208(%rdi), %ymm8 vmovdqu 208(%rdi), %ymm8
vpaddw %ymm8, %ymm11, %ymm8 vpaddw %ymm8, %ymm11, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 208(%rdi) vmovdqu %ymm8, 208(%rdi)
vmovdqu 560(%rdi), %ymm8 vmovdqu 560(%rdi), %ymm8
vpaddw %ymm8, %ymm6, %ymm8 vpaddw %ymm8, %ymm6, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 560(%rdi) vmovdqu %ymm8, 560(%rdi)
vmovdqu 912(%rdi), %ymm8 vmovdqu 912(%rdi), %ymm8
vpaddw %ymm8, %ymm9, %ymm8 vpaddw %ymm8, %ymm9, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 912(%rdi) vmovdqu %ymm8, 912(%rdi)
vmovdqu 1264(%rdi), %ymm8 vmovdqu 1264(%rdi), %ymm8
vpaddw %ymm8, %ymm10, %ymm8 vpaddw %ymm8, %ymm10, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 1264(%rdi) vmovdqu %ymm8, 1264(%rdi)
vmovdqu 262(%rdi), %ymm8 vmovdqu 262(%rdi), %ymm8
vpaddw %ymm8, %ymm4, %ymm8 vpaddw %ymm8, %ymm4, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 262(%rdi) vmovdqu %ymm8, 262(%rdi)
vmovdqu 614(%rdi), %ymm8 vmovdqu 614(%rdi), %ymm8
vpaddw %ymm8, %ymm3, %ymm8 vpaddw %ymm8, %ymm3, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 614(%rdi) vmovdqu %ymm8, 614(%rdi)
vmovdqu 966(%rdi), %ymm8 vmovdqu 966(%rdi), %ymm8
vpaddw %ymm8, %ymm5, %ymm8 vpaddw %ymm8, %ymm5, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 966(%rdi) vmovdqu %ymm8, 966(%rdi)
vmovdqa 96(%rsp), %ymm5 vmovdqa 96(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm3 vpunpcklwd const0(%rip), %ymm5, %ymm3
@ -6452,20 +6358,16 @@ vpmullw %ymm13, %ymm10, %ymm10
vpsubw %ymm10, %ymm6, %ymm6 vpsubw %ymm10, %ymm6, %ymm6
vmovdqu 296(%rdi), %ymm4 vmovdqu 296(%rdi), %ymm4
vpaddw %ymm4, %ymm5, %ymm4 vpaddw %ymm4, %ymm5, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 296(%rdi) vmovdqu %ymm4, 296(%rdi)
vmovdqu 648(%rdi), %ymm4 vmovdqu 648(%rdi), %ymm4
vpaddw %ymm4, %ymm6, %ymm4 vpaddw %ymm4, %ymm6, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 648(%rdi) vmovdqu %ymm4, 648(%rdi)
vmovdqu 1000(%rdi), %ymm4 vmovdqu 1000(%rdi), %ymm4
vpaddw %ymm4, %ymm7, %ymm4 vpaddw %ymm4, %ymm7, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 1000(%rdi) vmovdqu %ymm4, 1000(%rdi)
vmovdqu 1352(%rdi), %ymm4 vmovdqu 1352(%rdi), %ymm4
vpand mask_1_15(%rip), %ymm8, %ymm3 vpand mask_1_15(%rip), %ymm8, %ymm3
vpaddw %ymm4, %ymm3, %ymm4 vpaddw %ymm4, %ymm3, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 1352(%rdi) vmovdqu %ymm4, 1352(%rdi)
vpshufb rol_rol_16(%rip), %ymm8, %ymm8 vpshufb rol_rol_16(%rip), %ymm8, %ymm8
vpermq $216, %ymm8, %ymm8 vpermq $216, %ymm8, %ymm8
@ -6474,19 +6376,15 @@ vpermq $216, %ymm8, %ymm8
vpand mask_15_1(%rip), %ymm8, %ymm8 vpand mask_15_1(%rip), %ymm8, %ymm8
vmovdqu 0(%rdi), %ymm4 vmovdqu 0(%rdi), %ymm4
vpaddw %ymm4, %ymm8, %ymm4 vpaddw %ymm4, %ymm8, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 0(%rdi) vmovdqu %ymm4, 0(%rdi)
vmovdqu 350(%rdi), %ymm4 vmovdqu 350(%rdi), %ymm4
vpaddw %ymm4, %ymm9, %ymm4 vpaddw %ymm4, %ymm9, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 350(%rdi) vmovdqu %ymm4, 350(%rdi)
vmovdqu 702(%rdi), %ymm4 vmovdqu 702(%rdi), %ymm4
vpaddw %ymm4, %ymm10, %ymm4 vpaddw %ymm4, %ymm10, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 702(%rdi) vmovdqu %ymm4, 702(%rdi)
vmovdqu 1054(%rdi), %ymm4 vmovdqu 1054(%rdi), %ymm4
vpaddw %ymm4, %ymm11, %ymm4 vpaddw %ymm4, %ymm11, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 1054(%rdi) vmovdqu %ymm4, 1054(%rdi)
vmovdqa 128(%rsp), %ymm11 vmovdqa 128(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm10 vpunpcklwd const0(%rip), %ymm11, %ymm10
@ -6554,31 +6452,24 @@ vpmullw %ymm13, %ymm8, %ymm8
vpsubw %ymm8, %ymm6, %ymm6 vpsubw %ymm8, %ymm6, %ymm6
vmovdqu 384(%rdi), %ymm9 vmovdqu 384(%rdi), %ymm9
vpaddw %ymm9, %ymm11, %ymm9 vpaddw %ymm9, %ymm11, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 384(%rdi) vmovdqu %ymm9, 384(%rdi)
vmovdqu 736(%rdi), %ymm9 vmovdqu 736(%rdi), %ymm9
vpaddw %ymm9, %ymm6, %ymm9 vpaddw %ymm9, %ymm6, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 736(%rdi) vmovdqu %ymm9, 736(%rdi)
vmovdqu 1088(%rdi), %ymm9 vmovdqu 1088(%rdi), %ymm9
vpaddw %ymm9, %ymm3, %ymm9 vpaddw %ymm9, %ymm3, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 1088(%rdi) vmovdqu %ymm9, 1088(%rdi)
vmovdqu 86(%rdi), %ymm9 vmovdqu 86(%rdi), %ymm9
vpaddw %ymm9, %ymm4, %ymm9 vpaddw %ymm9, %ymm4, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 86(%rdi) vmovdqu %ymm9, 86(%rdi)
vmovdqu 438(%rdi), %ymm9 vmovdqu 438(%rdi), %ymm9
vpaddw %ymm9, %ymm7, %ymm9 vpaddw %ymm9, %ymm7, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 438(%rdi) vmovdqu %ymm9, 438(%rdi)
vmovdqu 790(%rdi), %ymm9 vmovdqu 790(%rdi), %ymm9
vpaddw %ymm9, %ymm8, %ymm9 vpaddw %ymm9, %ymm8, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 790(%rdi) vmovdqu %ymm9, 790(%rdi)
vmovdqu 1142(%rdi), %ymm9 vmovdqu 1142(%rdi), %ymm9
vpaddw %ymm9, %ymm5, %ymm9 vpaddw %ymm9, %ymm5, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 1142(%rdi) vmovdqu %ymm9, 1142(%rdi)
vmovdqa 160(%rsp), %ymm5 vmovdqa 160(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm8 vpunpcklwd const0(%rip), %ymm5, %ymm8
@ -6646,31 +6537,24 @@ vpmullw %ymm13, %ymm4, %ymm4
vpsubw %ymm4, %ymm6, %ymm6 vpsubw %ymm4, %ymm6, %ymm6
vmovdqu 472(%rdi), %ymm7 vmovdqu 472(%rdi), %ymm7
vpaddw %ymm7, %ymm5, %ymm7 vpaddw %ymm7, %ymm5, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 472(%rdi) vmovdqu %ymm7, 472(%rdi)
vmovdqu 824(%rdi), %ymm7 vmovdqu 824(%rdi), %ymm7
vpaddw %ymm7, %ymm6, %ymm7 vpaddw %ymm7, %ymm6, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 824(%rdi) vmovdqu %ymm7, 824(%rdi)
vmovdqu 1176(%rdi), %ymm7 vmovdqu 1176(%rdi), %ymm7
vpaddw %ymm7, %ymm10, %ymm7 vpaddw %ymm7, %ymm10, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 1176(%rdi) vmovdqu %ymm7, 1176(%rdi)
vmovdqu 174(%rdi), %ymm7 vmovdqu 174(%rdi), %ymm7
vpaddw %ymm7, %ymm9, %ymm7 vpaddw %ymm7, %ymm9, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 174(%rdi) vmovdqu %ymm7, 174(%rdi)
vmovdqu 526(%rdi), %ymm7 vmovdqu 526(%rdi), %ymm7
vpaddw %ymm7, %ymm3, %ymm7 vpaddw %ymm7, %ymm3, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 526(%rdi) vmovdqu %ymm7, 526(%rdi)
vmovdqu 878(%rdi), %ymm7 vmovdqu 878(%rdi), %ymm7
vpaddw %ymm7, %ymm4, %ymm7 vpaddw %ymm7, %ymm4, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 878(%rdi) vmovdqu %ymm7, 878(%rdi)
vmovdqu 1230(%rdi), %ymm7 vmovdqu 1230(%rdi), %ymm7
vpaddw %ymm7, %ymm11, %ymm7 vpaddw %ymm7, %ymm11, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 1230(%rdi) vmovdqu %ymm7, 1230(%rdi)
vmovdqa 192(%rsp), %ymm11 vmovdqa 192(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm4 vpunpcklwd const0(%rip), %ymm11, %ymm4
@ -6738,31 +6622,24 @@ vpmullw %ymm13, %ymm9, %ymm9
vpsubw %ymm9, %ymm6, %ymm6 vpsubw %ymm9, %ymm6, %ymm6
vmovdqu 560(%rdi), %ymm3 vmovdqu 560(%rdi), %ymm3
vpaddw %ymm3, %ymm11, %ymm3 vpaddw %ymm3, %ymm11, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 560(%rdi) vmovdqu %ymm3, 560(%rdi)
vmovdqu 912(%rdi), %ymm3 vmovdqu 912(%rdi), %ymm3
vpaddw %ymm3, %ymm6, %ymm3 vpaddw %ymm3, %ymm6, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 912(%rdi) vmovdqu %ymm3, 912(%rdi)
vmovdqu 1264(%rdi), %ymm3 vmovdqu 1264(%rdi), %ymm3
vpaddw %ymm3, %ymm8, %ymm3 vpaddw %ymm3, %ymm8, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 1264(%rdi) vmovdqu %ymm3, 1264(%rdi)
vmovdqu 262(%rdi), %ymm3 vmovdqu 262(%rdi), %ymm3
vpaddw %ymm3, %ymm7, %ymm3 vpaddw %ymm3, %ymm7, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 262(%rdi) vmovdqu %ymm3, 262(%rdi)
vmovdqu 614(%rdi), %ymm3 vmovdqu 614(%rdi), %ymm3
vpaddw %ymm3, %ymm10, %ymm3 vpaddw %ymm3, %ymm10, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 614(%rdi) vmovdqu %ymm3, 614(%rdi)
vmovdqu 966(%rdi), %ymm3 vmovdqu 966(%rdi), %ymm3
vpaddw %ymm3, %ymm9, %ymm3 vpaddw %ymm3, %ymm9, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 966(%rdi) vmovdqu %ymm3, 966(%rdi)
vmovdqu 1318(%rdi), %ymm3 vmovdqu 1318(%rdi), %ymm3
vpaddw %ymm3, %ymm5, %ymm3 vpaddw %ymm3, %ymm5, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 1318(%rdi) vmovdqu %ymm3, 1318(%rdi)
vmovdqa 224(%rsp), %ymm5 vmovdqa 224(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm9 vpunpcklwd const0(%rip), %ymm5, %ymm9
@ -6830,16 +6707,13 @@ vpmullw %ymm13, %ymm7, %ymm7
vpsubw %ymm7, %ymm6, %ymm6 vpsubw %ymm7, %ymm6, %ymm6
vmovdqu 648(%rdi), %ymm10 vmovdqu 648(%rdi), %ymm10
vpaddw %ymm10, %ymm5, %ymm10 vpaddw %ymm10, %ymm5, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 648(%rdi) vmovdqu %ymm10, 648(%rdi)
vmovdqu 1000(%rdi), %ymm10 vmovdqu 1000(%rdi), %ymm10
vpaddw %ymm10, %ymm6, %ymm10 vpaddw %ymm10, %ymm6, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 1000(%rdi) vmovdqu %ymm10, 1000(%rdi)
vmovdqu 1352(%rdi), %ymm10 vmovdqu 1352(%rdi), %ymm10
vpand mask_1_15(%rip), %ymm4, %ymm9 vpand mask_1_15(%rip), %ymm4, %ymm9
vpaddw %ymm10, %ymm9, %ymm10 vpaddw %ymm10, %ymm9, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 1352(%rdi) vmovdqu %ymm10, 1352(%rdi)
vpshufb rol_rol_16(%rip), %ymm4, %ymm4 vpshufb rol_rol_16(%rip), %ymm4, %ymm4
vpermq $216, %ymm4, %ymm4 vpermq $216, %ymm4, %ymm4
@ -6848,19 +6722,15 @@ vpermq $216, %ymm4, %ymm4
vpand mask_15_1(%rip), %ymm4, %ymm4 vpand mask_15_1(%rip), %ymm4, %ymm4
vmovdqu 0(%rdi), %ymm10 vmovdqu 0(%rdi), %ymm10
vpaddw %ymm10, %ymm4, %ymm10 vpaddw %ymm10, %ymm4, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 0(%rdi) vmovdqu %ymm10, 0(%rdi)
vmovdqu 350(%rdi), %ymm10 vmovdqu 350(%rdi), %ymm10
vpaddw %ymm10, %ymm3, %ymm10 vpaddw %ymm10, %ymm3, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 350(%rdi) vmovdqu %ymm10, 350(%rdi)
vmovdqu 702(%rdi), %ymm10 vmovdqu 702(%rdi), %ymm10
vpaddw %ymm10, %ymm8, %ymm10 vpaddw %ymm10, %ymm8, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 702(%rdi) vmovdqu %ymm10, 702(%rdi)
vmovdqu 1054(%rdi), %ymm10 vmovdqu 1054(%rdi), %ymm10
vpaddw %ymm10, %ymm7, %ymm10 vpaddw %ymm10, %ymm7, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 1054(%rdi) vmovdqu %ymm10, 1054(%rdi)
vmovdqa 160(%r12), %ymm0 vmovdqa 160(%r12), %ymm0
vpsubw 256(%r12), %ymm0, %ymm0 vpsubw 256(%r12), %ymm0, %ymm0
@ -7229,43 +7099,36 @@ vpmullw %ymm13, %ymm3, %ymm3
vpsubw %ymm3, %ymm6, %ymm6 vpsubw %ymm3, %ymm6, %ymm6
vmovdqu 64(%rdi), %ymm8 vmovdqu 64(%rdi), %ymm8
vpaddw %ymm8, %ymm11, %ymm8 vpaddw %ymm8, %ymm11, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 64(%rdi) vmovdqu %xmm8, 64(%rdi)
vextracti128 $1, %ymm8, %xmm8 vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 80(%rdi) vmovq %xmm8, 80(%rdi)
vmovdqu 416(%rdi), %ymm8 vmovdqu 416(%rdi), %ymm8
vpaddw %ymm8, %ymm6, %ymm8 vpaddw %ymm8, %ymm6, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 416(%rdi) vmovdqu %xmm8, 416(%rdi)
vextracti128 $1, %ymm8, %xmm8 vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 432(%rdi) vmovq %xmm8, 432(%rdi)
vmovdqu 768(%rdi), %ymm8 vmovdqu 768(%rdi), %ymm8
vpaddw %ymm8, %ymm9, %ymm8 vpaddw %ymm8, %ymm9, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 768(%rdi) vmovdqu %xmm8, 768(%rdi)
vextracti128 $1, %ymm8, %xmm8 vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 784(%rdi) vmovq %xmm8, 784(%rdi)
vmovdqu 1120(%rdi), %ymm8 vmovdqu 1120(%rdi), %ymm8
vpaddw %ymm8, %ymm10, %ymm8 vpaddw %ymm8, %ymm10, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 1120(%rdi) vmovdqu %xmm8, 1120(%rdi)
vextracti128 $1, %ymm8, %xmm8 vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 1136(%rdi) vmovq %xmm8, 1136(%rdi)
vmovdqu 118(%rdi), %ymm8 vmovdqu 118(%rdi), %ymm8
vpaddw %ymm8, %ymm4, %ymm8 vpaddw %ymm8, %ymm4, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 118(%rdi) vmovdqu %xmm8, 118(%rdi)
vextracti128 $1, %ymm8, %xmm8 vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 134(%rdi) vmovq %xmm8, 134(%rdi)
vmovdqu 470(%rdi), %ymm8 vmovdqu 470(%rdi), %ymm8
vpaddw %ymm8, %ymm3, %ymm8 vpaddw %ymm8, %ymm3, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 470(%rdi) vmovdqu %xmm8, 470(%rdi)
vextracti128 $1, %ymm8, %xmm8 vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 486(%rdi) vmovq %xmm8, 486(%rdi)
vmovdqu 822(%rdi), %ymm8 vmovdqu 822(%rdi), %ymm8
vpaddw %ymm8, %ymm5, %ymm8 vpaddw %ymm8, %ymm5, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 822(%rdi) vmovdqu %xmm8, 822(%rdi)
vextracti128 $1, %ymm8, %xmm8 vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 838(%rdi) vmovq %xmm8, 838(%rdi)
@ -7335,43 +7198,36 @@ vpmullw %ymm13, %ymm10, %ymm10
vpsubw %ymm10, %ymm6, %ymm6 vpsubw %ymm10, %ymm6, %ymm6
vmovdqu 152(%rdi), %ymm4 vmovdqu 152(%rdi), %ymm4
vpaddw %ymm4, %ymm5, %ymm4 vpaddw %ymm4, %ymm5, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 152(%rdi) vmovdqu %xmm4, 152(%rdi)
vextracti128 $1, %ymm4, %xmm4 vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 168(%rdi) vmovq %xmm4, 168(%rdi)
vmovdqu 504(%rdi), %ymm4 vmovdqu 504(%rdi), %ymm4
vpaddw %ymm4, %ymm6, %ymm4 vpaddw %ymm4, %ymm6, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 504(%rdi) vmovdqu %xmm4, 504(%rdi)
vextracti128 $1, %ymm4, %xmm4 vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 520(%rdi) vmovq %xmm4, 520(%rdi)
vmovdqu 856(%rdi), %ymm4 vmovdqu 856(%rdi), %ymm4
vpaddw %ymm4, %ymm7, %ymm4 vpaddw %ymm4, %ymm7, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 856(%rdi) vmovdqu %xmm4, 856(%rdi)
vextracti128 $1, %ymm4, %xmm4 vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 872(%rdi) vmovq %xmm4, 872(%rdi)
vmovdqu 1208(%rdi), %ymm4 vmovdqu 1208(%rdi), %ymm4
vpaddw %ymm4, %ymm8, %ymm4 vpaddw %ymm4, %ymm8, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 1208(%rdi) vmovdqu %xmm4, 1208(%rdi)
vextracti128 $1, %ymm4, %xmm4 vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 1224(%rdi) vmovq %xmm4, 1224(%rdi)
vmovdqu 206(%rdi), %ymm4 vmovdqu 206(%rdi), %ymm4
vpaddw %ymm4, %ymm9, %ymm4 vpaddw %ymm4, %ymm9, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 206(%rdi) vmovdqu %xmm4, 206(%rdi)
vextracti128 $1, %ymm4, %xmm4 vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 222(%rdi) vmovq %xmm4, 222(%rdi)
vmovdqu 558(%rdi), %ymm4 vmovdqu 558(%rdi), %ymm4
vpaddw %ymm4, %ymm10, %ymm4 vpaddw %ymm4, %ymm10, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 558(%rdi) vmovdqu %xmm4, 558(%rdi)
vextracti128 $1, %ymm4, %xmm4 vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 574(%rdi) vmovq %xmm4, 574(%rdi)
vmovdqu 910(%rdi), %ymm4 vmovdqu 910(%rdi), %ymm4
vpaddw %ymm4, %ymm11, %ymm4 vpaddw %ymm4, %ymm11, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 910(%rdi) vmovdqu %xmm4, 910(%rdi)
vextracti128 $1, %ymm4, %xmm4 vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 926(%rdi) vmovq %xmm4, 926(%rdi)
@ -7441,43 +7297,36 @@ vpmullw %ymm13, %ymm8, %ymm8
vpsubw %ymm8, %ymm6, %ymm6 vpsubw %ymm8, %ymm6, %ymm6
vmovdqu 240(%rdi), %ymm9 vmovdqu 240(%rdi), %ymm9
vpaddw %ymm9, %ymm11, %ymm9 vpaddw %ymm9, %ymm11, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %xmm9, 240(%rdi) vmovdqu %xmm9, 240(%rdi)
vextracti128 $1, %ymm9, %xmm9 vextracti128 $1, %ymm9, %xmm9
vmovq %xmm9, 256(%rdi) vmovq %xmm9, 256(%rdi)
vmovdqu 592(%rdi), %ymm9 vmovdqu 592(%rdi), %ymm9
vpaddw %ymm9, %ymm6, %ymm9 vpaddw %ymm9, %ymm6, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %xmm9, 592(%rdi) vmovdqu %xmm9, 592(%rdi)
vextracti128 $1, %ymm9, %xmm9 vextracti128 $1, %ymm9, %xmm9
vmovq %xmm9, 608(%rdi) vmovq %xmm9, 608(%rdi)
vmovdqu 944(%rdi), %ymm9 vmovdqu 944(%rdi), %ymm9
vpaddw %ymm9, %ymm3, %ymm9 vpaddw %ymm9, %ymm3, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %xmm9, 944(%rdi) vmovdqu %xmm9, 944(%rdi)
vextracti128 $1, %ymm9, %xmm9 vextracti128 $1, %ymm9, %xmm9
vmovq %xmm9, 960(%rdi) vmovq %xmm9, 960(%rdi)
vmovdqu 1296(%rdi), %ymm9 vmovdqu 1296(%rdi), %ymm9
vpaddw %ymm9, %ymm4, %ymm9 vpaddw %ymm9, %ymm4, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %xmm9, 1296(%rdi) vmovdqu %xmm9, 1296(%rdi)
vextracti128 $1, %ymm9, %xmm9 vextracti128 $1, %ymm9, %xmm9
vmovq %xmm9, 1312(%rdi) vmovq %xmm9, 1312(%rdi)
vmovdqu 294(%rdi), %ymm9 vmovdqu 294(%rdi), %ymm9
vpaddw %ymm9, %ymm7, %ymm9 vpaddw %ymm9, %ymm7, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %xmm9, 294(%rdi) vmovdqu %xmm9, 294(%rdi)
vextracti128 $1, %ymm9, %xmm9 vextracti128 $1, %ymm9, %xmm9
vmovq %xmm9, 310(%rdi) vmovq %xmm9, 310(%rdi)
vmovdqu 646(%rdi), %ymm9 vmovdqu 646(%rdi), %ymm9
vpaddw %ymm9, %ymm8, %ymm9 vpaddw %ymm9, %ymm8, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %xmm9, 646(%rdi) vmovdqu %xmm9, 646(%rdi)
vextracti128 $1, %ymm9, %xmm9 vextracti128 $1, %ymm9, %xmm9
vmovq %xmm9, 662(%rdi) vmovq %xmm9, 662(%rdi)
vmovdqu 998(%rdi), %ymm9 vmovdqu 998(%rdi), %ymm9
vpaddw %ymm9, %ymm5, %ymm9 vpaddw %ymm9, %ymm5, %ymm9
vpand mask_mod2048(%rip), %ymm9, %ymm9
vmovdqu %xmm9, 998(%rdi) vmovdqu %xmm9, 998(%rdi)
vextracti128 $1, %ymm9, %xmm9 vextracti128 $1, %ymm9, %xmm9
vmovq %xmm9, 1014(%rdi) vmovq %xmm9, 1014(%rdi)
@ -7547,43 +7396,36 @@ vpmullw %ymm13, %ymm4, %ymm4
vpsubw %ymm4, %ymm6, %ymm6 vpsubw %ymm4, %ymm6, %ymm6
vmovdqu 328(%rdi), %ymm7 vmovdqu 328(%rdi), %ymm7
vpaddw %ymm7, %ymm5, %ymm7 vpaddw %ymm7, %ymm5, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %xmm7, 328(%rdi) vmovdqu %xmm7, 328(%rdi)
vextracti128 $1, %ymm7, %xmm7 vextracti128 $1, %ymm7, %xmm7
vmovq %xmm7, 344(%rdi) vmovq %xmm7, 344(%rdi)
vmovdqu 680(%rdi), %ymm7 vmovdqu 680(%rdi), %ymm7
vpaddw %ymm7, %ymm6, %ymm7 vpaddw %ymm7, %ymm6, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %xmm7, 680(%rdi) vmovdqu %xmm7, 680(%rdi)
vextracti128 $1, %ymm7, %xmm7 vextracti128 $1, %ymm7, %xmm7
vmovq %xmm7, 696(%rdi) vmovq %xmm7, 696(%rdi)
vmovdqu 1032(%rdi), %ymm7 vmovdqu 1032(%rdi), %ymm7
vpaddw %ymm7, %ymm10, %ymm7 vpaddw %ymm7, %ymm10, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %xmm7, 1032(%rdi) vmovdqu %xmm7, 1032(%rdi)
vextracti128 $1, %ymm7, %xmm7 vextracti128 $1, %ymm7, %xmm7
vmovq %xmm7, 1048(%rdi) vmovq %xmm7, 1048(%rdi)
vmovdqu 30(%rdi), %ymm7 vmovdqu 30(%rdi), %ymm7
vpaddw %ymm7, %ymm9, %ymm7 vpaddw %ymm7, %ymm9, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %xmm7, 30(%rdi) vmovdqu %xmm7, 30(%rdi)
vextracti128 $1, %ymm7, %xmm7 vextracti128 $1, %ymm7, %xmm7
vmovq %xmm7, 46(%rdi) vmovq %xmm7, 46(%rdi)
vmovdqu 382(%rdi), %ymm7 vmovdqu 382(%rdi), %ymm7
vpaddw %ymm7, %ymm3, %ymm7 vpaddw %ymm7, %ymm3, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %xmm7, 382(%rdi) vmovdqu %xmm7, 382(%rdi)
vextracti128 $1, %ymm7, %xmm7 vextracti128 $1, %ymm7, %xmm7
vmovq %xmm7, 398(%rdi) vmovq %xmm7, 398(%rdi)
vmovdqu 734(%rdi), %ymm7 vmovdqu 734(%rdi), %ymm7
vpaddw %ymm7, %ymm4, %ymm7 vpaddw %ymm7, %ymm4, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %xmm7, 734(%rdi) vmovdqu %xmm7, 734(%rdi)
vextracti128 $1, %ymm7, %xmm7 vextracti128 $1, %ymm7, %xmm7
vmovq %xmm7, 750(%rdi) vmovq %xmm7, 750(%rdi)
vmovdqu 1086(%rdi), %ymm7 vmovdqu 1086(%rdi), %ymm7
vpaddw %ymm7, %ymm11, %ymm7 vpaddw %ymm7, %ymm11, %ymm7
vpand mask_mod2048(%rip), %ymm7, %ymm7
vmovdqu %xmm7, 1086(%rdi) vmovdqu %xmm7, 1086(%rdi)
vextracti128 $1, %ymm7, %xmm7 vextracti128 $1, %ymm7, %xmm7
vmovq %xmm7, 1102(%rdi) vmovq %xmm7, 1102(%rdi)
@ -7653,43 +7495,36 @@ vpmullw %ymm13, %ymm9, %ymm9
vpsubw %ymm9, %ymm6, %ymm6 vpsubw %ymm9, %ymm6, %ymm6
vmovdqu 416(%rdi), %ymm3 vmovdqu 416(%rdi), %ymm3
vpaddw %ymm3, %ymm11, %ymm3 vpaddw %ymm3, %ymm11, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %xmm3, 416(%rdi) vmovdqu %xmm3, 416(%rdi)
vextracti128 $1, %ymm3, %xmm3 vextracti128 $1, %ymm3, %xmm3
vmovq %xmm3, 432(%rdi) vmovq %xmm3, 432(%rdi)
vmovdqu 768(%rdi), %ymm3 vmovdqu 768(%rdi), %ymm3
vpaddw %ymm3, %ymm6, %ymm3 vpaddw %ymm3, %ymm6, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %xmm3, 768(%rdi) vmovdqu %xmm3, 768(%rdi)
vextracti128 $1, %ymm3, %xmm3 vextracti128 $1, %ymm3, %xmm3
vmovq %xmm3, 784(%rdi) vmovq %xmm3, 784(%rdi)
vmovdqu 1120(%rdi), %ymm3 vmovdqu 1120(%rdi), %ymm3
vpaddw %ymm3, %ymm8, %ymm3 vpaddw %ymm3, %ymm8, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %xmm3, 1120(%rdi) vmovdqu %xmm3, 1120(%rdi)
vextracti128 $1, %ymm3, %xmm3 vextracti128 $1, %ymm3, %xmm3
vmovq %xmm3, 1136(%rdi) vmovq %xmm3, 1136(%rdi)
vmovdqu 118(%rdi), %ymm3 vmovdqu 118(%rdi), %ymm3
vpaddw %ymm3, %ymm7, %ymm3 vpaddw %ymm3, %ymm7, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %xmm3, 118(%rdi) vmovdqu %xmm3, 118(%rdi)
vextracti128 $1, %ymm3, %xmm3 vextracti128 $1, %ymm3, %xmm3
vmovq %xmm3, 134(%rdi) vmovq %xmm3, 134(%rdi)
vmovdqu 470(%rdi), %ymm3 vmovdqu 470(%rdi), %ymm3
vpaddw %ymm3, %ymm10, %ymm3 vpaddw %ymm3, %ymm10, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %xmm3, 470(%rdi) vmovdqu %xmm3, 470(%rdi)
vextracti128 $1, %ymm3, %xmm3 vextracti128 $1, %ymm3, %xmm3
vmovq %xmm3, 486(%rdi) vmovq %xmm3, 486(%rdi)
vmovdqu 822(%rdi), %ymm3 vmovdqu 822(%rdi), %ymm3
vpaddw %ymm3, %ymm9, %ymm3 vpaddw %ymm3, %ymm9, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %xmm3, 822(%rdi) vmovdqu %xmm3, 822(%rdi)
vextracti128 $1, %ymm3, %xmm3 vextracti128 $1, %ymm3, %xmm3
vmovq %xmm3, 838(%rdi) vmovq %xmm3, 838(%rdi)
vmovdqu 1174(%rdi), %ymm3 vmovdqu 1174(%rdi), %ymm3
vpaddw %ymm3, %ymm5, %ymm3 vpaddw %ymm3, %ymm5, %ymm3
vpand mask_mod2048(%rip), %ymm3, %ymm3
vmovdqu %xmm3, 1174(%rdi) vmovdqu %xmm3, 1174(%rdi)
vextracti128 $1, %ymm3, %xmm3 vextracti128 $1, %ymm3, %xmm3
vmovq %xmm3, 1190(%rdi) vmovq %xmm3, 1190(%rdi)
@ -7759,43 +7594,36 @@ vpmullw %ymm13, %ymm7, %ymm7
vpsubw %ymm7, %ymm6, %ymm6 vpsubw %ymm7, %ymm6, %ymm6
vmovdqu 504(%rdi), %ymm10 vmovdqu 504(%rdi), %ymm10
vpaddw %ymm10, %ymm5, %ymm10 vpaddw %ymm10, %ymm5, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %xmm10, 504(%rdi) vmovdqu %xmm10, 504(%rdi)
vextracti128 $1, %ymm10, %xmm10 vextracti128 $1, %ymm10, %xmm10
vmovq %xmm10, 520(%rdi) vmovq %xmm10, 520(%rdi)
vmovdqu 856(%rdi), %ymm10 vmovdqu 856(%rdi), %ymm10
vpaddw %ymm10, %ymm6, %ymm10 vpaddw %ymm10, %ymm6, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %xmm10, 856(%rdi) vmovdqu %xmm10, 856(%rdi)
vextracti128 $1, %ymm10, %xmm10 vextracti128 $1, %ymm10, %xmm10
vmovq %xmm10, 872(%rdi) vmovq %xmm10, 872(%rdi)
vmovdqu 1208(%rdi), %ymm10 vmovdqu 1208(%rdi), %ymm10
vpaddw %ymm10, %ymm4, %ymm10 vpaddw %ymm10, %ymm4, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %xmm10, 1208(%rdi) vmovdqu %xmm10, 1208(%rdi)
vextracti128 $1, %ymm10, %xmm10 vextracti128 $1, %ymm10, %xmm10
vmovq %xmm10, 1224(%rdi) vmovq %xmm10, 1224(%rdi)
vmovdqu 206(%rdi), %ymm10 vmovdqu 206(%rdi), %ymm10
vpaddw %ymm10, %ymm3, %ymm10 vpaddw %ymm10, %ymm3, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %xmm10, 206(%rdi) vmovdqu %xmm10, 206(%rdi)
vextracti128 $1, %ymm10, %xmm10 vextracti128 $1, %ymm10, %xmm10
vmovq %xmm10, 222(%rdi) vmovq %xmm10, 222(%rdi)
vmovdqu 558(%rdi), %ymm10 vmovdqu 558(%rdi), %ymm10
vpaddw %ymm10, %ymm8, %ymm10 vpaddw %ymm10, %ymm8, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %xmm10, 558(%rdi) vmovdqu %xmm10, 558(%rdi)
vextracti128 $1, %ymm10, %xmm10 vextracti128 $1, %ymm10, %xmm10
vmovq %xmm10, 574(%rdi) vmovq %xmm10, 574(%rdi)
vmovdqu 910(%rdi), %ymm10 vmovdqu 910(%rdi), %ymm10
vpaddw %ymm10, %ymm7, %ymm10 vpaddw %ymm10, %ymm7, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %xmm10, 910(%rdi) vmovdqu %xmm10, 910(%rdi)
vextracti128 $1, %ymm10, %xmm10 vextracti128 $1, %ymm10, %xmm10
vmovq %xmm10, 926(%rdi) vmovq %xmm10, 926(%rdi)
vmovdqu 1262(%rdi), %ymm10 vmovdqu 1262(%rdi), %ymm10
vpaddw %ymm10, %ymm11, %ymm10 vpaddw %ymm10, %ymm11, %ymm10
vpand mask_mod2048(%rip), %ymm10, %ymm10
vmovdqu %xmm10, 1262(%rdi) vmovdqu %xmm10, 1262(%rdi)
vextracti128 $1, %ymm10, %xmm10 vextracti128 $1, %ymm10, %xmm10
vmovq %xmm10, 1278(%rdi) vmovq %xmm10, 1278(%rdi)
@ -7865,43 +7693,36 @@ vpmullw %ymm13, %ymm3, %ymm3
vpsubw %ymm3, %ymm6, %ymm6 vpsubw %ymm3, %ymm6, %ymm6
vmovdqu 592(%rdi), %ymm8 vmovdqu 592(%rdi), %ymm8
vpaddw %ymm8, %ymm11, %ymm8 vpaddw %ymm8, %ymm11, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 592(%rdi) vmovdqu %xmm8, 592(%rdi)
vextracti128 $1, %ymm8, %xmm8 vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 608(%rdi) vmovq %xmm8, 608(%rdi)
vmovdqu 944(%rdi), %ymm8 vmovdqu 944(%rdi), %ymm8
vpaddw %ymm8, %ymm6, %ymm8 vpaddw %ymm8, %ymm6, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 944(%rdi) vmovdqu %xmm8, 944(%rdi)
vextracti128 $1, %ymm8, %xmm8 vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 960(%rdi) vmovq %xmm8, 960(%rdi)
vmovdqu 1296(%rdi), %ymm8 vmovdqu 1296(%rdi), %ymm8
vpaddw %ymm8, %ymm9, %ymm8 vpaddw %ymm8, %ymm9, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 1296(%rdi) vmovdqu %xmm8, 1296(%rdi)
vextracti128 $1, %ymm8, %xmm8 vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 1312(%rdi) vmovq %xmm8, 1312(%rdi)
vmovdqu 294(%rdi), %ymm8 vmovdqu 294(%rdi), %ymm8
vpaddw %ymm8, %ymm10, %ymm8 vpaddw %ymm8, %ymm10, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 294(%rdi) vmovdqu %xmm8, 294(%rdi)
vextracti128 $1, %ymm8, %xmm8 vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 310(%rdi) vmovq %xmm8, 310(%rdi)
vmovdqu 646(%rdi), %ymm8 vmovdqu 646(%rdi), %ymm8
vpaddw %ymm8, %ymm4, %ymm8 vpaddw %ymm8, %ymm4, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 646(%rdi) vmovdqu %xmm8, 646(%rdi)
vextracti128 $1, %ymm8, %xmm8 vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 662(%rdi) vmovq %xmm8, 662(%rdi)
vmovdqu 998(%rdi), %ymm8 vmovdqu 998(%rdi), %ymm8
vpaddw %ymm8, %ymm3, %ymm8 vpaddw %ymm8, %ymm3, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 998(%rdi) vmovdqu %xmm8, 998(%rdi)
vextracti128 $1, %ymm8, %xmm8 vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 1014(%rdi) vmovq %xmm8, 1014(%rdi)
vmovdqu 1350(%rdi), %ymm8 vmovdqu 1350(%rdi), %ymm8
vpaddw %ymm8, %ymm5, %ymm8 vpaddw %ymm8, %ymm5, %ymm8
vpand mask_mod2048(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 1350(%rdi) vmovdqu %xmm8, 1350(%rdi)
vextracti128 $1, %ymm8, %xmm8 vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 1366(%rdi) vmovq %xmm8, 1366(%rdi)
@ -7971,37 +7792,31 @@ vpmullw %ymm13, %ymm10, %ymm10
vpsubw %ymm10, %ymm6, %ymm6 vpsubw %ymm10, %ymm6, %ymm6
vmovdqu 680(%rdi), %ymm4 vmovdqu 680(%rdi), %ymm4
vpaddw %ymm4, %ymm5, %ymm4 vpaddw %ymm4, %ymm5, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 680(%rdi) vmovdqu %xmm4, 680(%rdi)
vextracti128 $1, %ymm4, %xmm4 vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 696(%rdi) vmovq %xmm4, 696(%rdi)
vmovdqu 1032(%rdi), %ymm4 vmovdqu 1032(%rdi), %ymm4
vpaddw %ymm4, %ymm6, %ymm4 vpaddw %ymm4, %ymm6, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 1032(%rdi) vmovdqu %xmm4, 1032(%rdi)
vextracti128 $1, %ymm4, %xmm4 vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 1048(%rdi) vmovq %xmm4, 1048(%rdi)
vmovdqu 30(%rdi), %ymm4 vmovdqu 30(%rdi), %ymm4
vpaddw %ymm4, %ymm7, %ymm4 vpaddw %ymm4, %ymm7, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 30(%rdi) vmovdqu %xmm4, 30(%rdi)
vextracti128 $1, %ymm4, %xmm4 vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 46(%rdi) vmovq %xmm4, 46(%rdi)
vmovdqu 382(%rdi), %ymm4 vmovdqu 382(%rdi), %ymm4
vpaddw %ymm4, %ymm8, %ymm4 vpaddw %ymm4, %ymm8, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 382(%rdi) vmovdqu %xmm4, 382(%rdi)
vextracti128 $1, %ymm4, %xmm4 vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 398(%rdi) vmovq %xmm4, 398(%rdi)
vmovdqu 734(%rdi), %ymm4 vmovdqu 734(%rdi), %ymm4
vpaddw %ymm4, %ymm9, %ymm4 vpaddw %ymm4, %ymm9, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 734(%rdi) vmovdqu %xmm4, 734(%rdi)
vextracti128 $1, %ymm4, %xmm4 vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 750(%rdi) vmovq %xmm4, 750(%rdi)
vmovdqu 1086(%rdi), %ymm4 vmovdqu 1086(%rdi), %ymm4
vpaddw %ymm4, %ymm10, %ymm4 vpaddw %ymm4, %ymm10, %ymm4
vpand mask_mod2048(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 1086(%rdi) vmovdqu %xmm4, 1086(%rdi)
vextracti128 $1, %ymm4, %xmm4 vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 1102(%rdi) vmovq %xmm4, 1102(%rdi)

View File

@ -4,12 +4,9 @@
#include "params.h" #include "params.h"
#include "poly.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, void PQCLEAN_NTRUHPS2048677_CLEAN_owcpa_keypair(unsigned char *pk,
unsigned char *sk, 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, void PQCLEAN_NTRUHPS2048677_CLEAN_owcpa_enc(unsigned char *c,
const poly *r, const poly *r,

View File

@ -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) { 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); 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); PQCLEAN_NTRUHPS2048677_CLEAN_poly_mod_3_Phi_n(r);
} }

View File

@ -1,15 +1,284 @@
#include "poly.h" #include "poly.h"
void PQCLEAN_NTRUHPS2048677_CLEAN_poly_Rq_mul(poly *r, const poly *a, const poly *b) { /* Polynomial multiplication using */
int k, i; /* Toom-4 and two layers of Karatsuba. */
for (k = 0; k < NTRU_N; k++) { #define L PAD32(NTRU_N)
r->coeffs[k] = 0; #define M (L/4)
for (i = 1; i < NTRU_N - k; i++) { #define K (L/16)
r->coeffs[k] += a->coeffs[k + i] * b->coeffs[NTRU_N - i];
} static void toom4_k2x2_mul(uint16_t ab[2 * L], const uint16_t a[L], const uint16_t b[L]);
for (i = 0; i < k + 1; i++) {
r->coeffs[k] += a->coeffs[k - i] * b->coeffs[i]; 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) {
size_t i;
uint16_t ab[2 * L];
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];
}
}

View File

@ -23,9 +23,9 @@ auxiliary-submitters:
- Zhenfei Zhang - Zhenfei Zhang
implementations: implementations:
- name: clean - name: clean
version: https://github.com/jschanck/ntru/tree/6d1f44f5 reference implementation version: https://github.com/jschanck/ntru/tree/60cc7277 reference implementation
- name: avx2 - name: avx2
version: https://github.com/jschanck/ntru/tree/6d1f44f5 avx2 implementation version: https://github.com/jschanck/ntru/tree/60cc7277 avx2 implementation
supported_platforms: supported_platforms:
- architecture: x86_64 - architecture: x86_64
operating_systems: operating_systems:

View File

@ -4,12 +4,9 @@
#include "params.h" #include "params.h"
#include "poly.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, void PQCLEAN_NTRUHPS4096821_AVX2_owcpa_keypair(unsigned char *pk,
unsigned char *sk, 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, void PQCLEAN_NTRUHPS4096821_AVX2_owcpa_enc(unsigned char *c,
const poly *r, const poly *r,

View File

@ -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) { 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); 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); PQCLEAN_NTRUHPS4096821_AVX2_poly_mod_3_Phi_n(r);
} }

File diff suppressed because it is too large Load Diff

View File

@ -4,12 +4,9 @@
#include "params.h" #include "params.h"
#include "poly.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, void PQCLEAN_NTRUHPS4096821_CLEAN_owcpa_keypair(unsigned char *pk,
unsigned char *sk, 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, void PQCLEAN_NTRUHPS4096821_CLEAN_owcpa_enc(unsigned char *c,
const poly *r, const poly *r,

View File

@ -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) { 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); 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); PQCLEAN_NTRUHPS4096821_CLEAN_poly_mod_3_Phi_n(r);
} }

View File

@ -1,15 +1,284 @@
#include "poly.h" #include "poly.h"
void PQCLEAN_NTRUHPS4096821_CLEAN_poly_Rq_mul(poly *r, const poly *a, const poly *b) { /* Polynomial multiplication using */
int k, i; /* Toom-4 and two layers of Karatsuba. */
for (k = 0; k < NTRU_N; k++) { #define L PAD32(NTRU_N)
r->coeffs[k] = 0; #define M (L/4)
for (i = 1; i < NTRU_N - k; i++) { #define K (L/16)
r->coeffs[k] += a->coeffs[k + i] * b->coeffs[NTRU_N - i];
} static void toom4_k2x2_mul(uint16_t ab[2 * L], const uint16_t a[L], const uint16_t b[L]);
for (i = 0; i < k + 1; i++) {
r->coeffs[k] += a->coeffs[k - i] * b->coeffs[i]; 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) {
size_t i;
uint16_t ab[2 * L];
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];
}
}

View File

@ -23,9 +23,9 @@ auxiliary-submitters:
- Zhenfei Zhang - Zhenfei Zhang
implementations: implementations:
- name: clean - name: clean
version: https://github.com/jschanck/ntru/tree/6d1f44f5 reference implementation version: https://github.com/jschanck/ntru/tree/60cc7277 reference implementation
- name: avx2 - name: avx2
version: https://github.com/jschanck/ntru/tree/6d1f44f5 avx2 implementation version: https://github.com/jschanck/ntru/tree/60cc7277 avx2 implementation
supported_platforms: supported_platforms:
- architecture: x86_64 - architecture: x86_64
operating_systems: operating_systems:

View File

@ -4,12 +4,9 @@
#include "params.h" #include "params.h"
#include "poly.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, void PQCLEAN_NTRUHRSS701_AVX2_owcpa_keypair(unsigned char *pk,
unsigned char *sk, 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, void PQCLEAN_NTRUHRSS701_AVX2_owcpa_enc(unsigned char *c,
const poly *r, const poly *r,

View File

@ -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) { 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); 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); PQCLEAN_NTRUHRSS701_AVX2_poly_mod_3_Phi_n(r);
} }

View File

@ -237,23 +237,6 @@ shuf_128_to_64:
.byte 255 .byte 255
.byte 255 .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: const_modq:
.word 8191 .word 8191
.word 8191 .word 8191
@ -288,57 +271,23 @@ mask_n:
.word 0 .word 0
.word 0 .word 0
.word 0 .word 0
mask_mod8192: mask_omit_lowest:
.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
.word 0 .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: shuf_5_to_0_zerorest:
.byte 10 .byte 10
.byte 11 .byte 11
@ -2161,7 +2110,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 0(%rsp) vmovdqa %ymm3, 0(%rsp)
vpaddw 32(%rsp), %ymm1, %ymm2 vpaddw 32(%rsp), %ymm1, %ymm2
@ -2185,7 +2133,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 32(%rsp) vmovdqa %ymm3, 32(%rsp)
vpaddw 64(%rsp), %ymm1, %ymm2 vpaddw 64(%rsp), %ymm1, %ymm2
@ -2209,7 +2156,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 64(%rsp) vmovdqa %ymm3, 64(%rsp)
vpaddw 96(%rsp), %ymm1, %ymm2 vpaddw 96(%rsp), %ymm1, %ymm2
@ -2233,7 +2179,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 96(%rsp) vmovdqa %ymm3, 96(%rsp)
vpaddw 128(%rsp), %ymm1, %ymm2 vpaddw 128(%rsp), %ymm1, %ymm2
@ -2257,7 +2202,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 128(%rsp) vmovdqa %ymm3, 128(%rsp)
vpaddw 160(%rsp), %ymm1, %ymm2 vpaddw 160(%rsp), %ymm1, %ymm2
@ -2281,7 +2225,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 160(%rsp) vmovdqa %ymm3, 160(%rsp)
vpaddw 192(%rsp), %ymm1, %ymm2 vpaddw 192(%rsp), %ymm1, %ymm2
@ -2305,7 +2248,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 192(%rsp) vmovdqa %ymm3, 192(%rsp)
vpaddw 224(%rsp), %ymm1, %ymm2 vpaddw 224(%rsp), %ymm1, %ymm2
@ -2329,7 +2271,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 224(%rsp) vmovdqa %ymm3, 224(%rsp)
vpaddw 256(%rsp), %ymm1, %ymm2 vpaddw 256(%rsp), %ymm1, %ymm2
@ -2353,7 +2294,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 256(%rsp) vmovdqa %ymm3, 256(%rsp)
vpaddw 288(%rsp), %ymm1, %ymm2 vpaddw 288(%rsp), %ymm1, %ymm2
@ -2377,7 +2317,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 288(%rsp) vmovdqa %ymm3, 288(%rsp)
vpaddw 320(%rsp), %ymm1, %ymm2 vpaddw 320(%rsp), %ymm1, %ymm2
@ -2401,7 +2340,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 320(%rsp) vmovdqa %ymm3, 320(%rsp)
vpaddw 352(%rsp), %ymm1, %ymm2 vpaddw 352(%rsp), %ymm1, %ymm2
@ -2425,7 +2363,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 352(%rsp) vmovdqa %ymm3, 352(%rsp)
vpaddw 384(%rsp), %ymm1, %ymm2 vpaddw 384(%rsp), %ymm1, %ymm2
@ -2449,7 +2386,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 384(%rsp) vmovdqa %ymm3, 384(%rsp)
vpaddw 416(%rsp), %ymm1, %ymm2 vpaddw 416(%rsp), %ymm1, %ymm2
@ -2473,7 +2409,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 416(%rsp) vmovdqa %ymm3, 416(%rsp)
vpaddw 448(%rsp), %ymm1, %ymm2 vpaddw 448(%rsp), %ymm1, %ymm2
@ -2497,7 +2432,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 448(%rsp) vmovdqa %ymm3, 448(%rsp)
vpaddw 480(%rsp), %ymm1, %ymm2 vpaddw 480(%rsp), %ymm1, %ymm2
@ -2521,7 +2455,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 480(%rsp) vmovdqa %ymm3, 480(%rsp)
vpaddw 512(%rsp), %ymm1, %ymm2 vpaddw 512(%rsp), %ymm1, %ymm2
@ -2545,7 +2478,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 512(%rsp) vmovdqa %ymm3, 512(%rsp)
vpaddw 544(%rsp), %ymm1, %ymm2 vpaddw 544(%rsp), %ymm1, %ymm2
@ -2569,7 +2501,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 544(%rsp) vmovdqa %ymm3, 544(%rsp)
vpaddw 576(%rsp), %ymm1, %ymm2 vpaddw 576(%rsp), %ymm1, %ymm2
@ -2593,7 +2524,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 576(%rsp) vmovdqa %ymm3, 576(%rsp)
vpaddw 608(%rsp), %ymm1, %ymm2 vpaddw 608(%rsp), %ymm1, %ymm2
@ -2617,7 +2547,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 608(%rsp) vmovdqa %ymm3, 608(%rsp)
vpaddw 640(%rsp), %ymm1, %ymm2 vpaddw 640(%rsp), %ymm1, %ymm2
@ -2641,7 +2570,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 640(%rsp) vmovdqa %ymm3, 640(%rsp)
vpaddw 672(%rsp), %ymm1, %ymm2 vpaddw 672(%rsp), %ymm1, %ymm2
@ -2665,7 +2593,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 672(%rsp) vmovdqa %ymm3, 672(%rsp)
vpaddw 704(%rsp), %ymm1, %ymm2 vpaddw 704(%rsp), %ymm1, %ymm2
@ -2689,7 +2616,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 704(%rsp) vmovdqa %ymm3, 704(%rsp)
vpaddw 736(%rsp), %ymm1, %ymm2 vpaddw 736(%rsp), %ymm1, %ymm2
@ -2713,7 +2639,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 736(%rsp) vmovdqa %ymm3, 736(%rsp)
vpaddw 768(%rsp), %ymm1, %ymm2 vpaddw 768(%rsp), %ymm1, %ymm2
@ -2737,7 +2662,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 768(%rsp) vmovdqa %ymm3, 768(%rsp)
vpaddw 800(%rsp), %ymm1, %ymm2 vpaddw 800(%rsp), %ymm1, %ymm2
@ -2761,7 +2685,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 800(%rsp) vmovdqa %ymm3, 800(%rsp)
vpaddw 832(%rsp), %ymm1, %ymm2 vpaddw 832(%rsp), %ymm1, %ymm2
@ -2785,7 +2708,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 832(%rsp) vmovdqa %ymm3, 832(%rsp)
vpaddw 864(%rsp), %ymm1, %ymm2 vpaddw 864(%rsp), %ymm1, %ymm2
@ -2809,7 +2731,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 864(%rsp) vmovdqa %ymm3, 864(%rsp)
vpaddw 896(%rsp), %ymm1, %ymm2 vpaddw 896(%rsp), %ymm1, %ymm2
@ -2833,7 +2754,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 896(%rsp) vmovdqa %ymm3, 896(%rsp)
vpaddw 928(%rsp), %ymm1, %ymm2 vpaddw 928(%rsp), %ymm1, %ymm2
@ -2857,7 +2777,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 928(%rsp) vmovdqa %ymm3, 928(%rsp)
vpaddw 960(%rsp), %ymm1, %ymm2 vpaddw 960(%rsp), %ymm1, %ymm2
@ -2881,7 +2800,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 960(%rsp) vmovdqa %ymm3, 960(%rsp)
vpaddw 992(%rsp), %ymm1, %ymm2 vpaddw 992(%rsp), %ymm1, %ymm2
@ -2905,7 +2823,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 992(%rsp) vmovdqa %ymm3, 992(%rsp)
vpaddw 1024(%rsp), %ymm1, %ymm2 vpaddw 1024(%rsp), %ymm1, %ymm2
@ -2929,7 +2846,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 1024(%rsp) vmovdqa %ymm3, 1024(%rsp)
vpaddw 1056(%rsp), %ymm1, %ymm2 vpaddw 1056(%rsp), %ymm1, %ymm2
@ -2953,7 +2869,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 1056(%rsp) vmovdqa %ymm3, 1056(%rsp)
vpaddw 1088(%rsp), %ymm1, %ymm2 vpaddw 1088(%rsp), %ymm1, %ymm2
@ -2977,7 +2892,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 1088(%rsp) vmovdqa %ymm3, 1088(%rsp)
vpaddw 1120(%rsp), %ymm1, %ymm2 vpaddw 1120(%rsp), %ymm1, %ymm2
@ -3001,7 +2915,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 1120(%rsp) vmovdqa %ymm3, 1120(%rsp)
vpaddw 1152(%rsp), %ymm1, %ymm2 vpaddw 1152(%rsp), %ymm1, %ymm2
@ -3025,7 +2938,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 1152(%rsp) vmovdqa %ymm3, 1152(%rsp)
vpaddw 1184(%rsp), %ymm1, %ymm2 vpaddw 1184(%rsp), %ymm1, %ymm2
@ -3049,7 +2961,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 1184(%rsp) vmovdqa %ymm3, 1184(%rsp)
vpaddw 1216(%rsp), %ymm1, %ymm2 vpaddw 1216(%rsp), %ymm1, %ymm2
@ -3073,7 +2984,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 1216(%rsp) vmovdqa %ymm3, 1216(%rsp)
vpaddw 1248(%rsp), %ymm1, %ymm2 vpaddw 1248(%rsp), %ymm1, %ymm2
@ -3097,7 +3007,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 1248(%rsp) vmovdqa %ymm3, 1248(%rsp)
vpaddw 1280(%rsp), %ymm1, %ymm2 vpaddw 1280(%rsp), %ymm1, %ymm2
@ -3121,7 +3030,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 1280(%rsp) vmovdqa %ymm3, 1280(%rsp)
vpaddw 1312(%rsp), %ymm1, %ymm2 vpaddw 1312(%rsp), %ymm1, %ymm2
@ -3145,7 +3053,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 1312(%rsp) vmovdqa %ymm3, 1312(%rsp)
vpaddw 1344(%rsp), %ymm1, %ymm2 vpaddw 1344(%rsp), %ymm1, %ymm2
@ -3169,7 +3076,6 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 1344(%rsp) vmovdqa %ymm3, 1344(%rsp)
vpaddw 1376(%rsp), %ymm1, %ymm2 vpaddw 1376(%rsp), %ymm1, %ymm2
@ -3193,184 +3099,140 @@ vpxor %ymm14, %ymm2, %ymm3
vpsrlq $1, %ymm3, %ymm2 vpsrlq $1, %ymm3, %ymm2
vpsubw %ymm2, %ymm0, %ymm2 vpsubw %ymm2, %ymm0, %ymm2
vpand const_modq(%rip), %ymm2, %ymm2 vpand const_modq(%rip), %ymm2, %ymm2
vpand const_1s(%rip), %ymm3, %ymm3
vpor %ymm3, %ymm2, %ymm3 vpor %ymm3, %ymm2, %ymm3
vmovdqa %ymm3, 1376(%rsp) vmovdqa %ymm3, 1376(%rsp)
vmovdqu 1374(%rsp), %ymm0 vmovdqu 1374(%rsp), %ymm0
vpsubw 1376(%rsp), %ymm0, %ymm1 vpsubw 1376(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 1376(%rdi) vmovdqa %ymm1, 1376(%rdi)
vextracti128 $1, %ymm0, %xmm4 vextracti128 $1, %ymm0, %xmm4
vpshufb shuf_5_to_0_zerorest(%rip), %ymm4, %ymm4 vpshufb shuf_5_to_0_zerorest(%rip), %ymm4, %ymm4
vpsubw 0(%rsp), %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 vmovdqu 1342(%rsp), %ymm0
vpsubw 1344(%rsp), %ymm0, %ymm1 vpsubw 1344(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 1344(%rdi) vmovdqa %ymm1, 1344(%rdi)
vmovdqu 1310(%rsp), %ymm0 vmovdqu 1310(%rsp), %ymm0
vpsubw 1312(%rsp), %ymm0, %ymm1 vpsubw 1312(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 1312(%rdi) vmovdqa %ymm1, 1312(%rdi)
vmovdqu 1278(%rsp), %ymm0 vmovdqu 1278(%rsp), %ymm0
vpsubw 1280(%rsp), %ymm0, %ymm1 vpsubw 1280(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 1280(%rdi) vmovdqa %ymm1, 1280(%rdi)
vmovdqu 1246(%rsp), %ymm0 vmovdqu 1246(%rsp), %ymm0
vpsubw 1248(%rsp), %ymm0, %ymm1 vpsubw 1248(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 1248(%rdi) vmovdqa %ymm1, 1248(%rdi)
vmovdqu 1214(%rsp), %ymm0 vmovdqu 1214(%rsp), %ymm0
vpsubw 1216(%rsp), %ymm0, %ymm1 vpsubw 1216(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 1216(%rdi) vmovdqa %ymm1, 1216(%rdi)
vmovdqu 1182(%rsp), %ymm0 vmovdqu 1182(%rsp), %ymm0
vpsubw 1184(%rsp), %ymm0, %ymm1 vpsubw 1184(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 1184(%rdi) vmovdqa %ymm1, 1184(%rdi)
vmovdqu 1150(%rsp), %ymm0 vmovdqu 1150(%rsp), %ymm0
vpsubw 1152(%rsp), %ymm0, %ymm1 vpsubw 1152(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 1152(%rdi) vmovdqa %ymm1, 1152(%rdi)
vmovdqu 1118(%rsp), %ymm0 vmovdqu 1118(%rsp), %ymm0
vpsubw 1120(%rsp), %ymm0, %ymm1 vpsubw 1120(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 1120(%rdi) vmovdqa %ymm1, 1120(%rdi)
vmovdqu 1086(%rsp), %ymm0 vmovdqu 1086(%rsp), %ymm0
vpsubw 1088(%rsp), %ymm0, %ymm1 vpsubw 1088(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 1088(%rdi) vmovdqa %ymm1, 1088(%rdi)
vmovdqu 1054(%rsp), %ymm0 vmovdqu 1054(%rsp), %ymm0
vpsubw 1056(%rsp), %ymm0, %ymm1 vpsubw 1056(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 1056(%rdi) vmovdqa %ymm1, 1056(%rdi)
vmovdqu 1022(%rsp), %ymm0 vmovdqu 1022(%rsp), %ymm0
vpsubw 1024(%rsp), %ymm0, %ymm1 vpsubw 1024(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 1024(%rdi) vmovdqa %ymm1, 1024(%rdi)
vmovdqu 990(%rsp), %ymm0 vmovdqu 990(%rsp), %ymm0
vpsubw 992(%rsp), %ymm0, %ymm1 vpsubw 992(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 992(%rdi) vmovdqa %ymm1, 992(%rdi)
vmovdqu 958(%rsp), %ymm0 vmovdqu 958(%rsp), %ymm0
vpsubw 960(%rsp), %ymm0, %ymm1 vpsubw 960(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 960(%rdi) vmovdqa %ymm1, 960(%rdi)
vmovdqu 926(%rsp), %ymm0 vmovdqu 926(%rsp), %ymm0
vpsubw 928(%rsp), %ymm0, %ymm1 vpsubw 928(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 928(%rdi) vmovdqa %ymm1, 928(%rdi)
vmovdqu 894(%rsp), %ymm0 vmovdqu 894(%rsp), %ymm0
vpsubw 896(%rsp), %ymm0, %ymm1 vpsubw 896(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 896(%rdi) vmovdqa %ymm1, 896(%rdi)
vmovdqu 862(%rsp), %ymm0 vmovdqu 862(%rsp), %ymm0
vpsubw 864(%rsp), %ymm0, %ymm1 vpsubw 864(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 864(%rdi) vmovdqa %ymm1, 864(%rdi)
vmovdqu 830(%rsp), %ymm0 vmovdqu 830(%rsp), %ymm0
vpsubw 832(%rsp), %ymm0, %ymm1 vpsubw 832(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 832(%rdi) vmovdqa %ymm1, 832(%rdi)
vmovdqu 798(%rsp), %ymm0 vmovdqu 798(%rsp), %ymm0
vpsubw 800(%rsp), %ymm0, %ymm1 vpsubw 800(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 800(%rdi) vmovdqa %ymm1, 800(%rdi)
vmovdqu 766(%rsp), %ymm0 vmovdqu 766(%rsp), %ymm0
vpsubw 768(%rsp), %ymm0, %ymm1 vpsubw 768(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 768(%rdi) vmovdqa %ymm1, 768(%rdi)
vmovdqu 734(%rsp), %ymm0 vmovdqu 734(%rsp), %ymm0
vpsubw 736(%rsp), %ymm0, %ymm1 vpsubw 736(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 736(%rdi) vmovdqa %ymm1, 736(%rdi)
vmovdqu 702(%rsp), %ymm0 vmovdqu 702(%rsp), %ymm0
vpsubw 704(%rsp), %ymm0, %ymm1 vpsubw 704(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 704(%rdi) vmovdqa %ymm1, 704(%rdi)
vmovdqu 670(%rsp), %ymm0 vmovdqu 670(%rsp), %ymm0
vpsubw 672(%rsp), %ymm0, %ymm1 vpsubw 672(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 672(%rdi) vmovdqa %ymm1, 672(%rdi)
vmovdqu 638(%rsp), %ymm0 vmovdqu 638(%rsp), %ymm0
vpsubw 640(%rsp), %ymm0, %ymm1 vpsubw 640(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 640(%rdi) vmovdqa %ymm1, 640(%rdi)
vmovdqu 606(%rsp), %ymm0 vmovdqu 606(%rsp), %ymm0
vpsubw 608(%rsp), %ymm0, %ymm1 vpsubw 608(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 608(%rdi) vmovdqa %ymm1, 608(%rdi)
vmovdqu 574(%rsp), %ymm0 vmovdqu 574(%rsp), %ymm0
vpsubw 576(%rsp), %ymm0, %ymm1 vpsubw 576(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 576(%rdi) vmovdqa %ymm1, 576(%rdi)
vmovdqu 542(%rsp), %ymm0 vmovdqu 542(%rsp), %ymm0
vpsubw 544(%rsp), %ymm0, %ymm1 vpsubw 544(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 544(%rdi) vmovdqa %ymm1, 544(%rdi)
vmovdqu 510(%rsp), %ymm0 vmovdqu 510(%rsp), %ymm0
vpsubw 512(%rsp), %ymm0, %ymm1 vpsubw 512(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 512(%rdi) vmovdqa %ymm1, 512(%rdi)
vmovdqu 478(%rsp), %ymm0 vmovdqu 478(%rsp), %ymm0
vpsubw 480(%rsp), %ymm0, %ymm1 vpsubw 480(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 480(%rdi) vmovdqa %ymm1, 480(%rdi)
vmovdqu 446(%rsp), %ymm0 vmovdqu 446(%rsp), %ymm0
vpsubw 448(%rsp), %ymm0, %ymm1 vpsubw 448(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 448(%rdi) vmovdqa %ymm1, 448(%rdi)
vmovdqu 414(%rsp), %ymm0 vmovdqu 414(%rsp), %ymm0
vpsubw 416(%rsp), %ymm0, %ymm1 vpsubw 416(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 416(%rdi) vmovdqa %ymm1, 416(%rdi)
vmovdqu 382(%rsp), %ymm0 vmovdqu 382(%rsp), %ymm0
vpsubw 384(%rsp), %ymm0, %ymm1 vpsubw 384(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 384(%rdi) vmovdqa %ymm1, 384(%rdi)
vmovdqu 350(%rsp), %ymm0 vmovdqu 350(%rsp), %ymm0
vpsubw 352(%rsp), %ymm0, %ymm1 vpsubw 352(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 352(%rdi) vmovdqa %ymm1, 352(%rdi)
vmovdqu 318(%rsp), %ymm0 vmovdqu 318(%rsp), %ymm0
vpsubw 320(%rsp), %ymm0, %ymm1 vpsubw 320(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 320(%rdi) vmovdqa %ymm1, 320(%rdi)
vmovdqu 286(%rsp), %ymm0 vmovdqu 286(%rsp), %ymm0
vpsubw 288(%rsp), %ymm0, %ymm1 vpsubw 288(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 288(%rdi) vmovdqa %ymm1, 288(%rdi)
vmovdqu 254(%rsp), %ymm0 vmovdqu 254(%rsp), %ymm0
vpsubw 256(%rsp), %ymm0, %ymm1 vpsubw 256(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 256(%rdi) vmovdqa %ymm1, 256(%rdi)
vmovdqu 222(%rsp), %ymm0 vmovdqu 222(%rsp), %ymm0
vpsubw 224(%rsp), %ymm0, %ymm1 vpsubw 224(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 224(%rdi) vmovdqa %ymm1, 224(%rdi)
vmovdqu 190(%rsp), %ymm0 vmovdqu 190(%rsp), %ymm0
vpsubw 192(%rsp), %ymm0, %ymm1 vpsubw 192(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 192(%rdi) vmovdqa %ymm1, 192(%rdi)
vmovdqu 158(%rsp), %ymm0 vmovdqu 158(%rsp), %ymm0
vpsubw 160(%rsp), %ymm0, %ymm1 vpsubw 160(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 160(%rdi) vmovdqa %ymm1, 160(%rdi)
vmovdqu 126(%rsp), %ymm0 vmovdqu 126(%rsp), %ymm0
vpsubw 128(%rsp), %ymm0, %ymm1 vpsubw 128(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 128(%rdi) vmovdqa %ymm1, 128(%rdi)
vmovdqu 94(%rsp), %ymm0 vmovdqu 94(%rsp), %ymm0
vpsubw 96(%rsp), %ymm0, %ymm1 vpsubw 96(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 96(%rdi) vmovdqa %ymm1, 96(%rdi)
vmovdqu 62(%rsp), %ymm0 vmovdqu 62(%rsp), %ymm0
vpsubw 64(%rsp), %ymm0, %ymm1 vpsubw 64(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 64(%rdi) vmovdqa %ymm1, 64(%rdi)
vmovdqu 30(%rsp), %ymm0 vmovdqu 30(%rsp), %ymm0
vpsubw 32(%rsp), %ymm0, %ymm1 vpsubw 32(%rsp), %ymm0, %ymm1
vpand mask_mod8192(%rip), %ymm1, %ymm1
vmovdqa %ymm1, 32(%rdi) vmovdqa %ymm1, 32(%rdi)
vmovdqa 0(%rsp), %ymm3 vmovdqa 0(%rsp), %ymm3
vpsrlq $48, %ymm3, %ymm0 vpsrlq $48, %ymm3, %ymm0
@ -3378,7 +3240,7 @@ vpermq $147, %ymm0, %ymm0
vpsllq $16, %ymm3, %ymm2 vpsllq $16, %ymm3, %ymm2
vpxor %ymm0, %ymm2, %ymm2 vpxor %ymm0, %ymm2, %ymm2
vpsubw %ymm3, %ymm2, %ymm3 vpsubw %ymm3, %ymm2, %ymm3
vpand mask_mod8192_omit_lowest(%rip), %ymm3, %ymm3 vpand mask_omit_lowest(%rip), %ymm3, %ymm3
vpxor %ymm3, %ymm4, %ymm3 vpxor %ymm3, %ymm4, %ymm3
vmovdqa %ymm3, 0(%rdi) vmovdqa %ymm3, 0(%rdi)
mov %r8, %rsp mov %r8, %rsp

View File

@ -303,23 +303,6 @@ mask_keephigh:
.word 65535 .word 65535
.word 65535 .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 .text
.global PQCLEAN_NTRUHRSS701_AVX2_poly_Rq_mul .global PQCLEAN_NTRUHRSS701_AVX2_poly_Rq_mul
.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 vpor %ymm10, %ymm5, %ymm5
vpaddw %ymm5, %ymm3, %ymm3 vpaddw %ymm5, %ymm3, %ymm3
vmovdqa %xmm9, 2560(%rsp) vmovdqa %xmm9, 2560(%rsp)
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 0(%rdi) vmovdqu %ymm11, 0(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 352(%rdi) vmovdqu %ymm6, 352(%rdi)
vpand mask_mod8192(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 704(%rdi) vmovdqu %ymm3, 704(%rdi)
vpand mask_mod8192(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 1056(%rdi) vmovdqu %ymm4, 1056(%rdi)
vmovdqa 32(%rsp), %ymm5 vmovdqa 32(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm8 vpunpcklwd const0(%rip), %ymm5, %ymm8
@ -5309,13 +5288,9 @@ vpand mask_keephigh(%rip), %ymm7, %ymm8
vpor %ymm8, %ymm11, %ymm11 vpor %ymm8, %ymm11, %ymm11
vpaddw %ymm11, %ymm10, %ymm10 vpaddw %ymm11, %ymm10, %ymm10
vmovdqa %xmm7, 2592(%rsp) vmovdqa %xmm7, 2592(%rsp)
vpand mask_mod8192(%rip), %ymm5, %ymm5
vmovdqu %ymm5, 88(%rdi) vmovdqu %ymm5, 88(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 440(%rdi) vmovdqu %ymm6, 440(%rdi)
vpand mask_mod8192(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 792(%rdi) vmovdqu %ymm10, 792(%rdi)
vpand mask_mod8192(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 1144(%rdi) vmovdqu %ymm9, 1144(%rdi)
vmovdqa 64(%rsp), %ymm11 vmovdqa 64(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm4 vpunpcklwd const0(%rip), %ymm11, %ymm4
@ -5405,13 +5380,9 @@ vpand mask_keephigh(%rip), %ymm3, %ymm4
vpor %ymm4, %ymm5, %ymm5 vpor %ymm4, %ymm5, %ymm5
vpaddw %ymm5, %ymm8, %ymm8 vpaddw %ymm5, %ymm8, %ymm8
vmovdqa %xmm3, 2624(%rsp) vmovdqa %xmm3, 2624(%rsp)
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 176(%rdi) vmovdqu %ymm11, 176(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 528(%rdi) vmovdqu %ymm6, 528(%rdi)
vpand mask_mod8192(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 880(%rdi) vmovdqu %ymm8, 880(%rdi)
vpand mask_mod8192(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 1232(%rdi) vmovdqu %ymm7, 1232(%rdi)
vmovdqa 96(%rsp), %ymm5 vmovdqa 96(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm9 vpunpcklwd const0(%rip), %ymm5, %ymm9
@ -5501,13 +5472,9 @@ vpand mask_keephigh(%rip), %ymm10, %ymm9
vpor %ymm9, %ymm11, %ymm11 vpor %ymm9, %ymm11, %ymm11
vpaddw %ymm11, %ymm4, %ymm4 vpaddw %ymm11, %ymm4, %ymm4
vmovdqa %xmm10, 2656(%rsp) vmovdqa %xmm10, 2656(%rsp)
vpand mask_mod8192(%rip), %ymm5, %ymm5
vmovdqu %ymm5, 264(%rdi) vmovdqu %ymm5, 264(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 616(%rdi) vmovdqu %ymm6, 616(%rdi)
vpand mask_mod8192(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 968(%rdi) vmovdqu %ymm4, 968(%rdi)
vpand mask_mod8192(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 1320(%rdi) vmovdqu %ymm3, 1320(%rdi)
vmovdqa 128(%rsp), %ymm11 vmovdqa 128(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm7 vpunpcklwd const0(%rip), %ymm11, %ymm7
@ -5587,7 +5554,6 @@ vpand mask_keephigh(%rip), %ymm2, %ymm7
vpor %ymm7, %ymm10, %ymm10 vpor %ymm7, %ymm10, %ymm10
vmovdqu 0(%rdi), %ymm7 vmovdqu 0(%rdi), %ymm7
vpaddw %ymm10, %ymm7, %ymm7 vpaddw %ymm10, %ymm7, %ymm7
vpand mask_mod8192(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 0(%rdi) vmovdqu %ymm7, 0(%rdi)
vmovdqa %xmm2, 1920(%rsp) vmovdqa %xmm2, 1920(%rsp)
vpshufb shuf48_16(%rip), %ymm4, %ymm4 vpshufb shuf48_16(%rip), %ymm4, %ymm4
@ -5614,11 +5580,8 @@ vpand mask_keephigh(%rip), %ymm2, %ymm7
vpor %ymm7, %ymm5, %ymm5 vpor %ymm7, %ymm5, %ymm5
vpaddw %ymm5, %ymm9, %ymm9 vpaddw %ymm5, %ymm9, %ymm9
vmovdqa %xmm2, 2688(%rsp) vmovdqa %xmm2, 2688(%rsp)
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 352(%rdi) vmovdqu %ymm11, 352(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 704(%rdi) vmovdqu %ymm6, 704(%rdi)
vpand mask_mod8192(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 1056(%rdi) vmovdqu %ymm9, 1056(%rdi)
vmovdqa 160(%rsp), %ymm5 vmovdqa 160(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm3 vpunpcklwd const0(%rip), %ymm5, %ymm3
@ -5698,7 +5661,6 @@ vpand mask_keephigh(%rip), %ymm8, %ymm3
vpor %ymm3, %ymm2, %ymm2 vpor %ymm3, %ymm2, %ymm2
vmovdqu 88(%rdi), %ymm3 vmovdqu 88(%rdi), %ymm3
vpaddw %ymm2, %ymm3, %ymm3 vpaddw %ymm2, %ymm3, %ymm3
vpand mask_mod8192(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 88(%rdi) vmovdqu %ymm3, 88(%rdi)
vmovdqa %xmm8, 1952(%rsp) vmovdqa %xmm8, 1952(%rsp)
vpshufb shuf48_16(%rip), %ymm9, %ymm9 vpshufb shuf48_16(%rip), %ymm9, %ymm9
@ -5725,11 +5687,8 @@ vpand mask_keephigh(%rip), %ymm8, %ymm3
vpor %ymm3, %ymm11, %ymm11 vpor %ymm3, %ymm11, %ymm11
vpaddw %ymm11, %ymm7, %ymm7 vpaddw %ymm11, %ymm7, %ymm7
vmovdqa %xmm8, 2720(%rsp) vmovdqa %xmm8, 2720(%rsp)
vpand mask_mod8192(%rip), %ymm5, %ymm5
vmovdqu %ymm5, 440(%rdi) vmovdqu %ymm5, 440(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 792(%rdi) vmovdqu %ymm6, 792(%rdi)
vpand mask_mod8192(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 1144(%rdi) vmovdqu %ymm7, 1144(%rdi)
vmovdqa 192(%rsp), %ymm11 vmovdqa 192(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm10 vpunpcklwd const0(%rip), %ymm11, %ymm10
@ -5809,7 +5768,6 @@ vpand mask_keephigh(%rip), %ymm4, %ymm10
vpor %ymm10, %ymm8, %ymm8 vpor %ymm10, %ymm8, %ymm8
vmovdqu 176(%rdi), %ymm10 vmovdqu 176(%rdi), %ymm10
vpaddw %ymm8, %ymm10, %ymm10 vpaddw %ymm8, %ymm10, %ymm10
vpand mask_mod8192(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 176(%rdi) vmovdqu %ymm10, 176(%rdi)
vmovdqa %xmm4, 1984(%rsp) vmovdqa %xmm4, 1984(%rsp)
vpshufb shuf48_16(%rip), %ymm7, %ymm7 vpshufb shuf48_16(%rip), %ymm7, %ymm7
@ -5836,11 +5794,8 @@ vpand mask_keephigh(%rip), %ymm4, %ymm10
vpor %ymm10, %ymm5, %ymm5 vpor %ymm10, %ymm5, %ymm5
vpaddw %ymm5, %ymm3, %ymm3 vpaddw %ymm5, %ymm3, %ymm3
vmovdqa %xmm4, 2752(%rsp) vmovdqa %xmm4, 2752(%rsp)
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 528(%rdi) vmovdqu %ymm11, 528(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 880(%rdi) vmovdqu %ymm6, 880(%rdi)
vpand mask_mod8192(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 1232(%rdi) vmovdqu %ymm3, 1232(%rdi)
vmovdqa 224(%rsp), %ymm5 vmovdqa 224(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm2 vpunpcklwd const0(%rip), %ymm5, %ymm2
@ -5920,7 +5875,6 @@ vpand mask_keephigh(%rip), %ymm9, %ymm2
vpor %ymm2, %ymm4, %ymm4 vpor %ymm2, %ymm4, %ymm4
vmovdqu 264(%rdi), %ymm2 vmovdqu 264(%rdi), %ymm2
vpaddw %ymm4, %ymm2, %ymm2 vpaddw %ymm4, %ymm2, %ymm2
vpand mask_mod8192(%rip), %ymm2, %ymm2
vmovdqu %ymm2, 264(%rdi) vmovdqu %ymm2, 264(%rdi)
vmovdqa %xmm9, 2016(%rsp) vmovdqa %xmm9, 2016(%rsp)
vpshufb shuf48_16(%rip), %ymm3, %ymm3 vpshufb shuf48_16(%rip), %ymm3, %ymm3
@ -5947,11 +5901,8 @@ vpand mask_keephigh(%rip), %ymm9, %ymm2
vpor %ymm2, %ymm11, %ymm11 vpor %ymm2, %ymm11, %ymm11
vpaddw %ymm11, %ymm10, %ymm10 vpaddw %ymm11, %ymm10, %ymm10
vmovdqa %xmm9, 2784(%rsp) vmovdqa %xmm9, 2784(%rsp)
vpand mask_mod8192(%rip), %ymm5, %ymm5
vmovdqu %ymm5, 616(%rdi) vmovdqu %ymm5, 616(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 968(%rdi) vmovdqu %ymm6, 968(%rdi)
vpand mask_mod8192(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 1320(%rdi) vmovdqu %ymm10, 1320(%rdi)
vmovdqa 128(%r12), %ymm0 vmovdqa 128(%r12), %ymm0
vpsubw 224(%r12), %ymm0, %ymm0 vpsubw 224(%r12), %ymm0, %ymm0
@ -6345,13 +6296,9 @@ vpor %ymm8, %ymm5, %ymm5
vpaddw 2560(%rsp), %ymm2, %ymm2 vpaddw 2560(%rsp), %ymm2, %ymm2
vpaddw %ymm5, %ymm2, %ymm2 vpaddw %ymm5, %ymm2, %ymm2
vmovdqa %xmm3, 2560(%rsp) vmovdqa %xmm3, 2560(%rsp)
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 32(%rdi) vmovdqu %ymm11, 32(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 384(%rdi) vmovdqu %ymm6, 384(%rdi)
vpand mask_mod8192(%rip), %ymm2, %ymm2
vmovdqu %ymm2, 736(%rdi) vmovdqu %ymm2, 736(%rdi)
vpand mask_mod8192(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 1088(%rdi) vmovdqu %ymm9, 1088(%rdi)
vmovdqa 32(%rsp), %ymm5 vmovdqa 32(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm4 vpunpcklwd const0(%rip), %ymm5, %ymm4
@ -6444,13 +6391,9 @@ vpor %ymm4, %ymm11, %ymm11
vpaddw 2592(%rsp), %ymm8, %ymm8 vpaddw 2592(%rsp), %ymm8, %ymm8
vpaddw %ymm11, %ymm8, %ymm8 vpaddw %ymm11, %ymm8, %ymm8
vmovdqa %xmm10, 2592(%rsp) vmovdqa %xmm10, 2592(%rsp)
vpand mask_mod8192(%rip), %ymm5, %ymm5
vmovdqu %ymm5, 120(%rdi) vmovdqu %ymm5, 120(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 472(%rdi) vmovdqu %ymm6, 472(%rdi)
vpand mask_mod8192(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 824(%rdi) vmovdqu %ymm8, 824(%rdi)
vpand mask_mod8192(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 1176(%rdi) vmovdqu %ymm3, 1176(%rdi)
vmovdqa 64(%rsp), %ymm11 vmovdqa 64(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm9 vpunpcklwd const0(%rip), %ymm11, %ymm9
@ -6543,13 +6486,9 @@ vpor %ymm9, %ymm5, %ymm5
vpaddw 2624(%rsp), %ymm4, %ymm4 vpaddw 2624(%rsp), %ymm4, %ymm4
vpaddw %ymm5, %ymm4, %ymm4 vpaddw %ymm5, %ymm4, %ymm4
vmovdqa %xmm2, 2624(%rsp) vmovdqa %xmm2, 2624(%rsp)
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 208(%rdi) vmovdqu %ymm11, 208(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 560(%rdi) vmovdqu %ymm6, 560(%rdi)
vpand mask_mod8192(%rip), %ymm4, %ymm4
vmovdqu %ymm4, 912(%rdi) vmovdqu %ymm4, 912(%rdi)
vpand mask_mod8192(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 1264(%rdi) vmovdqu %ymm10, 1264(%rdi)
vmovdqa 96(%rsp), %ymm5 vmovdqa 96(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm3 vpunpcklwd const0(%rip), %ymm5, %ymm3
@ -6642,13 +6581,9 @@ vpor %ymm3, %ymm11, %ymm11
vpaddw 2656(%rsp), %ymm9, %ymm9 vpaddw 2656(%rsp), %ymm9, %ymm9
vpaddw %ymm11, %ymm9, %ymm9 vpaddw %ymm11, %ymm9, %ymm9
vmovdqa %xmm8, 2656(%rsp) vmovdqa %xmm8, 2656(%rsp)
vpand mask_mod8192(%rip), %ymm5, %ymm5
vmovdqu %ymm5, 296(%rdi) vmovdqu %ymm5, 296(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 648(%rdi) vmovdqu %ymm6, 648(%rdi)
vpand mask_mod8192(%rip), %ymm9, %ymm9
vmovdqu %ymm9, 1000(%rdi) vmovdqu %ymm9, 1000(%rdi)
vpand mask_mod8192(%rip), %ymm2, %ymm2
vmovdqu %ymm2, 1352(%rdi) vmovdqu %ymm2, 1352(%rdi)
vmovdqa 128(%rsp), %ymm11 vmovdqa 128(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm10 vpunpcklwd const0(%rip), %ymm11, %ymm10
@ -6729,7 +6664,6 @@ vpor %ymm10, %ymm8, %ymm8
vmovdqu 32(%rdi), %ymm10 vmovdqu 32(%rdi), %ymm10
vpaddw 1920(%rsp), %ymm10, %ymm10 vpaddw 1920(%rsp), %ymm10, %ymm10
vpaddw %ymm8, %ymm10, %ymm10 vpaddw %ymm8, %ymm10, %ymm10
vpand mask_mod8192(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 32(%rdi) vmovdqu %ymm10, 32(%rdi)
vmovdqa %xmm7, 1920(%rsp) vmovdqa %xmm7, 1920(%rsp)
vpshufb shuf48_16(%rip), %ymm9, %ymm9 vpshufb shuf48_16(%rip), %ymm9, %ymm9
@ -6759,11 +6693,8 @@ vpor %ymm10, %ymm5, %ymm5
vpaddw 2688(%rsp), %ymm3, %ymm3 vpaddw 2688(%rsp), %ymm3, %ymm3
vpaddw %ymm5, %ymm3, %ymm3 vpaddw %ymm5, %ymm3, %ymm3
vmovdqa %xmm7, 2688(%rsp) vmovdqa %xmm7, 2688(%rsp)
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 384(%rdi) vmovdqu %ymm11, 384(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 736(%rdi) vmovdqu %ymm6, 736(%rdi)
vpand mask_mod8192(%rip), %ymm3, %ymm3
vmovdqu %ymm3, 1088(%rdi) vmovdqu %ymm3, 1088(%rdi)
vmovdqa 160(%rsp), %ymm5 vmovdqa 160(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm2 vpunpcklwd const0(%rip), %ymm5, %ymm2
@ -6844,7 +6775,6 @@ vpor %ymm2, %ymm7, %ymm7
vmovdqu 120(%rdi), %ymm2 vmovdqu 120(%rdi), %ymm2
vpaddw 1952(%rsp), %ymm2, %ymm2 vpaddw 1952(%rsp), %ymm2, %ymm2
vpaddw %ymm7, %ymm2, %ymm2 vpaddw %ymm7, %ymm2, %ymm2
vpand mask_mod8192(%rip), %ymm2, %ymm2
vmovdqu %ymm2, 120(%rdi) vmovdqu %ymm2, 120(%rdi)
vmovdqa %xmm4, 1952(%rsp) vmovdqa %xmm4, 1952(%rsp)
vpshufb shuf48_16(%rip), %ymm3, %ymm3 vpshufb shuf48_16(%rip), %ymm3, %ymm3
@ -6874,11 +6804,8 @@ vpor %ymm2, %ymm11, %ymm11
vpaddw 2720(%rsp), %ymm10, %ymm10 vpaddw 2720(%rsp), %ymm10, %ymm10
vpaddw %ymm11, %ymm10, %ymm10 vpaddw %ymm11, %ymm10, %ymm10
vmovdqa %xmm4, 2720(%rsp) vmovdqa %xmm4, 2720(%rsp)
vpand mask_mod8192(%rip), %ymm5, %ymm5
vmovdqu %ymm5, 472(%rdi) vmovdqu %ymm5, 472(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 824(%rdi) vmovdqu %ymm6, 824(%rdi)
vpand mask_mod8192(%rip), %ymm10, %ymm10
vmovdqu %ymm10, 1176(%rdi) vmovdqu %ymm10, 1176(%rdi)
vmovdqa 192(%rsp), %ymm11 vmovdqa 192(%rsp), %ymm11
vpunpcklwd const0(%rip), %ymm11, %ymm8 vpunpcklwd const0(%rip), %ymm11, %ymm8
@ -6959,7 +6886,6 @@ vpor %ymm8, %ymm4, %ymm4
vmovdqu 208(%rdi), %ymm8 vmovdqu 208(%rdi), %ymm8
vpaddw 1984(%rsp), %ymm8, %ymm8 vpaddw 1984(%rsp), %ymm8, %ymm8
vpaddw %ymm4, %ymm8, %ymm8 vpaddw %ymm4, %ymm8, %ymm8
vpand mask_mod8192(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 208(%rdi) vmovdqu %ymm8, 208(%rdi)
vmovdqa %xmm9, 1984(%rsp) vmovdqa %xmm9, 1984(%rsp)
vpshufb shuf48_16(%rip), %ymm10, %ymm10 vpshufb shuf48_16(%rip), %ymm10, %ymm10
@ -6989,11 +6915,8 @@ vpor %ymm8, %ymm5, %ymm5
vpaddw 2752(%rsp), %ymm2, %ymm2 vpaddw 2752(%rsp), %ymm2, %ymm2
vpaddw %ymm5, %ymm2, %ymm2 vpaddw %ymm5, %ymm2, %ymm2
vmovdqa %xmm9, 2752(%rsp) vmovdqa %xmm9, 2752(%rsp)
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 560(%rdi) vmovdqu %ymm11, 560(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 912(%rdi) vmovdqu %ymm6, 912(%rdi)
vpand mask_mod8192(%rip), %ymm2, %ymm2
vmovdqu %ymm2, 1264(%rdi) vmovdqu %ymm2, 1264(%rdi)
vmovdqa 224(%rsp), %ymm5 vmovdqa 224(%rsp), %ymm5
vpunpcklwd const0(%rip), %ymm5, %ymm7 vpunpcklwd const0(%rip), %ymm5, %ymm7
@ -7074,7 +6997,6 @@ vpor %ymm7, %ymm9, %ymm9
vmovdqu 296(%rdi), %ymm7 vmovdqu 296(%rdi), %ymm7
vpaddw 2016(%rsp), %ymm7, %ymm7 vpaddw 2016(%rsp), %ymm7, %ymm7
vpaddw %ymm9, %ymm7, %ymm7 vpaddw %ymm9, %ymm7, %ymm7
vpand mask_mod8192(%rip), %ymm7, %ymm7
vmovdqu %ymm7, 296(%rdi) vmovdqu %ymm7, 296(%rdi)
vmovdqa %xmm3, 2016(%rsp) vmovdqa %xmm3, 2016(%rsp)
vpshufb shuf48_16(%rip), %ymm2, %ymm2 vpshufb shuf48_16(%rip), %ymm2, %ymm2
@ -7104,11 +7026,8 @@ vpor %ymm7, %ymm11, %ymm11
vpaddw 2784(%rsp), %ymm8, %ymm8 vpaddw 2784(%rsp), %ymm8, %ymm8
vpaddw %ymm11, %ymm8, %ymm8 vpaddw %ymm11, %ymm8, %ymm8
vmovdqa %xmm3, 2784(%rsp) vmovdqa %xmm3, 2784(%rsp)
vpand mask_mod8192(%rip), %ymm5, %ymm5
vmovdqu %ymm5, 648(%rdi) vmovdqu %ymm5, 648(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %ymm6, 1000(%rdi) vmovdqu %ymm6, 1000(%rdi)
vpand mask_mod8192(%rip), %ymm8, %ymm8
vmovdqu %ymm8, 1352(%rdi) vmovdqu %ymm8, 1352(%rdi)
vmovdqa 160(%r12), %ymm0 vmovdqa 160(%r12), %ymm0
vpsubw 256(%r12), %ymm0, %ymm0 vpsubw 256(%r12), %ymm0, %ymm0
@ -7502,19 +7421,15 @@ vpor %ymm4, %ymm5, %ymm5
vpaddw 2560(%rsp), %ymm7, %ymm7 vpaddw 2560(%rsp), %ymm7, %ymm7
vpaddw %ymm5, %ymm7, %ymm7 vpaddw %ymm5, %ymm7, %ymm7
vmovdqa %xmm2, 2560(%rsp) vmovdqa %xmm2, 2560(%rsp)
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %xmm11, 64(%rdi) vmovdqu %xmm11, 64(%rdi)
vextracti128 $1, %ymm11, %xmm11 vextracti128 $1, %ymm11, %xmm11
vmovq %xmm11, 80(%rdi) vmovq %xmm11, 80(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %xmm6, 416(%rdi) vmovdqu %xmm6, 416(%rdi)
vextracti128 $1, %ymm6, %xmm6 vextracti128 $1, %ymm6, %xmm6
vmovq %xmm6, 432(%rdi) vmovq %xmm6, 432(%rdi)
vpand mask_mod8192(%rip), %ymm7, %ymm7
vmovdqu %xmm7, 768(%rdi) vmovdqu %xmm7, 768(%rdi)
vextracti128 $1, %ymm7, %xmm7 vextracti128 $1, %ymm7, %xmm7
vmovq %xmm7, 784(%rdi) vmovq %xmm7, 784(%rdi)
vpand mask_mod8192(%rip), %ymm3, %ymm3
vmovdqu %xmm3, 1120(%rdi) vmovdqu %xmm3, 1120(%rdi)
vextracti128 $1, %ymm3, %xmm3 vextracti128 $1, %ymm3, %xmm3
vmovq %xmm3, 1136(%rdi) vmovq %xmm3, 1136(%rdi)
@ -7609,19 +7524,15 @@ vpor %ymm9, %ymm11, %ymm11
vpaddw 2592(%rsp), %ymm4, %ymm4 vpaddw 2592(%rsp), %ymm4, %ymm4
vpaddw %ymm11, %ymm4, %ymm4 vpaddw %ymm11, %ymm4, %ymm4
vmovdqa %xmm8, 2592(%rsp) vmovdqa %xmm8, 2592(%rsp)
vpand mask_mod8192(%rip), %ymm5, %ymm5
vmovdqu %xmm5, 152(%rdi) vmovdqu %xmm5, 152(%rdi)
vextracti128 $1, %ymm5, %xmm5 vextracti128 $1, %ymm5, %xmm5
vmovq %xmm5, 168(%rdi) vmovq %xmm5, 168(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %xmm6, 504(%rdi) vmovdqu %xmm6, 504(%rdi)
vextracti128 $1, %ymm6, %xmm6 vextracti128 $1, %ymm6, %xmm6
vmovq %xmm6, 520(%rdi) vmovq %xmm6, 520(%rdi)
vpand mask_mod8192(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 856(%rdi) vmovdqu %xmm4, 856(%rdi)
vextracti128 $1, %ymm4, %xmm4 vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 872(%rdi) vmovq %xmm4, 872(%rdi)
vpand mask_mod8192(%rip), %ymm2, %ymm2
vmovdqu %xmm2, 1208(%rdi) vmovdqu %xmm2, 1208(%rdi)
vextracti128 $1, %ymm2, %xmm2 vextracti128 $1, %ymm2, %xmm2
vmovq %xmm2, 1224(%rdi) vmovq %xmm2, 1224(%rdi)
@ -7716,19 +7627,15 @@ vpor %ymm3, %ymm5, %ymm5
vpaddw 2624(%rsp), %ymm9, %ymm9 vpaddw 2624(%rsp), %ymm9, %ymm9
vpaddw %ymm5, %ymm9, %ymm9 vpaddw %ymm5, %ymm9, %ymm9
vmovdqa %xmm7, 2624(%rsp) vmovdqa %xmm7, 2624(%rsp)
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %xmm11, 240(%rdi) vmovdqu %xmm11, 240(%rdi)
vextracti128 $1, %ymm11, %xmm11 vextracti128 $1, %ymm11, %xmm11
vmovq %xmm11, 256(%rdi) vmovq %xmm11, 256(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %xmm6, 592(%rdi) vmovdqu %xmm6, 592(%rdi)
vextracti128 $1, %ymm6, %xmm6 vextracti128 $1, %ymm6, %xmm6
vmovq %xmm6, 608(%rdi) vmovq %xmm6, 608(%rdi)
vpand mask_mod8192(%rip), %ymm9, %ymm9
vmovdqu %xmm9, 944(%rdi) vmovdqu %xmm9, 944(%rdi)
vextracti128 $1, %ymm9, %xmm9 vextracti128 $1, %ymm9, %xmm9
vmovq %xmm9, 960(%rdi) vmovq %xmm9, 960(%rdi)
vpand mask_mod8192(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 1296(%rdi) vmovdqu %xmm8, 1296(%rdi)
vextracti128 $1, %ymm8, %xmm8 vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 1312(%rdi) vmovq %xmm8, 1312(%rdi)
@ -7823,25 +7730,21 @@ vpor %ymm2, %ymm11, %ymm11
vpaddw 2656(%rsp), %ymm3, %ymm3 vpaddw 2656(%rsp), %ymm3, %ymm3
vpaddw %ymm11, %ymm3, %ymm3 vpaddw %ymm11, %ymm3, %ymm3
vmovdqa %xmm4, 2656(%rsp) vmovdqa %xmm4, 2656(%rsp)
vpand mask_mod8192(%rip), %ymm5, %ymm5
vmovdqu %xmm5, 328(%rdi) vmovdqu %xmm5, 328(%rdi)
vextracti128 $1, %ymm5, %xmm5 vextracti128 $1, %ymm5, %xmm5
vmovq %xmm5, 344(%rdi) vmovq %xmm5, 344(%rdi)
vpshufb shufmin1_mask3(%rip), %ymm5, %ymm5 vpshufb shufmin1_mask3(%rip), %ymm5, %ymm5
vmovdqa %xmm5, 1792(%rsp) vmovdqa %xmm5, 1792(%rsp)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %xmm6, 680(%rdi) vmovdqu %xmm6, 680(%rdi)
vextracti128 $1, %ymm6, %xmm6 vextracti128 $1, %ymm6, %xmm6
vmovq %xmm6, 696(%rdi) vmovq %xmm6, 696(%rdi)
vpshufb shufmin1_mask3(%rip), %ymm6, %ymm6 vpshufb shufmin1_mask3(%rip), %ymm6, %ymm6
vmovdqa %xmm6, 1824(%rsp) vmovdqa %xmm6, 1824(%rsp)
vpand mask_mod8192(%rip), %ymm3, %ymm3
vmovdqu %xmm3, 1032(%rdi) vmovdqu %xmm3, 1032(%rdi)
vextracti128 $1, %ymm3, %xmm3 vextracti128 $1, %ymm3, %xmm3
vmovq %xmm3, 1048(%rdi) vmovq %xmm3, 1048(%rdi)
vpshufb shufmin1_mask3(%rip), %ymm3, %ymm3 vpshufb shufmin1_mask3(%rip), %ymm3, %ymm3
vmovdqa %xmm3, 1856(%rsp) vmovdqa %xmm3, 1856(%rsp)
vpand mask_mod8192(%rip), %ymm7, %ymm7
vmovdqu %xmm7, 1384(%rdi) vmovdqu %xmm7, 1384(%rdi)
vextracti128 $1, %ymm7, %xmm7 vextracti128 $1, %ymm7, %xmm7
vmovq %xmm7, 1400(%rdi) vmovq %xmm7, 1400(%rdi)
@ -7926,7 +7829,6 @@ vpor %ymm8, %ymm4, %ymm4
vmovdqu 64(%rdi), %ymm8 vmovdqu 64(%rdi), %ymm8
vpaddw 1920(%rsp), %ymm8, %ymm8 vpaddw 1920(%rsp), %ymm8, %ymm8
vpaddw %ymm4, %ymm8, %ymm8 vpaddw %ymm4, %ymm8, %ymm8
vpand mask_mod8192(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 64(%rdi) vmovdqu %xmm8, 64(%rdi)
vextracti128 $1, %ymm8, %xmm8 vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 80(%rdi) vmovq %xmm8, 80(%rdi)
@ -7958,15 +7860,12 @@ vpor %ymm8, %ymm5, %ymm5
vpaddw 2688(%rsp), %ymm2, %ymm2 vpaddw 2688(%rsp), %ymm2, %ymm2
vpaddw %ymm5, %ymm2, %ymm2 vpaddw %ymm5, %ymm2, %ymm2
vmovdqa %xmm10, 2688(%rsp) vmovdqa %xmm10, 2688(%rsp)
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %xmm11, 416(%rdi) vmovdqu %xmm11, 416(%rdi)
vextracti128 $1, %ymm11, %xmm11 vextracti128 $1, %ymm11, %xmm11
vmovq %xmm11, 432(%rdi) vmovq %xmm11, 432(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %xmm6, 768(%rdi) vmovdqu %xmm6, 768(%rdi)
vextracti128 $1, %ymm6, %xmm6 vextracti128 $1, %ymm6, %xmm6
vmovq %xmm6, 784(%rdi) vmovq %xmm6, 784(%rdi)
vpand mask_mod8192(%rip), %ymm2, %ymm2
vmovdqu %xmm2, 1120(%rdi) vmovdqu %xmm2, 1120(%rdi)
vextracti128 $1, %ymm2, %xmm2 vextracti128 $1, %ymm2, %xmm2
vmovq %xmm2, 1136(%rdi) vmovq %xmm2, 1136(%rdi)
@ -8049,7 +7948,6 @@ vpor %ymm7, %ymm10, %ymm10
vmovdqu 152(%rdi), %ymm7 vmovdqu 152(%rdi), %ymm7
vpaddw 1952(%rsp), %ymm7, %ymm7 vpaddw 1952(%rsp), %ymm7, %ymm7
vpaddw %ymm10, %ymm7, %ymm7 vpaddw %ymm10, %ymm7, %ymm7
vpand mask_mod8192(%rip), %ymm7, %ymm7
vmovdqu %xmm7, 152(%rdi) vmovdqu %xmm7, 152(%rdi)
vextracti128 $1, %ymm7, %xmm7 vextracti128 $1, %ymm7, %xmm7
vmovq %xmm7, 168(%rdi) vmovq %xmm7, 168(%rdi)
@ -8081,15 +7979,12 @@ vpor %ymm7, %ymm11, %ymm11
vpaddw 2720(%rsp), %ymm8, %ymm8 vpaddw 2720(%rsp), %ymm8, %ymm8
vpaddw %ymm11, %ymm8, %ymm8 vpaddw %ymm11, %ymm8, %ymm8
vmovdqa %xmm9, 2720(%rsp) vmovdqa %xmm9, 2720(%rsp)
vpand mask_mod8192(%rip), %ymm5, %ymm5
vmovdqu %xmm5, 504(%rdi) vmovdqu %xmm5, 504(%rdi)
vextracti128 $1, %ymm5, %xmm5 vextracti128 $1, %ymm5, %xmm5
vmovq %xmm5, 520(%rdi) vmovq %xmm5, 520(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %xmm6, 856(%rdi) vmovdqu %xmm6, 856(%rdi)
vextracti128 $1, %ymm6, %xmm6 vextracti128 $1, %ymm6, %xmm6
vmovq %xmm6, 872(%rdi) vmovq %xmm6, 872(%rdi)
vpand mask_mod8192(%rip), %ymm8, %ymm8
vmovdqu %xmm8, 1208(%rdi) vmovdqu %xmm8, 1208(%rdi)
vextracti128 $1, %ymm8, %xmm8 vextracti128 $1, %ymm8, %xmm8
vmovq %xmm8, 1224(%rdi) vmovq %xmm8, 1224(%rdi)
@ -8172,7 +8067,6 @@ vpor %ymm4, %ymm9, %ymm9
vmovdqu 240(%rdi), %ymm4 vmovdqu 240(%rdi), %ymm4
vpaddw 1984(%rsp), %ymm4, %ymm4 vpaddw 1984(%rsp), %ymm4, %ymm4
vpaddw %ymm9, %ymm4, %ymm4 vpaddw %ymm9, %ymm4, %ymm4
vpand mask_mod8192(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 240(%rdi) vmovdqu %xmm4, 240(%rdi)
vextracti128 $1, %ymm4, %xmm4 vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 256(%rdi) vmovq %xmm4, 256(%rdi)
@ -8204,15 +8098,12 @@ vpor %ymm4, %ymm5, %ymm5
vpaddw 2752(%rsp), %ymm7, %ymm7 vpaddw 2752(%rsp), %ymm7, %ymm7
vpaddw %ymm5, %ymm7, %ymm7 vpaddw %ymm5, %ymm7, %ymm7
vmovdqa %xmm3, 2752(%rsp) vmovdqa %xmm3, 2752(%rsp)
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %xmm11, 592(%rdi) vmovdqu %xmm11, 592(%rdi)
vextracti128 $1, %ymm11, %xmm11 vextracti128 $1, %ymm11, %xmm11
vmovq %xmm11, 608(%rdi) vmovq %xmm11, 608(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %xmm6, 944(%rdi) vmovdqu %xmm6, 944(%rdi)
vextracti128 $1, %ymm6, %xmm6 vextracti128 $1, %ymm6, %xmm6
vmovq %xmm6, 960(%rdi) vmovq %xmm6, 960(%rdi)
vpand mask_mod8192(%rip), %ymm7, %ymm7
vmovdqu %xmm7, 1296(%rdi) vmovdqu %xmm7, 1296(%rdi)
vextracti128 $1, %ymm7, %xmm7 vextracti128 $1, %ymm7, %xmm7
vmovq %xmm7, 1312(%rdi) vmovq %xmm7, 1312(%rdi)
@ -8304,7 +8195,6 @@ vpor %ymm10, %ymm3, %ymm3
vmovdqu 328(%rdi), %ymm10 vmovdqu 328(%rdi), %ymm10
vpaddw 2016(%rsp), %ymm10, %ymm10 vpaddw 2016(%rsp), %ymm10, %ymm10
vpaddw %ymm3, %ymm10, %ymm10 vpaddw %ymm3, %ymm10, %ymm10
vpand mask_mod8192(%rip), %ymm10, %ymm10
vmovdqu %xmm10, 328(%rdi) vmovdqu %xmm10, 328(%rdi)
vextracti128 $1, %ymm10, %xmm10 vextracti128 $1, %ymm10, %xmm10
vmovq %xmm10, 344(%rdi) vmovq %xmm10, 344(%rdi)
@ -8338,119 +8228,92 @@ vpor %ymm10, %ymm11, %ymm11
vpaddw 2784(%rsp), %ymm4, %ymm4 vpaddw 2784(%rsp), %ymm4, %ymm4
vpaddw %ymm11, %ymm4, %ymm4 vpaddw %ymm11, %ymm4, %ymm4
vmovdqa %xmm2, 2784(%rsp) vmovdqa %xmm2, 2784(%rsp)
vpand mask_mod8192(%rip), %ymm5, %ymm5
vmovdqu %xmm5, 680(%rdi) vmovdqu %xmm5, 680(%rdi)
vextracti128 $1, %ymm5, %xmm5 vextracti128 $1, %ymm5, %xmm5
vmovq %xmm5, 696(%rdi) vmovq %xmm5, 696(%rdi)
vpand mask_mod8192(%rip), %ymm6, %ymm6
vmovdqu %xmm6, 1032(%rdi) vmovdqu %xmm6, 1032(%rdi)
vextracti128 $1, %ymm6, %xmm6 vextracti128 $1, %ymm6, %xmm6
vmovq %xmm6, 1048(%rdi) vmovq %xmm6, 1048(%rdi)
vpand mask_mod8192(%rip), %ymm4, %ymm4
vmovdqu %xmm4, 1384(%rdi) vmovdqu %xmm4, 1384(%rdi)
vextracti128 $1, %ymm4, %xmm4 vextracti128 $1, %ymm4, %xmm4
vmovq %xmm4, 1400(%rdi) vmovq %xmm4, 1400(%rdi)
vmovdqu 0(%rdi), %ymm11 vmovdqu 0(%rdi), %ymm11
vpaddw 1888(%rsp), %ymm11, %ymm11 vpaddw 1888(%rsp), %ymm11, %ymm11
vpaddw 2816(%rsp), %ymm11, %ymm11 vpaddw 2816(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 0(%rdi) vmovdqu %ymm11, 0(%rdi)
vmovdqu 352(%rdi), %ymm11 vmovdqu 352(%rdi), %ymm11
vpaddw 2528(%rsp), %ymm11, %ymm11 vpaddw 2528(%rsp), %ymm11, %ymm11
vpaddw 2848(%rsp), %ymm11, %ymm11 vpaddw 2848(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 352(%rdi) vmovdqu %ymm11, 352(%rdi)
vmovdqu 704(%rdi), %ymm11 vmovdqu 704(%rdi), %ymm11
vpaddw 2784(%rsp), %ymm11, %ymm11 vpaddw 2784(%rsp), %ymm11, %ymm11
vpaddw 2880(%rsp), %ymm11, %ymm11 vpaddw 2880(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 704(%rdi) vmovdqu %ymm11, 704(%rdi)
vmovdqu 88(%rdi), %ymm11 vmovdqu 88(%rdi), %ymm11
vpaddw 2048(%rsp), %ymm11, %ymm11 vpaddw 2048(%rsp), %ymm11, %ymm11
vpaddw 1920(%rsp), %ymm11, %ymm11 vpaddw 1920(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 88(%rdi) vmovdqu %ymm11, 88(%rdi)
vmovdqu 440(%rdi), %ymm11 vmovdqu 440(%rdi), %ymm11
vpaddw 2304(%rsp), %ymm11, %ymm11 vpaddw 2304(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 440(%rdi) vmovdqu %ymm11, 440(%rdi)
vmovdqu 792(%rdi), %ymm11 vmovdqu 792(%rdi), %ymm11
vpaddw 2560(%rsp), %ymm11, %ymm11 vpaddw 2560(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 792(%rdi) vmovdqu %ymm11, 792(%rdi)
vmovdqu 176(%rdi), %ymm11 vmovdqu 176(%rdi), %ymm11
vpaddw 2080(%rsp), %ymm11, %ymm11 vpaddw 2080(%rsp), %ymm11, %ymm11
vpaddw 1952(%rsp), %ymm11, %ymm11 vpaddw 1952(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 176(%rdi) vmovdqu %ymm11, 176(%rdi)
vmovdqu 528(%rdi), %ymm11 vmovdqu 528(%rdi), %ymm11
vpaddw 2336(%rsp), %ymm11, %ymm11 vpaddw 2336(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 528(%rdi) vmovdqu %ymm11, 528(%rdi)
vmovdqu 880(%rdi), %ymm11 vmovdqu 880(%rdi), %ymm11
vpaddw 2592(%rsp), %ymm11, %ymm11 vpaddw 2592(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 880(%rdi) vmovdqu %ymm11, 880(%rdi)
vmovdqu 264(%rdi), %ymm11 vmovdqu 264(%rdi), %ymm11
vpaddw 2112(%rsp), %ymm11, %ymm11 vpaddw 2112(%rsp), %ymm11, %ymm11
vpaddw 1984(%rsp), %ymm11, %ymm11 vpaddw 1984(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 264(%rdi) vmovdqu %ymm11, 264(%rdi)
vmovdqu 616(%rdi), %ymm11 vmovdqu 616(%rdi), %ymm11
vpaddw 2368(%rsp), %ymm11, %ymm11 vpaddw 2368(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 616(%rdi) vmovdqu %ymm11, 616(%rdi)
vmovdqu 968(%rdi), %ymm11 vmovdqu 968(%rdi), %ymm11
vpaddw 2624(%rsp), %ymm11, %ymm11 vpaddw 2624(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 968(%rdi) vmovdqu %ymm11, 968(%rdi)
vmovdqu 352(%rdi), %ymm11 vmovdqu 352(%rdi), %ymm11
vpaddw 2144(%rsp), %ymm11, %ymm11 vpaddw 2144(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 352(%rdi) vmovdqu %ymm11, 352(%rdi)
vmovdqu 704(%rdi), %ymm11 vmovdqu 704(%rdi), %ymm11
vpaddw 2400(%rsp), %ymm11, %ymm11 vpaddw 2400(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 704(%rdi) vmovdqu %ymm11, 704(%rdi)
vmovdqu 1056(%rdi), %ymm11 vmovdqu 1056(%rdi), %ymm11
vpaddw 2656(%rsp), %ymm11, %ymm11 vpaddw 2656(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 1056(%rdi) vmovdqu %ymm11, 1056(%rdi)
vmovdqu 440(%rdi), %ymm11 vmovdqu 440(%rdi), %ymm11
vpaddw 2176(%rsp), %ymm11, %ymm11 vpaddw 2176(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 440(%rdi) vmovdqu %ymm11, 440(%rdi)
vmovdqu 792(%rdi), %ymm11 vmovdqu 792(%rdi), %ymm11
vpaddw 2432(%rsp), %ymm11, %ymm11 vpaddw 2432(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 792(%rdi) vmovdqu %ymm11, 792(%rdi)
vmovdqu 1144(%rdi), %ymm11 vmovdqu 1144(%rdi), %ymm11
vpaddw 2688(%rsp), %ymm11, %ymm11 vpaddw 2688(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 1144(%rdi) vmovdqu %ymm11, 1144(%rdi)
vmovdqu 528(%rdi), %ymm11 vmovdqu 528(%rdi), %ymm11
vpaddw 2208(%rsp), %ymm11, %ymm11 vpaddw 2208(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 528(%rdi) vmovdqu %ymm11, 528(%rdi)
vmovdqu 880(%rdi), %ymm11 vmovdqu 880(%rdi), %ymm11
vpaddw 2464(%rsp), %ymm11, %ymm11 vpaddw 2464(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 880(%rdi) vmovdqu %ymm11, 880(%rdi)
vmovdqu 1232(%rdi), %ymm11 vmovdqu 1232(%rdi), %ymm11
vpaddw 2720(%rsp), %ymm11, %ymm11 vpaddw 2720(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 1232(%rdi) vmovdqu %ymm11, 1232(%rdi)
vmovdqu 616(%rdi), %ymm11 vmovdqu 616(%rdi), %ymm11
vpaddw 2240(%rsp), %ymm11, %ymm11 vpaddw 2240(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 616(%rdi) vmovdqu %ymm11, 616(%rdi)
vmovdqu 968(%rdi), %ymm11 vmovdqu 968(%rdi), %ymm11
vpaddw 2496(%rsp), %ymm11, %ymm11 vpaddw 2496(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 968(%rdi) vmovdqu %ymm11, 968(%rdi)
vmovdqu 1320(%rdi), %ymm11 vmovdqu 1320(%rdi), %ymm11
vpaddw 2752(%rsp), %ymm11, %ymm11 vpaddw 2752(%rsp), %ymm11, %ymm11
vpand mask_mod8192(%rip), %ymm11, %ymm11
vmovdqu %ymm11, 1320(%rdi) vmovdqu %ymm11, 1320(%rdi)
mov %r8, %rsp mov %r8, %rsp
pop %r12 pop %r12

View File

@ -4,12 +4,9 @@
#include "params.h" #include "params.h"
#include "poly.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, void PQCLEAN_NTRUHRSS701_CLEAN_owcpa_keypair(unsigned char *pk,
unsigned char *sk, 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, void PQCLEAN_NTRUHRSS701_CLEAN_owcpa_enc(unsigned char *c,
const poly *r, const poly *r,

View File

@ -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) { 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); 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); PQCLEAN_NTRUHRSS701_CLEAN_poly_mod_3_Phi_n(r);
} }

View File

@ -1,15 +1,284 @@
#include "poly.h" #include "poly.h"
void PQCLEAN_NTRUHRSS701_CLEAN_poly_Rq_mul(poly *r, const poly *a, const poly *b) { /* Polynomial multiplication using */
int k, i; /* Toom-4 and two layers of Karatsuba. */
for (k = 0; k < NTRU_N; k++) { #define L PAD32(NTRU_N)
r->coeffs[k] = 0; #define M (L/4)
for (i = 1; i < NTRU_N - k; i++) { #define K (L/16)
r->coeffs[k] += a->coeffs[k + i] * b->coeffs[NTRU_N - i];
} static void toom4_k2x2_mul(uint16_t ab[2 * L], const uint16_t a[L], const uint16_t b[L]);
for (i = 0; i < k + 1; i++) {
r->coeffs[k] += a->coeffs[k - i] * b->coeffs[i]; 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) {
size_t i;
uint16_t ab[2 * L];
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];
}
}