]> git.proxmox.com Git - mirror_edk2.git/blob - EdkCompatibilityPkg/Foundation/Library/EfiCommonLib/Ia32/RShiftU64.asm
Update the copyright notice format
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Library / EfiCommonLib / Ia32 / RShiftU64.asm
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