bsr
Bit Scan Reverse
Scans for MSB set to 1.
Pseudocode Operation
for i ← (width - 1) down to 0:
if (src >> i) & 1 == 1:
dest ← i;
ZF ← 0;
return;
ZF ← 1;
dest ← undefined;
Example
Encoding
Operands
-
dest
General-purpose register -
src
Register or memory operand
Related
Across architectures
Count Leading Zeros : how x86, ARM, RISC-V, and PowerISA each do this.
More in Base
Reference
Instruction Forms
| Opcode | Instruction | Op/En | 64/32-bit Mode | CPUID | Description |
|---|---|---|---|---|---|
| 0F BD /r | BSR r16, r/m16 | RM | Valid Valid | Bit scan reverse on r/m16. | |
| 0F BD /r | BSR r32, r/m32 | RM | Valid Valid | Bit scan reverse on r/m32. | |
| REX.W + 0F BD /r | BSR r64, r/m64 | RM | Valid N.E. | Bit scan reverse on r/m64. |
Description
Searches the source operand (second operand) for the most significant set bit (1 bit). If a most significant 1 bit is found, its bit index is stored in the destination operand (first operand). The source operand can be a register or a memory location; the destination operand is a register. The bit index is an unsigned offset from bit 0 of the source operand. If the content source operand is zero, the destination operand is unmodified.1 In 64-bit mode, the instruction’s default operation size is 32 bits. Using a REX prefix in the form of REX.R permits access to additional registers (R8-R15). Using a REX prefix in the form of REX.W promotes operation to 64 bits. See the summary chart at the beginning of this section for encoding data and limits.
Operation
IF SRC <> 0 temp := OperandSize - 1; WHILE Bit(SRC, temp) = 0 DO temp := temp - 1; OD; DEST := temp; FI;