2012-05-29 7 views
5

Delphi XE 또는 XE2에서 매우 빠른 Intel POPCNT 명령어를 사용하여 16/32/64 비트 워드 내에 1 비트 수를 구현하려면 어떻게해야합니까? 이 지침에 직접 액세스 할 수있는 라이브러리 루틴이 있습니까? 누군가가 그것의 사용을 보여주는 데모 asm 섹션을 작성해 주실 수 있습니까? 그리고 마지막으로, 64 비트 델파이 (asm을 사용할 수 없음)의 옵션은 무엇입니까? 미리 감사드립니다. tPOPCNT in Delphi XE/XE2 64bit

+1

ASM뿐만 아니라 64 비트 델파이 avaible이다. – Giel

+0

asm 블록 안에'popcnt eax, eax' 또는'popcnt rax, rcx '를 쓰는 것만 큼 간단하지는 않습니까? –

+1

약간 벗어난 주제 : http://www.strchr.com/crc32_popcnt에는 popcnt 구현의 비교표가 있습니다. SSSE3 (니블 테이블 조회 용 'pshufb') 변형은 실제로 일부 시스템에서'popcnt '를 능가합니다. 몇 % 만, 모든 CPU에서 반드시 같을 필요는 없으며 큰 (100 바이트 이상) 데이터를 처리하는 경우에만 유용합니다. _ 매우 빠르지는 상대적인 것입니다. –

답변

2

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; 

EDIT : 이 32 비트 및 64 비트 호환 버전 델파이

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

그 마지막 하나는 사납게 보입니다. 아마도 32 비트 값에서 작동하고 64 비트 값으로 저장 될 것입니까? 상위 32 비트를 제로로 만들거나 int64로 선언 하시겠습니까? –

+0

@Marco van de Voort 네, 기본적으로 32 비트입니다.하지만 num을 NativeInt 또는 Int64 또는 UInt64로 선언 할 수 있습니다. 대신 tham 모두와 작동합니다. Int64로 수정되었습니다! –

+0

변수 int 크기를 사용하는 경우 popcnt 줄에서 ifdef 레지스터를 정의해야합니다. –