[fpc-pascal] PopCount

reyno reynolight at googlemail.com
Sat Apr 27 15:24:57 CEST 2013

Unfortunately, for POPCNT assembler, SSE 4.2 is required. For older 
CPUs, after some tests, I'd finally recommend

function CShift(ANum : QWord) : Cardinal;
   n1, n2 : QWord;
   n1 := ANum - (ANum shr 1 and $5555555555555555);
   n2 := (n1 and $3333333333333333) + (n1 shr 2 and $3333333333333333);
   Result :=
     (((n2 + (n2 shr 4)) and $0f0f0f0f0f0f0f0f) * $0101010101010101) shr 56;

What do you do, when it comes to fast pop. counts on vintage CPUs?

The "official" alternative, provided with FPC 2.7.1, seems ca. 10 x 
slower. Did I grab the wrong version?

Is there a even better solution?

More information about the fpc-pascal mailing list