16位寄存器的SSE无符号/有符号减法

Posted

技术标签:

【中文标题】16位寄存器的SSE无符号/有符号减法【英文标题】:SSE unsigned/signed subtraction of 16 bit register 【发布时间】:2012-10-31 12:17:17 【问题描述】:

我有一个具有 16 位值的 __m128i 寄存器(向量 A),其内容:

100,26,26,26,26,26,26,100 // A Vector

现在我减去向量

82,82,82,82,82,82,82,82

有说明

_mm_sub_epi16(a_vec,_mm_set1_epi16(82)) 

预期的结果应该是下面的向量

18,-56,-56,-56,-56,-56,-56,18

但我明白了

18,65480,65480,65480,65480,65480,65480,18

如何解决向量被视为已签名的问题?

A 向量是由这条指令创建的:

__m128i a_vec = _mm_srli_epi16(_mm_unpacklo_epi8(score_vec_8bit, score_vec_8bit), 8)

【问题讨论】:

【参考方案1】:

65480-56 的值相同(在寄存器级别它们都是0xffc8) - 您只是显示它,就好像它是一个无符号的短路。

请注意,对于没有进位/借位标志的二进制值的非饱和加法和减法,这些值是有符号还是无符号实际上是无关紧要的 - 因此可以使用相同的指令来添加有符号和无符号的短裤 - 唯一的区别是您随后解释(或显示)结果的方式。

【讨论】:

以上是关于16位寄存器的SSE无符号/有符号减法的主要内容,如果未能解决你的问题,请参考以下文章

带符号的 16 位 SSE 平均值

汇编——寄存器

CPSR和SPSR中各个位的含义

如何在 x86(32 位)程序集中将无符号整数转换为浮点数?

符号从 8 位扩展到 16 位寄存器以获得 0xff00

汇编优化系列关于符号扩展和无符号扩展(包括mips msa实现)