summaryrefslogtreecommitdiffstats
path: root/MdePkg/Library/BaseLib/Ia32/DivS64x64Remainder.c
blob: 46042084039c17dffb47857e88a962884adc6cbb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/** @file
  Integer division worker functions for Ia32.

  Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#include "BaseLibInternals.h"

/**
  Worker function that Divides a 64-bit signed integer by a 64-bit signed integer and
  generates a  64-bit signed result and a optional 64-bit signed remainder.

  This function divides the 64-bit signed value Dividend by the 64-bit
  signed value Divisor and generates a 64-bit signed quotient. If Remainder
  is not NULL, then the 64-bit signed remainder is returned in Remainder.
  This function returns the 64-bit signed quotient.

  @param  Dividend  A 64-bit signed value.
  @param  Divisor   A 64-bit signed value.
  @param  Remainder A pointer to a 64-bit signed value. This parameter is
                    optional and may be NULL.

  @return Dividend / Divisor

**/
INT64
EFIAPI
InternalMathDivRemS64x64 (
  IN      INT64  Dividend,
  IN      INT64  Divisor,
  OUT     INT64  *Remainder  OPTIONAL
  )
{
  INT64  Quot;

  Quot = InternalMathDivRemU64x64 (
           (UINT64)(Dividend >= 0 ? Dividend : -Dividend),
           (UINT64)(Divisor >= 0 ? Divisor : -Divisor),
           (UINT64 *)Remainder
           );
  if ((Remainder != NULL) && (Dividend < 0)) {
    *Remainder = -*Remainder;
  }

  return (Dividend ^ Divisor) >= 0 ? Quot : -Quot;
}