TZCNT

Count the Number of Trailing Zero Bits

stableVMJITAOTinstruction

Encodings

OpcodeInstructionOp/En64-bitCompat/LegacyDescription
F3 0F BC /rTZCNT r16, r/m16AValidValidCount the number of trailing zero bits in r/m16, return result in r16.
F3 0F BC /rTZCNT r32, r/m32AValidValidCount the number of trailing zero bits in r/m32, return result in r32.
F3 REX.W 0F BC /rTZCNT r64, r/m64AValidNot encodableCount the number of trailing zero bits in r/m64, return result in r64.

Operand encoding

Each mode is a value of the Op/En column above. It says which field of the encoded instruction carries each operand, in the order they are written, and whether the instruction reads it, writes it or both.

A

  1. modrm.reg escrituraModRM byte, reg field (bits 5-3)
  2. modrm.rm lecturaModRM byte, r/m field (bits 2-0); with the SIB byte and the displacement when the mod field asks for them

Measured cost

Loading measurements from arch-data...

Flags named

Description

TZCNT counts the number of trailing least significant zero bits in source operand (second operand) and returns the result in the destination operand (first operand). TZCNT is an extension of the BSF instruction. The key difference between the TZCNT and BSF instructions is that when the source operand is zero, TZCNT outputs the operand size to the destination operand, whereas BSF leaves the destination operand unmodified.

On processors that do not support TZCNT, the instruction byte encoding is executed as BSF.

Operation

temp := 0
DEST := 0
DO WHILE ( (temp < OperandSize) and (SRC[ temp] = 0) )

    temp := temp +1
    DEST := DEST+ 1
OD

IF DEST = OperandSize
    CF := 1

ELSE
    CF := 0

FI

IF DEST = 0
    ZF := 1

ELSE
    ZF := 0

FI

Flags affected

ZF is set to 1 in case of zero output (least significant bit of the source is set), and to 0 otherwise, CF is set to 1 if the input was zero and cleared otherwise. OF, SF, PF, and AF flags are undefined.

Intel C/C++ compiler intrinsics

TZCNT unsigned __int32 _tzcnt_u32(unsigned __int32 src);
TZCNT unsigned __int64 _tzcnt_u64(unsigned __int64 src);

Exceptions

Protected mode
#GP(0)For an illegal memory operand effective address in the CS, DS, ES, FS or GS segments. If the DS, ES, FS, or GS register is used to access memory and it contains a null segment selector.
#SS(0)For an illegal address in the SS segment. #PF (fault-code) For a page fault.
#AC(0)If alignment checking is enabled and an unaligned memory reference is made while the current privilege level is 3.
#UDIf LOCK prefix is used.
Real address mode
#GP(0)If any part of the operand lies outside of the effective address space from 0 to 0FFFFH.
#SS(0)For an illegal address in the SS segment.
#UDIf LOCK prefix is used. Virtual 8086 Mode Exceptions
#GP(0)If any part of the operand lies outside of the effective address space from 0 to 0FFFFH.
#SS(0)For an illegal address in the SS segment. #PF (fault-code) For a page fault.
#AC(0)If alignment checking is enabled and an unaligned memory reference is made while the current privilege level is 3.
#UDIf LOCK prefix is used.
Compatibility mode
Same exceptions as in Protected Mode.
64-bit mode
#GP(0)If the memory address is in a non-canonical form.
#SS(0)If a memory address referencing the SS segment is in a non-canonical form. #PF (fault-code) For a page fault.
#AC(0)If alignment checking is enabled and an unaligned memory reference is made while the current privilege level is 3.
#UDIf LOCK prefix is used.

Sources