我改编了我在 SO 上找到的 SSE2 函数,并将其包含在我的程序中。该函数使用 SSE2 内在函数来计算向量中每个 8 x 16 位整数的前导零计数。当我编译这个程序时,它没有产生任何警告,并在我经常用于开发的旧笔记本电脑上运行它,它崩溃并显示消息“非法指令(核心转储)”。在检查程序集时,我注意到我的函数似乎具有 AVX1“VEX”编码的 SSE2 指令,如下所示。
.globl _mm_lzcnt_epi32
.type _mm_lzcnt_epi32, @function
_mm_lzcnt_epi32:
.LFB5318:
.cfi_startproc
endbr64
vmovdqa64 %xmm0, %xmm1
vpsrld $8, %xmm0, %xmm0
vpandn %xmm1, %xmm0, %xmm0
vmovdqa64 .LC0(%rip), %xmm1
vcvtdq2ps %xmm0, %xmm0
vpsrld $23, %xmm0, %xmm0
vpsubusw %xmm0, %xmm1, %xmm0
vpminsw .LC1(%rip), %xmm0, %xmm0
ret
.cfi_endproc
Run Code Online (Sandbox Code Playgroud)
如果我将头文件 immintrin.h 更改为 emmintrin.h,它会将我的代码正确编译为 SSE2 指令
.globl _mm_lzcnt_epi32
.type _mm_lzcnt_epi32, @function
_mm_lzcnt_epi32:
.LFB567:
.cfi_startproc
endbr64
movdqa %xmm0, %xmm1
psrld $8, %xmm0
pandn %xmm1, %xmm0
cvtdq2ps %xmm0, …
Run Code Online (Sandbox Code Playgroud)