summaryrefslogtreecommitdiff
path: root/EdkCompatibilityPkg/Foundation/Library/EfiCommonLib/Ia32/Log2.c
blob: 93a95300862071b328f1769bcc7e38d02cf2d2d8 (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
68
69
70
71
72
73
74
/*++

Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
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:

  Log2.c

Abstract:

  64-bit integer logarithm function for IA-32

--*/

#include "Tiano.h"

UINT8
Log2 (
  IN UINT64   Operand
  )
/*++

Routine Description:
 
  Calculates and floors logarithms based on 2

Arguments:

  Operand - value to calculate logarithm
  
Returns:

  The largest integer that is less than or equal
  to the logarithm of Operand based on 2 

--*/
{
  __asm {
  mov    ecx, 64
  
  cmp    dword ptr Operand[0], 0
  jne    _Log2_Wend 
  cmp    dword ptr Operand[4], 0
  jne    _Log2_Wend 
  mov    cl, 0FFH
  jmp    _Log2_Done
  
_Log2_Wend:
  dec    ecx
  cmp    ecx, 32
  jae    _Log2_Higher
  bt     dword ptr Operand[0], ecx
  jmp    _Log2_Bit
  
_Log2_Higher:
  mov    eax, ecx
  sub    eax, 32
  bt     dword ptr Operand[4], eax
  
_Log2_Bit:
  jc     _Log2_Done
  jmp    _Log2_Wend
      
_Log2_Done:
  mov    al, cl
  }
}