DivU64x32Remainder.c revision 4fd606d1f5abe38e1f42c38de1d2e895166bd0f4
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/** @file
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra Set error flag for all division functions
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra This program and the accompanying materials
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra are licensed and made available under the terms and conditions of the BSD License
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra which accompanies this distribution. The full text of the license may be found at
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra http://opensource.org/licenses/bsd-license.php.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra**/
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/**
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra Divides a 64-bit unsigned integer by a 32-bit unsigned integer and
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra generates a 64-bit unsigned result and an optional 32-bit unsigned remainder.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra This function divides the 64-bit unsigned value Dividend by the 32-bit
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra unsigned value Divisor and generates a 64-bit unsigned quotient. If Remainder
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra is not NULL, then the 32-bit unsigned remainder is returned in Remainder.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra This function returns the 64-bit unsigned quotient.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra @param Dividend A 64-bit unsigned value.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra @param Divisor A 32-bit unsigned value.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra @param Remainder A pointer to a 32-bit unsigned value. This parameter is
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra optional and may be NULL.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra @return Dividend / Divisor
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra**/
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta MisraUINT64
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta MisraEFIAPI
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta MisraInternalMathDivRemU64x32 (
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra IN UINT64 Dividend,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra IN UINT32 Divisor,
OUT UINT32 *Remainder
)
{
_asm {
mov ecx, Divisor
mov eax, dword ptr [Dividend + 4]
xor edx, edx
div ecx
push eax
mov eax, dword ptr [Dividend + 0]
div ecx
mov ecx, Remainder
jecxz RemainderNull // abandon remainder if Remainder == NULL
mov [ecx], edx
RemainderNull:
pop edx
}
}