macOS/Apple Silicon 上的 gcc 11.3.0 和 SHA-3 指令

swi*_*one 2 macos gcc arm64

我在配备 Apple Silicon M1 CPU 的 MacBook Air 上使用 Homebrew 安装了 gcc 11.3.0。该二进制文件是 aarch64 本机版本,而不是 Rosetta 模拟版本。安装的操作系统是 macOS Monterey 12.3。

我在编译使用 ARMv8.2-A SHA-3 扩展指令(M1 CPU 支持)的程序时遇到问题。这是一个最小的可重现示例:

#include <arm_neon.h>

int main() {
    uint64x2_t a = {0}, b = {0}, c = {0};
    veor3q_u64(a, b, c);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这段代码可以用 Apple 提供的 clang 编译器很好地编译。

我使用 gcc 11 的以下命令行编译它:

gcc-11 -o test test.c -march=armv8-a+sha3

这会导致以下错误:

In file included from test.c:1:
test.c: In function 'main':
/opt/homebrew/Cellar/gcc/11.3.0/lib/gcc/11/gcc/aarch64-apple-darwin21/11/include/arm_neon.h:32320:1: error: inlining failed in call to 'always_inline' 'veor3q_u64': target specific option mismatch
32320 | veor3q_u64 (uint64x2_t __a, uint64x2_t __b, uint64x2_t __c)
      | ^~~~~~~~~~
test.c:5:5: note: called from here
    5 |     veor3q_u64(a, b, c);
      |     ^~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

这是这个特定硬件/软件组合中的错误,还是有一些命令行选项我可以传递给 gcc 来编译这个特定程序?

swi*_*one 7

解决了问题。事实证明,gcc 需要-march=armv8.2-a+sha3而不仅仅是-march=armv8-a+sha3编译这个内在函数。事实上,在 gcc 的版本中arm_neon.h,人们可以在内部函数块之前找到它,其中包括veor3q_u64

#pragma GCC target ("arch=armv8.2-a+sha3")
Run Code Online (Sandbox Code Playgroud)