在 OSX 32 位上的 Clang 中是否支持 AVX512 intrisincs?



在OSX下使用AVX512内部函数时,我会收到数百万个错误,但只有在构建32位应用程序时,64位就可以了。是否受支持?我通过x86intrin.h和immintrin.h包含它。zmmintrin.h显然根本不存在...

我可以在 Godbolt (https://godbolt.org/z/d-mnAy( 上使用 clang6.0(主线,而不是 Apple 的版本(重现它,但不能用 clang7.0 重现它。

这可能是一个错误,但英特尔将_mm512_maskz_set1_epi64列为vpbroadcastq zmm {k}, r64的固有功能,这显然仅在64位模式下可用。

当然,这是愚蠢的,带有内存或xmm源的vpbroadcastq在32位模式下仍然可用。 在 32 位模式下支持它的最新 clang 版本将此代码编译为矢量常量的非广播负载,即使在 64 位模式下也是如此:

#include <immintrin.h>
__m512i foo() {
return _mm512_maskz_set1_epi64(0xf0, 123);
}

但是 clang5.0 及更早版本在 64 位模式下像这样编译它:

foo:                                    # @foo
mov     al, -16
kmovd   k1, eax
mov     eax, 123
vpbroadcastq    zmm0 {k1} {z}, rax
ret

clang 5.0 -m32 给出了一个内部编译器错误。


我没有Mac来尝试实际的Xcode,但很明显,一些clang/LLVM版本将_mm512_maskz_set1_epi64_mm512_set1_epi64视为仅64位模式。 您可以使用标头使用的相同内置函数为 32 位模式定义自己的模式。

最新更新