[PATCH v10 7/9] powerpc64: Add optimized chacha20

Paul E Murphy murphyp@linux.ibm.com
Fri Jul 15 19:48:45 GMT 2022



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.

Reviewed-by: Paul E. Murphy <murphyp@linux.ibm.com>



More information about the Libc-alpha mailing list