SP ECC Cache Resitance

SP ECC improved cache attack resistant implementation.
On by defualt and turn off with WC_NO_CACHE_RESISTANT.
This commit is contained in:
Sean Parkinson
2020-08-05 23:06:35 +10:00
parent d12b80abdf
commit 83caf39caa
11 changed files with 6781 additions and 2812 deletions
+4 -4
View File
@@ -252,10 +252,6 @@
#include <wolfssl/wolfcrypt/asn.h>
#endif
#if defined(WOLFSSL_SHA3) || defined(HAVE_PKCS7) || (!defined(NO_RSA) && \
!defined(NO_SIG_WRAPPER)) || !defined(WC_NO_RNG)
static int devId = INVALID_DEVID;
#endif
#ifndef NO_DSA
#include <wolfssl/wolfcrypt/dsa.h>
#ifndef ONEK_BUF
@@ -422,6 +418,8 @@ enum {
TESTING_ECC = 2
};
static int devId = INVALID_DEVID;
/*----------------------------------------------------------------------------*
| Setup
@@ -36061,6 +36059,8 @@ void ApiTest(void)
#endif
wolfSSL_Cleanup();
(void)devId;
printf(" End API Tests\n");
}
+666 -92
View File
File diff suppressed because it is too large Load Diff
+1114 -73
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+1264 -547
View File
File diff suppressed because it is too large Load Diff
+1108 -547
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+3 -2
View File
@@ -43,7 +43,8 @@
#include "hexagon_protos.h"
#include "hexagon_types.h"
#if (defined(WOLFSSL_SP_CACHE_RESISTANT) || defined(WOLFSSL_SP_SMALL)) && (defined(WOLFSSL_HAVE_SP_ECC) || !defined(WOLFSSL_RSA_PUBLIC_ONLY))
#if (!defined(WC_NO_CACHE_RESISTANT) || defined(WOLFSSL_SP_SMALL)) && \
(defined(WOLFSSL_HAVE_SP_ECC) || !defined(WOLFSSL_RSA_PUBLIC_ONLY))
/* Mask for address to obfuscate which of the two address will be used. */
static const size_t addr_mask[2] = { 0, (size_t)-1 };
#endif
@@ -1995,7 +1996,7 @@ static int sp_256_ecc_mulmod_10(sp_point* r, const sp_point* g, const sp_digit*
return err;
}
#elif defined(WOLFSSL_SP_CACHE_RESISTANT)
#elif !defined(WC_NO_CACHE_RESISTANT)
/* Multiply the point by the scalar and return the result.
* If map is true then convert result to affine co-ordinates.
*
+3 -1
View File
@@ -48,7 +48,6 @@
* WOLFSSL_SP_4096: Enable RSA/RH 4096-bit support
* WOLFSSL_SP_384 Enable ECC 384-bit SECP384R1 support
* WOLFSSL_SP_NO_256 Disable ECC 256-bit SECP256R1 support
* WOLFSSL_SP_CACHE_RESISTANT Enable cache resistantant code
* WOLFSSL_SP_ASM Enable assembly speedups (detect platform)
* WOLFSSL_SP_X86_64_ASM Enable Intel x86 assembly speedups like AVX/AVX2
* WOLFSSL_SP_ARM32_ASM Enable Aarch32 assembly speedups
@@ -688,6 +687,8 @@ void sp_rshb(sp_int* a, int n, sp_int* r)
}
}
#if defined(WOLFSSL_SP_SMALL) || (defined(WOLFSSL_KEY_GEN) || \
!defined(NO_DH) && !defined(WC_NO_RNG))
/* Multiply a by digit n and put result into r shifting up o digits.
* r = (a * n) << (o * SP_WORD_SIZE)
*
@@ -714,6 +715,7 @@ static void _sp_mul_d(sp_int* a, sp_int_digit n, sp_int* r, int o)
r->used = i+o+1;
sp_clamp(r);
}
#endif
/* Divide a two digit number by a digit number and return. (hi | lo) / d
*
+676 -1362
View File
File diff suppressed because it is too large Load Diff
+611
View File
@@ -38994,6 +38994,124 @@ _sp_256_div2_4:
#ifndef __APPLE__
.size sp_256_div2_4,.-sp_256_div2_4
#endif /* __APPLE__ */
#ifndef WC_NO_CACHE_RESISTANT
/* Touch each possible point that could be being copied.
*
* r Point to copy into.
* table Table - start of the entires to access
* idx Index of point to retrieve.
*/
#ifndef __APPLE__
.globl sp_256_get_point_33_4
.type sp_256_get_point_33_4,@function
.align 16
sp_256_get_point_33_4:
#else
.globl _sp_256_get_point_33_4
.p2align 4
_sp_256_get_point_33_4:
#endif /* __APPLE__ */
movq $1, %rax
movd %edx, %xmm13
addq $200, %rsi
movd %eax, %xmm15
movq $33, %rax
pshufd $0, %xmm15, %xmm15
pshufd $0, %xmm13, %xmm13
pxor %xmm14, %xmm14
pxor %xmm0, %xmm0
pxor %xmm1, %xmm1
pxor %xmm2, %xmm2
pxor %xmm3, %xmm3
pxor %xmm4, %xmm4
pxor %xmm5, %xmm5
movdqa %xmm15, %xmm14
L_256_get_point_33_4_start:
movdqa %xmm14, %xmm12
paddd %xmm15, %xmm14
pcmpeqd %xmm13, %xmm12
movdqu (%rsi), %xmm6
movdqu 16(%rsi), %xmm7
movdqu 64(%rsi), %xmm8
movdqu 80(%rsi), %xmm9
movdqu 128(%rsi), %xmm10
movdqu 144(%rsi), %xmm11
addq $200, %rsi
pand %xmm12, %xmm6
pand %xmm12, %xmm7
pand %xmm12, %xmm8
pand %xmm12, %xmm9
pand %xmm12, %xmm10
pand %xmm12, %xmm11
por %xmm6, %xmm0
por %xmm7, %xmm1
por %xmm8, %xmm2
por %xmm9, %xmm3
por %xmm10, %xmm4
por %xmm11, %xmm5
decq %rax
jnz L_256_get_point_33_4_start
movdqu %xmm0, (%rdi)
movdqu %xmm1, 16(%rdi)
movdqu %xmm2, 64(%rdi)
movdqu %xmm3, 80(%rdi)
movdqu %xmm4, 128(%rdi)
movdqu %xmm5, 144(%rdi)
repz retq
#ifndef __APPLE__
.size sp_256_get_point_33_4,.-sp_256_get_point_33_4
#endif /* __APPLE__ */
/* Touch each possible point that could be being copied.
*
* r Point to copy into.
* table Table - start of the entires to access
* idx Index of point to retrieve.
*/
#ifndef __APPLE__
.globl sp_256_get_point_33_avx2_4
.type sp_256_get_point_33_avx2_4,@function
.align 16
sp_256_get_point_33_avx2_4:
#else
.globl _sp_256_get_point_33_avx2_4
.p2align 4
_sp_256_get_point_33_avx2_4:
#endif /* __APPLE__ */
movq $1, %rax
movd %edx, %xmm7
addq $200, %rsi
movd %eax, %xmm9
movq $33, %rax
vpxor %ymm8, %ymm8, %ymm8
vpermd %ymm7, %ymm8, %ymm7
vpermd %ymm9, %ymm8, %ymm9
vpxor %ymm0, %ymm0, %ymm0
vpxor %ymm1, %ymm1, %ymm1
vpxor %ymm2, %ymm2, %ymm2
vmovdqa %ymm9, %ymm8
L_256_get_point_33_avx2_4_start:
vpcmpeqd %ymm7, %ymm8, %ymm6
vpaddd %ymm9, %ymm8, %ymm8
vmovdqu (%rsi), %ymm3
vmovdqu 64(%rsi), %ymm4
vmovdqu 128(%rsi), %ymm5
addq $200, %rsi
vpand %ymm6, %ymm3, %ymm3
vpand %ymm6, %ymm4, %ymm4
vpand %ymm6, %ymm5, %ymm5
vpor %ymm3, %ymm0, %ymm0
vpor %ymm4, %ymm1, %ymm1
vpor %ymm5, %ymm2, %ymm2
decq %rax
jnz L_256_get_point_33_avx2_4_start
vmovdqu %ymm0, (%rdi)
vmovdqu %ymm1, 64(%rdi)
vmovdqu %ymm2, 128(%rdi)
repz retq
#ifndef __APPLE__
.size sp_256_get_point_33_avx2_4,.-sp_256_get_point_33_avx2_4
#endif /* __APPLE__ */
#endif /* !WC_NO_CACHE_RESISTANT */
/* Multiply two Montogmery form numbers mod the modulus (prime).
* (r = a * b mod m)
*
@@ -39333,6 +39451,212 @@ _sp_256_mont_sqr_avx2_4:
#ifndef __APPLE__
.size sp_256_mont_sqr_avx2_4,.-sp_256_mont_sqr_avx2_4
#endif /* __APPLE__ */
#ifndef WC_NO_CACHE_RESISTANT
/* Touch each possible entry that could be being copied.
*
* r Point to copy into.
* table Table - start of the entires to access
* idx Index of entry to retrieve.
*/
#ifndef __APPLE__
.globl sp_256_get_entry_64_4
.type sp_256_get_entry_64_4,@function
.align 16
sp_256_get_entry_64_4:
#else
.globl _sp_256_get_entry_64_4
.p2align 4
_sp_256_get_entry_64_4:
#endif /* __APPLE__ */
movq $1, %rax
movd %edx, %xmm9
addq $64, %rsi
movd %eax, %xmm11
movq $64, %rax
pshufd $0, %xmm11, %xmm11
pshufd $0, %xmm9, %xmm9
pxor %xmm10, %xmm10
pxor %xmm0, %xmm0
pxor %xmm1, %xmm1
pxor %xmm2, %xmm2
pxor %xmm3, %xmm3
movdqa %xmm11, %xmm10
L_256_get_entry_64_4_start:
movdqa %xmm10, %xmm8
paddd %xmm11, %xmm10
pcmpeqd %xmm9, %xmm8
movdqa (%rsi), %xmm4
movdqa 16(%rsi), %xmm5
movdqa 32(%rsi), %xmm6
movdqa 48(%rsi), %xmm7
addq $64, %rsi
pand %xmm8, %xmm4
pand %xmm8, %xmm5
pand %xmm8, %xmm6
pand %xmm8, %xmm7
por %xmm4, %xmm0
por %xmm5, %xmm1
por %xmm6, %xmm2
por %xmm7, %xmm3
decq %rax
jnz L_256_get_entry_64_4_start
movdqu %xmm0, (%rdi)
movdqu %xmm1, 16(%rdi)
movdqu %xmm2, 64(%rdi)
movdqu %xmm3, 80(%rdi)
repz retq
#ifndef __APPLE__
.size sp_256_get_entry_64_4,.-sp_256_get_entry_64_4
#endif /* __APPLE__ */
/* Touch each possible entry that could be being copied.
*
* r Point to copy into.
* table Table - start of the entires to access
* idx Index of entry to retrieve.
*/
#ifndef __APPLE__
.globl sp_256_get_entry_64_avx2_4
.type sp_256_get_entry_64_avx2_4,@function
.align 16
sp_256_get_entry_64_avx2_4:
#else
.globl _sp_256_get_entry_64_avx2_4
.p2align 4
_sp_256_get_entry_64_avx2_4:
#endif /* __APPLE__ */
movq $1, %rax
movd %edx, %xmm5
addq $64, %rsi
movd %eax, %xmm7
movq $64, %rax
vpxor %ymm6, %ymm6, %ymm6
vpermd %ymm5, %ymm6, %ymm5
vpermd %ymm7, %ymm6, %ymm7
vpxor %ymm0, %ymm0, %ymm0
vpxor %ymm1, %ymm1, %ymm1
vmovdqa %ymm7, %ymm6
L_256_get_entry_64_avx2_4_start:
vpcmpeqd %ymm5, %ymm6, %ymm4
vpaddd %ymm7, %ymm6, %ymm6
vmovdqu (%rsi), %ymm2
vmovdqu 32(%rsi), %ymm3
addq $64, %rsi
vpand %ymm4, %ymm2, %ymm2
vpand %ymm4, %ymm3, %ymm3
vpor %ymm2, %ymm0, %ymm0
vpor %ymm3, %ymm1, %ymm1
decq %rax
jnz L_256_get_entry_64_avx2_4_start
vmovdqu %ymm0, (%rdi)
vmovdqu %ymm1, 64(%rdi)
repz retq
#ifndef __APPLE__
.size sp_256_get_entry_64_avx2_4,.-sp_256_get_entry_64_avx2_4
#endif /* __APPLE__ */
#endif /* !WC_NO_CACHE_RESISTANT */
#ifndef WC_NO_CACHE_RESISTANT
/* Touch each possible entry that could be being copied.
*
* r Point to copy into.
* table Table - start of the entires to access
* idx Index of entry to retrieve.
*/
#ifndef __APPLE__
.globl sp_256_get_entry_65_4
.type sp_256_get_entry_65_4,@function
.align 16
sp_256_get_entry_65_4:
#else
.globl _sp_256_get_entry_65_4
.p2align 4
_sp_256_get_entry_65_4:
#endif /* __APPLE__ */
movq $1, %rax
movd %edx, %xmm9
addq $64, %rsi
movd %eax, %xmm11
movq $65, %rax
pshufd $0, %xmm11, %xmm11
pshufd $0, %xmm9, %xmm9
pxor %xmm10, %xmm10
pxor %xmm0, %xmm0
pxor %xmm1, %xmm1
pxor %xmm2, %xmm2
pxor %xmm3, %xmm3
movdqa %xmm11, %xmm10
L_256_get_entry_65_4_start:
movdqa %xmm10, %xmm8
paddd %xmm11, %xmm10
pcmpeqd %xmm9, %xmm8
movdqa (%rsi), %xmm4
movdqa 16(%rsi), %xmm5
movdqa 32(%rsi), %xmm6
movdqa 48(%rsi), %xmm7
addq $64, %rsi
pand %xmm8, %xmm4
pand %xmm8, %xmm5
pand %xmm8, %xmm6
pand %xmm8, %xmm7
por %xmm4, %xmm0
por %xmm5, %xmm1
por %xmm6, %xmm2
por %xmm7, %xmm3
decq %rax
jnz L_256_get_entry_65_4_start
movdqu %xmm0, (%rdi)
movdqu %xmm1, 16(%rdi)
movdqu %xmm2, 64(%rdi)
movdqu %xmm3, 80(%rdi)
repz retq
#ifndef __APPLE__
.size sp_256_get_entry_65_4,.-sp_256_get_entry_65_4
#endif /* __APPLE__ */
/* Touch each possible entry that could be being copied.
*
* r Point to copy into.
* table Table - start of the entires to access
* idx Index of entry to retrieve.
*/
#ifndef __APPLE__
.globl sp_256_get_entry_65_avx2_4
.type sp_256_get_entry_65_avx2_4,@function
.align 16
sp_256_get_entry_65_avx2_4:
#else
.globl _sp_256_get_entry_65_avx2_4
.p2align 4
_sp_256_get_entry_65_avx2_4:
#endif /* __APPLE__ */
movq $1, %rax
movd %edx, %xmm5
addq $64, %rsi
movd %eax, %xmm7
movq $65, %rax
vpxor %ymm6, %ymm6, %ymm6
vpermd %ymm5, %ymm6, %ymm5
vpermd %ymm7, %ymm6, %ymm7
vpxor %ymm0, %ymm0, %ymm0
vpxor %ymm1, %ymm1, %ymm1
vmovdqa %ymm7, %ymm6
L_256_get_entry_65_avx2_4_start:
vpcmpeqd %ymm5, %ymm6, %ymm4
vpaddd %ymm7, %ymm6, %ymm6
vmovdqu (%rsi), %ymm2
vmovdqu 32(%rsi), %ymm3
addq $64, %rsi
vpand %ymm4, %ymm2, %ymm2
vpand %ymm4, %ymm3, %ymm3
vpor %ymm2, %ymm0, %ymm0
vpor %ymm3, %ymm1, %ymm1
decq %rax
jnz L_256_get_entry_65_avx2_4_start
vmovdqu %ymm0, (%rdi)
vmovdqu %ymm1, 64(%rdi)
repz retq
#ifndef __APPLE__
.size sp_256_get_entry_65_avx2_4,.-sp_256_get_entry_65_avx2_4
#endif /* __APPLE__ */
#endif /* !WC_NO_CACHE_RESISTANT */
/* Add 1 to a. (a = a + 1)
*
* a A single precision integer.
@@ -41671,6 +41995,170 @@ _sp_384_div2_6:
#ifndef __APPLE__
.size sp_384_div2_6,.-sp_384_div2_6
#endif /* __APPLE__ */
#ifndef WC_NO_CACHE_RESISTANT
/* Touch each possible point that could be being copied.
*
* r Point to copy into.
* table Table - start of the entires to access
* idx Index of point to retrieve.
*/
#ifndef __APPLE__
.globl sp_384_get_point_33_6
.type sp_384_get_point_33_6,@function
.align 16
sp_384_get_point_33_6:
#else
.globl _sp_384_get_point_33_6
.p2align 4
_sp_384_get_point_33_6:
#endif /* __APPLE__ */
movq $1, %rax
movd %edx, %xmm13
addq $296, %rsi
movd %eax, %xmm15
movq $33, %rax
pshufd $0, %xmm15, %xmm15
pshufd $0, %xmm13, %xmm13
pxor %xmm14, %xmm14
pxor %xmm0, %xmm0
pxor %xmm1, %xmm1
pxor %xmm2, %xmm2
pxor %xmm3, %xmm3
pxor %xmm4, %xmm4
pxor %xmm5, %xmm5
movdqa %xmm15, %xmm14
L_384_get_point_33_6_start:
movdqa %xmm14, %xmm12
paddd %xmm15, %xmm14
pcmpeqd %xmm13, %xmm12
movdqu (%rsi), %xmm6
movdqu 16(%rsi), %xmm7
movdqu 32(%rsi), %xmm8
movdqu 96(%rsi), %xmm9
movdqu 112(%rsi), %xmm10
movdqu 128(%rsi), %xmm11
addq $296, %rsi
pand %xmm12, %xmm6
pand %xmm12, %xmm7
pand %xmm12, %xmm8
pand %xmm12, %xmm9
pand %xmm12, %xmm10
pand %xmm12, %xmm11
por %xmm6, %xmm0
por %xmm7, %xmm1
por %xmm8, %xmm2
por %xmm9, %xmm3
por %xmm10, %xmm4
por %xmm11, %xmm5
decq %rax
jnz L_384_get_point_33_6_start
movdqu %xmm0, (%rdi)
movdqu %xmm1, 16(%rdi)
movdqu %xmm2, 32(%rdi)
movdqu %xmm3, 96(%rdi)
movdqu %xmm4, 112(%rdi)
movdqu %xmm5, 128(%rdi)
movq $1, %rax
movd %edx, %xmm13
addq $296, %rsi
movd %eax, %xmm15
movq $33, %rax
pshufd $0, %xmm15, %xmm15
pshufd $0, %xmm13, %xmm13
pxor %xmm14, %xmm14
pxor %xmm0, %xmm0
pxor %xmm1, %xmm1
pxor %xmm2, %xmm2
movdqa %xmm15, %xmm14
L_384_get_point_33_6_start_2:
movdqa %xmm14, %xmm12
paddd %xmm15, %xmm14
pcmpeqd %xmm13, %xmm12
movdqu 192(%rsi), %xmm6
movdqu 208(%rsi), %xmm7
movdqu 224(%rsi), %xmm8
addq $296, %rsi
pand %xmm12, %xmm6
pand %xmm12, %xmm7
pand %xmm12, %xmm8
por %xmm6, %xmm0
por %xmm7, %xmm1
por %xmm8, %xmm2
decq %rax
jnz L_384_get_point_33_6_start_2
movdqu %xmm0, 192(%rdi)
movdqu %xmm1, 208(%rdi)
movdqu %xmm2, 224(%rdi)
repz retq
#ifndef __APPLE__
.size sp_384_get_point_33_6,.-sp_384_get_point_33_6
#endif /* __APPLE__ */
/* Touch each possible point that could be being copied.
*
* r Point to copy into.
* table Table - start of the entires to access
* idx Index of point to retrieve.
*/
#ifndef __APPLE__
.globl sp_384_get_point_33_avx2_6
.type sp_384_get_point_33_avx2_6,@function
.align 16
sp_384_get_point_33_avx2_6:
#else
.globl _sp_384_get_point_33_avx2_6
.p2align 4
_sp_384_get_point_33_avx2_6:
#endif /* __APPLE__ */
movq $1, %rax
movd %edx, %xmm13
addq $296, %rsi
movd %eax, %xmm15
movq $33, %rax
vpxor %ymm14, %ymm14, %ymm14
vpermd %ymm13, %ymm14, %ymm13
vpermd %ymm15, %ymm14, %ymm15
vpxor %ymm0, %ymm0, %ymm0
vpxor %xmm1, %xmm1, %xmm1
vpxor %ymm2, %ymm2, %ymm2
vpxor %xmm3, %xmm3, %xmm3
vpxor %ymm4, %ymm4, %ymm4
vpxor %xmm5, %xmm5, %xmm5
vmovdqa %ymm15, %ymm14
L_384_get_point_33_avx2_6_start:
vpcmpeqd %ymm13, %ymm14, %ymm12
vpaddd %ymm15, %ymm14, %ymm14
vmovdqu (%rsi), %ymm6
vmovdqu 32(%rsi), %xmm7
vmovdqu 96(%rsi), %ymm8
vmovdqu 128(%rsi), %xmm9
vmovdqu 192(%rsi), %ymm10
vmovdqu 224(%rsi), %xmm11
addq $296, %rsi
vpand %ymm12, %ymm6, %ymm6
vpand %xmm12, %xmm7, %xmm7
vpand %ymm12, %ymm8, %ymm8
vpand %xmm12, %xmm9, %xmm9
vpand %ymm12, %ymm10, %ymm10
vpand %xmm12, %xmm11, %xmm11
vpor %ymm6, %ymm0, %ymm0
vpor %xmm7, %xmm1, %xmm1
vpor %ymm8, %ymm2, %ymm2
vpor %xmm9, %xmm3, %xmm3
vpor %ymm10, %ymm4, %ymm4
vpor %xmm11, %xmm5, %xmm5
decq %rax
jnz L_384_get_point_33_avx2_6_start
vmovdqu %ymm0, (%rdi)
vmovdqu %xmm1, 32(%rdi)
vmovdqu %ymm2, 96(%rdi)
vmovdqu %xmm3, 128(%rdi)
vmovdqu %ymm4, 192(%rdi)
vmovdqu %xmm5, 224(%rdi)
repz retq
#ifndef __APPLE__
.size sp_384_get_point_33_avx2_6,.-sp_384_get_point_33_avx2_6
#endif /* __APPLE__ */
#endif /* !WC_NO_CACHE_RESISTANT */
/* Multiply a and b into r. (r = a * b)
*
* r Result of multiplication.
@@ -42379,6 +42867,129 @@ _sp_384_sqr_avx2_6:
#ifndef __APPLE__
.size sp_384_sqr_avx2_6,.-sp_384_sqr_avx2_6
#endif /* __APPLE__ */
#ifndef WC_NO_CACHE_RESISTANT
/* Touch each possible entry that could be being copied.
*
* r Point to copy into.
* table Table - start of the entires to access
* idx Index of entry to retrieve.
*/
#ifndef __APPLE__
.globl sp_384_get_entry_256_6
.type sp_384_get_entry_256_6,@function
.align 16
sp_384_get_entry_256_6:
#else
.globl _sp_384_get_entry_256_6
.p2align 4
_sp_384_get_entry_256_6:
#endif /* __APPLE__ */
movq $1, %rax
movd %edx, %xmm13
addq $96, %rsi
movd %eax, %xmm15
movq $256, %rax
pshufd $0, %xmm15, %xmm15
pshufd $0, %xmm13, %xmm13
pxor %xmm14, %xmm14
pxor %xmm0, %xmm0
pxor %xmm1, %xmm1
pxor %xmm2, %xmm2
pxor %xmm3, %xmm3
pxor %xmm4, %xmm4
pxor %xmm5, %xmm5
movdqa %xmm15, %xmm14
L_384_get_entry_256_6_start:
movdqa %xmm14, %xmm12
paddd %xmm15, %xmm14
pcmpeqd %xmm13, %xmm12
movdqa (%rsi), %xmm6
movdqa 16(%rsi), %xmm7
movdqa 32(%rsi), %xmm8
movdqa 48(%rsi), %xmm9
movdqa 64(%rsi), %xmm10
movdqa 80(%rsi), %xmm11
addq $96, %rsi
pand %xmm12, %xmm6
pand %xmm12, %xmm7
pand %xmm12, %xmm8
pand %xmm12, %xmm9
pand %xmm12, %xmm10
pand %xmm12, %xmm11
por %xmm6, %xmm0
por %xmm7, %xmm1
por %xmm8, %xmm2
por %xmm9, %xmm3
por %xmm10, %xmm4
por %xmm11, %xmm5
decq %rax
jnz L_384_get_entry_256_6_start
movdqu %xmm0, (%rdi)
movdqu %xmm1, 16(%rdi)
movdqu %xmm2, 32(%rdi)
movdqu %xmm3, 96(%rdi)
movdqu %xmm4, 112(%rdi)
movdqu %xmm5, 128(%rdi)
repz retq
#ifndef __APPLE__
.size sp_384_get_entry_256_6,.-sp_384_get_entry_256_6
#endif /* __APPLE__ */
/* Touch each possible entry that could be being copied.
*
* r Point to copy into.
* table Table - start of the entires to access
* idx Index of entry to retrieve.
*/
#ifndef __APPLE__
.globl sp_384_get_entry_256_avx2_6
.type sp_384_get_entry_256_avx2_6,@function
.align 16
sp_384_get_entry_256_avx2_6:
#else
.globl _sp_384_get_entry_256_avx2_6
.p2align 4
_sp_384_get_entry_256_avx2_6:
#endif /* __APPLE__ */
movq $1, %rax
movd %edx, %xmm9
addq $96, %rsi
movd %eax, %xmm11
movq $256, %rax
vpxor %ymm10, %ymm10, %ymm10
vpermd %ymm9, %ymm10, %ymm9
vpermd %ymm11, %ymm10, %ymm11
vpxor %ymm0, %ymm0, %ymm0
vpxor %xmm1, %xmm1, %xmm1
vpxor %ymm2, %ymm2, %ymm2
vpxor %xmm3, %xmm3, %xmm3
vmovdqa %ymm11, %ymm10
L_384_get_entry_256_avx2_6_start:
vpcmpeqd %ymm9, %ymm10, %ymm8
vpaddd %ymm11, %ymm10, %ymm10
vmovdqu (%rsi), %ymm4
vmovdqu 32(%rsi), %xmm5
vmovdqu 48(%rsi), %ymm6
vmovdqu 80(%rsi), %xmm7
addq $96, %rsi
vpand %ymm8, %ymm4, %ymm4
vpand %xmm8, %xmm5, %xmm5
vpand %ymm8, %ymm6, %ymm6
vpand %xmm8, %xmm7, %xmm7
vpor %ymm4, %ymm0, %ymm0
vpor %xmm5, %xmm1, %xmm1
vpor %ymm6, %ymm2, %ymm2
vpor %xmm7, %xmm3, %xmm3
decq %rax
jnz L_384_get_entry_256_avx2_6_start
vmovdqu %ymm0, (%rdi)
vmovdqu %xmm1, 32(%rdi)
vmovdqu %ymm2, 96(%rdi)
vmovdqu %xmm3, 128(%rdi)
repz retq
#ifndef __APPLE__
.size sp_384_get_entry_256_avx2_6,.-sp_384_get_entry_256_avx2_6
#endif /* __APPLE__ */
#endif /* !WC_NO_CACHE_RESISTANT */
/* Add 1 to a. (a = a + 1)
*
* a A single precision integer.