SSE2指令集系列之一—-浮点运算指令

  • Post author:
  • Post category:其他


SSE2与SSE1使用相同寄存器,指令描述约定:

MM指64位MMX寄存器

XMM指128XMM寄存器

m32 指32位内存变量

m128指128位内存变量

本小结主要描述双精度浮点运算指令


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字节.

转载于:https://my.oschina.net/abcijkxyz/blog/792317