SIMD 指令使用技巧与优化策略
1. 字节比较与地址对齐
在进行字节比较时,有一段代码用于查找 16 字节块中是否存在匹配字节:
cmpLp: add rsi, 16
movdqa xmm0, xmm2 ; XMM2 contains bytes to test
pcmpeqb xmm0, [rsi]
pmovmskb eax, xmm0
test eax, eax
jz cmpLp
foundByte:
Do whatever needs to be done when the block of 16 bytes
contains at least one match between the bytes in XMM2
and the data at RSI
当地址已经按 16 字节对齐时,代码会测试所有 16 字节。若地址的低 4 位为 0001b ,实际数据从 16 字节块的偏移 1 处开始,需要忽略第一个字节进行比较。通过 shl 指令修改位掩码,可排除特定偏移处的字节,仅用 11 条指令就能完成原本(逐字节比较)多达 90 多条指令的工作。
对于非字节大小对象的地址对齐,可通过将指针按对象大小(字节)递增,直至得到 16 或 32 字节对齐的地址。但此方法仅适用于对象大小为 2、4 或 8 的情况。例如,对于以偶数地址开始的字对象数组,可逐字处理
超级会员免费看
订阅专栏 解锁全文
34

被折叠的 条评论
为什么被折叠?



