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 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