]> git.proxmox.com Git - mirror_edk2.git/blob - EdkCompatibilityPkg/Foundation/Library/EfiCommonLib/Ia32/RShiftU64.c
Add in the 1st version of ECP.
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Library / EfiCommonLib / Ia32 / RShiftU64.c
1 /*++
2
3 Copyright (c) 2006, Intel Corporation
4 All rights reserved. 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 }