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