[PATCH v10 7/9] powerpc64: Add optimized chacha20
Adhemerval Zanella Netto
adhemerval.zanella@linaro.org
Fri Jul 15 20:10:05 GMT 2022
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>
>
Thanks!
More information about the Libc-alpha
mailing list