我很难确定跨平台(Linux,Apple,Windows Phone和Windows Store)和工具链(ARMCC,GCC,Clang,MSVC)的ARM-64功能。根据ARM Compiler Toolchain对__ARM_FEATURE_CRYPTO
的文档:
Set to 1 if the target has crypto instructions.
根据ARM C Language Extensions 2.0 (ACLE):
进一步跟踪跟踪6.5.7加密扩展
如果支持加密指令并且12.3.14中定义的内部函数可用,则__ARM_FEATURE_CRYPTO定义为1。这些说明包括 AES {E,D},SHA1 {C,P,M}等。仅当__ARM_ARCH> = 8时才可用。
和
2.3.14加密内在因素
加密扩展指令是高级SIMD指令集的一部分。 定义__ARM_FEATURE_CRYPTO时可以使用这些内在函数...
如果你注意到,第6.5.7节推迟到2.3.14,并且2.3.14圈回来并推迟到6.5.7。
触发定义的说明是什么?当指令存在时,可以使用什么内在因素?
从64位ARMv8-a LeMaker HiKey( asimd
伪装成 neon
:
$ cat /proc/cpuinfo
Processor : AArch64 Processor rev 3 (aarch64)
processor : 0
...
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
来自同一个LeMaker HiKey开发板(-march=native
不可用):
$ gcc -dM -E -march=armv8-a -mcpu=cortex-a53 - < /dev/null | egrep -i '(arm|aarch|neon|crc|crypto)'
#define __AARCH64_CMODEL_SMALL__ 1
#define __aarch64__ 1
#define __AARCH64EL__ 1
#define __ARM_NEON 1
来自带有-arch arm64
的Apple工具链:
$ clang++ -arch arm64 -dM -E - < /dev/null | sort | egrep -i '(arm|aarch|neon|crc)'
#define __AARCH64EL__ 1
#define __AARCH64_SIMD__ 1
#define __ARM64_ARCH_8__ 1
#define __ARM_64BIT_STATE 1
#define __ARM_ACLE 200
#define __ARM_ALIGN_MAX_STACK_PWR 4
#define __ARM_ARCH 8
#define __ARM_ARCH_ISA_A64 1
#define __ARM_ARCH_PROFILE 'A'
#define __ARM_FEATURE_CLZ 1
#define __ARM_FEATURE_CRYPTO 1
#define __ARM_FEATURE_DIV 1
#define __ARM_FEATURE_FMA 1
#define __ARM_FEATURE_UNALIGNED 1
#define __ARM_FP 0xe
#define __ARM_FP16_FORMAT_IEEE 1
#define __ARM_FP_FENV_ROUNDING 1
#define __ARM_NEON 1
#define __ARM_NEON_FP 7
#define __ARM_NEON__ 1
#define __ARM_PCS_AAPCS64 1
#define __ARM_SIZEOF_MINIMAL_ENUM 4
#define __ARM_SIZEOF_WCHAR_T 4
#define __aarch64__ 1
#define __arm64 1
#define __arm64__ 1
答案 0 :(得分:3)
作为可选扩展,通常由您来告诉编译器您的目标是否实现了加密指令。对于GCC或常规Clang,这意味着将the +crypto
feature modifier添加到您的-march
或-mcpu
设置。
看起来Apple的Clang版本无条件地实现了它,但目标是隐含的&#34; Apples的CPU&#34;,我怀疑他们制作非加密版本,因为他们不喜欢完全许可他们的CPU设计,更不用说出口了。至于Windows Phone,虽然ARMv8确实也将加密指令添加到AArch32,但VS2015 ARM编译器似乎仍然只支持ARMv7,所以我认为它完全不存在。
请注意,自it doesn't properly support ACLE以来,GCC对加密功能做了很多工作,而不是将其传递给汇编程序。我尝试使用Arch Linux打包的Clang 4.8,如果给出arm_acle.h
,我很乐意从-march=armv8-a+crypto
编译标准的AES内在函数。