packuswb 指令如何工作? (低电平位操作)

how the packuswb instruction works ? (in low level bit operation)

研究从 yuv 到 rgb 的 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];

由于我不懂汇编x86,所以模拟它或调试当前代码更加困难。

我想知道它们是如何将 16 位放入 8 位的?

SaturateSignedWordToUnsignedByte表示裁剪到8位范围。所以>=0x100变为0xFF,<=-1变为0,其余(0-0xFF)未修改。