Мне сложно определять возможности ARM-64 на разных платформах (Linux, Apple, Windows Phone и Windows Store) и инструментальные цепочки (ARMCC, GCC, Clang, MSVC). Согласно документации ARM по адресу Compiler Toolchain для __ARM_FEATURE_CRYPTO
:ARM криптографические инструкции и макрос __ARM_FEATURE_CRYPTO
Set to 1 if the target has crypto instructions.
Назад отслеживание немного дальше, и в соответствии с ARM C Language Extensions 2.0 (ACLE):
6.5.7 Crypto Extension
__ARM_FEATURE_CRYPTO определяется до 1, если поддерживаются инструкции Crypto и доступны свойства, определенные в 12.3.14. Эти инструкции включают в себя AES {E, D}, {SHA1 C, P, M} и т.д. Это доступно только тогда, когда __ARM_ARCH> = 8.
А:
2.3.14 Crypto Intrinsics
Инструкции по расширению Crypto являются частью расширенного набора инструкций SIMD. Эти встроенные функции доступны при __ARM_FEATURE_CRYPTO определяется ...
Если вы заметили, раздел 6.5.7 сдвинуто 2.3.14 и 2.3.14 круги и назад сдвинуто 6.5.7.
Каковы инструкции, которые вызовут определение? И когда инструкции (ы) присутствуют, какие интрисики доступны?
С 64-разрядное ARMv8-а 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 Dev борту (-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
И от Apple toolcha в с -arch arm64
:
$ 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
Для Apple см. Ответ SO для [iPhone поддержки аппаратного ускорения AES Шифрование?] (Http://stackoverflow.com/a/5387310/451475) – zaph
@zaph Это похоже на использование внешнего периферийного криптоохладителя, а не конкретные инструкции ARMv8 для выполнения AES/SHA на самом CPU. Примечательно, что это датируется до того, как была анонсирована архитектура ARMv8 ... – Notlikethat