ARM加密指令和__ARM_FEATURE_CRYPTO宏

时间:2016-05-15 09:33:24

标签: macros arm c-preprocessor

我很难确定跨平台(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

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内在函数。