_mm_packus_epi16饱和度问题

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)

Pau*_*l R 5

我怀疑你只是误解了输出数据,例如将其显示为带符号的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)