kid*_*abr 1 c c++ x86 sse simd
当我使用_mm_packus_epi16时,小于零的值将变为零,但高于127的数字将变为负值.
根据这个链接,它应该是无符号饱和度 http://msdn.microsoft.com/en-us/library/07ad1wx4%28v=vs.90%29.aspx
但没有发生
有什么建议?
码:
__m128i result, resultHi, resultLo;
//processing.....
result = _mm_packus_epi16(resultLo, resultHi);
Run Code Online (Sandbox Code Playgroud)
我怀疑你只是误解了输出数据,例如将其显示为带符号的8位而不是无符号.无论如何,这是一个演示程序,可能有助于澄清事情:
#include <xmmintrin.h>
#include <stdio.h>
int main(void)
{
__m128i resultLo = _mm_setr_epi16(800, 700, 600, 500, 400, 300, 200, 100);
__m128i resultHi = _mm_setr_epi16(0, -100, -200, -300, -400, -500, -600, -700);
__m128i result = _mm_packus_epi16(resultLo, resultHi);
printf("resultLo = %vhd\n", resultLo);
printf("resultHi = %vhd\n", resultHi);
printf("result = %vu\n", result);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译并运行:
$ gcc -Wall -msse3 packus.c && ./a.out
resultLo = 800 700 600 500 400 300 200 100
resultHi = 0 -100 -200 -300 -400 -500 -600 -700
result = 255 255 255 255 255 255 200 100 0 0 0 0 0 0 0 0
$
Run Code Online (Sandbox Code Playgroud)