Index: include/llvm/Support/ScaledNumber.h =================================================================== --- include/llvm/Support/ScaledNumber.h +++ include/llvm/Support/ScaledNumber.h @@ -514,7 +514,7 @@ : Digits(Digits), Scale(Scale) {} private: - ScaledNumber(const std::pair &X) + ScaledNumber(const std::pair &X) : Digits(X.first), Scale(X.second) {} public: @@ -732,10 +732,18 @@ SCALED_NUMBER_BOP(-, -= ) SCALED_NUMBER_BOP(*, *= ) SCALED_NUMBER_BOP(/, /= ) -SCALED_NUMBER_BOP(<<, <<= ) -SCALED_NUMBER_BOP(>>, >>= ) #undef SCALED_NUMBER_BOP +#define SCALED_NUMBER_SHIFT(op, base) \ + template \ + ScaledNumber operator op(const ScaledNumber &L, \ + int16_t Shift) { \ + return ScaledNumber(L) base Shift; \ + } +SCALED_NUMBER_SHIFT(<<, <<= ) +SCALED_NUMBER_SHIFT(>>, >>= ) +#undef SCALED_NUMBER_SHIFT + template raw_ostream &operator<<(raw_ostream &OS, const ScaledNumber &X) { return X.print(OS, 10); Index: unittests/Support/ScaledNumberTest.cpp =================================================================== --- unittests/Support/ScaledNumberTest.cpp +++ unittests/Support/ScaledNumberTest.cpp @@ -155,7 +155,7 @@ EXPECT_EQ(SP32(0xaaaaaaab, -33), getQuotient32(1, 3)); EXPECT_EQ(SP32(0xd5555555, -31), getQuotient32(5, 3)); - // 64-bit division is hard to test, since divide64 doesn't canonicalized its + // 64-bit division is hard to test, since divide64 doesn't canonicalize its // output. However, this is the algorithm the implementation uses: // // - Shift divisor right. @@ -532,4 +532,17 @@ EXPECT_EQ(SP64(0, 0), getDifference64(1, -64, 1, -1)); } +TEST(ScaledNumberHelpersTest, arithmeticOperators) { + EXPECT_EQ(ScaledNumber(1, 3) + ScaledNumber(1, 1), + ScaledNumber(10, 0)); + EXPECT_EQ(ScaledNumber(1, 3) - ScaledNumber(1, 1), + ScaledNumber(6, 0)); + EXPECT_EQ(ScaledNumber(1, 3) * ScaledNumber(1, 1), + ScaledNumber(2, 3)); + EXPECT_EQ(ScaledNumber(1, 3) / ScaledNumber(1, 1), + ScaledNumber(1, 2)); + EXPECT_EQ(ScaledNumber(1, 3) >> 1, ScaledNumber(1, 2)); + EXPECT_EQ(ScaledNumber(1, 3) << 1, ScaledNumber(2, 3)); +} + } // end namespace