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

时间:2014-03-09 14:01:32

标签: assembly x86-64 sse cpu-registers

如何只访问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。

1 个答案:

答案 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----------"