MMX指令集系列之三
6. 数据压缩指令
packuswb MM,MM/m64
把目的寄存器按字有符号数压缩为饱和字节无符号数放入目的寄存器低32位,
把源寄存器字有符号数压缩为饱和字节无符号数放入目的寄存器高32位。
简单的说,就是16位有符号压缩为饱和8位无符号数。
高32位 | 低32位
目的寄存器: a0 | a1 | a2 | a3
源寄存器: b0 | b1 | b2 | b3
目的寄存器压缩结果: b0|b1| b2|b3| a0|a1|a2|a3
例:
当MM0 == 0x 7fff 8000 1234 00ae,
MM1== 0x 00ad 0123 80ff 0100,
执行packuswb MM0,MM1,则MM0 = 0x ad ff 00 ff ff 00 ff ae.
packsswb MM,MM/m64
把目的寄存器按字有符号数压缩为字节有符号数放入目的寄存器低32位
把源寄存器按字有符号数压缩为字节有符号数放入目的寄存器高32位
压缩时小于-128负数变为80h,大于127的正数变为7fh.
简单的说,就是16位有符号压缩为饱和8位有符号数。
高32位 | 低32位
目的寄存器: a0 | a1 | a2 | a3
源寄存器: b0 | b1 | b2 | b3
目的寄存器压缩结果: b0|b1| b2|b3| a0|a1|a2|a3
例:
当MM0 == 0x 0fff ff06 0080 0012,
MM1 == 0x 0001 8000 ffff 7fff ,
执行packsswb MM0,MM1,则 MM0 = 0x 01 80 ff 7f 7f 80 7f 12
packssdw MM,MM/m64
把目的寄存器按双字有符号数压缩为单字有符号数放入目的寄存器低32位
把源寄存器按双字有符号数压缩为单字有符号数放入目的寄存器高32位
压缩时小于-32768负数变为8000h,大于32767的正数变为7fffh.
高32位 | 低32位
目的寄存器: a0 | a1
源寄存器 : b0 | b1
目的寄存器压缩结果: b0 | b1 | a0 | a1
7. 数据重排指令
punpcklbw MM,MM/m64
把目的寄存器与源寄存器的低32位按字节交错排列放入目的寄存器
高32位 | 低32位
目的寄存器: a0 | a1| a2 | a3 | a4 | a5 | a6 |a7
源寄存器: b0 | b1| b2 | b3 | b4 | b5 | b6 |b7
目的寄存器结果: b4|a4|b5|a5|b6|a6|b7|a7
例:
当MM0 == 0x 01 02 03 04 05 06 07 08,
MM1 == 0x 09 0a 0b 0c 0d 0e 0f 00
执行punpcklbw MM0,MM1,
则MM0 = 0x 0d 05 0e 06 0f 07 00 08
punpcklwd MM,MM/m64
把目的寄存器与源寄存器的低32位按字交错排列放入目的寄存器
高32位 | 低32位
目的寄存器: a0 | a1 | a2 | a3
源寄存器: b0 | b1 | b2 | b3
目的寄存器结果: b2 | a2 | b3 | a3
punpckldq MM,MM/m64
把目的寄存器与源寄存器的低32位按双字交错排列放入目的寄存器
高32位 | 低32位
目的寄存器: a0 | a1
源寄存器: b0 | b1
目的寄存器结果: b1 | a1
punpckhbw MM,MM/m64
把目的寄存器与源寄存器的高32位按字节交错排列放入目的寄存器
高32位 | 低32位
目的寄存器: a0 |a1|a2|a3|a4|a5|a6|a7
源寄存器: b0|b1|b2|b3|b4|b5|b6|b7
目的寄存器结果: b0|a0|b1|a1|b2|a2|b3|a3
例:
当 MM0 == 0x 01 02 03 04 05 06 07 08,
MM1 == 0x 09 0a 0b 0c 0d 0e 0f 00
执行punpcklbw MM0,MM1,
则MM0 = 0x 09 01 0a 02 0b 03 0c 04
punpckhwd MM,MM/m64
把目的寄存器与源寄存器的高32位按字交错排列放入目的寄存器
高32位 | 低32位
目的寄存器: a0 | a1 | a2 | a3
源寄存器: b0 | b1 | b2 | b3
目的寄存器结果: b0 | a0 | b1 | a1
punpckhdq MM,MM/m64
把目的寄存器与源寄存器的高32位按双字交错排列放入目的寄存器
高32位 | 低32位
目的寄存器: a0 | a1
源寄存器: b0 | b1
目的寄存器结果: b0 | a0
小结:
1. 数据压缩指令和NEON窄指令相类似,所生成的元素是源操作数位宽的一半。
2. 数据重排指令与NEON指令VZIP有类似之处,具体请参考NOEN相关指令集说明。
8. 位运算和比较指令
这些比较简单,从略!
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
· Linux系列:如何调试 malloc 的底层源码
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· 对象命名为何需要避免'-er'和'-or'后缀
· JDK 24 发布,新特性解读!
· .NET Core奇技淫巧之WinForm使用Python.NET并打包
· Java24你发任你发,我用Java8
· C# 中比较实用的关键字,基础高频面试题!