aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/ADT/APIntTest.cpp
diff options
context:
space:
mode:
authorPedro Lobo <pedro.lobo@tecnico.ulisboa.pt>2025-08-13 22:37:33 +0100
committerGitHub <noreply@github.com>2025-08-13 22:37:33 +0100
commit08eff57444343e4081690f7947fd81f5ea862a86 (patch)
treed4efe3a2f1822e7d9caafd1d9bbd47a32c1be520 /llvm/unittests/ADT/APIntTest.cpp
parent7a13a756d6ed428aad580f46e2fd053b6b5cbb00 (diff)
downloadllvm-08eff57444343e4081690f7947fd81f5ea862a86.zip
llvm-08eff57444343e4081690f7947fd81f5ea862a86.tar.gz
llvm-08eff57444343e4081690f7947fd81f5ea862a86.tar.bz2
[ADT] Add signed and unsigned mulExtended to APInt (#153399)
Adds `mulsExtended` and `muluExtended` methods to `APInt`, as suggested in #153293. These are based on the `MULDQ` and `MULUDQ` x86 intrinsics.
Diffstat (limited to 'llvm/unittests/ADT/APIntTest.cpp')
-rw-r--r--llvm/unittests/ADT/APIntTest.cpp47
1 files changed, 47 insertions, 0 deletions
diff --git a/llvm/unittests/ADT/APIntTest.cpp b/llvm/unittests/ADT/APIntTest.cpp
index 4741c7b..acc6a09 100644
--- a/llvm/unittests/ADT/APIntTest.cpp
+++ b/llvm/unittests/ADT/APIntTest.cpp
@@ -3103,6 +3103,53 @@ TEST(APIntOpsTest, Mulh) {
EXPECT_EQ(APInt(128, "FFEB498812C66C68D4552DB89B8EBF8F", 16), i128Res);
}
+TEST(APIntOpsTest, muli) {
+ APInt u32a(32, 0x0001'E235);
+ APInt u32b(32, 0xF623'55AD);
+ EXPECT_EQ(0x0001'CFA1'7CA0'76D1, APIntOps::muluExtended(u32a, u32b));
+
+ APInt u64a(64, 0x1234'5678'90AB'CDEF);
+ APInt u64b(64, 0xFEDC'BA09'8765'4321);
+ EXPECT_EQ(APInt(128, "121FA000A3723A57C24A442FE55618CF", 16),
+ APIntOps::muluExtended(u64a, u64b));
+
+ APInt u128a(128, "1234567890ABCDEF1234567890ABCDEF", 16);
+ APInt u128b(128, "FEDCBA0987654321FEDCBA0987654321", 16);
+ EXPECT_EQ(
+ APInt(256,
+ "121FA000A3723A57E68984312C3A8D7E96B428606E1E6BF5C24A442FE55618CF",
+ 16),
+ APIntOps::muluExtended(u128a, u128b));
+
+ APInt s32a(32, 0x1234'5678);
+ APInt s32b(32, 0x10AB'CDEF);
+ APInt s32c(32, 0xFEDC'BA09);
+ EXPECT_EQ(0x012F'7D02'2A42'D208, APIntOps::mulsExtended(s32a, s32b));
+ EXPECT_EQ(0xFFEB'4988'09CA'3A38, APIntOps::mulsExtended(s32a, s32c));
+
+ APInt s64a(64, 0x1234'5678'90AB'CDEF);
+ APInt s64b(64, 0x1234'5678'90FE'DCBA);
+ APInt s64c(64, 0xFEDC'BA09'8765'4321);
+ EXPECT_EQ(APInt(128, "014B66DC328E10C1FB99704184EF03A6", 16),
+ APIntOps::mulsExtended(s64a, s64b));
+ EXPECT_EQ(APInt(128, "FFEB498812C66C68C24A442FE55618CF", 16),
+ APIntOps::mulsExtended(s64a, s64c));
+
+ APInt s128a(128, "1234567890ABCDEF1234567890ABCDEF", 16);
+ APInt s128b(128, "1234567890FEDCBA1234567890FEDCBA", 16);
+ APInt s128c(128, "FEDCBA0987654321FEDCBA0987654321", 16);
+ EXPECT_EQ(
+ APInt(256,
+ "014B66DC328E10C1FE303DF9EA0B2529F87E475F3C6C180DFB99704184EF03A6",
+ 16),
+ APIntOps::mulsExtended(s128a, s128b));
+ EXPECT_EQ(
+ APInt(256,
+ "FFEB498812C66C68D4552DB89B8EBF8F96B428606E1E6BF5C24A442FE55618CF",
+ 16),
+ APIntOps::mulsExtended(s128a, s128c));
+}
+
TEST(APIntTest, RoundingUDiv) {
for (uint64_t Ai = 1; Ai <= 255; Ai++) {
APInt A(8, Ai);