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 #include "EfiBind.h" 23 #--------------------------------------------------------------------------- 24 .686: 25 #.MODEL flat,C 26 .code: 27 28 #--------------------------------------------------------------------------- 29 .globl ASM_PFX(GetPowerOfTwo) 30 #UINT64 31 #GetPowerOfTwo ( 32 # IN UINT64 Input 33 # ) 34 #/*++ 35 # 36 #Routine Description: 37 # 38 # Calculates the largest integer that is both 39 # a power of two and less than Input 40 # 41 #Arguments: 42 # 43 # Input - value to calculate power of two 44 # 45 #Returns: 46 # 47 # the largest integer that is both a power of 48 # two and less than Input 49 # 50 #--*/ 51 ASM_PFX(GetPowerOfTwo): 52 xorl %eax, %eax 53 movl %eax, %edx 54 movl 8(%esp), %ecx # dword ptr Input[4] 55 jecxz _F 56 bsrl %ecx, %ecx 57 btsl %ecx, %edx 58 jmp _Exit 59 _F: 60 movl 4(%esp), %ecx # dword ptr Input[0] 61 jecxz _Exit 62 bsrl %ecx, %ecx 63 btsl %ecx, %eax 64 _Exit: 65 66 ret 67 #GetPowerOfTwo ENDP 68 69