SSE Logical Instructions
SSE的逻辑指令执行与,或,非,以及与非操作。操作数是组合的单精度浮点数。
指令 | 描述 |
ANDPS | 格式:xmm1, xmm2/m128 对操作数执行按位“与”操作
指令操作: DEST[31:0] <-- DEST[31:0] BITWISE AND SRC[31:0] DEST[63:32] <-- DEST[63:32] BITWISE AND SRC[63:32] DEST[95:64] <-- DEST[95:64] BITWISE AND SRC[95:64] DEST[127:96] <-- DEST[127:96] BITWISE AND SRC[127:96] |
ANDNPS | 格式:xmm1, xmm2/m128 对操作数执行按位“与非”操作 |
ORPS | 格式:xmm1, xmm2/m128 对操作数执行按位“或”操作 |
XORPS | 格式:xmm1, xmm2/m128 对操作数执行按位“异或”操作 |
SSE Comparison Instruction
SSE的比较指令比较组合的/标量的单精度浮点数,比较结果保存在目标寄存器中或者EFLAGS标志寄存器中。
指令 | 描述 |
CMPPS | 格式:CMPPS xmm1, xmm2/m128, imm8 比较组合的单精度浮点数,imm8指定比较类型,结果保存在xmm1中。
指令操作:(OP3的值参考下表) CMP0 <-- SRC1[31:0] OP3 SRC2[31:0]; |
CMPSS | 格式:CMPSS xmm1, xmm2/m32, imm8 比较标量的单精度浮点数,imm8指定比较类型,结果保存在xmm1中。 |
在CMPPS指令,imm8指定的比较类型列表如下(也同样适用于CMPSS指令):
值 | 类型 | 伪指令 | 备注 |
0 | 相等EQ | CMPEQPS xmm1, xmm2 | xmm1中的数据元素 == xmm2中的数据元素,则为真 |
1 | 小于LT | CMPLTPS xmm1, xmm2 | xmm1中的数据元素< xmm2中的数据元素,则为真 |
2 | 小于等于LE | CMPLEPS xmm1, xmm2 | xmm1中的数据元素<= xmm2中的数据元素,则为真 |
3 | 无序UNORD | CMPUNORDPS xmm1, xmm2 | 两个操作数中至少有一个是NaN,则为真 |
4 | 不相等NEQ | CMPNEQPS xmm1, xmm2 | xmm1中的数据元素!= xmm2中的数据元素,则为真 |
5 | 不小于NLT | CMPNLTPS xmm1, xmm2 | xmm1中的数据元素>= xmm2中的数据元素,则为真 |
6 | 不小于等于NLE | CMPNLEPS xmm1, xmm2 | xmm1中的数据元素> xmm2中的数据元素,则为真 |
7 | 有序ORD | CMPORDPS xmm1, xmm2 | 两个操作数中都不是NaN,则为真 |
指令 | 描述 | ||
COMISS | 格式:COMISS xmm1, xmm2/m32
比较标量的单精度浮点数,结果保存在EFLAGS中。
以下是对标志寄存器的标志位的解释 UNORDERED: ZF,PF,CF <-- 111; (任一操作数是NaN(QNaN或SNaN)) GREATER_THAN: ZF,PF,CF <-- 000; (xmm1 > xmm2/m32) LESS_THAN: ZF,PF,CF <-- 001; (xmm1 < xmm2/m32) EQUAL: ZF,PF,CF <-- 100; (xmm1 == xmm2/m32)
本条指令与下面一条UCOMISS指令的区别在于:当某个操作数是QNaN或者SNaN的时候,COMISS指令会产生一个SIMD浮点数无效操作异常(#I)。而UCOMISS指令,只有在某个操作数是SNaN的时候,产生无效操作异常(#I)。
Intel C/C++ Compiler Intrinsic Equivalent COMISS int _mm_comieq_ss (__m128 a, __m128 b)
| ||
UCOMISS | 格式:COMISS xmm1, xmm2/m32
比较标量的单精度浮点数,结果保存在EFLAGS中。
以下是对标志寄存器的标志位的解释 UNORDERED: ZF,PF,CF <-- 111; (任一操作数是NaN(QNaN或SNaN)) GREATER_THAN: ZF,PF,CF <-- 000; (xmm1 > xmm2/m32) LESS_THAN: ZF,PF,CF <-- 001; (xmm1 < xmm2/m32) EQUAL: ZF,PF,CF <-- 100; (xmm1 == xmm2/m32)
Intel C/C++ Compiler Intrinsic Equivalent
|