2016-05-15 5 views
2

Мне сложно определять возможности 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 
+0

Для Apple см. Ответ SO для [iPhone поддержки аппаратного ускорения AES Шифрование?] (Http://stackoverflow.com/a/5387310/451475) – zaph

+0

@zaph Это похоже на использование внешнего периферийного криптоохладителя, а не конкретные инструкции ARMv8 для выполнения AES/SHA на самом CPU. Примечательно, что это датируется до того, как была анонсирована архитектура ARMv8 ... – Notlikethat

ответ

3

Будучи дополнительным расширением, это вообще к вам, чтобы сообщить компилятору, если ваша цель реализует криптографические инструкции. Для GCC или обычного Clang это означает добавление the +crypto feature modifier к настройкам -march или -mcpu.

Похоже, что версия Clang от Apple позволяет это безоговорочно, но цель неявно «Яблочные процессоры», и я сомневаюсь, что они делают некриптовые версии, поскольку они вообще не лицензируют свои проекты процессора, не говоря уже о экспорт. Что касается Windows Phone, в то время как ARMv8 действительно добавляет инструкции крипто к AArch32, а также, VS2015 ARM компилятор до сих пор, кажется, только для поддержки ARMv7, так что я думаю, что это совсем спорный вопрос там.

Обратите внимание, что GCC не сильно отличается от функции криптографии, кроме как передать ее ассемблеру с it doesn't properly support ACLE. Я пробовал Clang 4.8, как упакован Arch Linux, и это действительно скомпилирует стандартные AES-функции от arm_acle.h, если дано -march=armv8-a+crypto.

Смежные вопросы