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

Mai*_*nto 1 assembly sse ffmpeg x86-64

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

我想知道packuswb指令的工作原理吗?Google说:

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

    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];
Run Code Online (Sandbox Code Playgroud)

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

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

Ron*_*tje 6

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