我在配備 Apple Silicon M1 CPU 的 MacBook Air 上使用 Homebrew 安裝了 gcc 11.3.0。該二進制檔案是 aarch64 本機版本,而不是模擬的 Rosetta。安裝的作業系統是 macOS Monterey 12.3。
我在編譯使用 M1 CPU 支持的 ARMv8.2-A SHA-3 擴展指令的程式時遇到問題。這是一個最小的可重現示例:
#include <arm_neon.h>
int main() {
uint64x2_t a = {0}, b = {0}, c = {0};
veor3q_u64(a, b, c);
return 0;
}
這段代碼使用 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);
| ^~~~~~~~~~~~~~~~~~~
這是這個特定的硬體/軟體組合中的一個錯誤,還是有一些命令列選項我可以傳遞給 gcc 來編譯這個特定的程式?
uj5u.com熱心網友回復:
解決了這個問題。事實證明,gcc 需要-march=armv8.2-a sha3
而不僅僅是-march=armv8-a sha3
編譯這個內在函式。實際上,在 gcc 的版本中arm_neon.h
,可以在包括以下在內的內部函式塊之前找到它veor3q_u64
:
#pragma GCC target ("arch=armv8.2-a sha3")
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/470511.html
上一篇:無法在macOSBigSur上安裝IntelHAXM
下一篇:終端在啟動時顯示環境變數