您的位置:首页 > 其它

SSE2指令集系列之二----整数运算相关指令

2013-04-23 12:22 260 查看
本小节描述的是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位。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: