]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Foundation/Library/EfiCommonLib/Ia32/LShiftU64.S
Update the copyright notice format
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Library / EfiCommonLib / Ia32 / LShiftU64.S
CommitLineData
b341712e 1#/*++\r
2#\r
4ea9375a
HT
3#Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>\r
4#This program and the accompanying materials \r
b341712e 5#are licensed and made available under the terms and conditions of the BSD License \r
6#which accompanies this distribution. The full text of the license may be found at \r
7#http://opensource.org/licenses/bsd-license.php \r
8# \r
9#THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10#WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
11#\r
12#Module Name:\r
13#\r
14# LShiftU64.c\r
15#\r
16#Abstract:\r
17#\r
18# 64-bit left shift function for IA-32\r
19#\r
20#--*/\r
21#\r
22#include "EfiBind.h"\r
23#---------------------------------------------------------------------------\r
24 .686: \r
25 #.MODEL flat,C\r
26 .code: \r
27\r
28#---------------------------------------------------------------------------\r
29.globl ASM_PFX(LShiftU64)\r
30#\r
31#UINT64\r
32#LShiftU64 (\r
33# IN UINT64 Operand,\r
34# IN UINTN Count\r
35# )\r
36#/*++\r
37#\r
38#Routine Description:\r
39# \r
40# This routine allows a 64 bit value to be left shifted by 32 bits and \r
41# returns the shifted value.\r
42# Count is valid up 63. (Only Bits 0-5 is valid for Count)\r
43#\r
44#Arguments:\r
45#\r
46# Operand - Value to be shifted\r
47# Count - Number of times to shift left.\r
48# \r
49#Returns:\r
50#\r
51# Value shifted left identified by the Count.\r
52#\r
53#--*/\r
54ASM_PFX(LShiftU64):\r
55\r
56 movl 4(%esp), %eax # dword ptr Operand[0]\r
57 movl 8(%esp), %edx # dword ptr Operand[4]\r
58\r
59 #\r
60 # CL is valid from 0 - 31. shld will move EDX:EAX by CL times but EAX is not touched\r
61 # For CL of 32 - 63, it will be shifted 0 - 31 so we will move eax to edx later. \r
62 #\r
63 movl 0xC(%esp), %ecx # Count\r
64 andl $63, %ecx\r
65 shld %cl, %eax, %edx\r
66 shlb %cl, %eax\r
67\r
68 #\r
69 # Since Count is 32 - 63, eax will have been shifted by 0 - 31 \r
70 # If shifted by 32 or more, set lower 32 bits to zero.\r
71 #\r
72 cmpl $32, %ecx\r
73 jc _LShiftU64_Done\r
74\r
75 movl %eax, %edx\r
76 xorl %eax, %eax\r
77\r
78_LShiftU64_Done: \r
79\r
80 ret\r
81#LShiftU64 ENDP\r
82\r