SSE2指令集系列之一
SSE2与SSE1使用相同寄存器,指令描述约定:
MM指64位MMX寄存器
XMM指128XMM寄存器
m32 指32位内存变量
m128指128位内存变量
SSE2主要是双精度浮点运算指令
1. 数据搬移指令
movapd XMM,XMM/m128
movapd XMM/m128,XMM
把源存储器内容值送入目的寄存器,当有m128时,内存变量地址必须16字节对齐.
movupd XMM,XMM/m128
movupd XMM/m128,XMM
把源存储器内容值送入目的寄存器,内存变量地址不必对齐16字节.
两条指令同SSE1的浮点搬移指令movaps 和 movups 指令类似
movlpd XMM,m64
movlpd m64,XMM
把源存储器64位内容送入目的寄存器低64位,高64位不变,内存变量地址不必对齐16字节.
movhpd XMM,m64
movhpd m64,XMM
把源存储器64位内容送入目的寄存器高64位,低64位不变,内存变量地址不必对齐16字节.
2. 浮点常用算数运算指令
addpd XMM,XMM/m128
addsd XMM,XMM/m128
subpd XMM,XMM/m128
subsd XMM,XMM/m128
mulpd XMM,XMM/m128
mulsd XMM,XMM/m128
divpd XMM,XMM/m128
divsd XMM,XMM/m128
sqrtpd XMM,XMM/m128
sqrtsd XMM,XMM/m128
maxpd XMM,XMM/m128
maxsd XMM,XMM/m128
minpd XMM,XMM/m128
minsd XMM,XMM/m128
小结:
1. 以pd结尾的指令对两个双精度浮点数执行相同的运算
2. 以sd结尾的指令只对低64位双精度执行运算,高64位保持不变。
3. 当有m128存储器是要求内存地址必须为16字节对齐。
3. 位运算指令
andpd XMM,XMM/m128
源存储器128个二进制位'与'目的寄存器128个二进制位,结果送入目的寄存器,内存变量地址必须对齐16字节边界.
andnpd XMM,XMM/m128
目的寄存器128个二进制位先取'非',再'与'源存储器128个二进制位,结果送入目的寄存器,内存变量地址必须对齐16字节边界
orpd XMM,XMM/m128
源存储器128个二进制位'或'目的寄存器128个二进制位,结果送入目的寄存器,内存变量地址必须对齐16字节边界
xorpd XMM,XMM/m128
源存储器128个二进制位'异或'目的寄存器128个二进制位,结果送入目的寄存器,内存变量地址必须对齐16字节边界
4. 数据类型转换指令
4.1 32位浮点与64位浮点之间的转换
cvtps2pd XMM,XMM/m64
把源存储器低64位两个单精度浮点数变成两个双精度浮点数,结果送入目的寄存器.
cvtss2sd XMM,XMM/m32
把源存储器低32位1个单精度浮点数变成1个双精度浮点数,结果送入目的寄存器的低64位,高64位不变.
cvtpd2ps XMM,XMM/m128
把源存储器两个双精度浮点数变成两个单精度浮点数,结果送入目的寄存器的低64位,高64位清零,
cvtsd2ss XMM,XMM/m64
把源存储器低64位1个双精度浮点数变成1个单精度浮点数,结果送入目的寄存器的低32位,高96位不变.
4.2 浮点数与32位整数之间的转换
4.2.1 双精度与整数之间转换
cvtpd2pi MM,XMM/m128
把源存储器两个双精度浮点数变成两个双字有符号整数,结果送入目的寄存器,内存变量必须对齐内存16字节.
如果结果大于所能表示的范围,那么转化为80000000h(正数也转为此值).
当XMM1 = 0x 0dd1a5e1f35aec736 41132a4000000000,执行cvtpd2pi MM0,XMM1
则 MM0 = 0x 80000000 0004ca90
因为0dd1a5e1f35aec736h(双精度浮点数) = -3.14E140 超过 80000000h所以变为80000000h
而41132a4000000000h(双精度浮点数) = 3.14E5,所以转为314000 = 0004ca90h(有符号整数)
cvtpi2pd XMM,MM/m64
把源存储器两个双字有符号整数变成两个双精度浮点数,结果送入目的寄存器.
cvtpd2dq XMM,XMM/m128
把源存储器两个双精度浮点数变成两个双字有符号整数
结果送入目的寄存器的低64位,高64位清零,内存变量必须对齐内存16字节.
此运算与cvtpd2pi类似但目的寄存器变为XMM.
cvtdq2pd XMM,XMM/m128
把源存储器低64位两个双字有符号整数变成两个双精度浮点数,结果送入目的寄存器,内存变量必须对齐内存16字节.
cvtsd2si r32,XMM/m64
把源存储器低64位1个双精度浮点数变成1个双字有符号整数,结果送入目的寄存器.
此指令目的寄存器是32位通用寄存器
cvtsi2sd XMM,r32/m32
把源存储器1个双字有符号整数变成1个双精度浮点数,结果送入目的寄存器的低64位,高64位不变.
4.2.2 单精度浮点与整数之间转换
cvtps2dq XMM,XMM/m128
把源存储器4个单精度浮点数变成4个双字有符号整数,结果送入目的寄存器,内存变量必须对齐内存16字节.
cvtdq2ps XMM,XMM/m128
把源存储器4个双字有符号整数变成4个单精度浮点数,结果送入目的寄存器,内存变量必须对齐内存16字节.
小结:1. SSE1浮点指令一般以后缀ps,ss结尾。
2. SSE2浮点指令一般以后缀pd,sd结尾。