blob: af009c7a7a9a791995da542b064c52954bd69dfd (
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
63
64
65
66
67
|
;/*++
;
;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
;
;--*/
;---------------------------------------------------------------------------
.686
.model flat,C
.code
;---------------------------------------------------------------------------
;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
;
;--*/
GetPowerOfTwo PROC
xor eax, eax
mov edx, eax
mov ecx, [esp + 8] ; dword ptr Input[4]
jecxz _F
bsr ecx, ecx
bts edx, ecx
jmp _Exit
_F:
mov ecx, [esp + 4] ; dword ptr Input[0]
jecxz _Exit
bsr ecx, ecx
bts eax, ecx
_Exit:
ret
GetPowerOfTwo ENDP
END
|