gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:44:42 25 4
gpt4 key购买 nike

这是我在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


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

chk_0x00:
kmovq rbx, k0
tzcnt rbx, rbx
add rax, rbx


在这里,我们有一个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 .check_next_dword
bsf ebx, ebx
add eax, ebx
jmp .done
.check_next_dword:
add eax, 32 ; 0x00 is not found in the first DWORD of the mask so we pass it by adding 32 to the length
sub esp, 8 ; reserve 8-byte from memory
kmovq [esp], k0 ; move the 8-byte MASK from k0 to our reserved memory
mov ebx, [esp+4] ; move the second DWORD of the mask to the ebx
bsf ebx, ebx
add eax, ebx
add esp, 8


以我的x86方式,我使用“ kmovd”将遮罩的第一个DWORD移到ebx中,但是我不知道该遮罩的第二个DWORD要做什么!所以我只是从内存中保留了8个字节并将掩码(8个字节)移入其中,然后将第二个dword移入了ebx并再次检查了它……还有更好的解决方案吗? (我认为我的方法还不够快)
使用 vxorps初始化为零的 zmm寄存器是否正确?

最佳答案

看起来KSHIFTRQ可以用作替代方案,以将k0计数器的高32位右移为低32位,可以将其复制到常规用途寄存器中。喜欢:

.check_next_dword:
add eax, 32
KSHIFTRQ k0, k0, 32 ;shift hi 32 bits to be low 32 bits
kmovd ebx, k0
...


是的, vxorps zmm0, zmm0, zmm0会将 zmm0设置为零,因为根据 vxorps referense,它在不带掩码的情况下进行异或运算成为第三个参数(您也可以检查此 SO question关于将zmm寄存器清零)

关于assembly - AVX512BW:使用bsf/tzcnt处理32位代码中的64位掩码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58562820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com