;/*++ ; ;Copyright (c) 2006, Intel Corporation. All rights reserved.
;This program and the accompanying materials ;are licensed and made available under the terms and conditions of the BSD License ;which accompanies this distribution. The full text of the license may be found at ;http://opensource.org/licenses/bsd-license.php ; ;THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, ;WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. ; ;Module Name: ; ; GetPowerOfTwo.c ; ;Abstract: ; ; Calculates the largest integer that is both ; a power of two and less than Input ; ;--*/ ;--------------------------------------------------------------------------- .686 .model flat,C .code ;--------------------------------------------------------------------------- ;UINT64 ;GetPowerOfTwo ( ; IN UINT64 Input ; ) ;/*++ ; ;Routine Description: ; ; Calculates the largest integer that is both ; a power of two and less than Input ; ;Arguments: ; ; Input - value to calculate power of two ; ;Returns: ; ; the largest integer that is both a power of ; two and less than Input ; ;--*/ GetPowerOfTwo PROC xor eax, eax mov edx, eax mov ecx, [esp + 8] ; dword ptr Input[4] jecxz _F bsr ecx, ecx bts edx, ecx jmp _Exit _F: mov ecx, [esp + 4] ; dword ptr Input[0] jecxz _Exit bsr ecx, ecx bts eax, ecx _Exit: ret GetPowerOfTwo ENDP END