Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(6) - 逻辑指令 & 比较指令

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];
CMP1 <-- SRC1[63:32] OP3 SRC2[63:32];
CMP2 <-- SRC1[95:64] OP3 SRC2[95:64];
CMP3 <-- SRC1[127:96] OP3 SRC2[127:96];
IF CMP0 = TRUE
    THEN DEST[31:0] <-- FFFFFFFFH;
    ELSE DEST[31:0] <-- 000000000H; FI;
IF CMP1 = TRUE
    THEN DEST[63:32] <-- FFFFFFFFH;
    ELSE DEST[63:32] <-- 000000000H; FI;
IF CMP2 = TRUE
    THEN DEST[95:64] <-- FFFFFFFFH;
    ELSE DEST[95:64] <-- 000000000H; FI;
IF CMP3 = TRUE
    THEN DEST[127:96] <-- FFFFFFFFH;
    ELSE DEST[127:96] <-- 000000000H; FI;

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)
COMISS int _mm_comilt_ss (__m128 a, __m128 b)
COMISS int _mm_comile_ss (__m128 a, __m128 b)
COMISS int _mm_comigt_ss (__m128 a, __m128 b)
COMISS int _mm_comige_ss (__m128 a, __m128 b)
COMISS int _mm_comineq_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

UCOMISS
UCOMISS
UCOMISS
UCOMISS
UCOMISS
UCOMISS

int _mm_ucomieq_ss(__m128 a, __m128 b);
int _mm_ucomilt_ss(__m128 a, __m128 b);
int _mm_ucomile_ss(__m128 a, __m128 b);
int _mm_ucomigt_ss(__m128 a, __m128 b);
int _mm_ucomige_ss(__m128 a, __m128 b);
int _mm_ucomineq_ss(__m128 a, __m128 b);

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值