4.2.4 SSE 的指令说明
ADDPS
说明 ADDPS
xmm1,
功能 两组单精度数相加
xmm2/m128
算法
DEST[31-0]
= DEST[31-0]
+ SRC/m128[31-0]
DEST[63-32] = DEST[63-32] + SRC/m128[63-32];
DEST[95-64] = DEST[95-64] + SRC/m128[95-64];
DEST[127-96] = DEST[127-96] + SRC/m128[127-96];
ADDSS
说明 ADDSS
xmm1,
功能 低位单精度数相加
xmm2/m32
算法
DEST[31-0]
= DEST[31-0] + SRC/m32[31-0];
DEST[63-32] = DEST[63-32];
DEST[95-64] = DEST[95-64];
DEST[127-96] = DEST[127-96];
ANDNPS
xmm1,
说明 ANDNPS
功能 xmm1“取反”再和 xmm2/m128 求“与”运算
算法
DEST[127-0] = NOT
(DEST[127-0])
xmm2/m128
AND SRC/m128[127-0];
ANDPS
说明 ANDPS
xmm2/m128
功能 进行两个寄存器的逻辑“与”操作
xmm1,
算法
DEST[127-0]
AND = SRC/m128[127-0];
CMPPS
说明 CMPPS
功能 比较两个寄存器的数值,根据 imm8 的不同数值采用不同的比较方法
xmm2/m128,
xmm1,
imm8
imm8 == 0, ==;
imm8 == 1, <;
imm8 == 2, <=;
imm8 == 3,
?;
!=;
imm8 == 5,
!<;
imm8 == 6,
!<=;
imm8 == 7,
!?;
imm8 == 4,
算法
IF
(imm8 = 0)
THEN OP = "EQ";
ELSEIF
(imm8 = 1)
THEN OP = "LT";
ELSEIF
(imm8 = 2)
THEN OP = "LE";
ELSEIF
(imm8 = 3)
THEN OP = "UNORD";
ELSEIF
(imm8 = 4)
THEN OP = "NE";
ELSEIF
(imm8 = 5)
THEN OP = "NLT";
ELSEIF
(imm8 = 6)
THEN OP = "NLE";
ELSEIF
(imm8 = 7)
THEN OP = "ORD";
FI
CMP0 = DEST[31-0]
CMP1 = DEST[63-32] OP
CMP2 = DEST
CMP3 = DEST[127-96] OP
[95-64] OP
OP
SRC/m128[31-0];
SRC/m128[63-32];
SRC/m128[95-64];
SRC/m128[127-96];
IF
(CMP0 = TRUE)
DEST[31-0] = 0XFFFFFFFF;
THEN
ELSE
DEST[31-0] = 0X00000000;
FI
IF
(CMP1 = TRUE)
DEST[63-32] = 0XFFFFFFFF;
THEN
ELSE
DEST[63-32] = 0X00000000;
FI
IF
(CMP2 = TRUE)
DEST[95-64] = 0XFFFFFFFF;
THEN
ELSE
DEST[95-64] = 0X00000000;
FI
IF
(CMP3 = TRUE)
THEN DEST[127-96] = 0XFFFFFFFF;
ELSE
DEST[127-96] = 0X00000000;
FI
其它 你可以使用下面的可读性良好的指令。
指令
CMPEQPS
CMPLTPS
CMPLEPS
CMPUNORDPS
CMPNEQPS
CMPNLTPS
CMPNLEPS
CMPORDPS
xmm1,xmm2,
xmm1,xmm2,
xmm1,xmm2,
0
1
2
xmm1,xmm2,
xmm1,xmm2,
xmm1,xmm2,
xmm1,xmm2,
xmm1,xmm2,
3
4
5
6
7
实现
xmm2;
xmm2;
xmm2;
CMPPS
CMPPS
CMPPS
xmm1,
xmm1,
xmm1,
xmm1,
xmm1,
xmm1,
xmm1,
xmm1,
xmm2;
xmm2;
xmm2;
xmm2;
xmm2;
CMPPS
CMPPS
CMPPS
CMPPS
CMPPS
CMPSS
xmm1,
xmm2/m32,
说明 CMPSS
功能 低位单精度数做比较
算法 算法同 CMPPS 相似,只不过只是针对 DEST[31-0]进行操作。
其它 同样也可以利用可读性更好的指令
imm8
实现
xmm2
xmm2
xmm2
CMPSS
CMPSS
CMPSS
xmm1,
xmm1,
xmm1,
指令
CMPEQSS
CMPLTSS
CMPLESS
CMPUNORDSS
CMPNEQSS
CMPNLTSS
CMPNLESS
CMPORDSS
xmm1,xmm2,
xmm1,xmm2,
xmm1,xmm2,
0
1
2
xmm1,xmm2,
xmm1,xmm2,
xmm1,xmm2,
xmm1,xmm2,
xmm1,xmm2,
3
4
5
6
7
xmm1,
xmm1,
xmm1,
xmm1,
xmm1,
xmm2
xmm2
xmm2
xmm2
xmm2
CMPSS
CMPSS
CMPSS
CMPSS
CMPSS
COMISS
说明 COMISS
功能 比较低位数并且设置标识位
xmm1,
xmm2/m32
算法
OF = 0;
SF = 0;
AF = 0;
IF
((DEST[31-0]
ZF = 1;
PF = 1;
CF = 1;
UNORD SRC/m32[31-0]) = TRUE)
THEN
ELSEIF
((DEST[31-0] GTRTHAN SRC/m32[31-0]) = TRUE)THEN
ZF = 0;
PF = 0;
CF = 0;
ELSEIF
((DEST[31-0]
LESSTHAN SRC/m32[31-0]) = TRUE
THEN
ZF = 0;
PF = 0;
CF = 1;
ELSE
ZF = 1;
PF = 0;
CF = 0;
FI
CVTPI2PS
xmm, mm/m64
说明 CVTPI2PS
功能 32 位整数转变为浮点数
算法
DEST[31-0]
= (float)
(SRC/m64[31-0]);
DEST[63-32] = (float)
DEST[95-64] = DEST[95-64];
DEST[127-96] = DEST[127-96];
(SRC/m64[63-32]);
CVTPS2PI
说明 CVTPS2PI mm,
xmm/m64
功能 低位的两个浮点数转变为整数
算法
DEST[31-0] = (int)
(SRC/m64[31-0]);
DEST[63-32] = (int)
(SRC/m64[63-32]);
CVTSI2SS
说明 CVTSI2SS
功能 32 位整数转变为浮点数,存入低位
算法
r/m32
xmm,
DEST[31-0]
= (float)
(R/m32);
DEST[63-32] = DEST[63-32];
DEST[95-64] = DEST[95-64];
DEST[127-96] = DEST[127-96];
CVTSS2SI
r32,
xmm/m32
说明 CVTSS2SI
功能 低位的浮点数转变为 32 位整数
算法
r32 = (int)
(SRC/m32[31-0]);
CVTTPS2PI
说明 CVTTPS2PI mm,
功能 低位的两个浮点数转变为整数,并且舍位
xmm/m64
算法
DEST[31-0] = (int)
(SRC/m64[31-0]);
DEST[63-32] = (int)
(SRC/m64[63-32]);
CVTTSS2SI
r32,
说明 CVTTSS2SI
功能 将最低位浮点数转换为整数,并舍位。
(SRC/m32[31-0]);
r32 = (INT)
xmm/ m32
算法
DIVPS
说明 DIVPS
功能 单精度数除法运算
xmm1,
xmm2/m128
算法
DEST[31-0]
= DEST[31-0]
/
(SRC/m128[31-0]);
/
DEST[63-32] = DEST[63-32]
DEST[95-64] = DEST[95-64]
/
DEST[127-96] = DEST[127-96]
(SRC/m128[63-32]);
(SRC/m128[95-64]);
/
(SRC/m128[127-96]);
DIVSS
说明 DIVSS
xmm1,
xmm2/m32
功能 低位单精度数除法
算法
DEST[31-0]
= DEST[31-0]
/
(SRC/m32[31-0]);
DEST[63-32] = DEST[63-32];
DEST[95-64] = DEST[95-64];
DEST[127-96] = DEST[127-96];
EMMS
说明 EMMS
功能 将浮点标识字置空
算法
FPUTagWord <-
FFFF
FXRSTOR
说明 FXRSTOR m512byte
功能 从 m512byte 中装入 FP,MMX,以及 SSE 的状态
算法
and MMX
Streaming
state
FP
and
SIMD Extension
state = m512byte;
Streaming
SIMD Extension
state;
FXSAVE
说明 FXSAVE m512byte
功能 向 m512byte 中存入 FP,MMX,以及 SSE 的状态
算法
m512byte = FP
and MMX
state
and
LDMXCSR
说明 LDMXCSR m32
功能 装入 SSE 的状态控制字
MXCSR = m32;
算法
MAXPS
说明 MAXPS
功能 返回最大值
xmm1,
xmm2/m128
算法
IF
(DEST[31-0]=NaN)
THEN
ELSEIF
DEST[31-0] = SRC[31-0];
(SRC[31-0] = NaN)
DEST[31-0] = SRC[31-0];
THEN
ELSEIF
(DEST[31-0] > SRC/m128[31-0])
THEN
DEST[31-0] = DEST[31-0];
ELSE
DEST[31-0] = SRC/m128[31-0];
FI
IF
(DEST[63-32]=NaN)
DEST[63-32] = SRC[63-32];
THEN
ELSEIF
(SRC[63-32] = NaN)
THEN
DEST[63-32] = SRC[63-32];
ELSEIF
(DEST[63-32] > SRC/m128[63-32])
THEN
DEST[63-32] = DEST[63-32];
ELSE
DEST[63-32] = SRC/m128[63-32];
FI
IF
(DEST[95-64]=NaN)
DEST[95-64] = SRC[95-64];
THEN
ELSEIF
(SRC[95-64] = NaN)
THEN
DEST[95-64] = SRC[95-64];
ELSEIF
(DEST[95-64] > SRC/m128[95-64])
THEN
DEST[95-64] = DEST[95-64];
ELSE DEST[95-64] = SRC/m128[95-64];
FI
IF
(DEST[127-96]=NaN)
DEST[127-96] = SRC[127-96];
THEN
ELSEIF
(SRC[127-96] = NaN)
THEN
DEST[127-96] = SRC[127-96];
ELSEIF
(DEST[127-96] > SRC/m128[127-96])
THEN
DEST[127-96] = DEST[127-96];
ELSE DEST[127-96] = SRC/m128[127-96];
FI
MAXSS
说明 MAXSS
xmm1,
功能 返回低位最大值
算法 同上面类似,区别在于只对 DEST[31-0]进行操作
xmm2/m32
MINPS
说明 MINPS
功能 返回最小值
xmm1,
xmm2/m128
算法 略
MINSS
说明 MINSS
xmm1,
功能 返回低位最小值
xmm2/m32
算法 略
MOVAPS
说明 MOVAPS
功能 对齐的数据传输指令
xmm1,
xmm2/m128 或 MOVAPS
xmm2/m128,
xmm1
算法
IF
IF
(destination = DEST)
(SRC = m128)THEN (*
DEST[127-0] = m128;
ELSE(* move
instruction
*)
THEN
load
DEST[127=0] = SRC[127-0];
FI;
instruction
*)
ELSE
IF
(destination = m128)
m128 = SRC[127-0];
instruction
ELSE(* move
THEN (*
store
instruction
*)
*)
DEST[127-0] = SRC[127-0];
FI;
FI;
MOVHLPS
说明 MOVHLPS
功能 高位的两个数传向低位
xmm1,
xmm2
算法
DEST[127-64] = DEST[127-64];
DEST[63-0]
= SRC[127-64];
MOVHPS
说明 MOVHPS
功能 高位数据传输指令
xmm, m64 或 MOVHPS m64,
xmm
算法
IF
(destination = DEST)
THEN(*
load
instruction
*)
DEST[127-64] = m64;
DEST[31-0] = DEST[31-0];
DEST[63-32] = DEST[63-32];
ELSE
m64 = SRC[127-64];
instruction
store
(*
*)
FI;
MOVLPS
说明 MOVLPS
功能 低位数据传输指令
xmm, m64 或 MOVLPS m64,
xmm
算法
IF
(destination = DEST)
THEN(*
load
instruction
*)
DEST[63-0] = m64;
DEST[95-64] = DEST[95-64];
DEST[127-96] = DEST[127-96];
ELSE(*
store
instruction
m64 = DEST[63-0];
*)
FI
MOVLHPS
说明 MOVLHPS
功能 低位的两个数传向高位
xmm1,
xmm2
算法
DEST[127-64] = SRC[63-0];
DEST[63-0]
= DEST[63-0];
MOVMSKPS
说明 MOVMSKPS
r32,
xmm
功能 掩码移入 32 位寄存器
算法
r32[0]
= SRC[31];
= SRC[63];
r32[1]
= SRC[95];
r32[2]
= SRC[127];
r32[3]
r32[7-4]
= 0X0;
r32[15-8] = 0X00;
r32[31-16] = 0X0000;
MOVNTPS
说明 MOVNTPS m128,
功能 将数据直接存入内存,减小对缓存的压力
xmm
算法
Dm128 = SRC;
MOVSS
说明 MOVSS
功能 最低位数据的传输指令
xmm1,
xmm2/m32 或 MOVSS
xmm2/m32,
xmm1
THEN
load
instruction
*)
算法
IF
IF
(destination = DEST)
THEN(*
(SRC == m32)
DEST[31-0] = m32;
DEST
DEST
DEST
[63-32] = 0X00000000;
[95-64] = 0X00000000;
[127-96] = 0X00000000;
ELSE(* move
instruction
*)
DEST
DEST
DEST
DEST
[31-0] = SRC[31-0];
[63-32] = DEST
[95-64] = DEST
[127-96] = DEST
[63-32];
[95-64];
[127-96];
FI
ELSE
IF
(destination = m32)
m32 = SRC[31-0];
THEN(*
store
instruction
*)
ELSE
(* move
instruction
*)
[31-0] = SRC[31-0];
[63-32] = DEST[63-32];
[95-64] = DEST
[127-96] = DEST
[95-64];
[127-96];
DEST
DEST
DEST
DEST
FI
FI
MOVUPS
说明 MOVUPS
功能 非对齐数据的传输指令
xmm1,
xmm2/m128 或 MOVUPS
xmm2/m128,
xmm1
算法
IF
(destination = xmm)
THEN