Improve Apple iOS support for ARM and NEON. Add ARM Crypto detection
parent
950cf4cdb9
commit
480532931b
13
config.h
13
config.h
|
|
@ -535,16 +535,25 @@ NAMESPACE_END
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(CRYPTOPP_BOOL_NEON_INTRINSICS_AVAILABLE)
|
#if !defined(CRYPTOPP_BOOL_NEON_INTRINSICS_AVAILABLE)
|
||||||
# if (CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARM64) && ((CRYPTOPP_GCC_VERSION >= 40400) || (CRYPTOPP_CLANG_VERSION >= 20800) || (CRYPTOPP_MSC_VERSION >= 1700))
|
# if (CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARM64) && ((CRYPTOPP_GCC_VERSION >= 40400) || (CRYPTOPP_CLANG_VERSION >= 20800) || (CRYPTOPP_APPLE_CLANG_VERSION >= 60000) || (CRYPTOPP_MSC_VERSION >= 1700))
|
||||||
# if defined(__ARM_NEON__) || defined(__ARM_NEON) || defined(_M_ARM)
|
# if defined(__ARM_NEON__) || defined(__ARM_NEON) || defined(_M_ARM) || (__ARM_ARCH >= 8)
|
||||||
# define CRYPTOPP_BOOL_NEON_INTRINSICS_AVAILABLE 1
|
# define CRYPTOPP_BOOL_NEON_INTRINSICS_AVAILABLE 1
|
||||||
# endif
|
# endif
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !defined(CRYPTOPP_BOOL_ARM_CRYPTO_INTRINSICS_AVAILABLE)
|
||||||
|
# if (CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARM64) && ((CRYPTOPP_GCC_VERSION >= 40400) || (CRYPTOPP_CLANG_VERSION >= 20800) || (CRYPTOPP_APPLE_CLANG_VERSION >= 60000))
|
||||||
|
# if defined(__ARM_FEATURE_CRYPTO)
|
||||||
|
# define CRYPTOPP_BOOL_ARM_CRYPTO_INTRINSICS_AVAILABLE 1
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef CRYPTOPP_BOOL_NEON_INTRINSICS_AVAILABLE
|
#ifndef CRYPTOPP_BOOL_NEON_INTRINSICS_AVAILABLE
|
||||||
# define CRYPTOPP_BOOL_NEON_INTRINSICS_AVAILABLE 0
|
# define CRYPTOPP_BOOL_NEON_INTRINSICS_AVAILABLE 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(CRYPTOPP_NO_UNALIGNED_DATA_ACCESS) && !defined(CRYPTOPP_ALLOW_UNALIGNED_DATA_ACCESS)
|
#if !defined(CRYPTOPP_NO_UNALIGNED_DATA_ACCESS) && !defined(CRYPTOPP_ALLOW_UNALIGNED_DATA_ACCESS)
|
||||||
#if (CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || defined(__powerpc__) || (__ARM_FEATURE_UNALIGNED >= 1))
|
#if (CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || defined(__powerpc__) || (__ARM_FEATURE_UNALIGNED >= 1))
|
||||||
#define CRYPTOPP_ALLOW_UNALIGNED_DATA_ACCESS
|
#define CRYPTOPP_ALLOW_UNALIGNED_DATA_ACCESS
|
||||||
|
|
|
||||||
|
|
@ -535,16 +535,25 @@ NAMESPACE_END
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(CRYPTOPP_BOOL_NEON_INTRINSICS_AVAILABLE)
|
#if !defined(CRYPTOPP_BOOL_NEON_INTRINSICS_AVAILABLE)
|
||||||
# if (CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARM64) && ((CRYPTOPP_GCC_VERSION >= 40400) || (CRYPTOPP_CLANG_VERSION >= 20800) || (CRYPTOPP_MSC_VERSION >= 1700))
|
# if (CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARM64) && ((CRYPTOPP_GCC_VERSION >= 40400) || (CRYPTOPP_CLANG_VERSION >= 20800) || (CRYPTOPP_APPLE_CLANG_VERSION >= 60000) || (CRYPTOPP_MSC_VERSION >= 1700))
|
||||||
# if defined(__ARM_NEON__) || defined(__ARM_NEON) || defined(_M_ARM)
|
# if defined(__ARM_NEON__) || defined(__ARM_NEON) || defined(_M_ARM) || (__ARM_ARCH >= 8)
|
||||||
# define CRYPTOPP_BOOL_NEON_INTRINSICS_AVAILABLE 1
|
# define CRYPTOPP_BOOL_NEON_INTRINSICS_AVAILABLE 1
|
||||||
# endif
|
# endif
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !defined(CRYPTOPP_BOOL_ARM_CRYPTO_INTRINSICS_AVAILABLE)
|
||||||
|
# if (CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARM64) && ((CRYPTOPP_GCC_VERSION >= 40400) || (CRYPTOPP_CLANG_VERSION >= 20800) || (CRYPTOPP_APPLE_CLANG_VERSION >= 60000))
|
||||||
|
# if defined(__ARM_FEATURE_CRYPTO)
|
||||||
|
# define CRYPTOPP_BOOL_ARM_CRYPTO_INTRINSICS_AVAILABLE 1
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef CRYPTOPP_BOOL_NEON_INTRINSICS_AVAILABLE
|
#ifndef CRYPTOPP_BOOL_NEON_INTRINSICS_AVAILABLE
|
||||||
# define CRYPTOPP_BOOL_NEON_INTRINSICS_AVAILABLE 0
|
# define CRYPTOPP_BOOL_NEON_INTRINSICS_AVAILABLE 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(CRYPTOPP_NO_UNALIGNED_DATA_ACCESS) && !defined(CRYPTOPP_ALLOW_UNALIGNED_DATA_ACCESS)
|
#if !defined(CRYPTOPP_NO_UNALIGNED_DATA_ACCESS) && !defined(CRYPTOPP_ALLOW_UNALIGNED_DATA_ACCESS)
|
||||||
#if (CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || defined(__powerpc__) || (__ARM_FEATURE_UNALIGNED >= 1))
|
#if (CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || defined(__powerpc__) || (__ARM_FEATURE_UNALIGNED >= 1))
|
||||||
#define CRYPTOPP_ALLOW_UNALIGNED_DATA_ACCESS
|
#define CRYPTOPP_ALLOW_UNALIGNED_DATA_ACCESS
|
||||||
|
|
|
||||||
21
cpu.cpp
21
cpu.cpp
|
|
@ -256,7 +256,7 @@ void DetectX86Features()
|
||||||
#elif (CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARM64)
|
#elif (CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARM64)
|
||||||
|
|
||||||
bool g_ArmDetectionDone = false;
|
bool g_ArmDetectionDone = false;
|
||||||
bool g_hasNEON = false, g_hasCRC32 = false;
|
bool g_hasNEON = false, g_hasCRC32 = false, g_hasCrypto = false;
|
||||||
|
|
||||||
// This is avaiable in a status register, but we need privileged code to perform the read
|
// This is avaiable in a status register, but we need privileged code to perform the read
|
||||||
word32 g_cacheLineSize = CRYPTOPP_L1_CACHE_LINE_SIZE;
|
word32 g_cacheLineSize = CRYPTOPP_L1_CACHE_LINE_SIZE;
|
||||||
|
|
@ -285,9 +285,26 @@ void DetectArmFeatures()
|
||||||
# else
|
# else
|
||||||
g_hasCRC32 = false;
|
g_hasCRC32 = false;
|
||||||
# endif
|
# endif
|
||||||
#elif defined(_WIN32) && defined(_M_ARM) // Microsoft ARM
|
#elif defined(__APPLE__)
|
||||||
|
g_hasNEON = true;
|
||||||
|
# if defined(__ARM_FEATURE_CRC32)
|
||||||
|
g_hasCRC32 = true;
|
||||||
|
# else
|
||||||
|
g_hasCRC32 = false;
|
||||||
|
# endif
|
||||||
|
# if defined(__ARM_FEATURE_CRYPTO)
|
||||||
|
g_hasCrypto = true;
|
||||||
|
# else
|
||||||
|
g_hasCrypto = false;
|
||||||
|
# endif
|
||||||
|
#elif defined(_WIN32)
|
||||||
g_hasNEON = true;
|
g_hasNEON = true;
|
||||||
g_hasCRC32 = false;
|
g_hasCRC32 = false;
|
||||||
|
g_hasCrypto = false;
|
||||||
|
#else
|
||||||
|
g_hasNEON = false;
|
||||||
|
g_hasCRC32 = false;
|
||||||
|
g_hasCrypto = false;
|
||||||
#endif
|
#endif
|
||||||
*((volatile bool*)&g_ArmDetectionDone) = true;
|
*((volatile bool*)&g_ArmDetectionDone) = true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
24
cpu.h
24
cpu.h
|
|
@ -20,7 +20,7 @@
|
||||||
# if CRYPTOPP_BOOL_NEON_INTRINSICS_AVAILABLE
|
# if CRYPTOPP_BOOL_NEON_INTRINSICS_AVAILABLE
|
||||||
# include <arm_neon.h>
|
# include <arm_neon.h>
|
||||||
# endif
|
# endif
|
||||||
# if defined(__ARM_FEATURE_CRC32) || (__ARM_ACLE >= 200)
|
# if (defined(__ARM_FEATURE_CRC32) || defined(__ARM_FEATURE_CRYPTO) || (__ARM_ACLE >= 200)) && !defined(__APPLE__)
|
||||||
# include <arm_acle.h>
|
# include <arm_acle.h>
|
||||||
# endif
|
# endif
|
||||||
#endif // ARM-32 or ARM-64
|
#endif // ARM-32 or ARM-64
|
||||||
|
|
@ -237,12 +237,14 @@ inline int GetCacheLineSize()
|
||||||
#elif (CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARM64)
|
#elif (CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARM64)
|
||||||
|
|
||||||
extern bool g_ArmDetectionDone;
|
extern bool g_ArmDetectionDone;
|
||||||
extern bool g_hasNEON, g_hasCRC32;
|
extern bool g_hasNEON, g_hasCRC32, g_hasCrypto;
|
||||||
void CRYPTOPP_API DetectArmFeatures();
|
void CRYPTOPP_API DetectArmFeatures();
|
||||||
|
|
||||||
//! \brief Determine if an ARM processor has Advanced SIMD available
|
//! \brief Determine if an ARM processor has Advanced SIMD available
|
||||||
//! \returns true if the hardware is capable of Advanced SIMD at runtime, false otherwise.
|
//! \returns true if the hardware is capable of Advanced SIMD at runtime, false otherwise.
|
||||||
//! \details Runtime support requires compile time support.
|
//! \details Runtime support requires compile time support. When compiling with GCC, you may
|
||||||
|
//! need to compile with <tt>-mfpu=neon</tt> (32-bit) or <tt>-march=armv8-a</tt>
|
||||||
|
//! (64-bit). Also see ARM's <tt>__ARM_NEON</tt> preprocessor macro.
|
||||||
inline bool HasNEON()
|
inline bool HasNEON()
|
||||||
{
|
{
|
||||||
if (!g_ArmDetectionDone)
|
if (!g_ArmDetectionDone)
|
||||||
|
|
@ -253,7 +255,8 @@ inline bool HasNEON()
|
||||||
//! \brief Determine if an ARM processor has CRC32 available
|
//! \brief Determine if an ARM processor has CRC32 available
|
||||||
//! \returns true if the hardware is capable of CRC32 at runtime, false otherwise.
|
//! \returns true if the hardware is capable of CRC32 at runtime, false otherwise.
|
||||||
//! \details Runtime support requires compile time support. When compiling with GCC, you may
|
//! \details Runtime support requires compile time support. When compiling with GCC, you may
|
||||||
//! need to compile with <tt>-march=armv8-a+crc</tt>.
|
//! need to compile with <tt>-march=armv8-a+crc</tt>. Also see ARM's <tt>__ARM_FEATURE_CRC32</tt>
|
||||||
|
//! preprocessor macro.
|
||||||
inline bool HasCRC32()
|
inline bool HasCRC32()
|
||||||
{
|
{
|
||||||
if (!g_ArmDetectionDone)
|
if (!g_ArmDetectionDone)
|
||||||
|
|
@ -261,6 +264,19 @@ inline bool HasCRC32()
|
||||||
return g_hasCRC32;
|
return g_hasCRC32;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//! \brief Determine if an ARM processor has Crypto available
|
||||||
|
//! \returns true if the hardware is capable of Crypto at runtime, false otherwise.
|
||||||
|
//! \details Runtime support requires compile time support. When compiling with GCC, you may
|
||||||
|
//! need to compile with <tt>-march=armv8-a+crypto</tt>; while Apple requires
|
||||||
|
//! <tt>-arch armv7s</tt> or <tt>-arch arm64</tt>. Also see ARM's <tt>__ARM_FEATURE_CRYPTO</tt>
|
||||||
|
//! preprocessor macro.
|
||||||
|
inline bool HasCrypto()
|
||||||
|
{
|
||||||
|
if (!g_ArmDetectionDone)
|
||||||
|
DetectArmFeatures();
|
||||||
|
return g_hasCrypto;
|
||||||
|
}
|
||||||
|
|
||||||
//! \brief Provides the cache line size at runtime
|
//! \brief Provides the cache line size at runtime
|
||||||
//! \returns true if the hardware is capable of CRC32 at runtime, false otherwise.
|
//! \returns true if the hardware is capable of CRC32 at runtime, false otherwise.
|
||||||
//! \details GetCacheLineSize() provides is an estimate using CRYPTOPP_L1_CACHE_LINE_SIZE.
|
//! \details GetCacheLineSize() provides is an estimate using CRYPTOPP_L1_CACHE_LINE_SIZE.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue