Delphi XE/XE2 64位中的POPCNT

Delphi XE/XE2 64位中的POPCNT,delphi,assembly,delphi-xe,basm,Delphi,Assembly,Delphi Xe,Basm,如何在Delphi XE或XE2下使用非常快的Intel POPCNT指令在16/32/64位字中实现1位计数?是否有库例程可直接访问此说明?有人能写一个演示asm部分来说明它的使用吗? 最后,64位Delphi的选项是什么(没有可用的asm)? 提前谢谢 正如Rob Kennedy所建议的,这里有32位和64位Delphi IDE的函数 function GetBitCount(num: integer): integer; asm POPCNT eax, num end; fun

如何在Delphi XE或XE2下使用非常快的Intel POPCNT指令在16/32/64位字中实现1位计数?是否有库例程可直接访问此说明?有人能写一个演示asm部分来说明它的使用吗? 最后,64位Delphi的选项是什么(没有可用的asm)? 提前谢谢
正如Rob Kennedy所建议的,这里有32位和64位Delphi IDE的函数

function GetBitCount(num: integer): integer;
asm
  POPCNT    eax, num
end;

function GetBitCount(num: Int64): integer;
asm
  POPCNT    rax, num
end;
编辑: 这是32位和64位Delphi兼容的版本

{$IF CompilerVersion < 23} //pre-XE2
  NativeInt = integer;
{$IFEND}

function GetBitCount(num: NativeInt): integer;
asm
{$IFNDEF CPUX64}
  POPCNT    eax, num
{$ELSE CPUX64}
  POPCNT    rax, num
{$ENDIF CPUX64}
end;
{$IF CompilerVersion<23}//pre-XE2
NativeInt=整数;
{$IFEND}
函数GetBitCount(num:NativeInt):整数;
asm
{$IFNDEF CPUX64}
POPCNT eax,num
{$ELSE CPUX64}
POPCNT-rax,num
{$ENDIF CPUX64}
结束;

asm也可以在64位Delphi中使用。我想它不像在asm块中编写
popcnt eax,eax
popcnt rax,rcx
那么简单,是吗?有点离题:有一个popcnt实现的比较表,其中SSSE3(
pshufb
用于半字节表查找)在某些系统上,variant实际上优于
popcnt
。只有少数%,不一定在所有CPU上都相同,而且只有在对大量(100+字节)数据执行操作时才有好处。“非常快是相对的。@FrankH我也测试过这个实现,因为我需要非常快的popcount,我发现SSSE3版本几乎慢了一个数量级,即使我使用了大量数据。我怀疑某个地方有错误或bug。最后一个看起来不可靠,可能会操作32位值并存储在64位值中?要么将上面的32位归零,要么将其声明为int64?@Marco van de Voort谢谢,是的,默认情况下它是32位的,但您可以将num声明为
NativeInt
int64
UInt64
,而它可以与所有tham一起工作。更正为Int64!如果使用变量int size,还需要在popcnt行中定义寄存器。函数GetBitCount(num:int64):int64;asm POPCNT rax,num end;抱歉:函数GetBitCount(num:int64):int64;asm POPCNT rax,num end;工作正常,但在测试中被stroint()发现,它不适用于64位整数。。。所以函数strotint64(S:string):Int64;变量E:整数;开始Val(S、结果、E)//如果E 0,则ConvertErrorFmt(@SInvalidInteger[S]);结束;哪一个成功了-再次感谢大家