Почему __ARM_FEATURE_CRC32 не определяется компилятором?

c++ arm c-preprocessor neon intrinsics

983 просмотра

1 ответ

Я работаю над этим вопросом в течение некоторого времени, и я надеюсь, что кто-то может указать на мою ошибку. Я думаю, я больше не могу видеть лес сквозь деревья.

У меня есть LeMaker HiKey Dev Board, который я использую для тестирования. Это AArch64, поэтому он имеет NEON и другие функции процессора, такие как AES, SHA и CRC32:

$ cat /proc/cpuinfo 
Processor   : AArch64 Processor rev 3 (aarch64)
...
Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32 
...

Когда я пытаюсь скомпилировать программу:

$ cat test.cxx
#if (defined(__ARM_NEON__) || defined(__ARM_NEON))
# define NEON_INTRINSICS_AVAILABLE 1
#else
# define NEON_INTRINSICS_AVAILABLE 0
#endif

#if BOOL_NEON_INTRINSICS_AVAILABLE
# include <arm_neon.h>
# if defined(__ARM_FEATURE_CRC32) || (__ARM_ACLE >= 200)
#  include <arm_acle.h>
# endif
#endif

#include <stdint.h>

int main(int argc, char* argv[])
{
  uint32_t crc = 0;

  crc = __crc32b(crc, (uint8_t)0);
  return 0
}

Это приводит к следующему:

$ g++ test.cxx -o test.exe
test.cxx: In function ‘int main(int, char**)’:
test.cxx:20:33: error: ‘__crc32b’ was not declared in this scope
   crc = __crc32b(crc, (uint8_t)0);
                                 ^
test.cxx:22:1: error: expected ‘;’ before ‘}’ token
 }
 ^

$ clang++ test.cxx -o test.exe
test.cxx:20:9: error: use of undeclared identifier '__crc32b'
  crc = __crc32b(crc, (uint8_t)0);
        ^
test.cxx:21:11: error: expected ';' after return statement
  return 0
          ^
          ;
2 errors generated.

Греп файловой системы показывает, arm_acle.hчто на самом деле это заголовок:

$ grep -IR '__crc32' /usr/lib
/usr/lib/gcc/.../include/arm_acle.h:__crc32b (uint32_t __a, uint8_t __b)
...

И в соответствии с ARM® C Language Extensions , Раздел 9.7 Встроенные функции CRC32 , недостающие символы должны присутствовать, когда они __ARM_FEATURE_CRC32определены. Осмотр arm_acle.hподтверждает это.

Для полноты я попытался скомпилировать -march=native, но компилятор отклонил его.

Почему __ARM_FEATURE_CRC32не определяется компилятором?

Что я могу сделать, чтобы программа компилировалась с нативными функциями, доступными на плате?


$ gcc --version
gcc (Debian/Linaro 4.9.2-10) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ clang --version
Debian clang version 3.5.0-10 (tags/RELEASE_350/final) (based on LLVM 3.5.0)
Target: aarch64-unknown-linux-gnu
Thread model: posix

$ g++ -dM -E - </dev/null | egrep -i '(arm|neon|acle)'
#define __ARM_NEON 1

$ clang++ -dM -E - </dev/null | egrep -i '(arm|neon|acle)'
#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_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 0xe
#define __ARM_PCS_AAPCS64 1
#define __ARM_SIZEOF_MINIMAL_ENUM 4
#define __ARM_SIZEOF_WCHAR_T 4
Автор: jww Источник Размещён: 04.11.2019 11:24

Ответы (1)


2 плюса

Решение

Что касается того, почему эта функция не включена по умолчанию; это необязательная функция, отсутствующая в базовом ABI, на которую ориентирован ваш компилятор, т.е. ожидается, что исполняемые вашим компилятором двоичные файлы будут работать на устройствах, не имеющих функции CRC.

По крайней мере, для gcc, вы можете включить эту функцию с -marchмодификатором crc, например так:

$ gcc -dM -E - -march=armv8-a+crc < /dev/null | egrep -i '(arm|neon|acle|crc)'
#define __ARM_FEATURE_CRC32 1
#define __ARM_NEON 1

См. Https://gcc.gnu.org/onlinedocs/gcc-6.1.0/gcc/AArch64-Options.html (или ту же страницу для более старых версий gcc) для получения дополнительной документации о том, как это установить.

Полагаю, можно было бы ожидать -march=nativeтого же, но в настоящее время этот вариант, похоже, реализован только для архитектур x86.

Автор: mstorsjo Размещён: 06.05.2016 07:54
Вопросы из категории :
32x32