SSE比较打包无符号字节

时间:2013-04-25 00:51:01

标签: x86 comparison unsigned sse

我正在尝试使用SSE指令进行一些图像过滤。我正在使用的图像每个像素有一个字节(255灰度),我需要使用比比较更好的无符号打包字节。我查看了英特尔的手册并且比较存在,但仅用于签名字节(PCMPGTB)。我怎么能对无符号字节进行这种比较? 提前致谢

4 个答案:

答案 0 :(得分:10)

确实无法直接进行无符号比较。

但是你可以为每个值添加-128(或减去128,或XOR 0x80,或类似)。将0变为-128,将255变为127,将其他值变为值之间的值;结果是你从比较中得到了正确的结果。

将它扩展为单词也应该有效,但听起来有点慢,因为你按照指令完成了一半的工作。

(我觉得迟到的反应比从来没有好。)

答案 1 :(得分:4)

无符号比较(a> = b)与maxu(a,b)== a相同, 所以你可以使用

_mm_cmpeq_epi8( a, _mm_max_epu8(a,b))   -->   a >= b  "cmpge_epu8(a,b)"

如果您需要进行<>比较,则需要反转结果,此时Alcaro的方法可能同样好(尽管该方法需要一个寄存器才能进行反转常数)。但对于>=<=比较,这肯定更好(因为即使将无符号转换为有符号范围,也无法使用_mm_cmple_epi8或_mm_cmpge_epi8)。

答案 2 :(得分:1)

在打包的无符号字节中进行比较是不可能的,我已经将字节解压缩成字(因为它们可能就像从无符号到有符号的转换和从字节到字的扩展)并使用它们进行比较PCMPGTB。

答案 3 :(得分:1)

为@ greggo的解决方案提出一个小而重要的增强功能:

maxu( a, b ) == a

有一个缺点,因为你必须在maxu比较之前备份“a”,导致补充操作,如下所示:

movq mmc, mma
pmaxu mma, mmb
pcmpeq mma, mmc

minu( a, b ) == b

给出了完全相同的效果,但保留了运算符以进行相等性检查:

pminu mma, mmb
pcmpeq mma, mmb

增益很重要:只有2次操作而不是3次。