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 #include "Tiano.h"
24
25 UINT64
GetPowerOfTwo(IN UINT64 Input)26 GetPowerOfTwo (
27 IN UINT64 Input
28 )
29 /*++
30
31 Routine Description:
32
33 Calculates the largest integer that is both
34 a power of two and less than Input
35
36 Arguments:
37
38 Input - value to calculate power of two
39
40 Returns:
41
42 the largest integer that is both a power of
43 two and less than Input
44
45 --*/
46 {
47 __asm {
48 xor eax, eax
49 mov edx, eax
50 mov ecx, dword ptr Input[4]
51 jecxz _F
52 bsr ecx, ecx
53 bts edx, ecx
54 jmp _Exit
55 _F:
56 mov ecx, dword ptr Input[0]
57 jecxz _Exit
58 bsr ecx, ecx
59 bts eax, ecx
60 _Exit:
61 }
62 }
63