1;/*++ 2; 3;Copyright (c) 2006, Intel Corporation. All rights reserved.<BR> 4;This program and the accompanying materials 5;are licensed and made available under the terms and conditions of the BSD License 6;which accompanies this distribution. The full text of the license may be found at 7;http://opensource.org/licenses/bsd-license.php 8; 9;THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 10;WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 11; 12;Module Name: 13; 14; GetPowerOfTwo.c 15; 16;Abstract: 17; 18; Calculates the largest integer that is both 19; a power of two and less than Input 20; 21;--*/ 22;--------------------------------------------------------------------------- 23 .686 24 .model flat,C 25 .code 26 27;--------------------------------------------------------------------------- 28 29;UINT64 30;GetPowerOfTwo ( 31; IN UINT64 Input 32; ) 33;/*++ 34; 35;Routine Description: 36; 37; Calculates the largest integer that is both 38; a power of two and less than Input 39; 40;Arguments: 41; 42; Input - value to calculate power of two 43; 44;Returns: 45; 46; the largest integer that is both a power of 47; two and less than Input 48; 49;--*/ 50GetPowerOfTwo PROC 51 xor eax, eax 52 mov edx, eax 53 mov ecx, [esp + 8] ; dword ptr Input[4] 54 jecxz _F 55 bsr ecx, ecx 56 bts edx, ecx 57 jmp _Exit 58_F: 59 mov ecx, [esp + 4] ; dword ptr Input[0] 60 jecxz _Exit 61 bsr ecx, ecx 62 bts eax, ecx 63_Exit: 64 65 ret 66GetPowerOfTwo ENDP 67 END 68