gpt4 book ai didi

assembly - xmm 寄存器上的字节操作 (AMD64)

转载 作者:行者123 更新时间:2023-12-03 06:36:59 29 4
gpt4 key购买 nike

如何仅访问 128 位 xmm 寄存器的特定部分(字节)?我必须在整个空间上循环(按字节),逐字节比较并在明确定义的条件下复制它*。

因此,我必须将这个 16 字节寄存器的每个字节与 \0 进行比较,并(也许)覆盖它。

xor %ecx, %ecx #var i

copy:
cmp $0, <i-th byte of xmm1>
je end
mov <byte i of xmm1>, <byte i of xmm2>
inc %ecx
jmp copy
end:
# ...

如何访问xmm寄存器的第i个字节?

我的解决方案必须使用尽可能少的操作(仅计算操作数,而不计算其时钟周期数!),因此我不会使用 strlen 等子函数。

*) 我必须移动所有字节,将 b 中第一个 \0 出现的字节从寄存器 a 移动到寄存器 b。

最佳答案

从技术上讲,您可以使用 PEXTRB 访问字节,但不建议在此任务中这样做。我将使用 PCMPEQB 进行 SIMD 比较,然后使用 PMOVMSKB 获取结果掩码,然后使用 BSF 查找第一个设置位,然后创建混合面具。避免循环,使用并行性。

<小时/>

更新:基于rwong's comment这是使用 pcmpistrm 的可能实现:

3       movdqu input, %xmm1
(gdb) si
4 movdqu replace, %xmm2
(gdb)
5 movdqa %xmm1, %xmm0
(gdb)
6 pcmpistrm $0x78, %xmm1, %xmm1
(gdb) p/s $xmm1.v16_int8
$1 = "input\000----------"
(gdb) p/s $xmm2.v16_int8
$2 = "replacereplacere"
(gdb) si
7 pblendvb %xmm1, %xmm2
(gdb) si
8 ret
(gdb) p/s $xmm2.v16_int8
$3 = "repla\000----------"

关于assembly - xmm 寄存器上的字节操作 (AMD64),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22283118/

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