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 # RShiftU64.c 15 # 16 #Abstract: 17 # 18 # 64-bit right shift function for IA-32 19 # 20 #--*/ 21 # 22 ##include "Tiano.h" 23 # 24 #include "EfiBind.h" 25 #--------------------------------------------------------------------------- 26 .686: 27 #.MODEL flat,C 28 .code: 29 30 #--------------------------------------------------------------------------- 31 .globl ASM_PFX(RShiftU64) 32 #UINT64 33 #RShiftU64 ( 34 # IN UINT64 Operand, 35 # IN UINTN Count 36 # ) 37 #/*++ 38 # 39 #Routine Description: 40 # This routine allows a 64 bit value to be right shifted by 32 bits and returns the 41 # shifted value. 42 # Count is valid up 63. (Only Bits 0-5 is valid for Count) 43 #Arguments: 44 # Operand - Value to be shifted 45 # Count - Number of times to shift right. 46 # 47 #Returns: 48 # 49 # Value shifted right identified by the Count. 50 # 51 #--*/ 52 ASM_PFX(RShiftU64): 53 54 movl 4(%esp), %eax # dword ptr Operand[0] 55 movl 8(%esp), %edx # dword ptr Operand[4] 56 57 # 58 # CL is valid from 0 - 31. shld will move EDX:EAX by CL times but EDX is not touched 59 # For CL of 32 - 63, it will be shifted 0 - 31 so we will move edx to eax later. 60 # 61 movl 0xC(%esp), %ecx # Count 62 andl $63, %ecx 63 shrd %cl, %edx, %eax 64 shrb %cl, %edx 65 66 cmpl $32, %ecx 67 jc _RShiftU64_Done 68 69 # 70 # Since Count is 32 - 63, edx will have been shifted by 0 - 31 71 # If shifted by 32 or more, set upper 32 bits to zero. 72 # 73 movl %edx, %eax 74 xorl %edx, %edx 75 76 _RShiftU64_Done: 77 78 ret 79 #RShiftU64 ENDP 80 81