| #/*++ |
| # |
| #Copyright (c) 2006, Intel Corporation |
| #All rights reserved. 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 "EfiBind.h" //For ASM_PFX |
| #--------------------------------------------------------------------------- |
| |
| .globl ASM_PFX(Log2) |
| |
| #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_PFX(Log2): |
| movl $64, %ecx |
| |
| cmpl $0, 4(%esp) # (UINT32 *(&Operand)) |
| jne _Log2_Wend |
| cmpl $0, 8(%esp) # (UINT32 *(&Operand)) + 1 |
| jne _Log2_Wend |
| movb $0xFF, %cl |
| jmp _Log2_Done |
| |
| _Log2_Wend: |
| decl %ecx |
| cmpl $32, %ecx |
| jae _Log2_Higher |
| btl %ecx, 4(%esp) # (UINT32 *(&Operand)) |
| jmp _Log2_Bit |
| |
| _Log2_Higher: |
| movl %ecx, %eax |
| subl $32, %eax |
| btl %eax, 8(%esp) # (UINT32 *(&Operand)) + 1 |
| |
| _Log2_Bit: |
| jc _Log2_Done |
| jmp _Log2_Wend |
| |
| _Log2_Done: |
| movb %cl, %al |
| |
| ret |
| |