小编ELH*_*ERS的帖子

AVX512BW:使用 bsf / tzcnt 处理 32 位代码中的 64 位掩码?

这是我在 AVX512BW 中的“strlen”函数的代码

vxorps          zmm0, zmm0, zmm0   ; ZMM0 = 0
vpcmpeqb        k0, zmm0, [ebx]    ; ebx is string and it's aligned at 64-byte boundary
kortestq        k0, k0             ; 0x00 found ?
jnz             .chk_0x00
Run Code Online (Sandbox Code Playgroud)

现在对于'chk_0x00',在x86_64系统中,没有问题,我们可以这样处理:

chk_0x00:
kmovq   rbx, k0
tzcnt   rbx, rbx
add     rax, rbx
Run Code Online (Sandbox Code Playgroud)

这里我们有一个 64 位寄存器,因此我们可以将掩码存储到其中,但我的问题是关于 x86 系统,我们没有任何 64 位寄存器,因此我们必须使用“内存”保留(8 字节)并检查两者掩码的DWORD一一对应(其实这是我的方式,我想知道有没有更好的方式)

chk_0x00:
kmovd   ebx, k0       ; move the first dword of the mask to the ebx
test    ebx, ebx      ; 0x00 found in the first dword ?
jz …
Run Code Online (Sandbox Code Playgroud)

x86 assembly 32-bit micro-optimization avx512

2
推荐指数
1
解决办法
606
查看次数

作为单个指令的延迟,多个值或范围意味着什么?

我对https://uops.info/上的指令延迟有疑问。

对于某些指令,例如PCMPEQB(XMM, M128)Skylake 表条目中的延迟被列为[1;?8]

我对延迟有一点了解,但我知道它只是一个数字!!!例如,1 或 2 或 3 或...但这是什么[1;?8]!!!???这意味着延迟取决于内存,它在 1 到 8 之间?

如果是真的,什么时候是 1 .. 什么时候是 3,等等?

例如,它的延迟是多少:

pcmpeqb xmm0, xword [.my_aligned_data]

....
....

align 16
.my_aligned_data db 5,6,7,2,5,6,7,2,5,6,7,2,5,6,7,2
Run Code Online (Sandbox Code Playgroud)

这里的确切延迟值是多少pcmpeqb xmm0, xword [.my_aligned_data]???

或者例如,

PMOVMSKB (R32, XMM)
Run Code Online (Sandbox Code Playgroud)

该指令的延迟是 (?3) !!! 什么意思 ?!这是否意味着延迟在 1 到 3 之间?如果是,则此指令仅适用于寄存器!!!那么什么时候1 与更高的数字呢?

performance x86 assembly cpu-architecture micro-optimization

2
推荐指数
1
解决办法
102
查看次数

将 XMM 寄存器设置为重复字节模式(广播一个常量字节)

我知道我们可以做这样的事情来将一个字符移动到一个 xmm 寄存器:

movaps xmm1, xword [.__0x20]

align 16
.__0x20 db 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20
Run Code Online (Sandbox Code Playgroud)

但由于这是一个记忆过程,我想知道是否有更好的方法?(另外,我在谈论 SSE2 而不是其他 SIMD 类型......)

我希望 xmm1 寄存器的每个字节都是 0x20,而不仅仅是一个字节..

(编者注:这可以称为广播或 splat。
这是_mm_set1_epi8(0x20)内在函数的作用。)

assembly sse micro-optimization sse2

2
推荐指数
1
解决办法
281
查看次数