4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync;; @file
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync; IPRT - ASMBitFirstSet().
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync;
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync;
c58f1213e628a545081c70e26c6b67a841cff880vboxsync; Copyright (C) 2006-2010 Oracle Corporation
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync;
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync; This file is part of VirtualBox Open Source Edition (OSE), as
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync; available from http://www.virtualbox.org. This file is free software;
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync; you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync; General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync; Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync;
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync; The contents of this file may alternatively be used under the terms
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync; of the Common Development and Distribution License Version 1.0
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync; VirtualBox OSE distribution, in which case the provisions of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync; CDDL are applicable instead of those of the GPL.
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync;
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync; You may elect to license modified versions of this file under the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync; terms and conditions of either the GPL or the CDDL or both.
27bac3660c0d7b7501583be434a647dd710be680vboxsync;
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync;*******************************************************************************
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync;* Header Files *
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync;*******************************************************************************
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync%include "iprt/asmdefs.mac"
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsyncBEGINCODE
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync;;
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync; Finds the first set bit in a bitmap.
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync;
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync; @returns eax Index of the first set bit.
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync; @returns eax -1 if no clear bit was found.
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync; @param rcx pvBitmap Pointer to the bitmap.
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync; @param edx cBits The number of bits in the bitmap. Multiple of 32.
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync;
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsyncBEGINPROC_EXPORTED ASMBitFirstSet
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync ;if (cBits)
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync or edx, edx
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync jz short .failed
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync ;{
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync push rdi
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync ; asm {...}
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync mov rdi, rcx ; rdi = start of scasd
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync mov ecx, edx
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync add ecx, 31 ; 32 bit aligned
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync shr ecx, 5 ; number of dwords to scan.
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync mov rdx, rdi ; rdx = saved pvBitmap
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync xor eax, eax
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync repe scasd ; Scan for the first dword with any set bit.
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync je .failed_restore
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync ; find the bit in question
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync lea rdi, [rdi - 4] ; one step back.
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync mov eax, [rdi]
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync sub rdi, rdx
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync shl edi, 3 ; calc bit offset.
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync mov ecx, 0ffffffffh
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync bsf ecx, eax
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync add ecx, edi
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync mov eax, ecx
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync ; return success
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync pop rdi
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync ret
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync ; failure
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync ;}
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync ;return -1;
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync.failed_restore:
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync pop rdi
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync.failed:
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync mov eax, 0ffffffffh
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync ret
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsyncENDPROC ASMBitFirstSet
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync
4d939f327b6fe2b8201ab00e2d7e7d12b6d47d23vboxsync