C++ 为什么编译器没有定义uuu ARM u FEATURE u CRC32?

C++ 为什么编译器没有定义uuu ARM u FEATURE u CRC32?,c++,arm,c-preprocessor,neon,intrinsics,C++,Arm,C Preprocessor,Neon,Intrinsics,我已经在这个问题上工作了一段时间,我希望有人能指出我的错误。我想我再也不能透过树林看到森林了 我有一个用于测试的开发板。其AArch64,因此具有霓虹灯和其他cpu功能,如AES、SHA和CRC32: $ cat /proc/cpuinfo Processor : AArch64 Processor rev 3 (aarch64) ... Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 ... 当我试图编译程序时: $

我已经在这个问题上工作了一段时间,我希望有人能指出我的错误。我想我再也不能透过树林看到森林了

我有一个用于测试的开发板。其AArch64,因此具有霓虹灯和其他cpu功能,如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
}
文件系统的grep显示
arm\u acle.h
实际上是头文件:

$ grep -IR '__crc32' /usr/lib
/usr/lib/gcc/.../include/arm_acle.h:__crc32b (uint32_t __a, uint8_t __b)
...
根据第9.7节CRC32本质,当定义
\uuu ARM\u FEATURE\uCRC32
时,假设存在缺失符号。检查
arm\u acle.h
确认

为了完整起见,我尝试使用
-march=native
进行编译,但编译器拒绝了

为什么编译器没有定义
\u ARM\u FEATURE\u CRC32

我可以做些什么来让程序使用主板上可用的本机功能进行编译




$g++-dM-E-关于为什么默认情况下不启用此功能;这是编译器目标的基线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
$gcc-dM-E--march=armv8-a+crc
有关如何设置此选项的更多文档,请参阅(对于较旧的gcc版本,请参阅同一页)


我想人们可能会期望
-march=native
也这样做,但目前该选项似乎只适用于x86体系结构。

谢谢@mstorsjo。这对我解释了很多;再次感谢。我如何才能获得应该存在的其他定义,就像其他缺失的功能一样,
\uuuuuu ARM\uarch
\uuuu ARM\uacle
<代码>\uuuuu ARM\u ACLE
有点重要,因为Linaro提供了4.9编译器,所以
has\u include(x)
不可用;如果定义了
\uuuu AARCH64\uuuu
,则它应该相当于
\uuu ARM\u ARCH>=8
。至于
\uuu ARM\uacle
,显然gcc也没有设置。我想你可以假设如果设置了
\u ARM\u FEATURE\u CRC32
,你可以包括
ARM\u acle.h
(至少如果你在gcc/clang上,并且对于添加了
\u ARM\u FEATURE\u CRC32
的版本,无论是哪一个-我现在不知道)。哦,我们开始吧。从bug中可以看出:“实现ACLE的工作正在进行中。不幸的是,这个定义是在intrinsic出现之前添加的……”。看起来他们删除了所有与ARM相关的定义。不,这不是ARM相关的定义丢失的原因(但可能解释了为什么
\uu ARM\u ACLE
丢失)。如果您执行相同的
g++-dM-E-Yes,那么这些只是AArch64 GCC端口中缺少的功能<代码>\uuuu ARM\u ACLE
未定义为ACLE支持还远未完成,因此声称通过此宏支持任何特定版本会产生误导。
$ 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
$ gcc -dM -E - -march=armv8-a+crc < /dev/null | egrep -i '(arm|neon|acle|crc)'
#define __ARM_FEATURE_CRC32 1
#define __ARM_NEON 1