OSX 32 位的 Clang 是否支持 AVX 512 内在函数?

Are AVX512 instrinsics supported in Clang on OSX 32-bit?

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

我可以在 Godbolt (https://godbolt.org/z/d-mnAy) 上用 clang6.0 (mainline, not Apple's version) 重现它,但不能用 clang7.0.

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

当然这很傻,而且 vpbroadcastq 带有内存或 xmm 源的在 32 位模式下仍然可用。在 32 位模式下支持它的最新 clang 版本将此代码编译为 non-broadcast 向量常量加载,即使在 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-bit-mode-only。您可以使用 headers 使用的相同 built-ins 为 32 位模式定义自己的模式。