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 #include "EfiBind.h" //For ASM_PFX 24 #--------------------------------------------------------------------------- 25 26 .globl ASM_PFX(Log2) 27 28 #UINT8 29 #Log2 ( 30 # IN UINT64 Operand 31 # ) 32 #/*++ 33 # 34 #Routine Description: 35 # 36 # Calculates and floors logarithms based on 2 37 # 38 #Arguments: 39 # 40 # Operand - value to calculate logarithm 41 # 42 #Returns: 43 # 44 # The largest integer that is less than or equal 45 # to the logarithm of Operand based on 2 46 # 47 #--*/ 48 ASM_PFX(Log2): 49 movl $64, %ecx 50 51 cmpl $0, 4(%esp) # (UINT32 *(&Operand)) 52 jne _Log2_Wend 53 cmpl $0, 8(%esp) # (UINT32 *(&Operand)) + 1 54 jne _Log2_Wend 55 movb $0xFF, %cl 56 jmp _Log2_Done 57 58 _Log2_Wend: 59 decl %ecx 60 cmpl $32, %ecx 61 jae _Log2_Higher 62 btl %ecx, 4(%esp) # (UINT32 *(&Operand)) 63 jmp _Log2_Bit 64 65 _Log2_Higher: 66 movl %ecx, %eax 67 subl $32, %eax 68 btl %eax, 8(%esp) # (UINT32 *(&Operand)) + 1 69 70 _Log2_Bit: 71 jc _Log2_Done 72 jmp _Log2_Wend 73 74 _Log2_Done: 75 movb %cl, %al 76 77 ret 78 79