rdos/lib/popcnt.asm

31 lines
389 B
NASM
Raw Normal View History

2019-08-31 00:18:05 +02:00
popcnt:
push bx
push cx
mov bx, ax
and ax, 0x5555 ; 8x 01
and bx, 0xaaaa ; 8x 10
sar bx, 1
add ax, bx
mov bx, ax
and ax, 0x3333 ; 4x 0011
and bx, 0xcccc ; 4x 1100
mov cl, 2
sar bx, cl
add ax, bx
mov bx, ax
and ax, 0x0f0f ; 2x 00001111
and bx, 0xf0f0 ; 2x 11110000
mov cl, 4
sar bx, cl
add ax, bx
add al, ah
xor ah, ah
pop cx
pop bx
ret