* [PATCH] lib/crypto: x86/chacha: Use bzhi to simplify mask generation
@ 2026-11-03 23:50 Eric Biggers
2026-11-04 0:02 ` Antonio Quartulli
2026-11-07 21:39 ` Eric Biggers
0 siblings, 2 replies; 3+ messages in thread
From: Eric Biggers @ 2026-11-03 23:50 UTC (permalink / raw)
To: linux-crypto
Cc: Ard Biesheuvel, Jason A . Donenfeld, Herbert Xu, Martin Willi,
Antonio Quartulli, Eric Biggers
When XOR'ing the bytes from a partial register at the end, use the bzhi
instruction (from BMI2) to generate the needed mask a bit more
efficiently. All real processors with AVX-512 also have BMI2, so we
might as well make use of it. This follows the example of the AVX-512
optimized AES-GCM code which already does this.
Signed-off-by: Eric Biggers <ebiggers@kernel.org>
---
lib/crypto/x86/chacha-avx512-x86_64.S | 30 +++++++++++----------------
lib/crypto/x86/chacha.h | 3 ++-
2 files changed, 14 insertions(+), 19 deletions(-)
diff --git a/lib/crypto/x86/chacha-avx512-x86_64.S b/lib/crypto/x86/chacha-avx512-x86_64.S
index 92babb1d3844..422479631d5b 100644
--- a/lib/crypto/x86/chacha-avx512-x86_64.S
+++ b/lib/crypto/x86/chacha-avx512-x86_64.S
@@ -189,15 +189,13 @@ SYM_FUNC_START(chacha_2block_xor_avx512vl)
.Lxorpart2:
# xor remaining bytes from partial register into output
- mov %rcx,%rax
+ mov %rcx,%r9
+ and $~0xf,%r9
and $0xf,%rcx
jz .Ldone2
- mov %rax,%r9
- and $~0xf,%r9
- mov $1,%rax
- shld %cl,%rax,%rax
- sub $1,%rax
+ mov $-1,%rax
+ bzhi %rcx,%rax,%rax
kmovq %rax,%k1
vmovdqu8 (%rdx,%r9),%xmm1{%k1}{z}
@@ -455,15 +453,13 @@ SYM_FUNC_START(chacha_4block_xor_avx512vl)
.Lxorpart4:
# xor remaining bytes from partial register into output
- mov %rcx,%rax
+ mov %rcx,%r9
+ and $~0xf,%r9
and $0xf,%rcx
jz .Ldone4
- mov %rax,%r9
- and $~0xf,%r9
- mov $1,%rax
- shld %cl,%rax,%rax
- sub $1,%rax
+ mov $-1,%rax
+ bzhi %rcx,%rax,%rax
kmovq %rax,%k1
vmovdqu8 (%rdx,%r9),%xmm1{%k1}{z}
@@ -977,15 +973,13 @@ SYM_FUNC_END(chacha_4block_xor_avx512vl)
.Lxorpart\@:
# xor remaining bytes from partial register into output
- mov %rcx,%rax
+ mov %rcx,%r9
+ and $~(VL - 1),%r9
and $(VL - 1),%rcx
jz .Ldone\@
- mov %rax,%r9
- and $~(VL - 1),%r9
- mov $1,%rax
- shld %cl,%rax,%rax
- sub $1,%rax
+ mov $-1,%rax
+ bzhi %rcx,%rax,%rax
kmovq %rax,%k1
vmovdqu8 (%rdx,%r9),V1{%k1}{z}
diff --git a/lib/crypto/x86/chacha.h b/lib/crypto/x86/chacha.h
index fdf01b07742e..ed39b3fdda84 100644
--- a/lib/crypto/x86/chacha.h
+++ b/lib/crypto/x86/chacha.h
@@ -191,7 +191,8 @@ static void chacha_mod_init_arch(void)
static_branch_enable(&chacha_use_avx2);
if (boot_cpu_has(X86_FEATURE_AVX512VL) &&
- boot_cpu_has(X86_FEATURE_AVX512BW)) { /* kmovq */
+ boot_cpu_has(X86_FEATURE_AVX512BW) &&
+ boot_cpu_has(X86_FEATURE_BMI2)) {
static_branch_enable(&chacha_use_avx512vl);
if (!boot_cpu_has(X86_FEATURE_PREFER_YMM))
base-commit: 9fbbbaefd5f95551da18426c200cf41e1b4255a1
--
2.56.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] lib/crypto: x86/chacha: Use bzhi to simplify mask generation
2026-11-03 23:50 [PATCH] lib/crypto: x86/chacha: Use bzhi to simplify mask generation Eric Biggers
@ 2026-11-04 0:02 ` Antonio Quartulli
2026-11-07 21:39 ` Eric Biggers
1 sibling, 0 replies; 3+ messages in thread
From: Antonio Quartulli @ 2026-11-04 0:02 UTC (permalink / raw)
To: Eric Biggers, linux-crypto
Cc: Ard Biesheuvel, Jason A . Donenfeld, Herbert Xu, Martin Willi
Hi,
On 04/11/2026 00:50, Eric Biggers wrote:
> When XOR'ing the bytes from a partial register at the end, use the bzhi
> instruction (from BMI2) to generate the needed mask a bit more
> efficiently. All real processors with AVX-512 also have BMI2, so we
> might as well make use of it. This follows the example of the AVX-512
> optimized AES-GCM code which already does this.
>
> Signed-off-by: Eric Biggers <ebiggers@kernel.org>
KUnit test is happy and my tests (on Zen 5) too :)
Tested-by: Antonio Quartulli <antonio@mandelbit.com>
--
Antonio Quartulli
CEO and Co-Founder
Mandelbit Srl
https://www.mandelbit.com
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] lib/crypto: x86/chacha: Use bzhi to simplify mask generation
2026-11-03 23:50 [PATCH] lib/crypto: x86/chacha: Use bzhi to simplify mask generation Eric Biggers
2026-11-04 0:02 ` Antonio Quartulli
@ 2026-11-07 21:39 ` Eric Biggers
1 sibling, 0 replies; 3+ messages in thread
From: Eric Biggers @ 2026-11-07 21:39 UTC (permalink / raw)
To: linux-crypto
Cc: Ard Biesheuvel, Jason A . Donenfeld, Herbert Xu, Martin Willi,
Antonio Quartulli
On Tue, Nov 03, 2026 at 03:50:27PM -0800, Eric Biggers wrote:
> When XOR'ing the bytes from a partial register at the end, use the bzhi
> instruction (from BMI2) to generate the needed mask a bit more
> efficiently. All real processors with AVX-512 also have BMI2, so we
> might as well make use of it. This follows the example of the AVX-512
> optimized AES-GCM code which already does this.
>
> Signed-off-by: Eric Biggers <ebiggers@kernel.org>
> ---
> lib/crypto/x86/chacha-avx512-x86_64.S | 30 +++++++++++----------------
> lib/crypto/x86/chacha.h | 3 ++-
> 2 files changed, 14 insertions(+), 19 deletions(-)
Applied to https://git.kernel.org/pub/scm/linux/kernel/git/ebiggers/linux.git/log/?h=libcrypto-next
- Eric
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-11-07 21:39 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-11-03 23:50 [PATCH] lib/crypto: x86/chacha: Use bzhi to simplify mask generation Eric Biggers
2026-11-04 0:02 ` Antonio Quartulli
2026-11-07 21:39 ` Eric Biggers
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox