• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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;---------------------------------------------------------------------------
23    .686
24    .model  flat,C
25    .code
26
27;---------------------------------------------------------------------------
28
29;UINT8
30;Log2 (
31;  IN UINT64   Operand
32;  )
33;/*++
34;
35;Routine Description:
36;
37;  Calculates and floors logarithms based on 2
38;
39;Arguments:
40;
41;  Operand - value to calculate logarithm
42;
43;Returns:
44;
45;  The largest integer that is less than or equal
46;  to the logarithm of Operand based on 2
47;
48;--*/
49Log2 PROC
50  mov    ecx, 64
51
52  cmp    dword ptr [esp + 4], 0  ; (UINT32 *(&Operand))
53  jne    _Log2_Wend
54  cmp    dword ptr [esp + 8], 0  ; (UINT32 *(&Operand)) + 1
55  jne    _Log2_Wend
56  mov    cl, 0FFH
57  jmp    _Log2_Done
58
59_Log2_Wend:
60  dec    ecx
61  cmp    ecx, 32
62  jae    _Log2_Higher
63  bt     [esp + 4], ecx ; (UINT32 *(&Operand))
64  jmp    _Log2_Bit
65
66_Log2_Higher:
67  mov    eax, ecx
68  sub    eax, 32
69  bt     [esp + 8], eax ; (UINT32 *(&Operand)) + 1
70
71_Log2_Bit:
72  jc     _Log2_Done
73  jmp    _Log2_Wend
74
75_Log2_Done:
76  mov    al, cl
77
78  ret
79
80	Log2 ENDP
81	END
82