1// Copyright 2021 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Helper functions that operate on {Digits} vectors of digits.
6
7#ifndef V8_BIGINT_VECTOR_ARITHMETIC_H_
8#define V8_BIGINT_VECTOR_ARITHMETIC_H_
9
10#include "src/bigint/bigint.h"
11#include "src/bigint/digit-arithmetic.h"
12
13namespace v8 {
14namespace bigint {
15
16// Z += X. Returns carry on overflow.
17digit_t AddAndReturnOverflow(RWDigits Z, Digits X);
18
19// Z -= X. Returns borrow on overflow.
20digit_t SubAndReturnBorrow(RWDigits Z, Digits X);
21
22// X += y.
23inline void Add(RWDigits X, digit_t y) {
24  digit_t carry = y;
25  int i = 0;
26  do {
27    X[i] = digit_add2(X[i], carry, &carry);
28    i++;
29  } while (carry != 0);
30}
31
32// X -= y.
33inline void Subtract(RWDigits X, digit_t y) {
34  digit_t borrow = y;
35  int i = 0;
36  do {
37    X[i] = digit_sub(X[i], borrow, &borrow);
38    i++;
39  } while (borrow != 0);
40}
41
42// These add exactly Y's digits to the matching digits in X, storing the
43// result in (part of) Z, and return the carry/borrow.
44digit_t AddAndReturnCarry(RWDigits Z, Digits X, Digits Y);
45digit_t SubtractAndReturnBorrow(RWDigits Z, Digits X, Digits Y);
46
47inline bool IsDigitNormalized(Digits X) { return X.len() == 0 || X.msd() != 0; }
48inline bool IsBitNormalized(Digits X) {
49  return (X.msd() >> (kDigitBits - 1)) == 1;
50}
51
52inline bool GreaterThanOrEqual(Digits A, Digits B) {
53  return Compare(A, B) >= 0;
54}
55
56inline int BitLength(Digits X) {
57  return X.len() * kDigitBits - CountLeadingZeros(X.msd());
58}
59
60}  // namespace bigint
61}  // namespace v8
62
63#endif  // V8_BIGINT_VECTOR_ARITHMETIC_H_
64