1#------------------------------------------------------------------------------ 2# 3# Copyright (c) 2006 - 2015, 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# RRotU64.S 15# 16# Abstract: 17# 18# 64-bit right rotation for Ia32 19# 20#------------------------------------------------------------------------------ 21 22ASM_GLOBAL ASM_PFX(InternalMathRRotU64) 23 24#------------------------------------------------------------------------------ 25# UINT64 26# EFIAPI 27# InternalMathRRotU64 ( 28# IN UINT64 Operand, 29# IN UINTN Count 30# ); 31#------------------------------------------------------------------------------ 32ASM_PFX(InternalMathRRotU64): 33 push %ebx 34 movb 16(%esp), %cl 35 movl 8(%esp), %eax 36 movl 12(%esp), %edx 37 shrdl %cl, %eax, %ebx 38 shrdl %cl, %edx, %eax 39 roll %cl, %ebx 40 shrdl %cl, %ebx, %edx 41 testb $32, %cl # Count >= 32? 42 jz L0 43 movl %eax, %ecx # switch eax & edx if Count >= 32 44 movl %edx, %eax 45 movl %ecx, %edx 46L0: 47 pop %ebx 48 ret 49