ASMBitFirstClear.asm revision 27bac3660c0d7b7501583be434a647dd710be680
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync;; @file
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync; innotek Portable Runtime - ASMBitFirstClear().
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync;
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync;
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync; Copyright (C) 2006-2007 innotek GmbH
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync;
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync; This file is part of VirtualBox Open Source Edition (OSE), as
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync; available from http://www.virtualbox.org. This file is free software;
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync; you can redistribute it and/or modify it under the terms of the GNU
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync; General Public License as published by the Free Software Foundation,
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync; in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync; distribution. VirtualBox OSE is distributed in the hope that it will
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync; be useful, but WITHOUT ANY WARRANTY of any kind.
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync;*******************************************************************************
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync;* Header Files *
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync;*******************************************************************************
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync%include "iprt/asmdefs.mac"
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsyncBEGINCODE
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync;;
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync; Finds the first clear bit in a bitmap.
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync;
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync; @returns eax Index of the first zero bit.
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync; @returns eax -1 if no clear bit was found.
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync; @param rcx pvBitmap Pointer to the bitmap.
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync; @param edx cBits The number of bits in the bitmap. Multiple of 32.
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync;
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsyncBEGINPROC_EXPORTED ASMBitFirstClear
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync ;if (cBits)
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync or edx, edx
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync jz short .failed
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync ;{
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync push rdi
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync ; asm {...}
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync mov rdi, rcx ; rdi = start of scasd
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync mov ecx, edx
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync add ecx, 31 ; 32 bit aligned
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync shr ecx, 5 ; number of dwords to scan.
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync mov rdx, rdi ; rdx = saved pvBitmap
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync mov eax, 0ffffffffh
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync repe scasd ; Scan for the first dword with any clear bit.
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync je .failed_restore
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync ; find the bit in question
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync lea rdi, [rdi - 4] ; one step back.
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync xor eax, [rdi] ; eax = NOT [rdi]
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync sub rdi, rdx
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync shl edi, 3 ; calc bit offset.
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync mov ecx, 0ffffffffh
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync bsf ecx, eax
43b5dc1de36c0382122e939b0795bc9975cabd0cvboxsync add ecx, edi
mov eax, ecx
; return success
pop rdi
ret
; failure
;}
;return -1;
.failed_restore:
pop rdi
ret
.failed:
mov eax, 0ffffffffh
ret
ENDPROC ASMBitFirstClear