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中。

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

  1. Intel 64/x86_64/IA-32/x86处理器通用寄存器 (2) - 64位通用寄存器

    General-Purpose Registers in 64-mode 在64位模式下,有16个64位宽通用寄存器(32位模式是8个通用寄存器),默认的操作数宽度是32位(注:与32位模式相同).但 ...

  2. Intel 64/x86_64/IA-32/x86处理器基本执行环境 (2) - 64位执行环境

    64-Bit Execution Environment 64位模式的执行环境与32位执行环境类似.不同点如下所述: 地址空间 – 程序/任务运行在64位模式下,可以访问最高2^64字节(受制于规范寻 ...

  3. Intel 64/x86_64/IA-32/x86处理器基本执行环境 (1) - 32位执行环境概述

    Basic Execution Environment Overview IA-32处理器提供了一套完整的资源,在处理器上运行的程序/任务可以执行指令,存储代码,数据以及状态信息.这些资源(如下简要的 ...

  4. Intel 64/x86_64/x86/IA-32处理器标志寄存器详解(3) - 32位EFLAGS - 概述

    32位标志寄存器中的标志位/域可以分成3组:状态标志位,控制标志位,以及系统标志位.下图定义了这些标志位以及对应的比特位编号.在处理器刚刚初始化之后(通过激活RESET引脚或者INIT引脚),EFLA ...

  5. Intel 64/x86_64/IA-32/x86处理器 - 指令格式(7) - 80386/32位指令格式概述

    32-bit Instruction Format 从80386的指令格式可以看出,32位指令的操作码可以是1个字节或者2个字节,还新引入了SIB(即BYTE4)字节.地址位移量和操作数宽度也都升级为 ...

  6. Intel 64/x86_64/IA-32/x86处理器 - 通用指令(1) - 数据传输指令

    General-Purpose Instructions 通用指令执行基本的数据搬移,算术/逻辑计算,程序流控制,字符串操作等.这些指令被频繁地用于运行在IA-32与Intel 64架构的系统软件与应 ...

  7. Intel 64/x86_64/IA-32/x86处理器段寄存器 - 32位段寄存器/64位段寄存器

    Segment Registers 本节主要讲述Intel处理器中的段寄存器,用于支持处理器的段式存储器管理机制.16位的8086/Intel286处理器有4个段寄存器CS/DS/SS/ES.32位的 ...

  8. Intel 64/x86_64/IA-32/x86处理器 - 通用指令(2) - 二进制算术指令/十进制算术指令

    Binary Arithmetic Instructions 二进制算术指令执行基本的二进制整型计算,操作数可以是字节,单字和双字整型数,位于存储器中,和/或通用寄存器中. 指令 描述 ADCX 带进 ...

  9. Intel 64/x86_64/x86/IA-32处理器标志寄存器详解(2) - 32位EFLAGS - 80386(386, Intel386)/80486(486, Intel486)

    80386/386/Intel386标志寄存器EFLAGS 80386增加了RF/VM标志位,用于支持虚拟8086模式与指令断点调试. 80486/486/Intel486标志寄存器EFLAGS (1 ...

最新文章

  1. GitHub标星10,000+,Apache项目ShardingSphere的开源之路
  2. Tomcat发布项目方法!
  3. linux 写脚本登录ftp,Linux使用Shell脚本实现ftp的自动上传下载-Go语言中文社区
  4. 基于Sbo SDK的Add-on插件开发实例
  5. 软件配置管理(六)常用配置软件配置工具指令
  6. Visual Studio2012打开时弹出“遇到异常:这可能是由某个扩展导致的”错误的解决办法...
  7. DOS命令之ping命令大全详解
  8. SharePoint:扩展DVWP - 第15部分:通过网站栏实现可维护的下拉框
  9. bootstrap 学习 ---css样式学习
  10. web视频播放插件:Video For Everybody
  11. JFinal一行代码搞定增删改,要的就是快
  12. 电脑必备必装的软件工具神器,强烈推荐
  13. Oracle 数据库锁机制
  14. junit5 入门系列教程-05-junit5 断言(assert)
  15. 学历低的程序员要起飞了!拿下这个证书!年薪58万起!
  16. 应广单片机MINI-C编程要点
  17. 邮箱、微信号、手机号正则验证
  18. 在go mod中使用k8s.io/code-generator生成代码
  19. linux多线程调用同一个函数解析
  20. 开发一个简单易用的SDK的详细步骤(超详细,超适用)

热门文章

  1. PyCharm将制表符转换为空格并显示的配置方法
  2. 从零开始学keras之电影二分类
  3. jenkins中文插件_Jenkins学习笔记(一)
  4. 删除顽固文件夹cygwin的方法,挺折腾的
  5. java获取本机ip地址_代码片段:获取系统所有IP
  6. java 计数器_java并发之计数器CountDownLatch原理
  7. 计算机二级选择题40分,2017年计算机二级选择题及答案
  8. 大学计算机基础网络配置实验报告答案,大学计算机基础实验报告2.doc
  9. python提取高频词_seo与python大数据结合给文本分词并提取高频词
  10. mysql查询中怎样使用索引_MySQL如何使用索引