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 UINT64 25 RShiftU64 ( 26 IN UINT64 Operand, 27 IN UINTN Count 28 ) 29 /*++ 30 31 Routine Description: 32 This routine allows a 64 bit value to be right shifted by 32 bits and returns the 33 shifted value. 34 Count is valid up 63. (Only Bits 0-5 is valid for Count) 35 Arguments: 36 Operand - Value to be shifted 37 Count - Number of times to shift right. 38 39 Returns: 40 41 Value shifted right identified by the Count. 42 43 --*/ 44 { 45 __asm { 46 47 mov eax, dword ptr Operand[0] 48 mov edx, dword ptr Operand[4] 49 50 ; 51 ; CL is valid from 0 - 31. shld will move EDX:EAX by CL times but EDX is not touched 52 ; For CL of 32 - 63, it will be shifted 0 - 31 so we will move edx to eax later. 53 ; 54 mov ecx, Count 55 and ecx, 63 56 shrd eax, edx, cl 57 shr edx, cl 58 59 cmp ecx, 32 60 jc short _RShiftU64_Done 61 62 ; 63 ; Since Count is 32 - 63, edx will have been shifted by 0 - 31 64 ; If shifted by 32 or more, set upper 32 bits to zero. 65 ; 66 mov eax, edx 67 xor edx, edx 68 69 _RShiftU64_Done: 70 } 71 } 72