2012-05-29 20 views
5

Come si implementa un conteggio di 1 bit in una parola 16/32/64 bit utilizzando l'istruzione Intel POPCNT molto veloce, in Delphi XE o XE2? Esiste una routine di biblioteca che dà accesso diretto a queste istruzioni? Qualcuno può scrivere una sezione demo di Asm che ne illustri l'uso per favore? E infine, quali sono le opzioni per Delphi a 64 bit (non disponibile ASM)? grazie in anticipo tPOPCNT in Delphi XE/XE2 64bit

+1

ASM è avaible a 64 bit di Delphi pure. – Giel

+0

Suppongo che non sia così semplice come scrivere 'popcnt eax, eax' o' popcnt rax, rcx' all'interno di un blocco asm, vero? –

+1

Leggermente off-topic: http://www.strchr.com/crc32_popcnt ha una tabella di confronto delle implementazioni popcnt, in cui una variante SSSE3 ('pshufb' per la ricerca della tabella dei nibble) batte effettivamente' popcnt' su alcuni sistemi. Solo pochi%, non necessariamente lo stesso su tutte le CPU, e solo vantaggioso se si esegue l'operazione per una grande quantità di dati (oltre 100 byte). _Molto veloce_ è relativo. –

risposta

2

Come suggerito da Rob Kennedy, ecco le funzioni per Delphi IDE a 32 bit e 64 bit.

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

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

EDIT: Questo è 32bit e 64bit versione compatibile 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; 
+0

Quest'ultimo sembra poco sicuro, probabilmente funzionerà su un valore a 32 bit e lo memorizzerà in uno a 64 bit? O azzerare il limite superiore a 32 bit o dichiararlo come int64? –

+0

@Marco van de Voort Grazie, sì è 32bit di default, ma puoi dichiarare num come 'NativeInt' o' Int64' o 'UInt64' invece funziona con tutto il tham. Corretto su Int64! –

+0

Se si utilizza una dimensione int variabile, è necessario anche ifdef il registro nella riga popcnt. –