在0范围内,我有一个8个无符号8位数的向量.12在xmm0。我想对向量中的每个元素e执行以下转换:
if (e != 12)
e = 11 - e;也就是说,数字0,1,.,11改为11,10,.,0,而12不变。其他的价值观不会发生,我不在乎它们会发生什么。
如何使用SSE4指令集有效地实现此操作?
发布于 2016-07-31 13:26:36
对于SSE2 (您没有问,但是.),我建议使用比较中的掩码来进行有趣的否定:
e = (e ^ mask) + (12 & mask)对于一个真正的面具来说,它变成了~e + 12 = -e + -1 + 12 = 11 - e,而对于一个假面具,它显然是身份。
或者是病媒的东西,(没有测试)
movdqa xmm1, [vec12]
pcmpgtb xmm1, xmm0
pxor xmm0, xmm1
pand xmm1, [vec12]
paddb xmm0, xmm1对于SSSE3和up,您可以使用我们的老朋友pshufb,因为对于这个范围的值,它可以是16项表查找:(未测试)
movdqa xmm1, [table]
pshufb xmm1, xmm0表的外观(未测试)
.db 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 12, "yolo"https://stackoverflow.com/questions/38684230
复制相似问题