]> git.proxmox.com Git - mirror_edk2.git/blob - EdkCompatibilityPkg/Foundation/Library/EfiCommonLib/Ia32/GetPowerOfTwo.asm
af009c7a7a9a791995da542b064c52954bd69dfd
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Library / EfiCommonLib / Ia32 / GetPowerOfTwo.asm
1 ;/*++
2 ;
3 ;Copyright (c) 2006, Intel Corporation
4 ;All rights reserved. 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 ;--*/
50 GetPowerOfTwo 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
66 GetPowerOfTwo ENDP
67 END