xref: /src/contrib/llvm-project/llvm/lib/Support/SlowDynamicAPInt.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1ac9a064cSDimitry Andric //===- SlowDynamicAPInt.cpp - SlowDynamicAPInt Implementation -------------===//
2ac9a064cSDimitry Andric //
3ac9a064cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4ac9a064cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5ac9a064cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ac9a064cSDimitry Andric //
7ac9a064cSDimitry Andric //===----------------------------------------------------------------------===//
8ac9a064cSDimitry Andric 
9ac9a064cSDimitry Andric #include "llvm/ADT/SlowDynamicAPInt.h"
10ac9a064cSDimitry Andric #include "llvm/ADT/Hashing.h"
11ac9a064cSDimitry Andric #include "llvm/Support/Debug.h"
12ac9a064cSDimitry Andric #include "llvm/Support/raw_ostream.h"
13ac9a064cSDimitry Andric 
14ac9a064cSDimitry Andric using namespace llvm;
15ac9a064cSDimitry Andric using namespace detail;
16ac9a064cSDimitry Andric 
SlowDynamicAPInt(int64_t Val)17ac9a064cSDimitry Andric SlowDynamicAPInt::SlowDynamicAPInt(int64_t Val)
18ac9a064cSDimitry Andric     : Val(64, Val, /*isSigned=*/true) {}
SlowDynamicAPInt()19ac9a064cSDimitry Andric SlowDynamicAPInt::SlowDynamicAPInt() : SlowDynamicAPInt(0) {}
SlowDynamicAPInt(const APInt & Val)20ac9a064cSDimitry Andric SlowDynamicAPInt::SlowDynamicAPInt(const APInt &Val) : Val(Val) {}
operator =(int64_t Val)21ac9a064cSDimitry Andric SlowDynamicAPInt &SlowDynamicAPInt::operator=(int64_t Val) {
22ac9a064cSDimitry Andric   return *this = SlowDynamicAPInt(Val);
23ac9a064cSDimitry Andric }
operator int64_t() const24ac9a064cSDimitry Andric SlowDynamicAPInt::operator int64_t() const { return Val.getSExtValue(); }
25ac9a064cSDimitry Andric 
hash_value(const SlowDynamicAPInt & X)26ac9a064cSDimitry Andric hash_code detail::hash_value(const SlowDynamicAPInt &X) {
27ac9a064cSDimitry Andric   return hash_value(X.Val);
28ac9a064cSDimitry Andric }
29ac9a064cSDimitry Andric 
30ac9a064cSDimitry Andric /// ---------------------------------------------------------------------------
31ac9a064cSDimitry Andric /// Convenience operator overloads for int64_t.
32ac9a064cSDimitry Andric /// ---------------------------------------------------------------------------
operator +=(SlowDynamicAPInt & A,int64_t B)33ac9a064cSDimitry Andric SlowDynamicAPInt &detail::operator+=(SlowDynamicAPInt &A, int64_t B) {
34ac9a064cSDimitry Andric   return A += SlowDynamicAPInt(B);
35ac9a064cSDimitry Andric }
operator -=(SlowDynamicAPInt & A,int64_t B)36ac9a064cSDimitry Andric SlowDynamicAPInt &detail::operator-=(SlowDynamicAPInt &A, int64_t B) {
37ac9a064cSDimitry Andric   return A -= SlowDynamicAPInt(B);
38ac9a064cSDimitry Andric }
operator *=(SlowDynamicAPInt & A,int64_t B)39ac9a064cSDimitry Andric SlowDynamicAPInt &detail::operator*=(SlowDynamicAPInt &A, int64_t B) {
40ac9a064cSDimitry Andric   return A *= SlowDynamicAPInt(B);
41ac9a064cSDimitry Andric }
operator /=(SlowDynamicAPInt & A,int64_t B)42ac9a064cSDimitry Andric SlowDynamicAPInt &detail::operator/=(SlowDynamicAPInt &A, int64_t B) {
43ac9a064cSDimitry Andric   return A /= SlowDynamicAPInt(B);
44ac9a064cSDimitry Andric }
operator %=(SlowDynamicAPInt & A,int64_t B)45ac9a064cSDimitry Andric SlowDynamicAPInt &detail::operator%=(SlowDynamicAPInt &A, int64_t B) {
46ac9a064cSDimitry Andric   return A %= SlowDynamicAPInt(B);
47ac9a064cSDimitry Andric }
48ac9a064cSDimitry Andric 
operator ==(const SlowDynamicAPInt & A,int64_t B)49ac9a064cSDimitry Andric bool detail::operator==(const SlowDynamicAPInt &A, int64_t B) {
50ac9a064cSDimitry Andric   return A == SlowDynamicAPInt(B);
51ac9a064cSDimitry Andric }
operator !=(const SlowDynamicAPInt & A,int64_t B)52ac9a064cSDimitry Andric bool detail::operator!=(const SlowDynamicAPInt &A, int64_t B) {
53ac9a064cSDimitry Andric   return A != SlowDynamicAPInt(B);
54ac9a064cSDimitry Andric }
operator >(const SlowDynamicAPInt & A,int64_t B)55ac9a064cSDimitry Andric bool detail::operator>(const SlowDynamicAPInt &A, int64_t B) {
56ac9a064cSDimitry Andric   return A > SlowDynamicAPInt(B);
57ac9a064cSDimitry Andric }
operator <(const SlowDynamicAPInt & A,int64_t B)58ac9a064cSDimitry Andric bool detail::operator<(const SlowDynamicAPInt &A, int64_t B) {
59ac9a064cSDimitry Andric   return A < SlowDynamicAPInt(B);
60ac9a064cSDimitry Andric }
operator <=(const SlowDynamicAPInt & A,int64_t B)61ac9a064cSDimitry Andric bool detail::operator<=(const SlowDynamicAPInt &A, int64_t B) {
62ac9a064cSDimitry Andric   return A <= SlowDynamicAPInt(B);
63ac9a064cSDimitry Andric }
operator >=(const SlowDynamicAPInt & A,int64_t B)64ac9a064cSDimitry Andric bool detail::operator>=(const SlowDynamicAPInt &A, int64_t B) {
65ac9a064cSDimitry Andric   return A >= SlowDynamicAPInt(B);
66ac9a064cSDimitry Andric }
operator +(const SlowDynamicAPInt & A,int64_t B)67ac9a064cSDimitry Andric SlowDynamicAPInt detail::operator+(const SlowDynamicAPInt &A, int64_t B) {
68ac9a064cSDimitry Andric   return A + SlowDynamicAPInt(B);
69ac9a064cSDimitry Andric }
operator -(const SlowDynamicAPInt & A,int64_t B)70ac9a064cSDimitry Andric SlowDynamicAPInt detail::operator-(const SlowDynamicAPInt &A, int64_t B) {
71ac9a064cSDimitry Andric   return A - SlowDynamicAPInt(B);
72ac9a064cSDimitry Andric }
operator *(const SlowDynamicAPInt & A,int64_t B)73ac9a064cSDimitry Andric SlowDynamicAPInt detail::operator*(const SlowDynamicAPInt &A, int64_t B) {
74ac9a064cSDimitry Andric   return A * SlowDynamicAPInt(B);
75ac9a064cSDimitry Andric }
operator /(const SlowDynamicAPInt & A,int64_t B)76ac9a064cSDimitry Andric SlowDynamicAPInt detail::operator/(const SlowDynamicAPInt &A, int64_t B) {
77ac9a064cSDimitry Andric   return A / SlowDynamicAPInt(B);
78ac9a064cSDimitry Andric }
operator %(const SlowDynamicAPInt & A,int64_t B)79ac9a064cSDimitry Andric SlowDynamicAPInt detail::operator%(const SlowDynamicAPInt &A, int64_t B) {
80ac9a064cSDimitry Andric   return A % SlowDynamicAPInt(B);
81ac9a064cSDimitry Andric }
82ac9a064cSDimitry Andric 
operator ==(int64_t A,const SlowDynamicAPInt & B)83ac9a064cSDimitry Andric bool detail::operator==(int64_t A, const SlowDynamicAPInt &B) {
84ac9a064cSDimitry Andric   return SlowDynamicAPInt(A) == B;
85ac9a064cSDimitry Andric }
operator !=(int64_t A,const SlowDynamicAPInt & B)86ac9a064cSDimitry Andric bool detail::operator!=(int64_t A, const SlowDynamicAPInt &B) {
87ac9a064cSDimitry Andric   return SlowDynamicAPInt(A) != B;
88ac9a064cSDimitry Andric }
operator >(int64_t A,const SlowDynamicAPInt & B)89ac9a064cSDimitry Andric bool detail::operator>(int64_t A, const SlowDynamicAPInt &B) {
90ac9a064cSDimitry Andric   return SlowDynamicAPInt(A) > B;
91ac9a064cSDimitry Andric }
operator <(int64_t A,const SlowDynamicAPInt & B)92ac9a064cSDimitry Andric bool detail::operator<(int64_t A, const SlowDynamicAPInt &B) {
93ac9a064cSDimitry Andric   return SlowDynamicAPInt(A) < B;
94ac9a064cSDimitry Andric }
operator <=(int64_t A,const SlowDynamicAPInt & B)95ac9a064cSDimitry Andric bool detail::operator<=(int64_t A, const SlowDynamicAPInt &B) {
96ac9a064cSDimitry Andric   return SlowDynamicAPInt(A) <= B;
97ac9a064cSDimitry Andric }
operator >=(int64_t A,const SlowDynamicAPInt & B)98ac9a064cSDimitry Andric bool detail::operator>=(int64_t A, const SlowDynamicAPInt &B) {
99ac9a064cSDimitry Andric   return SlowDynamicAPInt(A) >= B;
100ac9a064cSDimitry Andric }
operator +(int64_t A,const SlowDynamicAPInt & B)101ac9a064cSDimitry Andric SlowDynamicAPInt detail::operator+(int64_t A, const SlowDynamicAPInt &B) {
102ac9a064cSDimitry Andric   return SlowDynamicAPInt(A) + B;
103ac9a064cSDimitry Andric }
operator -(int64_t A,const SlowDynamicAPInt & B)104ac9a064cSDimitry Andric SlowDynamicAPInt detail::operator-(int64_t A, const SlowDynamicAPInt &B) {
105ac9a064cSDimitry Andric   return SlowDynamicAPInt(A) - B;
106ac9a064cSDimitry Andric }
operator *(int64_t A,const SlowDynamicAPInt & B)107ac9a064cSDimitry Andric SlowDynamicAPInt detail::operator*(int64_t A, const SlowDynamicAPInt &B) {
108ac9a064cSDimitry Andric   return SlowDynamicAPInt(A) * B;
109ac9a064cSDimitry Andric }
operator /(int64_t A,const SlowDynamicAPInt & B)110ac9a064cSDimitry Andric SlowDynamicAPInt detail::operator/(int64_t A, const SlowDynamicAPInt &B) {
111ac9a064cSDimitry Andric   return SlowDynamicAPInt(A) / B;
112ac9a064cSDimitry Andric }
operator %(int64_t A,const SlowDynamicAPInt & B)113ac9a064cSDimitry Andric SlowDynamicAPInt detail::operator%(int64_t A, const SlowDynamicAPInt &B) {
114ac9a064cSDimitry Andric   return SlowDynamicAPInt(A) % B;
115ac9a064cSDimitry Andric }
116ac9a064cSDimitry Andric 
getMaxWidth(const APInt & A,const APInt & B)117ac9a064cSDimitry Andric static unsigned getMaxWidth(const APInt &A, const APInt &B) {
118ac9a064cSDimitry Andric   return std::max(A.getBitWidth(), B.getBitWidth());
119ac9a064cSDimitry Andric }
120ac9a064cSDimitry Andric 
121ac9a064cSDimitry Andric /// ---------------------------------------------------------------------------
122ac9a064cSDimitry Andric /// Comparison operators.
123ac9a064cSDimitry Andric /// ---------------------------------------------------------------------------
124ac9a064cSDimitry Andric 
125ac9a064cSDimitry Andric // TODO: consider instead making APInt::compare available and using that.
operator ==(const SlowDynamicAPInt & O) const126ac9a064cSDimitry Andric bool SlowDynamicAPInt::operator==(const SlowDynamicAPInt &O) const {
127ac9a064cSDimitry Andric   unsigned Width = getMaxWidth(Val, O.Val);
128ac9a064cSDimitry Andric   return Val.sext(Width) == O.Val.sext(Width);
129ac9a064cSDimitry Andric }
operator !=(const SlowDynamicAPInt & O) const130ac9a064cSDimitry Andric bool SlowDynamicAPInt::operator!=(const SlowDynamicAPInt &O) const {
131ac9a064cSDimitry Andric   unsigned Width = getMaxWidth(Val, O.Val);
132ac9a064cSDimitry Andric   return Val.sext(Width) != O.Val.sext(Width);
133ac9a064cSDimitry Andric }
operator >(const SlowDynamicAPInt & O) const134ac9a064cSDimitry Andric bool SlowDynamicAPInt::operator>(const SlowDynamicAPInt &O) const {
135ac9a064cSDimitry Andric   unsigned Width = getMaxWidth(Val, O.Val);
136ac9a064cSDimitry Andric   return Val.sext(Width).sgt(O.Val.sext(Width));
137ac9a064cSDimitry Andric }
operator <(const SlowDynamicAPInt & O) const138ac9a064cSDimitry Andric bool SlowDynamicAPInt::operator<(const SlowDynamicAPInt &O) const {
139ac9a064cSDimitry Andric   unsigned Width = getMaxWidth(Val, O.Val);
140ac9a064cSDimitry Andric   return Val.sext(Width).slt(O.Val.sext(Width));
141ac9a064cSDimitry Andric }
operator <=(const SlowDynamicAPInt & O) const142ac9a064cSDimitry Andric bool SlowDynamicAPInt::operator<=(const SlowDynamicAPInt &O) const {
143ac9a064cSDimitry Andric   unsigned Width = getMaxWidth(Val, O.Val);
144ac9a064cSDimitry Andric   return Val.sext(Width).sle(O.Val.sext(Width));
145ac9a064cSDimitry Andric }
operator >=(const SlowDynamicAPInt & O) const146ac9a064cSDimitry Andric bool SlowDynamicAPInt::operator>=(const SlowDynamicAPInt &O) const {
147ac9a064cSDimitry Andric   unsigned Width = getMaxWidth(Val, O.Val);
148ac9a064cSDimitry Andric   return Val.sext(Width).sge(O.Val.sext(Width));
149ac9a064cSDimitry Andric }
150ac9a064cSDimitry Andric 
151ac9a064cSDimitry Andric /// ---------------------------------------------------------------------------
152ac9a064cSDimitry Andric /// Arithmetic operators.
153ac9a064cSDimitry Andric /// ---------------------------------------------------------------------------
154ac9a064cSDimitry Andric 
155ac9a064cSDimitry Andric /// Bring a and b to have the same width and then call op(a, b, overflow).
156ac9a064cSDimitry Andric /// If the overflow bit becomes set, resize a and b to double the width and
157ac9a064cSDimitry Andric /// call op(a, b, overflow), returning its result. The operation with double
158ac9a064cSDimitry Andric /// widths should not also overflow.
runOpWithExpandOnOverflow(const APInt & A,const APInt & B,function_ref<APInt (const APInt &,const APInt &,bool & Overflow)> Op)159ac9a064cSDimitry Andric APInt runOpWithExpandOnOverflow(
160ac9a064cSDimitry Andric     const APInt &A, const APInt &B,
161ac9a064cSDimitry Andric     function_ref<APInt(const APInt &, const APInt &, bool &Overflow)> Op) {
162ac9a064cSDimitry Andric   bool Overflow;
163ac9a064cSDimitry Andric   unsigned Width = getMaxWidth(A, B);
164ac9a064cSDimitry Andric   APInt Ret = Op(A.sext(Width), B.sext(Width), Overflow);
165ac9a064cSDimitry Andric   if (!Overflow)
166ac9a064cSDimitry Andric     return Ret;
167ac9a064cSDimitry Andric 
168ac9a064cSDimitry Andric   Width *= 2;
169ac9a064cSDimitry Andric   Ret = Op(A.sext(Width), B.sext(Width), Overflow);
170ac9a064cSDimitry Andric   assert(!Overflow && "double width should be sufficient to avoid overflow!");
171ac9a064cSDimitry Andric   return Ret;
172ac9a064cSDimitry Andric }
173ac9a064cSDimitry Andric 
operator +(const SlowDynamicAPInt & O) const174ac9a064cSDimitry Andric SlowDynamicAPInt SlowDynamicAPInt::operator+(const SlowDynamicAPInt &O) const {
175ac9a064cSDimitry Andric   return SlowDynamicAPInt(
176ac9a064cSDimitry Andric       runOpWithExpandOnOverflow(Val, O.Val, std::mem_fn(&APInt::sadd_ov)));
177ac9a064cSDimitry Andric }
operator -(const SlowDynamicAPInt & O) const178ac9a064cSDimitry Andric SlowDynamicAPInt SlowDynamicAPInt::operator-(const SlowDynamicAPInt &O) const {
179ac9a064cSDimitry Andric   return SlowDynamicAPInt(
180ac9a064cSDimitry Andric       runOpWithExpandOnOverflow(Val, O.Val, std::mem_fn(&APInt::ssub_ov)));
181ac9a064cSDimitry Andric }
operator *(const SlowDynamicAPInt & O) const182ac9a064cSDimitry Andric SlowDynamicAPInt SlowDynamicAPInt::operator*(const SlowDynamicAPInt &O) const {
183ac9a064cSDimitry Andric   return SlowDynamicAPInt(
184ac9a064cSDimitry Andric       runOpWithExpandOnOverflow(Val, O.Val, std::mem_fn(&APInt::smul_ov)));
185ac9a064cSDimitry Andric }
operator /(const SlowDynamicAPInt & O) const186ac9a064cSDimitry Andric SlowDynamicAPInt SlowDynamicAPInt::operator/(const SlowDynamicAPInt &O) const {
187ac9a064cSDimitry Andric   return SlowDynamicAPInt(
188ac9a064cSDimitry Andric       runOpWithExpandOnOverflow(Val, O.Val, std::mem_fn(&APInt::sdiv_ov)));
189ac9a064cSDimitry Andric }
abs(const SlowDynamicAPInt & X)190ac9a064cSDimitry Andric SlowDynamicAPInt detail::abs(const SlowDynamicAPInt &X) {
191ac9a064cSDimitry Andric   return X >= 0 ? X : -X;
192ac9a064cSDimitry Andric }
ceilDiv(const SlowDynamicAPInt & LHS,const SlowDynamicAPInt & RHS)193ac9a064cSDimitry Andric SlowDynamicAPInt detail::ceilDiv(const SlowDynamicAPInt &LHS,
194ac9a064cSDimitry Andric                                  const SlowDynamicAPInt &RHS) {
195ac9a064cSDimitry Andric   if (RHS == -1)
196ac9a064cSDimitry Andric     return -LHS;
197ac9a064cSDimitry Andric   unsigned Width = getMaxWidth(LHS.Val, RHS.Val);
198ac9a064cSDimitry Andric   return SlowDynamicAPInt(APIntOps::RoundingSDiv(
199ac9a064cSDimitry Andric       LHS.Val.sext(Width), RHS.Val.sext(Width), APInt::Rounding::UP));
200ac9a064cSDimitry Andric }
floorDiv(const SlowDynamicAPInt & LHS,const SlowDynamicAPInt & RHS)201ac9a064cSDimitry Andric SlowDynamicAPInt detail::floorDiv(const SlowDynamicAPInt &LHS,
202ac9a064cSDimitry Andric                                   const SlowDynamicAPInt &RHS) {
203ac9a064cSDimitry Andric   if (RHS == -1)
204ac9a064cSDimitry Andric     return -LHS;
205ac9a064cSDimitry Andric   unsigned Width = getMaxWidth(LHS.Val, RHS.Val);
206ac9a064cSDimitry Andric   return SlowDynamicAPInt(APIntOps::RoundingSDiv(
207ac9a064cSDimitry Andric       LHS.Val.sext(Width), RHS.Val.sext(Width), APInt::Rounding::DOWN));
208ac9a064cSDimitry Andric }
209ac9a064cSDimitry Andric // The RHS is always expected to be positive, and the result
210ac9a064cSDimitry Andric /// is always non-negative.
mod(const SlowDynamicAPInt & LHS,const SlowDynamicAPInt & RHS)211ac9a064cSDimitry Andric SlowDynamicAPInt detail::mod(const SlowDynamicAPInt &LHS,
212ac9a064cSDimitry Andric                              const SlowDynamicAPInt &RHS) {
213ac9a064cSDimitry Andric   assert(RHS >= 1 && "mod is only supported for positive divisors!");
214ac9a064cSDimitry Andric   return LHS % RHS < 0 ? LHS % RHS + RHS : LHS % RHS;
215ac9a064cSDimitry Andric }
216ac9a064cSDimitry Andric 
gcd(const SlowDynamicAPInt & A,const SlowDynamicAPInt & B)217ac9a064cSDimitry Andric SlowDynamicAPInt detail::gcd(const SlowDynamicAPInt &A,
218ac9a064cSDimitry Andric                              const SlowDynamicAPInt &B) {
219ac9a064cSDimitry Andric   assert(A >= 0 && B >= 0 && "operands must be non-negative!");
220ac9a064cSDimitry Andric   unsigned Width = getMaxWidth(A.Val, B.Val);
221ac9a064cSDimitry Andric   return SlowDynamicAPInt(
222ac9a064cSDimitry Andric       APIntOps::GreatestCommonDivisor(A.Val.sext(Width), B.Val.sext(Width)));
223ac9a064cSDimitry Andric }
224ac9a064cSDimitry Andric 
225ac9a064cSDimitry Andric /// Returns the least common multiple of A and B.
lcm(const SlowDynamicAPInt & A,const SlowDynamicAPInt & B)226ac9a064cSDimitry Andric SlowDynamicAPInt detail::lcm(const SlowDynamicAPInt &A,
227ac9a064cSDimitry Andric                              const SlowDynamicAPInt &B) {
228ac9a064cSDimitry Andric   SlowDynamicAPInt X = abs(A);
229ac9a064cSDimitry Andric   SlowDynamicAPInt Y = abs(B);
230ac9a064cSDimitry Andric   return (X * Y) / gcd(X, Y);
231ac9a064cSDimitry Andric }
232ac9a064cSDimitry Andric 
233ac9a064cSDimitry Andric /// This operation cannot overflow.
operator %(const SlowDynamicAPInt & O) const234ac9a064cSDimitry Andric SlowDynamicAPInt SlowDynamicAPInt::operator%(const SlowDynamicAPInt &O) const {
235ac9a064cSDimitry Andric   unsigned Width = std::max(Val.getBitWidth(), O.Val.getBitWidth());
236ac9a064cSDimitry Andric   return SlowDynamicAPInt(Val.sext(Width).srem(O.Val.sext(Width)));
237ac9a064cSDimitry Andric }
238ac9a064cSDimitry Andric 
operator -() const239ac9a064cSDimitry Andric SlowDynamicAPInt SlowDynamicAPInt::operator-() const {
240ac9a064cSDimitry Andric   if (Val.isMinSignedValue()) {
241ac9a064cSDimitry Andric     /// Overflow only occurs when the value is the minimum possible value.
242ac9a064cSDimitry Andric     APInt Ret = Val.sext(2 * Val.getBitWidth());
243ac9a064cSDimitry Andric     return SlowDynamicAPInt(-Ret);
244ac9a064cSDimitry Andric   }
245ac9a064cSDimitry Andric   return SlowDynamicAPInt(-Val);
246ac9a064cSDimitry Andric }
247ac9a064cSDimitry Andric 
248ac9a064cSDimitry Andric /// ---------------------------------------------------------------------------
249ac9a064cSDimitry Andric /// Assignment operators, preincrement, predecrement.
250ac9a064cSDimitry Andric /// ---------------------------------------------------------------------------
operator +=(const SlowDynamicAPInt & O)251ac9a064cSDimitry Andric SlowDynamicAPInt &SlowDynamicAPInt::operator+=(const SlowDynamicAPInt &O) {
252ac9a064cSDimitry Andric   *this = *this + O;
253ac9a064cSDimitry Andric   return *this;
254ac9a064cSDimitry Andric }
operator -=(const SlowDynamicAPInt & O)255ac9a064cSDimitry Andric SlowDynamicAPInt &SlowDynamicAPInt::operator-=(const SlowDynamicAPInt &O) {
256ac9a064cSDimitry Andric   *this = *this - O;
257ac9a064cSDimitry Andric   return *this;
258ac9a064cSDimitry Andric }
operator *=(const SlowDynamicAPInt & O)259ac9a064cSDimitry Andric SlowDynamicAPInt &SlowDynamicAPInt::operator*=(const SlowDynamicAPInt &O) {
260ac9a064cSDimitry Andric   *this = *this * O;
261ac9a064cSDimitry Andric   return *this;
262ac9a064cSDimitry Andric }
operator /=(const SlowDynamicAPInt & O)263ac9a064cSDimitry Andric SlowDynamicAPInt &SlowDynamicAPInt::operator/=(const SlowDynamicAPInt &O) {
264ac9a064cSDimitry Andric   *this = *this / O;
265ac9a064cSDimitry Andric   return *this;
266ac9a064cSDimitry Andric }
operator %=(const SlowDynamicAPInt & O)267ac9a064cSDimitry Andric SlowDynamicAPInt &SlowDynamicAPInt::operator%=(const SlowDynamicAPInt &O) {
268ac9a064cSDimitry Andric   *this = *this % O;
269ac9a064cSDimitry Andric   return *this;
270ac9a064cSDimitry Andric }
operator ++()271ac9a064cSDimitry Andric SlowDynamicAPInt &SlowDynamicAPInt::operator++() {
272ac9a064cSDimitry Andric   *this += 1;
273ac9a064cSDimitry Andric   return *this;
274ac9a064cSDimitry Andric }
275ac9a064cSDimitry Andric 
operator --()276ac9a064cSDimitry Andric SlowDynamicAPInt &SlowDynamicAPInt::operator--() {
277ac9a064cSDimitry Andric   *this -= 1;
278ac9a064cSDimitry Andric   return *this;
279ac9a064cSDimitry Andric }
280ac9a064cSDimitry Andric 
281ac9a064cSDimitry Andric /// ---------------------------------------------------------------------------
282ac9a064cSDimitry Andric /// Printing.
283ac9a064cSDimitry Andric /// ---------------------------------------------------------------------------
print(raw_ostream & OS) const284ac9a064cSDimitry Andric void SlowDynamicAPInt::print(raw_ostream &OS) const { OS << Val; }
285ac9a064cSDimitry Andric 
dump() const286ac9a064cSDimitry Andric void SlowDynamicAPInt::dump() const { print(dbgs()); }
287