diff options
Diffstat (limited to 'EDK/Foundation/Library/EfiCommonLib/Ia32/Log2.asm')
-rw-r--r-- | EDK/Foundation/Library/EfiCommonLib/Ia32/Log2.asm | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/EDK/Foundation/Library/EfiCommonLib/Ia32/Log2.asm b/EDK/Foundation/Library/EfiCommonLib/Ia32/Log2.asm new file mode 100644 index 0000000..167086e --- /dev/null +++ b/EDK/Foundation/Library/EfiCommonLib/Ia32/Log2.asm @@ -0,0 +1,87 @@ + TITLE Log2.asm: 64-bit integer logarithm function for IA-32 + +;------------------------------------------------------------------------------ +; +; Copyright (c) 2004, 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.asm +; +; Abstract: +; +; 64-bit integer logarithm function for IA-32 +; +;------------------------------------------------------------------------------ + + .686P + .XMM + .MODEL SMALL + .CODE + +Log2 PROTO C Operand: QWORD + +Log2 PROC C Operand: QWORD + +;------------------------------------------------------------------------------ +; 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 +;------------------------------------------------------------------------------ + + push ecx + + mov ecx, 64 + + cmp dword ptr Operand[0], 0 + jne _Log2_Wend + cmp dword ptr Operand[4], 0 + jne _Log2_Wend + mov cl, 0FFH + jmp _Log2_Done + +_Log2_Wend: + dec ecx + cmp ecx, 32 + jae _Log2_Higher + bt dword ptr Operand[0], ecx + jmp _Log2_Bit + +_Log2_Higher: + mov eax, ecx + sub eax, 32 + bt dword ptr Operand[4], eax + +_Log2_Bit: + jc _Log2_Done + jmp _Log2_Wend + +_Log2_Done: + mov al, cl + pop ecx + ret + +Log2 ENDP + +END |