[PATCH v10 7/9] powerpc64: Add optimized chacha20
Adhemerval Zanella Netto
adhemerval.zanella@linaro.org
Fri Jul 15 20:18:05 GMT 2022
On 15/07/22 17:10, Adhemerval Zanella Netto wrote:
>
>
> On 15/07/22 16:48, Paul E Murphy wrote:
>>
>>
>> On 7/14/22 6:28 AM, Adhemerval Zanella via Libc-alpha wrote:
>>> From: Adhemerval Zanella Netto <adhemerval.zanella@linaro.org>
>>
>>> +++ b/sysdeps/powerpc/powerpc64/be/multiarch/chacha20_arch.h
>>> @@ -0,0 +1,42 @@
>>> +/* PowerPC optimization for ChaCha20.
>>> + Copyright (C) 2022 Free Software Foundation, Inc.
>>> + This file is part of the GNU C Library.
>>> +
>>> + The GNU C Library is free software; you can redistribute it and/or
>>> + modify it under the terms of the GNU Lesser General Public
>>> + License as published by the Free Software Foundation; either
>>> + version 2.1 of the License, or (at your option) any later version.
>>> +
>>> + The GNU C Library is distributed in the hope that it will be useful,
>>> + but WITHOUT ANY WARRANTY; without even the implied warranty of
>>> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
>>> + Lesser General Public License for more details.
>>> +
>>> + You should have received a copy of the GNU Lesser General Public
>>> + License along with the GNU C Library; if not, see
>>> + <http://www.gnu.org/licenses/>. */
>>> +
>>> +#include <stdbool.h>
>>> +#include <ldsodefs.h>
>>> +
>>> +unsigned int __chacha20_power8_blocks4 (uint32_t *state, uint8_t *dst,
>>> + const uint8_t *src, size_t nblks)
>>> + attribute_hidden;
>>> +
>>> +static void
>>> +chacha20_crypt (uint32_t *state, uint8_t *dst,
>>> + const uint8_t *src, size_t bytes)
>>> +{
>>> + _Static_assert (CHACHA20_BUFSIZE % 4 == 0,
>>> + "CHACHA20_BUFSIZE not multiple of 4");
>>> + _Static_assert (CHACHA20_BUFSIZE >= CHACHA20_BLOCK_SIZE * 4,
>>> + "CHACHA20_BUFSIZE < CHACHA20_BLOCK_SIZE * 4");
>>> +
>>> + unsigned long int hwcap = GLRO(dl_hwcap);
>>> + unsigned long int hwcap2 = GLRO(dl_hwcap2);
>>> + if (hwcap2 & PPC_FEATURE2_ARCH_2_07 && hwcap & PPC_FEATURE_HAS_ALTIVEC)
>>> + __chacha20_power8_blocks4 (state, dst, src,
>>> + CHACHA20_BUFSIZE / CHACHA20_BLOCK_SIZE);
>>> + else
>>> + chacha20_crypt_generic (state, dst, src, bytes);
>>> +}
>>
>> I wonder if using libc_ifunc_hidden and such might simplify this a little. I don't feel strongly about this. I think this patch is OK as is. LGTM.
>
> I think we can reevaluate it for 2.37, although even a hidden ifunc requires
> a PLT call and I think for powerpc it is way costly than global memory load
> and a predictable branch.
>
>>
>> Reviewed-by: Paul E. Murphy <murphyp@linux.ibm.com>
>>
We might need to check if it worth to the internal buffer to be arch-defined,
so we can add both AVX-512 and POWER10 optimizations (since libgcrypt
optimized implementation requires large buffer sizes).
More information about the Libc-alpha
mailing list