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