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