1 /** @file 2 Integer division worker functions for Ia32. 3 4 Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR> 5 This program and the accompanying materials 6 are licensed and made available under the terms and conditions of the BSD License 7 which accompanies this distribution. The full text of the license may be found at 8 http://opensource.org/licenses/bsd-license.php. 9 10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 13 **/ 14 15 #include "BaseLibInternals.h" 16 17 /** 18 Worker function that Divides a 64-bit signed integer by a 64-bit signed integer and 19 generates a 64-bit signed result and a optional 64-bit signed remainder. 20 21 This function divides the 64-bit signed value Dividend by the 64-bit 22 signed value Divisor and generates a 64-bit signed quotient. If Remainder 23 is not NULL, then the 64-bit signed remainder is returned in Remainder. 24 This function returns the 64-bit signed quotient. 25 26 @param Dividend A 64-bit signed value. 27 @param Divisor A 64-bit signed value. 28 @param Remainder A pointer to a 64-bit signed value. This parameter is 29 optional and may be NULL. 30 31 @return Dividend / Divisor 32 33 **/ 34 INT64 35 EFIAPI 36 InternalMathDivRemS64x64 ( 37 IN INT64 Dividend, 38 IN INT64 Divisor, 39 OUT INT64 *Remainder OPTIONAL 40 ) 41 { 42 INT64 Quot; 43 44 Quot = InternalMathDivRemU64x64 ( 45 (UINT64) (Dividend >= 0 ? Dividend : -Dividend), 46 (UINT64) (Divisor >= 0 ? Divisor : -Divisor), 47 (UINT64 *) Remainder 48 ); 49 if (Remainder != NULL && Dividend < 0) { 50 *Remainder = -*Remainder; 51 } 52 return (Dividend ^ Divisor) >= 0 ? Quot : -Quot; 53 } 54