2012-05-29 22 views
5

Çok hızlı Intel POPCNT komutunu kullanarak 16/32/64bit sözcük içinde 1 bitlik bir sayıyı Delphi XE veya XE2 altında nasıl uygularım? Bu eğitime doğrudan erişim sağlayan bir kütüphane rutini var mı? Birisi kullanımını gösteren bir demo asm bölümü yazabilir mi lütfen? Ve son olarak, 64bit Delphi için seçenekler nelerdir (kullanılabilir değil)? şimdiden teşekkür ederiz. tPOPCNT 64bit

+1

asm yanı 64 bitlik Delphi şu lisanlarda olmasıdır. – Giel

+0

Sanırım, "popcnt eax, eax" veya "popcnt rax, rcx" kelimesini bir blok bloğun içinde yazmak kadar basit değil, değil mi? –

+1

Biraz konu dışı: http://www.strchr.com/crc32_popcnt, bir SSSE3 (nibble tablo araması için pshufb') varyantının bazı sistemlerde 'popcnt' yi attığı popcnt uygulamalarının bir karşılaştırma tablosuna sahiptir. Sadece birkaç%, tüm CPU'larda mutlaka aynı değildir ve sadece büyük (100+ Byte) veri için işlem yaparsanız faydalıdır. _Very fast_ akrabadır. –

cevap

2

Rob Kennedy'in suistimal ettiği gibi, burada 32bit ve 64bit Delphi IDE işlevleri vardır.

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

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

DÜZENLEME: Bu 32bit ve 64bit Delphi uyumlu versiyon

{$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

Sonuncusu tehlikeli görünüyor, muhtemelen 32-bit bir değer üzerinde çalışacak ve 64-bit bir depolayacak? Ya üst 32-bit sıfır veya int64 olarak ilan? –

+0

@Marco van de Voort Teşekkürler, evet varsayılan olarak 32bit'dir, ancak num'i "NativeInt" veya "Int64" veya "UInt64" olarak bildirebilirsiniz, bunun yerine tham ile çalışır. Int64'e düzeltildi! –

+0

Değişken bir int boyutu kullanırsanız, popcnt satırındaki register'ı ifdef etmeniz gerekir. –

İlgili konular