summaryrefslogtreecommitdiff
path: root/EdkCompatibilityPkg/Foundation/Library/EfiCommonLib/Ia32/GetPowerOfTwo.c
blob: 665fa02136fb54ba429009fdd8f9ec3ebb0d7bc8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/*++

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

--*/

#include "Tiano.h"

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

--*/
{
  __asm {
    xor     eax, eax
    mov     edx, eax
    mov     ecx, dword ptr Input[4]
    jecxz   _F
    bsr     ecx, ecx
    bts     edx, ecx
    jmp     _Exit
_F:
    mov     ecx, dword ptr Input[0]
    jecxz   _Exit
    bsr     ecx, ecx
    bts     eax, ecx
_Exit:
  }
}