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   Log2.c
15 
16 Abstract:
17 
18   64-bit integer logarithm function for IA-32
19 
20 --*/
21 
22 #include "Tiano.h"
23 
24 UINT8
Log2(IN UINT64 Operand)25 Log2 (
26   IN UINT64   Operand
27   )
28 /*++
29 
30 Routine Description:
31 
32   Calculates and floors logarithms based on 2
33 
34 Arguments:
35 
36   Operand - value to calculate logarithm
37 
38 Returns:
39 
40   The largest integer that is less than or equal
41   to the logarithm of Operand based on 2
42 
43 --*/
44 {
45   __asm {
46   mov    ecx, 64
47 
48   cmp    dword ptr Operand[0], 0
49   jne    _Log2_Wend
50   cmp    dword ptr Operand[4], 0
51   jne    _Log2_Wend
52   mov    cl, 0FFH
53   jmp    _Log2_Done
54 
55 _Log2_Wend:
56   dec    ecx
57   cmp    ecx, 32
58   jae    _Log2_Higher
59   bt     dword ptr Operand[0], ecx
60   jmp    _Log2_Bit
61 
62 _Log2_Higher:
63   mov    eax, ecx
64   sub    eax, 32
65   bt     dword ptr Operand[4], eax
66 
67 _Log2_Bit:
68   jc     _Log2_Done
69   jmp    _Log2_Wend
70 
71 _Log2_Done:
72   mov    al, cl
73   }
74 }
75