• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "mpl_int_val.h"
17 
18 namespace maple {
19 
operator /(const IntVal & divisor) const20 IntVal IntVal::operator/(const IntVal &divisor) const
21 {
22     DEBUG_ASSERT(width == divisor.width && sign == divisor.sign, "bit-width and sign must be the same");
23     DEBUG_ASSERT(divisor.value != 0, "division by zero");
24     DEBUG_ASSERT(!sign || (!IsMinValue() || !divisor.AreAllBitsOne()), "minValue / -1 leads to overflow");
25 
26     bool isNeg = sign && GetSignBit();
27     bool isDivisorNeg = divisor.sign && divisor.GetSignBit();
28 
29     uint64 dividendVal = isNeg ? (-*this).value : value;
30     uint64 divisorVal = isDivisorNeg ? (-divisor).value : divisor.value;
31 
32     return isNeg != isDivisorNeg ? -IntVal(dividendVal / divisorVal, width, sign)
33                                  : IntVal(dividendVal / divisorVal, width, sign);
34 }
35 
operator %(const IntVal & divisor) const36 IntVal IntVal::operator%(const IntVal &divisor) const
37 {
38     DEBUG_ASSERT(width == divisor.width && sign == divisor.sign, "bit-width and sign must be the same");
39     DEBUG_ASSERT(divisor.value != 0, "division by zero");
40     DEBUG_ASSERT(!sign || (!IsMinValue() || !divisor.AreAllBitsOne()), "minValue % -1 leads to overflow");
41 
42     bool isNeg = sign && GetSignBit();
43     bool isDivisorNeg = divisor.sign && divisor.GetSignBit();
44 
45     uint64 dividendVal = isNeg ? (-*this).value : value;
46     uint64 divisorVal = isDivisorNeg ? (-divisor).value : divisor.value;
47 
48     return isNeg ? -IntVal(dividendVal % divisorVal, width, sign) : IntVal(dividendVal % divisorVal, width, sign);
49 }
50 
operator <<(std::ostream & os,const IntVal & value)51 std::ostream &operator<<(std::ostream &os, const IntVal &value)
52 {
53     int64 val = value.GetExtValue();
54     constexpr int64 valThreshold = 1024;
55 
56     if (val <= valThreshold) {
57         os << val;
58     } else {
59         os << std::hex << "0x" << val << std::dec;
60     }
61 
62     return os;
63 }
64 
65 }  // namespace maple