本小节描述的是SSE2整数运算指令。
5. 数据搬移指令
movdqa XMM,XMM/m128
movdqa XMM/m128,XMM
把源存储器内容值送入目的寄存器,当有m128时,内存地址必须16字节对齐.
movdqu XMM,XMM/m128
movdqu XMM/m128,XMM
把源存储器内容值送入目的寄存器,内存地址不必16字节对齐.
movq2dq XMM,MM
把源寄存器内容送入目的寄存器的低64位,高64位清零.
movdq2q MM,XMM
把源寄存器低64位内容送入目的寄存器.
6. 算数运算指令
要点:
1. SSE2的算数运算指令和MMX指令在指令助记符上完全相同。
2. SSE2的算数运算指令操作的是128位的XMM寄存器,而MMX指令操作的是64位的MM寄存器。
3. SSE2指令中如涉及存储器变量,需要变量地址按照16字节对齐。
7. 数据打包与数据重排指令
7.1 packuswb XMM,XMM/m128
此指令与前面的MMX指令packuswb MM,MM/m64操作相同,只是变成了128位。
把目的寄存器按字有符号数压缩为字节无符号数放入目的寄存器低64位
把源寄存器按字有符号数压缩为字节无符号数放入目的寄存器高64位
压缩时负数变为00h,大于255的正数变为0ffh,内存变量必须对齐内存16字节.
高64位 | 低64位
目的寄存器: a0 | a1 | a2 | a3 | a4 | a5 | a6 | a7
源寄存器: b0 | b1 | b2 | b3 | b4 | b5 | b6 | b7
目的寄存器压缩结果: b0|b1| b2| b3| b4|b5| b6|b7| a0|a1| a2|a3| a4|a5| a6| a7
7.2 packsswb XMM,XMM/m128
此指令与前面的MMX指令packsswb MM,MM/m64操作相同,只是变成了128位
把目的寄存器按字有符号数压缩为字节有符号数放入目的寄存器低64位
把源寄存器按字有符号数压缩为字节有符号数放入目的寄存器高64位
压缩时小于-128负数变为80h,大于127的正数变为7fh,内存变量必须对齐内存16字节.
高64位 | 低64位
目的寄存器: a0 | a1 | a2 | a3 | a4 | a5 | a6 | a7
源寄存器: b0 | b1 | b2 | b3 | b4 | b5 | b6 | b7
目的寄存器压缩结果: b0|b1| b2| b3| b4|b5| b6|b7| a0|a1| a2|a3| a4|a5| a6| a7
7.3 packssdw XMM,XMM/m128
此指令与前面的MMX指令packsswb MM,MM/m64操作相同,只是变成了128位
把目的寄存器按双字有符号数压缩为字有符号数放入目的寄存器低64位
把源寄存器按双字有符号数压缩为字有符号数放入目的寄存器高64位
压缩时小于-32768负数变为8000h,大于32767的正数变为7fffh,内存变量必须对齐内存16字节.
高64位 | 低64位
目的寄存器: a0 | a1 | a2 | a3
源寄存器: b0 | b1 | b2 | b3
目的寄存器压缩结果: b0 | b1 | b2 | b3 | a0 | a1 | a2 | a3
7.4 punpckldq XMM,XMM/m128
此指令与前面的MMX指令punpckldq MM,MM/m64操作相同,只是变成了128位
把源存储器与目的寄存器低64位按双字交错排列,内存变量必须对齐内存16字节.
高64位 | 低64位
目的寄存器: a0 | a1 | a2 | a3
源寄存器: b0 | b1 | b2 | b3
目的寄存器排列结果: b2 | a2 | b3 | a3
7.5 punpckhdq XMM,XMM/m128
此指令与前面的MMX指令punpckhdq MM,MM/m64操作相同,只是变成了128位
把源存储器与目的寄存器高64位按双字交错排列,内存变量必须对齐内存16字节.
高64位 | 低64位
目的寄存器: a0 | a1 | a2 | a3
源寄存器: b0 | b1 | b2 | b3
目的寄存器排列结果: b0 | a0 | b1 | a1
7.6 punpcklwd XMM,XMM/m128
此指令与前面的MMX指令punpcklwd MM,MM/m64操作相同,只是变成了128位
把源存储器与目的寄存器低64位按字交错排列,内存变量必须对齐内存16字节.
高64位 | 低64位
目的寄存器: a0 | a1 | a2 | a3 | a4 | a5 | a6 | a7
源寄存器: b0 | b1 | b2 | b3 | b4 | b5 | b6 | b7
目的寄存器排列结果: b4 | a4 | b5 | a5 | b6 | a6 | b7 | a7
7.7 punpckhwd XMM,XMM/m128
此指令与前面的MMX指令punpckhwd MM,MM/m64操作相同,只是变成了128位
把源存储器与目的寄存器高64位按字交错排列,内存变量必须对齐内存16字节.
高64位 | 低64位
目的寄存器: a0 | a1 | a2 | a3 | a4 | a5 | a6 | a7
源寄存器: b0 | b1 | b2 | b3 | b4 | b5 | b6 | b7
目的寄存器排列结果: b0 | a0 | b1 | a1 | b2 | a2 | b3 | a3
7.8 punpcklbw XMM,XMM/m128
此指令与前面的MMX指令punpcklbw MM,MM/m64操作相同,只是变成了128位
把源存储器与目的寄存器低64位按字节交错排列,内存变量必须对齐内存16字节.
高64位 | 低64位
目的寄存器: a0|a1| a2| a3| a4|a5| a6|a7| a8|a9| aA|aB| aC|aD| aE| aF
源寄存器: b0|b1| b2| b3| b4|b5| b6|b7| b8|b9| bA|bB| bC|bD| bE| bF
目的寄存器排列结果: b8|a8| b9| a9| bA|aA| bB|aB| bC|aC| bD|aD| bE|aE| bF| aF
7.9 punpckhbw XMM,XMM/m128
此指令与前面的MMX指令punpckhbw MM,MM/m64操作相同,只是变成了128位
把源存储器与目的寄存器高64位按字节交错排列,内存变量必须对齐内存16字节.
高64位 | 低64位
目的寄存器: a0|a1| a2| a3| a4|a5| a6|a7| a8|a9| aA|aB| aC|aD| aE| aF
源寄存器: b0|b1| b2| b3| b4|b5| b6|b7| b8|b9| bA|bB| bC|bD| bE| bF
目的寄存器排列结果: b0|a0| b1| a1| b2|a2| b3|a3| b4|a4| b5|a5| b6|a6| b7| a7
要点:
1. SSE2的数据打包、重排指令和MMX数据打包、重排指令在指令助记符上完全相同。
2. SSE2的算数运算指令操作的是128位的XMM寄存器,而MMX指令操作的是64位的MM寄存器。
3. SSE2指令中如涉及存储器变量,需要变量地址按照16字节对齐。
4. SSE2指令一般如果操作低64位,而MMX指令就会操作低32位。