aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/unittests')
-rw-r--r--llvm/unittests/ADT/APIntTest.cpp52
-rw-r--r--llvm/unittests/Support/KnownBitsTest.cpp10
2 files changed, 54 insertions, 8 deletions
diff --git a/llvm/unittests/ADT/APIntTest.cpp b/llvm/unittests/ADT/APIntTest.cpp
index 83cbb02..d5ef63e 100644
--- a/llvm/unittests/ADT/APIntTest.cpp
+++ b/llvm/unittests/ADT/APIntTest.cpp
@@ -2841,6 +2841,58 @@ TEST(APIntTest, multiply) {
EXPECT_EQ(64U, i96.countr_zero());
}
+TEST(APIntOpsTest, Mulh) {
+
+ // Unsigned
+
+ // 32 bits
+ APInt i32a(32, 0x0001'E235);
+ APInt i32b(32, 0xF623'55AD);
+ EXPECT_EQ(0x0001'CFA1, APIntOps::mulhu(i32a, i32b));
+
+ // 64 bits
+ APInt i64a(64, 0x1234'5678'90AB'CDEF);
+ APInt i64b(64, 0xFEDC'BA09'8765'4321);
+ EXPECT_EQ(0x121F'A000'A372'3A57, APIntOps::mulhu(i64a, i64b));
+
+ // 128 bits
+ APInt i128a(128, "1234567890ABCDEF1234567890ABCDEF", 16);
+ APInt i128b(128, "FEDCBA0987654321FEDCBA0987654321", 16);
+ APInt i128Res = APIntOps::mulhu(i128a, i128b);
+ EXPECT_EQ(APInt(128, "121FA000A3723A57E68984312C3A8D7E", 16), i128Res);
+
+ // Signed
+
+ // 32 bits
+ APInt i32c(32, 0x1234'5678); // +ve
+ APInt i32d(32, 0x10AB'CDEF); // +ve
+ APInt i32e(32, 0xFEDC'BA09); // -ve
+
+ EXPECT_EQ(0x012F'7D02, APIntOps::mulhs(i32c, i32d));
+ EXPECT_EQ(0xFFEB'4988, APIntOps::mulhs(i32c, i32e));
+ EXPECT_EQ(0x0001'4B68, APIntOps::mulhs(i32e, i32e));
+
+ // 64 bits
+ APInt i64c(64, 0x1234'5678'90AB'CDEF); // +ve
+ APInt i64d(64, 0x1234'5678'90FE'DCBA); // +ve
+ APInt i64e(64, 0xFEDC'BA09'8765'4321); // -ve
+
+ EXPECT_EQ(0x014B'66DC'328E'10C1, APIntOps::mulhs(i64c, i64d));
+ EXPECT_EQ(0xFFEB'4988'12C6'6C68, APIntOps::mulhs(i64c, i64e));
+ EXPECT_EQ(0x0001'4B68'2174'FA18, APIntOps::mulhs(i64e, i64e));
+
+ // 128 bits
+ APInt i128c(128, "1234567890ABCDEF1234567890ABCDEF", 16); // +ve
+ APInt i128d(128, "1234567890FEDCBA1234567890FEDCBA", 16); // +ve
+ APInt i128e(128, "FEDCBA0987654321FEDCBA0987654321", 16); // -ve
+
+ i128Res = APIntOps::mulhs(i128c, i128d);
+ EXPECT_EQ(APInt(128, "14B66DC328E10C1FE303DF9EA0B2529", 16), i128Res);
+
+ i128Res = APIntOps::mulhs(i128c, i128e);
+ EXPECT_EQ(APInt(128, "FFEB498812C66C68D4552DB89B8EBF8F", 16), i128Res);
+}
+
TEST(APIntTest, RoundingUDiv) {
for (uint64_t Ai = 1; Ai <= 255; Ai++) {
APInt A(8, Ai);
diff --git a/llvm/unittests/Support/KnownBitsTest.cpp b/llvm/unittests/Support/KnownBitsTest.cpp
index 48de088..027d637 100644
--- a/llvm/unittests/Support/KnownBitsTest.cpp
+++ b/llvm/unittests/Support/KnownBitsTest.cpp
@@ -553,17 +553,11 @@ TEST(KnownBitsTest, BinaryExhaustive) {
checkCorrectnessOnlyBinary);
testBinaryOpExhaustive(
KnownBits::mulhs,
- [](const APInt &N1, const APInt &N2) {
- unsigned Bits = N1.getBitWidth();
- return (N1.sext(2 * Bits) * N2.sext(2 * Bits)).extractBits(Bits, Bits);
- },
+ [](const APInt &N1, const APInt &N2) { return APIntOps::mulhs(N1, N2); },
checkCorrectnessOnlyBinary);
testBinaryOpExhaustive(
KnownBits::mulhu,
- [](const APInt &N1, const APInt &N2) {
- unsigned Bits = N1.getBitWidth();
- return (N1.zext(2 * Bits) * N2.zext(2 * Bits)).extractBits(Bits, Bits);
- },
+ [](const APInt &N1, const APInt &N2) { return APIntOps::mulhu(N1, N2); },
checkCorrectnessOnlyBinary);
}