packuswb指令如何工作? (在低位操作中)

时间:2019-04-16 18:01:10

标签: assembly ffmpeg x86-64 sse

研究ffmpeg从yuv到rgb的转换时,我遇到了在程序集中实现的等式,位于ffmpeg / libswscale / x86的yuv2rgb_template.c。

我想知道packuswb指令是如何工作的? Google说:

使用无符号饱和度将4个带mm的带符号字整数和4个带mm / m64的带符号字整数转换为8个带mm的无符号字节整数。

    DEST[7:0] ← SaturateSignedWordToUnsignedByte DEST[15:0];
    DEST[15:8] ← SaturateSignedWordToUnsignedByte DEST[31:16];
    DEST[23:16] ← SaturateSignedWordToUnsignedByte DEST[47:32];
    DEST[31:24] ← SaturateSignedWordToUnsignedByte DEST[63:48];
    DEST[39:32] ← SaturateSignedWordToUnsignedByte SRC[15:0];
    DEST[47:40] ← SaturateSignedWordToUnsignedByte SRC[31:16];
    DEST[55:48] ← SaturateSignedWordToUnsignedByte SRC[47:32];
    DEST[63:56] ← SaturateSignedWordToUnsignedByte SRC[63:48];

由于我不了解Assembly x86,因此甚至很难对其进行仿真或调试当前代码。

我想知道它们如何适合8位中的16位?

1 个答案:

答案 0 :(得分:6)

SaturateSignedWordToUnsignedByte表示裁剪到8位范围。因此> = 0x100变为0xFF,<=-1变为0,其余(0-0xFF)保持不变。