| #/*++ |
| # |
| #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: |
| # |
| # GetPowerOfTwo.c |
| # |
| #Abstract: |
| # |
| # Calculates the largest integer that is both |
| # a power of two and less than Input |
| # |
| #--*/ |
| #include "EfiBind.h" |
| #--------------------------------------------------------------------------- |
| .686: |
| #.MODEL flat,C |
| .code: |
| |
| #--------------------------------------------------------------------------- |
| .globl ASM_PFX(GetPowerOfTwo) |
| #UINT64 |
| #GetPowerOfTwo ( |
| # IN UINT64 Input |
| # ) |
| #/*++ |
| # |
| #Routine Description: |
| # |
| # Calculates the largest integer that is both |
| # a power of two and less than Input |
| # |
| #Arguments: |
| # |
| # Input - value to calculate power of two |
| # |
| #Returns: |
| # |
| # the largest integer that is both a power of |
| # two and less than Input |
| # |
| #--*/ |
| ASM_PFX(GetPowerOfTwo): |
| xorl %eax, %eax |
| movl %eax, %edx |
| movl 8(%esp), %ecx # dword ptr Input[4] |
| jecxz _F |
| bsrl %ecx, %ecx |
| btsl %ecx, %edx |
| jmp _Exit |
| _F: |
| movl 4(%esp), %ecx # dword ptr Input[0] |
| jecxz _Exit |
| bsrl %ecx, %ecx |
| btsl %ecx, %eax |
| _Exit: |
| |
| ret |
| #GetPowerOfTwo ENDP |
| |