SSE指令集系列之一----数据加载与浮点运算指令
SSE有8个128位独立寄存器(XMM1~XMM7),指令描述约定:
MM指64位MMX寄存器
XMM指128XMM寄存器
m32 指32位内存变量
m128指128位内存变量
1. 数据传送指令
movapsXMM,XMM/m128 movaps XMM/m128,XMM
把源存储器内容值送入目的寄存器,当有m128时, 内存地址必须是16字节对齐的。
movups XMM,XMM/m128 movaps XMM/m128,XMM
与 movaps 执行的结果相同,但内存地址可以不是16字节对齐的,速度没有 movaps 的快!
movlps XMM, m64
把源存储器64位内容送入目的寄存器低64位,高64位不变,内存地址不必16字节对齐.
movhps XMM, m64
把源存储器64位内容送入目的寄存器高64位,低64位不变,内存地址不必16字节对齐.
movhlps XMM,XMM
把源寄存器高64位送入目的寄存器低64位,高64位不变.
movlhps XMM,XMM
把源寄存器低64位送入目的寄存器高64位,低64位不变.
movss XMM, XMM/m32
把源寄存器低32位送入目的寄存器低32位,如果源为32为内存变量,则目的寄存器其它位清零,否则保持不变.
movntps m128, xmm
把源存储器128位值直接送入内存,不经过cache
movntq m64, mm
把源存储器64位值直接送入内存,不经过cache
2. 单精度浮点算数运算指令
SSE 的点算数运算指令,大致上可以分成兩种:packed 和 scalar。Packed 指令是一次对 XMM 寄存器中的四个浮点数均进行相同的运算,而 scalar 则只对 XMM寄存器中的最低 32位浮点数进行运算,高96位保持不变,如下图:
addps XMM,XMM/m128
addss XMM,XMM/m32
subps XMM,XMM/m128
subss XMM,XMM/m32
mulps XMM,XMM/m128
mulss XMM,XMM/m32
divps XMM,XMM/m128
divss XMM,XMM/m32
maxps XMM,XMM/m128
maxss XMM,XMM/m32
minps XMM,XMM/m128
minss XMM,XMM/m32
rcpps XMM,XMM/m128
rcpss XMM,XMM/m32
rsqrtps XMM,XMM/m128
rsqrtss XMM,XMM/m32
要点: 以PS后缀结尾的指令,如果源操作数为存储器,要求内存地址必须是16字节对齐的。而以SS后缀结尾的指令,没有这个限制。
3. 位运算指令
andps XMM,XMM/m128
源存储器128个二进制位'与'目的寄存器128个二进制位,结果送入目的寄存器,内存变量地址必须16字节对齐.
orps XMM,XMM/m128
源存储器128个二进制位'或'目的寄存器128个二进制位,结果送入目的寄存器,内存变量地址必须16字节对齐.
xorps XMM,XMM/m128
源存储器128个二进制位'异或'目的寄存器128个二进制位,结果送入目的寄存器,内存变量地址必须16字节对齐