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