Intel 64/x86_64/IA-32/x86处理器 - 通用指令(9/E) - 比特位操控指令(BMI1 & BMI2)

Bit Manipulation Instructions (BMI1 & BMI2)

指令

描述

ANDN

格式: ANDN r32a, r32b, r/m32

第一源操作数(r32b)取反后与第二源操作数(r/m32)按位“与”操作,结果保存在目标操作数中。

BEXTR

格式:BEXTR r32a, r/m32, r32b

按照第二源操作数(r32b)指定的索引值与长度值,从第一源操作数(r/m32)中截取比特位,结果保存在目标操作数中。

 

Intel C/C++ Compiler Intrinsic Equivalent

BEXTR: unsigned __int32 _bextr_u32(

     unsigned __int32 src,

     unsigned __int32 start.

     unsigned __int32 len);

 

BEXTR: unsigned __int64 _bextr_u64(

     unsigned __int64 src,

     unsigned __int32 start.

     unsigned __int32 len);

BLSI

格式: BLSI r32, r/m32

在源操作数中查找到设置为1的最低比特位,将目标操作数中对应的比特位设置为1,其他的所有比特位置0。如果源操作数是0(即没有比特位为1),则目标操作数也置0。

 

Intel C/C++ Compiler Intrinsic Equivalent

BLSI: unsigned __int32 _blsi_u32(unsigned __int32 src);

BLSI: unsigned __int64 _blsi_u64(unsigned __int64 src);

BLSMSK

格式:BLSMSK r32, r/m32

扫描源操作数(r/m32),从最低比特位开始,直到最低的设置为1的比特位,将目标操作数中对应的比特位设置为1。

 

Intel C/C++ Compiler Intrinsic Equivalent

BLSMSK: unsigned __int32 _blsmsk_u32(unsigned __int32 src);

BLSMSK: unsigned __int64 _blsmsk_u64(unsigned __int64 src);

BLSR

格式:BLSR r32, r/m32

将源操作数的最低设置为1的比特位清除为0,其他比特位保持不变,结果写入到目标操作数。

 

Intel C/C++ Compiler Intrinsic Equivalent
BLSR: unsigned __int32 _blsr_u32(unsigned __int32 src);

BLSR: unsigned __int64 _blsr_u64(unsigned __int64 src);

BZHI

格式:BZHI r32a, r/m32, r32b

按照第二源操作数(r32b)指定的比特位,将第一源操作数(r/m32)对应的比特位及其更高比特位全部设置为0,结果写入到目标操作数(r32a)

 

Intel C/C++ Compiler Intrinsic Equivalent

BZHI: unsigned __int32 _bzhi_u32(

     unsigned __int32 src, unsigned __int32 index);

 

BZHI: unsigned __int64 _bzhi_u64(

     unsigned __int64 src, unsigned __int32 index);

 

LZCNT

格式:LZCNT r32, r/m32

统计r/m32中的前导比特位0的个数,结果保存在r32中。

 

Intel C/C++ Compiler Intrinsic Equivalent
LZCNT: unsigned __int32 _lzcnt_u32(

     unsigned __int32 src);

 

LZCNT: unsigned __int64 _lzcnt_u64(

     unsigned __int64 src);

TZCNT

格式:TZCNT r32, r/m32

统计r/m32中结尾比特位0的个数,结果保存在r32中。

 

TZCNT与BSF指令的关键区别在于当源操作数是0时,TZCNT的计数结果是32(即操作数的宽度),但是BSF的结果是未定义的。

 

Intel C/C++ Compiler Intrinsic Equivalent
TZCNT: unsigned __int32 _tzcnt_u32(

     unsigned __int32 src);

 

TZCNT: unsigned __int64 _tzcnt_u64(

     unsigned __int64 src);

MULX

格式:MULX r32a, r32b, r/m32

无符号整数乘法,EDX * r/m32,结果保存在r32a:r32b中。

 

Intel C/C++ Compiler Intrinsic Equivalent
unsigned int mulx_u32(

     unsigned int a,

     unsigned int b,

     unsigned int * hi);

 

unsigned __int64 mulx_u64(

     unsigned __int64 a,

     unsigned __int64 b,

     unsigned __int64 * hi);

PDEP

格式:PDEP r32a, r32b, r/m32

使用r/m32的掩码,将r32b中的低比特位传输并散列到r32a中。

(参看表后图PDEP示例)

 

Intel C/C++ Compiler Intrinsic Equivalent

PDEP: unsigned __int32 _pdep_u32(

     unsigned __int32 src, unsigned __int32 mask);

 

PDEP: unsigned __int64 _pdep_u64(

     unsigned __int64 src, unsigned __int32 mask);

 

指令

描述

PEXT

格式:PEXT r32a, r32b, r/m32

与PDEP的操作相反,PEXT根据r/m32中指定的掩码将r32b中的比特位传输到r32a的低比特位中。(参看表后图PEXT示例)

Intel C/C++ Compiler Intrinsic Equivalent
PEXT: unsigned __int32 _pext_u32(

     unsigned __int32 src, unsigned __int32 mask);

 

PEXT: unsigned __int64 _pext_u64(

     unsigned __int64 src, unsigned __int32 mask);

 

指令

描述

RORX

格式:RORX r32, r/m32, imm8

将32位的r/m32右移imm8次,结果保存到r32中,不修改算术标志位。

SARX

格式:SARX r32a, r/m32, r32b

将r/m32算术右移r32b次,结果保存在r32a中。

SHLX

格式:SHLX r32a, r/m32, r32b

将r/m32逻辑左移r32b次,结果保存在r32a中。

SHRX

格式:SHRX r32a, r/m32, r32b

将r/m32逻辑右移r32b次,结果保存在r32a中。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值