logo资料库

关于SSE浮点指令的介绍.doc

第1页 / 共13页
第2页 / 共13页
第3页 / 共13页
第4页 / 共13页
第5页 / 共13页
第6页 / 共13页
第7页 / 共13页
第8页 / 共13页
资料共13页,剩余部分请下载后查看
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
分享到:
收藏