如何只访问128bit 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。
答案 0 :(得分:4)
从技术上讲,您可以使用PEXTRB
访问字节,但不建议您执行此任务。我会使用PCMPEQB
然后PMOVMSKB
进行SIMD比较以获得结果掩码,然后使用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----------"