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
risposta
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;
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? –
@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! –
Se si utilizza una dimensione int variabile, è necessario anche ifdef il registro nella riga popcnt. –
- 1. Long type 64bit linux
- 2. SendInput non riesce a 64bit
- 3. OpenCL: istruzione popcnt a 32 e 64 bit su GPU?
- 4. "Delphi Fundamentals" in Delphi 2009
- 5. 64bit eccezioni in WndProc in silenzio non riescono
- 6. 64bit mirato Metro style app utilizzando C#
- 7. XCode compilare solo per Intel 32-64bit
- 8. Costruire 64bit libpython27.a utilizzando cygwin, dlltool
- 9. File DLL per windows 7 64bit
- 10. iOS 64bit @try {...} @catch {...} non funziona
- 11. Installazione di maven su windows 7 64bit
- 12. Installazione Theano per Windows, Python 3, 64bit
- 13. Il programma 64bit vC++ sembra funzionare in modalità 32bit
- 14. Delphi WideString e Delphi 2009+
- 15. GetStackTrace in Delphi 7?
- 16. Parentesi quadrate in delphi?
- 17. Miniature PDF in Delphi
- 18. Delphi plug-in framework
- 19. Eccezione EProgrammerNotFound in Delphi?
- 20. Font smoothing in Delphi
- 21. HMAC-SHA256 in Delphi
- 22. Namespace in Delphi XE2
- 23. Virus in Delphi 7
- 24. Interlinea GDI in Delphi?
- 25. Namespace in Delphi
- 26. Javascript in applicazioni delphi
- 27. Operatore Unario ++ in Delphi
- 28. Garbage Collection in Delphi
- 29. setter ripetute in Delphi
- 30. Delphi TList in multithreading
ASM è avaible a 64 bit di Delphi pure. – Giel
Suppongo che non sia così semplice come scrivere 'popcnt eax, eax' o' popcnt rax, rcx' all'interno di un blocco asm, vero? –
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. –