Arm64 SHA512内部函数无法使用GCC编译(“目标特定选项不匹配”)

lrpiutwd  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(288)

考虑以下源文件test-sha512.c,在Arm64(aarch64)上使用SHA512内部函数:

#include <arm_neon.h>
const uint64_t data[256] = {0,};

void test()
{
    uint64x2_t a = vld1q_u64(data);
    a = vsha512h2q_u64(a, a, a);
}

在Ubuntu 22.10(MacBook M1上的虚拟机),与gcc 12.2.0,我有错误“内联失败调用'always_inline'”和“目标特定选项不匹配”:

$ gcc -c test-sha512.c -march=armv8-a+sha3
In file included from test-sha512.c:1:
/usr/lib/gcc/aarch64-linux-gnu/12/include/arm_neon.h: In function ‘test’:
/usr/lib/gcc/aarch64-linux-gnu/12/include/arm_neon.h:29671:1: error: inlining failed in call to ‘always_inline’ ‘vsha512h2q_u64’: target specific option mismatch
29671 | vsha512h2q_u64 (uint64x2_t __a, uint64x2_t __b, uint64x2_t __c)
      | ^~~~~~~~~~~~~~
test-sha512.c:7:9: note: called from here
    7 |     a = vsha512h2q_u64(a, a, a);
      |         ^~~~~~~~~~~~~~~~~~~~~~~
/usr/lib/gcc/aarch64-linux-gnu/12/include/arm_neon.h:29671:1: error: inlining failed in call to ‘always_inline’ ‘vsha512h2q_u64’: target specific option mismatch
29671 | vsha512h2q_u64 (uint64x2_t __a, uint64x2_t __b, uint64x2_t __c)
      | ^~~~~~~~~~~~~~
test-sha512.c:7:9: note: called from here
    7 |     a = vsha512h2q_u64(a, a, a);
      |         ^~~~~~~~~~~~~~~~~~~~~~~

使用clang 15.0.6,它可以正确编译,使用Arm64 intrinsic并使用clang编译的完整SHA512实现也可以正确工作。

$ clang -c test-sha512.c -march=armv8-a+sha3

注意:Arm架构为SHA1、SHA256、SHA512和SHA3定义了不同的特性。然而,gcc和clang只知道cryptosha2sha3。SHA512指令(SHA2的加密部分)是用sha3激活的。奇怪。总之...
用于AES、SHA1和SHA256的类似的Arm64 intrinsic可以用gcc正确编译。该问题是SHA512特有的。
其他测试,未成功,相同错误:

  • 错误“目标特定选项不匹配”可能表明对-march选项的误解。我尝试了所有Armv8选项(-march=armv8-a+fp+simd+crypto+crc+lse+fp16+rcpc+rdma+dotprod+aes+sha2+sha3+sm4+fp16fml+sve+profile+rng+memtag+sb+ssbs+predres+sve2+sve2-sm4+sve2-aes+sve2-sha3+sve2-bitperm+tme+i8mm+f32mm+f64mm+bf16+flagm+pauth+ls64+mops)和-march=armv9-a
  • 使用-march=native,考虑到M1支持SHA512。
  • 使用-mcpu=neoverse-v1-mcpu=neoverse-n2或其他已知的支持SHA512的Arm内核。
  • 各种类型的优化选项。
  • 尝试了gcc --target-help的各种(但不是全部)建议。

这是一个已知错误吗?我在网上没有找到任何关于Arm64 SHA512 intrinsics上这个错误的参考。
编辑:SHA256的内部函数也会因为同样的错误而失败。只有SHA1的内部函数可以工作。我之前对SHA256的测试是使用clang进行的,对不起。
编辑2:SHA256 intrinsic适用于-march=armv8-a+sha2+crypto,但不适用于-march=armv8-a+sha2。SHA512仍然不适用,即使适用于所有-march选项。

kx7yvsdv

kx7yvsdv1#

SHA 3/SHA 512扩展由ARM文档化,仅适用于ARMv8.2-A以上版本。因此,gcc要求您使用-march=armv8.2-a+sha3(或v8.3-a等)

相关问题