From 9e65d487b8b907a3ddb84f736b89e0a8f95abce3 Mon Sep 17 00:00:00 2001 From: Adam Langley Date: Tue, 17 Nov 2015 15:25:00 -0800 Subject: [PATCH] Allow |CRYPTO_is_NEON_capable| to be known at compile time, if possible. If -mfpu=neon is passed then we don't need to worry about checking for NEON support at run time. This change allows |CRYPTO_is_NEON_capable| to statically return 1 in this case. This then allows the compiler to discard generic code in several cases. Change-Id: I3b229740ea3d5cb0a304f365c400a0996d0c66ef Reviewed-on: https://boringssl-review.googlesource.com/6523 Reviewed-by: David Benjamin Reviewed-by: Adam Langley --- crypto/cpu-arm.c | 2 +- include/openssl/cpu.h | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/crypto/cpu-arm.c b/crypto/cpu-arm.c index 14ad2ee4..675d174e 100644 --- a/crypto/cpu-arm.c +++ b/crypto/cpu-arm.c @@ -34,7 +34,7 @@ unsigned long getauxval(unsigned long type) __attribute__((weak)); extern uint32_t OPENSSL_armcap_P; -char CRYPTO_is_NEON_capable(void) { +char CRYPTO_is_NEON_capable_at_runtime(void) { return (OPENSSL_armcap_P & ARMV7_NEON) != 0; } diff --git a/include/openssl/cpu.h b/include/openssl/cpu.h index 19e11d04..e946304a 100644 --- a/include/openssl/cpu.h +++ b/include/openssl/cpu.h @@ -102,10 +102,20 @@ extern uint32_t OPENSSL_ia32cap_P[4]; #if !defined(OPENSSL_STATIC_ARMCAP) -/* CRYPTO_is_NEON_capable returns true if the current CPU has a NEON unit. Note - * that |OPENSSL_armcap_P| also exists and contains the same information in a - * form that's easier for assembly to use. */ -OPENSSL_EXPORT char CRYPTO_is_NEON_capable(void); +/* CRYPTO_is_NEON_capable_at_runtime returns true if the current CPU has a NEON + * unit. Note that |OPENSSL_armcap_P| also exists and contains the same + * information in a form that's easier for assembly to use. */ +OPENSSL_EXPORT char CRYPTO_is_NEON_capable_at_runtime(void); + +/* CRYPTO_is_NEON_capable returns true if the current CPU has a NEON unit. If + * this is known statically then it returns one immediately. */ +static inline int CRYPTO_is_NEON_capable(void) { +#if defined(__ARM_NEON__) + return 1; +#else + return CRYPTO_is_NEON_capable_at_runtime(); +#endif +} /* CRYPTO_set_NEON_capable sets the return value of |CRYPTO_is_NEON_capable|. * By default, unless the code was compiled with |-mfpu=neon|, NEON is assumed