我正在将SIMD代码转换为等效的c代码.我被困在SSE指令之一
__m128i _mm_packus_epi16 (__m128i a, __m128i b)
Run Code Online (Sandbox Code Playgroud)
它返回
r0 := UnsignedSaturate(a0)
r1 := UnsignedSaturate(a1)
...
r7 := UnsignedSaturate(a7)
r8 := UnsignedSaturate(b0)
r9 := UnsignedSaturate(b1)
...
r15 := UnsignedSaturate(b7)
Run Code Online (Sandbox Code Playgroud)
什么UnsignedSaturate
意思?
Chr*_*ber 15
基本上,"饱和度"意味着超出某个"最大"值的值被设置为"最大",而低于"最小值"的值被设置为"最小".通常,"min"和"max"是适合某些数据类型的值.
因此,例如,如果对无符号字节进行算术运算,则"128 + 128"必须为"256"(十六进制0x100),这不适合一个字节.正常整数运算会产生溢出并丢弃不适合的部分,这意味着"128 + 128 - > 0".使用饱和算术,"256> 255",结果为255.
另一种选择是缩放,它基本上将值"压缩"到较小的范围.饱和只会削减它们.
您也可以使用它将较大的类型放入较小的类型中,例如将16位值放入8位值.你的例子最有可能就是这样,虽然你可能比我知道的更好,你在那里处理的是哪种类型.
"UnsignedSaturation"最有可能具有"0"的最小值和结果类型的最大值的"最大值".因此,负输入变为"0".