[libc-commits] [libc] [llvm] [libc][NFC] Remove integer_utils.h (PR #84466)
Guillaume Chatelet via libc-commits
libc-commits at lists.llvm.org
Fri Mar 8 03:40:49 PST 2024
https://github.com/gchatelet created https://github.com/llvm/llvm-project/pull/84466
Its sole user is `BigInt` so moving `full_mul` inside UInt.h.
>From 59131f64cc9c27a832732d20857646b902094f2c Mon Sep 17 00:00:00 2001
From: Guillaume Chatelet <gchatelet at google.com>
Date: Fri, 8 Mar 2024 11:40:21 +0000
Subject: [PATCH] [libc][NFC] Remove integer_utils.h
Its sole user is `BigInt` so moving `full_mul` inside UInt.h.
---
libc/src/__support/CMakeLists.txt | 13 ----
libc/src/__support/UInt.h | 60 ++++++++++++++--
libc/src/__support/integer_utils.h | 69 -------------------
.../llvm-project-overlay/libc/BUILD.bazel | 12 ----
4 files changed, 54 insertions(+), 100 deletions(-)
delete mode 100644 libc/src/__support/integer_utils.h
diff --git a/libc/src/__support/CMakeLists.txt b/libc/src/__support/CMakeLists.txt
index 17c04aa57e6fd6..66e4d808333fdd 100644
--- a/libc/src/__support/CMakeLists.txt
+++ b/libc/src/__support/CMakeLists.txt
@@ -194,24 +194,11 @@ add_header_library(
libc.src.__support.CPP.type_traits
)
-add_header_library(
- integer_utils
- HDRS
- integer_utils.h
- DEPENDS
- .math_extras
- .number_pair
- libc.src.__support.common
- libc.src.__support.CPP.bit
- libc.src.__support.CPP.type_traits
-)
-
add_header_library(
uint
HDRS
UInt.h
DEPENDS
- .integer_utils
.math_extras
.number_pair
libc.src.__support.CPP.array
diff --git a/libc/src/__support/UInt.h b/libc/src/__support/UInt.h
index cf0c5a669ae8dd..bcbae420f80c68 100644
--- a/libc/src/__support/UInt.h
+++ b/libc/src/__support/UInt.h
@@ -14,7 +14,6 @@
#include "src/__support/CPP/limits.h"
#include "src/__support/CPP/optional.h"
#include "src/__support/CPP/type_traits.h"
-#include "src/__support/integer_utils.h"
#include "src/__support/macros/attributes.h" // LIBC_INLINE
#include "src/__support/macros/optimization.h" // LIBC_UNLIKELY
#include "src/__support/math_extras.h" // SumCarry, DiffBorrow
@@ -36,6 +35,52 @@ template <> struct half_width<__uint128_t> : cpp::type_identity<uint64_t> {};
#endif // __SIZEOF_INT128__
template <typename T> using half_width_t = typename half_width<T>::type;
+
+template <typename T> constexpr NumberPair<T> full_mul(T a, T b) {
+ NumberPair<T> pa = split(a);
+ NumberPair<T> pb = split(b);
+ NumberPair<T> prod;
+
+ prod.lo = pa.lo * pb.lo; // exact
+ prod.hi = pa.hi * pb.hi; // exact
+ NumberPair<T> lo_hi = split(pa.lo * pb.hi); // exact
+ NumberPair<T> hi_lo = split(pa.hi * pb.lo); // exact
+
+ constexpr size_t HALF_BIT_WIDTH = sizeof(T) * CHAR_BIT / 2;
+
+ auto r1 = add_with_carry(prod.lo, lo_hi.lo << HALF_BIT_WIDTH, T(0));
+ prod.lo = r1.sum;
+ prod.hi = add_with_carry(prod.hi, lo_hi.hi, r1.carry).sum;
+
+ auto r2 = add_with_carry(prod.lo, hi_lo.lo << HALF_BIT_WIDTH, T(0));
+ prod.lo = r2.sum;
+ prod.hi = add_with_carry(prod.hi, hi_lo.hi, r2.carry).sum;
+
+ return prod;
+}
+
+template <>
+LIBC_INLINE constexpr NumberPair<uint32_t> full_mul<uint32_t>(uint32_t a,
+ uint32_t b) {
+ uint64_t prod = uint64_t(a) * uint64_t(b);
+ NumberPair<uint32_t> result;
+ result.lo = uint32_t(prod);
+ result.hi = uint32_t(prod >> 32);
+ return result;
+}
+
+#ifdef __SIZEOF_INT128__
+template <>
+LIBC_INLINE constexpr NumberPair<uint64_t> full_mul<uint64_t>(uint64_t a,
+ uint64_t b) {
+ __uint128_t prod = __uint128_t(a) * __uint128_t(b);
+ NumberPair<uint64_t> result;
+ result.lo = uint64_t(prod);
+ result.hi = uint64_t(prod >> 64);
+ return result;
+}
+#endif // __SIZEOF_INT128__
+
} // namespace internal
template <size_t Bits, bool Signed, typename WordType = uint64_t>
@@ -264,7 +309,7 @@ struct BigInt {
BigInt<2 * WORD_SIZE, Signed, WordType> partial_sum(0);
WordType carry = 0;
for (size_t i = 0; i < WORD_COUNT; ++i) {
- NumberPair<WordType> prod = full_mul(val[i], x);
+ NumberPair<WordType> prod = internal::full_mul(val[i], x);
BigInt<2 * WORD_SIZE, Signed, WordType> tmp({prod.lo, prod.hi});
carry += partial_sum.add(tmp);
val[i] = partial_sum.val[0];
@@ -298,7 +343,8 @@ struct BigInt {
WordType carry = 0;
for (size_t i = 0; i < WORD_COUNT; ++i) {
for (size_t j = 0; j <= i; j++) {
- NumberPair<WordType> prod = full_mul(val[j], other.val[i - j]);
+ NumberPair<WordType> prod =
+ internal::full_mul(val[j], other.val[i - j]);
BigInt<2 * WORD_SIZE, Signed, WordType> tmp({prod.lo, prod.hi});
carry += partial_sum.add(tmp);
}
@@ -326,7 +372,8 @@ struct BigInt {
i < OTHER_WORDCOUNT ? 0 : i - OTHER_WORDCOUNT + 1;
const size_t upper_idx = i < WORD_COUNT ? i : WORD_COUNT - 1;
for (size_t j = lower_idx; j <= upper_idx; ++j) {
- NumberPair<WordType> prod = full_mul(val[j], other.val[i - j]);
+ NumberPair<WordType> prod =
+ internal::full_mul(val[j], other.val[i - j]);
BigInt<2 * WORD_SIZE, Signed, WordType> tmp({prod.lo, prod.hi});
carry += partial_sum.add(tmp);
}
@@ -368,7 +415,7 @@ struct BigInt {
// product.
for (size_t i = 0; i < WORD_COUNT; ++i) {
NumberPair<WordType> prod =
- full_mul(val[i], other.val[WORD_COUNT - 1 - i]);
+ internal::full_mul(val[i], other.val[WORD_COUNT - 1 - i]);
BigInt<2 * WORD_SIZE, Signed, WordType> tmp({prod.lo, prod.hi});
carry += partial_sum.add(tmp);
}
@@ -377,7 +424,8 @@ struct BigInt {
partial_sum.val[1] = carry;
carry = 0;
for (size_t j = i - WORD_COUNT + 1; j < WORD_COUNT; ++j) {
- NumberPair<WordType> prod = full_mul(val[j], other.val[i - j]);
+ NumberPair<WordType> prod =
+ internal::full_mul(val[j], other.val[i - j]);
BigInt<2 * WORD_SIZE, Signed, WordType> tmp({prod.lo, prod.hi});
carry += partial_sum.add(tmp);
}
diff --git a/libc/src/__support/integer_utils.h b/libc/src/__support/integer_utils.h
deleted file mode 100644
index 15e04bda808231..00000000000000
--- a/libc/src/__support/integer_utils.h
+++ /dev/null
@@ -1,69 +0,0 @@
-//===-- Utilities for integers. ---------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_LIBC_SRC___SUPPORT_INTEGER_UTILS_H
-#define LLVM_LIBC_SRC___SUPPORT_INTEGER_UTILS_H
-
-#include "src/__support/CPP/type_traits.h"
-#include "src/__support/common.h"
-
-#include "math_extras.h"
-#include "number_pair.h"
-
-#include <stdint.h>
-
-namespace LIBC_NAMESPACE {
-
-template <typename T> constexpr NumberPair<T> full_mul(T a, T b) {
- NumberPair<T> pa = split(a);
- NumberPair<T> pb = split(b);
- NumberPair<T> prod;
-
- prod.lo = pa.lo * pb.lo; // exact
- prod.hi = pa.hi * pb.hi; // exact
- NumberPair<T> lo_hi = split(pa.lo * pb.hi); // exact
- NumberPair<T> hi_lo = split(pa.hi * pb.lo); // exact
-
- constexpr size_t HALF_BIT_WIDTH = sizeof(T) * CHAR_BIT / 2;
-
- auto r1 = add_with_carry(prod.lo, lo_hi.lo << HALF_BIT_WIDTH, T(0));
- prod.lo = r1.sum;
- prod.hi = add_with_carry(prod.hi, lo_hi.hi, r1.carry).sum;
-
- auto r2 = add_with_carry(prod.lo, hi_lo.lo << HALF_BIT_WIDTH, T(0));
- prod.lo = r2.sum;
- prod.hi = add_with_carry(prod.hi, hi_lo.hi, r2.carry).sum;
-
- return prod;
-}
-
-template <>
-LIBC_INLINE constexpr NumberPair<uint32_t> full_mul<uint32_t>(uint32_t a,
- uint32_t b) {
- uint64_t prod = uint64_t(a) * uint64_t(b);
- NumberPair<uint32_t> result;
- result.lo = uint32_t(prod);
- result.hi = uint32_t(prod >> 32);
- return result;
-}
-
-#ifdef __SIZEOF_INT128__
-template <>
-LIBC_INLINE constexpr NumberPair<uint64_t> full_mul<uint64_t>(uint64_t a,
- uint64_t b) {
- __uint128_t prod = __uint128_t(a) * __uint128_t(b);
- NumberPair<uint64_t> result;
- result.lo = uint64_t(prod);
- result.hi = uint64_t(prod >> 64);
- return result;
-}
-#endif // __SIZEOF_INT128__
-
-} // namespace LIBC_NAMESPACE
-
-#endif // LLVM_LIBC_SRC___SUPPORT_INTEGER_UTILS_H
diff --git a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
index 5c6cf761ebe7de..127059c529ecdd 100644
--- a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
+++ b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
@@ -438,17 +438,6 @@ libc_support_library(
],
)
-libc_support_library(
- name = "__support_integer_utils",
- hdrs = ["src/__support/integer_utils.h"],
- deps = [
- ":__support_common",
- ":__support_cpp_type_traits",
- ":__support_math_extras",
- ":__support_number_pair",
- ],
-)
-
libc_support_library(
name = "__support_uint",
hdrs = ["src/__support/UInt.h"],
@@ -458,7 +447,6 @@ libc_support_library(
":__support_cpp_limits",
":__support_cpp_optional",
":__support_cpp_type_traits",
- ":__support_integer_utils",
":__support_macros_attributes",
":__support_macros_optimization",
":__support_math_extras",
More information about the libc-commits
mailing list