1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| unit uASMTools;
interface
function FirstOne(aBoard: Int64): Integer;
function LastOne(aBoard: Int64): Integer;
function BitCount(aBoard: Int64): Byte; assembler;
function BitScanForward(var X: Int64): Integer;
function BitScanReverse(var X: Int64): Integer;
function BitScan(var X, Y: Integer; Z: pointer): Integer;
function BitScanForwardAndClear(var X: Int64): Integer;
implementation
//FirstOne scans low register first (forward)
//LastOne scans high register first (reverse)
//PopCount count the number of bits set in a Int64
function FirstOne(aBoard: Int64): Integer;
asm
xor eax, eax
bsf edx, dword ptr aBoard
jnz @@1
mov eax, 32
bsf edx, dword ptr aBoard + 4
@@1: add eax, edx
end;
function LastOne(aBoard: Int64): Integer;
asm
xor eax, eax
bsr edx, dword ptr aBoard
jnz @@1
mov eax, 32
bsr edx, dword ptr aBoard + 4
@@1: add eax, edx
end;
function BitCount(aBoard: Int64): Byte; assembler;
asm
mov ecx, dword ptr aBoard
xor eax, eax
test ecx, ecx
jz @@1
@@0: lea edx, [ecx-1]
inc eax
and ecx, edx
jnz @@0
@@1: mov ecx, dword ptr aBoard+4
test ecx, ecx
jz @@3
@@2: lea edx, [ecx-1]
inc eax
and ecx, edx
jnz @@2
@@3:
end; |
Partager