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)未修改。
研究从 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)未修改。