MathExtras.h revision 360660
1//===-- llvm/Support/MathExtras.h - Useful math functions -------*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// This file contains some functions that are useful for math stuff. 10// 11//===----------------------------------------------------------------------===// 12 13#ifndef LLVM_SUPPORT_MATHEXTRAS_H 14#define LLVM_SUPPORT_MATHEXTRAS_H 15 16#include "llvm/Support/Compiler.h" 17#include "llvm/Support/SwapByteOrder.h" 18#include <algorithm> 19#include <cassert> 20#include <climits> 21#include <cstring> 22#include <limits> 23#include <type_traits> 24 25#ifdef __ANDROID_NDK__ 26#include <android/api-level.h> 27#endif 28 29#ifdef _MSC_VER 30// Declare these intrinsics manually rather including intrin.h. It's very 31// expensive, and MathExtras.h is popular. 32// #include <intrin.h> 33extern "C" { 34unsigned char _BitScanForward(unsigned long *_Index, unsigned long _Mask); 35unsigned char _BitScanForward64(unsigned long *_Index, unsigned __int64 _Mask); 36unsigned char _BitScanReverse(unsigned long *_Index, unsigned long _Mask); 37unsigned char _BitScanReverse64(unsigned long *_Index, unsigned __int64 _Mask); 38} 39#endif 40 41namespace llvm { 42/// The behavior an operation has on an input of 0. 43enum ZeroBehavior { 44 /// The returned value is undefined. 45 ZB_Undefined, 46 /// The returned value is numeric_limits<T>::max() 47 ZB_Max, 48 /// The returned value is numeric_limits<T>::digits 49 ZB_Width 50}; 51 52namespace detail { 53template <typename T, std::size_t SizeOfT> struct TrailingZerosCounter { 54 static unsigned count(T Val, ZeroBehavior) { 55 if (!Val) 56 return std::numeric_limits<T>::digits; 57 if (Val & 0x1) 58 return 0; 59 60 // Bisection method. 61 unsigned ZeroBits = 0; 62 T Shift = std::numeric_limits<T>::digits >> 1; 63 T Mask = std::numeric_limits<T>::max() >> Shift; 64 while (Shift) { 65 if ((Val & Mask) == 0) { 66 Val >>= Shift; 67 ZeroBits |= Shift; 68 } 69 Shift >>= 1; 70 Mask >>= Shift; 71 } 72 return ZeroBits; 73 } 74}; 75 76#if __GNUC__ >= 4 || defined(_MSC_VER) 77template <typename T> struct TrailingZerosCounter<T, 4> { 78 static unsigned count(T Val, ZeroBehavior ZB) { 79 if (ZB != ZB_Undefined && Val == 0) 80 return 32; 81 82#if __has_builtin(__builtin_ctz) || LLVM_GNUC_PREREQ(4, 0, 0) 83 return __builtin_ctz(Val); 84#elif defined(_MSC_VER) 85 unsigned long Index; 86 _BitScanForward(&Index, Val); 87 return Index; 88#endif 89 } 90}; 91 92#if !defined(_MSC_VER) || defined(_M_X64) 93template <typename T> struct TrailingZerosCounter<T, 8> { 94 static unsigned count(T Val, ZeroBehavior ZB) { 95 if (ZB != ZB_Undefined && Val == 0) 96 return 64; 97 98#if __has_builtin(__builtin_ctzll) || LLVM_GNUC_PREREQ(4, 0, 0) 99 return __builtin_ctzll(Val); 100#elif defined(_MSC_VER) 101 unsigned long Index; 102 _BitScanForward64(&Index, Val); 103 return Index; 104#endif 105 } 106}; 107#endif 108#endif 109} // namespace detail 110 111/// Count number of 0's from the least significant bit to the most 112/// stopping at the first 1. 113/// 114/// Only unsigned integral types are allowed. 115/// 116/// \param ZB the behavior on an input of 0. Only ZB_Width and ZB_Undefined are 117/// valid arguments. 118template <typename T> 119unsigned countTrailingZeros(T Val, ZeroBehavior ZB = ZB_Width) { 120 static_assert(std::numeric_limits<T>::is_integer && 121 !std::numeric_limits<T>::is_signed, 122 "Only unsigned integral types are allowed."); 123 return llvm::detail::TrailingZerosCounter<T, sizeof(T)>::count(Val, ZB); 124} 125 126namespace detail { 127template <typename T, std::size_t SizeOfT> struct LeadingZerosCounter { 128 static unsigned count(T Val, ZeroBehavior) { 129 if (!Val) 130 return std::numeric_limits<T>::digits; 131 132 // Bisection method. 133 unsigned ZeroBits = 0; 134 for (T Shift = std::numeric_limits<T>::digits >> 1; Shift; Shift >>= 1) { 135 T Tmp = Val >> Shift; 136 if (Tmp) 137 Val = Tmp; 138 else 139 ZeroBits |= Shift; 140 } 141 return ZeroBits; 142 } 143}; 144 145#if __GNUC__ >= 4 || defined(_MSC_VER) 146template <typename T> struct LeadingZerosCounter<T, 4> { 147 static unsigned count(T Val, ZeroBehavior ZB) { 148 if (ZB != ZB_Undefined && Val == 0) 149 return 32; 150 151#if __has_builtin(__builtin_clz) || LLVM_GNUC_PREREQ(4, 0, 0) 152 return __builtin_clz(Val); 153#elif defined(_MSC_VER) 154 unsigned long Index; 155 _BitScanReverse(&Index, Val); 156 return Index ^ 31; 157#endif 158 } 159}; 160 161#if !defined(_MSC_VER) || defined(_M_X64) 162template <typename T> struct LeadingZerosCounter<T, 8> { 163 static unsigned count(T Val, ZeroBehavior ZB) { 164 if (ZB != ZB_Undefined && Val == 0) 165 return 64; 166 167#if __has_builtin(__builtin_clzll) || LLVM_GNUC_PREREQ(4, 0, 0) 168 return __builtin_clzll(Val); 169#elif defined(_MSC_VER) 170 unsigned long Index; 171 _BitScanReverse64(&Index, Val); 172 return Index ^ 63; 173#endif 174 } 175}; 176#endif 177#endif 178} // namespace detail 179 180/// Count number of 0's from the most significant bit to the least 181/// stopping at the first 1. 182/// 183/// Only unsigned integral types are allowed. 184/// 185/// \param ZB the behavior on an input of 0. Only ZB_Width and ZB_Undefined are 186/// valid arguments. 187template <typename T> 188unsigned countLeadingZeros(T Val, ZeroBehavior ZB = ZB_Width) { 189 static_assert(std::numeric_limits<T>::is_integer && 190 !std::numeric_limits<T>::is_signed, 191 "Only unsigned integral types are allowed."); 192 return llvm::detail::LeadingZerosCounter<T, sizeof(T)>::count(Val, ZB); 193} 194 195/// Get the index of the first set bit starting from the least 196/// significant bit. 197/// 198/// Only unsigned integral types are allowed. 199/// 200/// \param ZB the behavior on an input of 0. Only ZB_Max and ZB_Undefined are 201/// valid arguments. 202template <typename T> T findFirstSet(T Val, ZeroBehavior ZB = ZB_Max) { 203 if (ZB == ZB_Max && Val == 0) 204 return std::numeric_limits<T>::max(); 205 206 return countTrailingZeros(Val, ZB_Undefined); 207} 208 209/// Create a bitmask with the N right-most bits set to 1, and all other 210/// bits set to 0. Only unsigned types are allowed. 211template <typename T> T maskTrailingOnes(unsigned N) { 212 static_assert(std::is_unsigned<T>::value, "Invalid type!"); 213 const unsigned Bits = CHAR_BIT * sizeof(T); 214 assert(N <= Bits && "Invalid bit index"); 215 return N == 0 ? 0 : (T(-1) >> (Bits - N)); 216} 217 218/// Create a bitmask with the N left-most bits set to 1, and all other 219/// bits set to 0. Only unsigned types are allowed. 220template <typename T> T maskLeadingOnes(unsigned N) { 221 return ~maskTrailingOnes<T>(CHAR_BIT * sizeof(T) - N); 222} 223 224/// Create a bitmask with the N right-most bits set to 0, and all other 225/// bits set to 1. Only unsigned types are allowed. 226template <typename T> T maskTrailingZeros(unsigned N) { 227 return maskLeadingOnes<T>(CHAR_BIT * sizeof(T) - N); 228} 229 230/// Create a bitmask with the N left-most bits set to 0, and all other 231/// bits set to 1. Only unsigned types are allowed. 232template <typename T> T maskLeadingZeros(unsigned N) { 233 return maskTrailingOnes<T>(CHAR_BIT * sizeof(T) - N); 234} 235 236/// Get the index of the last set bit starting from the least 237/// significant bit. 238/// 239/// Only unsigned integral types are allowed. 240/// 241/// \param ZB the behavior on an input of 0. Only ZB_Max and ZB_Undefined are 242/// valid arguments. 243template <typename T> T findLastSet(T Val, ZeroBehavior ZB = ZB_Max) { 244 if (ZB == ZB_Max && Val == 0) 245 return std::numeric_limits<T>::max(); 246 247 // Use ^ instead of - because both gcc and llvm can remove the associated ^ 248 // in the __builtin_clz intrinsic on x86. 249 return countLeadingZeros(Val, ZB_Undefined) ^ 250 (std::numeric_limits<T>::digits - 1); 251} 252 253/// Macro compressed bit reversal table for 256 bits. 254/// 255/// http://graphics.stanford.edu/~seander/bithacks.html#BitReverseTable 256static const unsigned char BitReverseTable256[256] = { 257#define R2(n) n, n + 2 * 64, n + 1 * 64, n + 3 * 64 258#define R4(n) R2(n), R2(n + 2 * 16), R2(n + 1 * 16), R2(n + 3 * 16) 259#define R6(n) R4(n), R4(n + 2 * 4), R4(n + 1 * 4), R4(n + 3 * 4) 260 R6(0), R6(2), R6(1), R6(3) 261#undef R2 262#undef R4 263#undef R6 264}; 265 266/// Reverse the bits in \p Val. 267template <typename T> 268T reverseBits(T Val) { 269 unsigned char in[sizeof(Val)]; 270 unsigned char out[sizeof(Val)]; 271 std::memcpy(in, &Val, sizeof(Val)); 272 for (unsigned i = 0; i < sizeof(Val); ++i) 273 out[(sizeof(Val) - i) - 1] = BitReverseTable256[in[i]]; 274 std::memcpy(&Val, out, sizeof(Val)); 275 return Val; 276} 277 278// NOTE: The following support functions use the _32/_64 extensions instead of 279// type overloading so that signed and unsigned integers can be used without 280// ambiguity. 281 282/// Return the high 32 bits of a 64 bit value. 283constexpr inline uint32_t Hi_32(uint64_t Value) { 284 return static_cast<uint32_t>(Value >> 32); 285} 286 287/// Return the low 32 bits of a 64 bit value. 288constexpr inline uint32_t Lo_32(uint64_t Value) { 289 return static_cast<uint32_t>(Value); 290} 291 292/// Make a 64-bit integer from a high / low pair of 32-bit integers. 293constexpr inline uint64_t Make_64(uint32_t High, uint32_t Low) { 294 return ((uint64_t)High << 32) | (uint64_t)Low; 295} 296 297/// Checks if an integer fits into the given bit width. 298template <unsigned N> constexpr inline bool isInt(int64_t x) { 299 return N >= 64 || (-(INT64_C(1)<<(N-1)) <= x && x < (INT64_C(1)<<(N-1))); 300} 301// Template specializations to get better code for common cases. 302template <> constexpr inline bool isInt<8>(int64_t x) { 303 return static_cast<int8_t>(x) == x; 304} 305template <> constexpr inline bool isInt<16>(int64_t x) { 306 return static_cast<int16_t>(x) == x; 307} 308template <> constexpr inline bool isInt<32>(int64_t x) { 309 return static_cast<int32_t>(x) == x; 310} 311 312/// Checks if a signed integer is an N bit number shifted left by S. 313template <unsigned N, unsigned S> 314constexpr inline bool isShiftedInt(int64_t x) { 315 static_assert( 316 N > 0, "isShiftedInt<0> doesn't make sense (refers to a 0-bit number."); 317 static_assert(N + S <= 64, "isShiftedInt<N, S> with N + S > 64 is too wide."); 318 return isInt<N + S>(x) && (x % (UINT64_C(1) << S) == 0); 319} 320 321/// Checks if an unsigned integer fits into the given bit width. 322/// 323/// This is written as two functions rather than as simply 324/// 325/// return N >= 64 || X < (UINT64_C(1) << N); 326/// 327/// to keep MSVC from (incorrectly) warning on isUInt<64> that we're shifting 328/// left too many places. 329template <unsigned N> 330constexpr inline typename std::enable_if<(N < 64), bool>::type 331isUInt(uint64_t X) { 332 static_assert(N > 0, "isUInt<0> doesn't make sense"); 333 return X < (UINT64_C(1) << (N)); 334} 335template <unsigned N> 336constexpr inline typename std::enable_if<N >= 64, bool>::type 337isUInt(uint64_t X) { 338 return true; 339} 340 341// Template specializations to get better code for common cases. 342template <> constexpr inline bool isUInt<8>(uint64_t x) { 343 return static_cast<uint8_t>(x) == x; 344} 345template <> constexpr inline bool isUInt<16>(uint64_t x) { 346 return static_cast<uint16_t>(x) == x; 347} 348template <> constexpr inline bool isUInt<32>(uint64_t x) { 349 return static_cast<uint32_t>(x) == x; 350} 351 352/// Checks if a unsigned integer is an N bit number shifted left by S. 353template <unsigned N, unsigned S> 354constexpr inline bool isShiftedUInt(uint64_t x) { 355 static_assert( 356 N > 0, "isShiftedUInt<0> doesn't make sense (refers to a 0-bit number)"); 357 static_assert(N + S <= 64, 358 "isShiftedUInt<N, S> with N + S > 64 is too wide."); 359 // Per the two static_asserts above, S must be strictly less than 64. So 360 // 1 << S is not undefined behavior. 361 return isUInt<N + S>(x) && (x % (UINT64_C(1) << S) == 0); 362} 363 364/// Gets the maximum value for a N-bit unsigned integer. 365inline uint64_t maxUIntN(uint64_t N) { 366 assert(N > 0 && N <= 64 && "integer width out of range"); 367 368 // uint64_t(1) << 64 is undefined behavior, so we can't do 369 // (uint64_t(1) << N) - 1 370 // without checking first that N != 64. But this works and doesn't have a 371 // branch. 372 return UINT64_MAX >> (64 - N); 373} 374 375/// Gets the minimum value for a N-bit signed integer. 376inline int64_t minIntN(int64_t N) { 377 assert(N > 0 && N <= 64 && "integer width out of range"); 378 379 return -(UINT64_C(1)<<(N-1)); 380} 381 382/// Gets the maximum value for a N-bit signed integer. 383inline int64_t maxIntN(int64_t N) { 384 assert(N > 0 && N <= 64 && "integer width out of range"); 385 386 // This relies on two's complement wraparound when N == 64, so we convert to 387 // int64_t only at the very end to avoid UB. 388 return (UINT64_C(1) << (N - 1)) - 1; 389} 390 391/// Checks if an unsigned integer fits into the given (dynamic) bit width. 392inline bool isUIntN(unsigned N, uint64_t x) { 393 return N >= 64 || x <= maxUIntN(N); 394} 395 396/// Checks if an signed integer fits into the given (dynamic) bit width. 397inline bool isIntN(unsigned N, int64_t x) { 398 return N >= 64 || (minIntN(N) <= x && x <= maxIntN(N)); 399} 400 401/// Return true if the argument is a non-empty sequence of ones starting at the 402/// least significant bit with the remainder zero (32 bit version). 403/// Ex. isMask_32(0x0000FFFFU) == true. 404constexpr inline bool isMask_32(uint32_t Value) { 405 return Value && ((Value + 1) & Value) == 0; 406} 407 408/// Return true if the argument is a non-empty sequence of ones starting at the 409/// least significant bit with the remainder zero (64 bit version). 410constexpr inline bool isMask_64(uint64_t Value) { 411 return Value && ((Value + 1) & Value) == 0; 412} 413 414/// Return true if the argument contains a non-empty sequence of ones with the 415/// remainder zero (32 bit version.) Ex. isShiftedMask_32(0x0000FF00U) == true. 416constexpr inline bool isShiftedMask_32(uint32_t Value) { 417 return Value && isMask_32((Value - 1) | Value); 418} 419 420/// Return true if the argument contains a non-empty sequence of ones with the 421/// remainder zero (64 bit version.) 422constexpr inline bool isShiftedMask_64(uint64_t Value) { 423 return Value && isMask_64((Value - 1) | Value); 424} 425 426/// Return true if the argument is a power of two > 0. 427/// Ex. isPowerOf2_32(0x00100000U) == true (32 bit edition.) 428constexpr inline bool isPowerOf2_32(uint32_t Value) { 429 return Value && !(Value & (Value - 1)); 430} 431 432/// Return true if the argument is a power of two > 0 (64 bit edition.) 433constexpr inline bool isPowerOf2_64(uint64_t Value) { 434 return Value && !(Value & (Value - 1)); 435} 436 437/// Return a byte-swapped representation of the 16-bit argument. 438inline uint16_t ByteSwap_16(uint16_t Value) { 439 return sys::SwapByteOrder_16(Value); 440} 441 442/// Return a byte-swapped representation of the 32-bit argument. 443inline uint32_t ByteSwap_32(uint32_t Value) { 444 return sys::SwapByteOrder_32(Value); 445} 446 447/// Return a byte-swapped representation of the 64-bit argument. 448inline uint64_t ByteSwap_64(uint64_t Value) { 449 return sys::SwapByteOrder_64(Value); 450} 451 452/// Count the number of ones from the most significant bit to the first 453/// zero bit. 454/// 455/// Ex. countLeadingOnes(0xFF0FFF00) == 8. 456/// Only unsigned integral types are allowed. 457/// 458/// \param ZB the behavior on an input of all ones. Only ZB_Width and 459/// ZB_Undefined are valid arguments. 460template <typename T> 461unsigned countLeadingOnes(T Value, ZeroBehavior ZB = ZB_Width) { 462 static_assert(std::numeric_limits<T>::is_integer && 463 !std::numeric_limits<T>::is_signed, 464 "Only unsigned integral types are allowed."); 465 return countLeadingZeros<T>(~Value, ZB); 466} 467 468/// Count the number of ones from the least significant bit to the first 469/// zero bit. 470/// 471/// Ex. countTrailingOnes(0x00FF00FF) == 8. 472/// Only unsigned integral types are allowed. 473/// 474/// \param ZB the behavior on an input of all ones. Only ZB_Width and 475/// ZB_Undefined are valid arguments. 476template <typename T> 477unsigned countTrailingOnes(T Value, ZeroBehavior ZB = ZB_Width) { 478 static_assert(std::numeric_limits<T>::is_integer && 479 !std::numeric_limits<T>::is_signed, 480 "Only unsigned integral types are allowed."); 481 return countTrailingZeros<T>(~Value, ZB); 482} 483 484namespace detail { 485template <typename T, std::size_t SizeOfT> struct PopulationCounter { 486 static unsigned count(T Value) { 487 // Generic version, forward to 32 bits. 488 static_assert(SizeOfT <= 4, "Not implemented!"); 489#if __GNUC__ >= 4 490 return __builtin_popcount(Value); 491#else 492 uint32_t v = Value; 493 v = v - ((v >> 1) & 0x55555555); 494 v = (v & 0x33333333) + ((v >> 2) & 0x33333333); 495 return ((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 24; 496#endif 497 } 498}; 499 500template <typename T> struct PopulationCounter<T, 8> { 501 static unsigned count(T Value) { 502#if __GNUC__ >= 4 503 return __builtin_popcountll(Value); 504#else 505 uint64_t v = Value; 506 v = v - ((v >> 1) & 0x5555555555555555ULL); 507 v = (v & 0x3333333333333333ULL) + ((v >> 2) & 0x3333333333333333ULL); 508 v = (v + (v >> 4)) & 0x0F0F0F0F0F0F0F0FULL; 509 return unsigned((uint64_t)(v * 0x0101010101010101ULL) >> 56); 510#endif 511 } 512}; 513} // namespace detail 514 515/// Count the number of set bits in a value. 516/// Ex. countPopulation(0xF000F000) = 8 517/// Returns 0 if the word is zero. 518template <typename T> 519inline unsigned countPopulation(T Value) { 520 static_assert(std::numeric_limits<T>::is_integer && 521 !std::numeric_limits<T>::is_signed, 522 "Only unsigned integral types are allowed."); 523 return detail::PopulationCounter<T, sizeof(T)>::count(Value); 524} 525 526/// Return the log base 2 of the specified value. 527inline double Log2(double Value) { 528#if defined(__ANDROID_API__) && __ANDROID_API__ < 18 529 return __builtin_log(Value) / __builtin_log(2.0); 530#else 531 return log2(Value); 532#endif 533} 534 535/// Return the floor log base 2 of the specified value, -1 if the value is zero. 536/// (32 bit edition.) 537/// Ex. Log2_32(32) == 5, Log2_32(1) == 0, Log2_32(0) == -1, Log2_32(6) == 2 538inline unsigned Log2_32(uint32_t Value) { 539 return 31 - countLeadingZeros(Value); 540} 541 542/// Return the floor log base 2 of the specified value, -1 if the value is zero. 543/// (64 bit edition.) 544inline unsigned Log2_64(uint64_t Value) { 545 return 63 - countLeadingZeros(Value); 546} 547 548/// Return the ceil log base 2 of the specified value, 32 if the value is zero. 549/// (32 bit edition). 550/// Ex. Log2_32_Ceil(32) == 5, Log2_32_Ceil(1) == 0, Log2_32_Ceil(6) == 3 551inline unsigned Log2_32_Ceil(uint32_t Value) { 552 return 32 - countLeadingZeros(Value - 1); 553} 554 555/// Return the ceil log base 2 of the specified value, 64 if the value is zero. 556/// (64 bit edition.) 557inline unsigned Log2_64_Ceil(uint64_t Value) { 558 return 64 - countLeadingZeros(Value - 1); 559} 560 561/// Return the greatest common divisor of the values using Euclid's algorithm. 562template <typename T> 563inline T greatestCommonDivisor(T A, T B) { 564 while (B) { 565 T Tmp = B; 566 B = A % B; 567 A = Tmp; 568 } 569 return A; 570} 571 572inline uint64_t GreatestCommonDivisor64(uint64_t A, uint64_t B) { 573 return greatestCommonDivisor<uint64_t>(A, B); 574} 575 576/// This function takes a 64-bit integer and returns the bit equivalent double. 577inline double BitsToDouble(uint64_t Bits) { 578 double D; 579 static_assert(sizeof(uint64_t) == sizeof(double), "Unexpected type sizes"); 580 memcpy(&D, &Bits, sizeof(Bits)); 581 return D; 582} 583 584/// This function takes a 32-bit integer and returns the bit equivalent float. 585inline float BitsToFloat(uint32_t Bits) { 586 float F; 587 static_assert(sizeof(uint32_t) == sizeof(float), "Unexpected type sizes"); 588 memcpy(&F, &Bits, sizeof(Bits)); 589 return F; 590} 591 592/// This function takes a double and returns the bit equivalent 64-bit integer. 593/// Note that copying doubles around changes the bits of NaNs on some hosts, 594/// notably x86, so this routine cannot be used if these bits are needed. 595inline uint64_t DoubleToBits(double Double) { 596 uint64_t Bits; 597 static_assert(sizeof(uint64_t) == sizeof(double), "Unexpected type sizes"); 598 memcpy(&Bits, &Double, sizeof(Double)); 599 return Bits; 600} 601 602/// This function takes a float and returns the bit equivalent 32-bit integer. 603/// Note that copying floats around changes the bits of NaNs on some hosts, 604/// notably x86, so this routine cannot be used if these bits are needed. 605inline uint32_t FloatToBits(float Float) { 606 uint32_t Bits; 607 static_assert(sizeof(uint32_t) == sizeof(float), "Unexpected type sizes"); 608 memcpy(&Bits, &Float, sizeof(Float)); 609 return Bits; 610} 611 612/// A and B are either alignments or offsets. Return the minimum alignment that 613/// may be assumed after adding the two together. 614constexpr inline uint64_t MinAlign(uint64_t A, uint64_t B) { 615 // The largest power of 2 that divides both A and B. 616 // 617 // Replace "-Value" by "1+~Value" in the following commented code to avoid 618 // MSVC warning C4146 619 // return (A | B) & -(A | B); 620 return (A | B) & (1 + ~(A | B)); 621} 622 623/// Aligns \c Addr to \c Alignment bytes, rounding up. 624/// 625/// Alignment should be a power of two. This method rounds up, so 626/// alignAddr(7, 4) == 8 and alignAddr(8, 4) == 8. 627inline uintptr_t alignAddr(const void *Addr, size_t Alignment) { 628 assert(Alignment && isPowerOf2_64((uint64_t)Alignment) && 629 "Alignment is not a power of two!"); 630 631 assert((uintptr_t)Addr + Alignment - 1 >= (uintptr_t)Addr); 632 633 return (((uintptr_t)Addr + Alignment - 1) & ~(uintptr_t)(Alignment - 1)); 634} 635 636/// Returns the necessary adjustment for aligning \c Ptr to \c Alignment 637/// bytes, rounding up. 638inline size_t alignmentAdjustment(const void *Ptr, size_t Alignment) { 639 return alignAddr(Ptr, Alignment) - (uintptr_t)Ptr; 640} 641 642/// Returns the next power of two (in 64-bits) that is strictly greater than A. 643/// Returns zero on overflow. 644inline uint64_t NextPowerOf2(uint64_t A) { 645 A |= (A >> 1); 646 A |= (A >> 2); 647 A |= (A >> 4); 648 A |= (A >> 8); 649 A |= (A >> 16); 650 A |= (A >> 32); 651 return A + 1; 652} 653 654/// Returns the power of two which is less than or equal to the given value. 655/// Essentially, it is a floor operation across the domain of powers of two. 656inline uint64_t PowerOf2Floor(uint64_t A) { 657 if (!A) return 0; 658 return 1ull << (63 - countLeadingZeros(A, ZB_Undefined)); 659} 660 661/// Returns the power of two which is greater than or equal to the given value. 662/// Essentially, it is a ceil operation across the domain of powers of two. 663inline uint64_t PowerOf2Ceil(uint64_t A) { 664 if (!A) 665 return 0; 666 return NextPowerOf2(A - 1); 667} 668 669/// Returns the next integer (mod 2**64) that is greater than or equal to 670/// \p Value and is a multiple of \p Align. \p Align must be non-zero. 671/// 672/// If non-zero \p Skew is specified, the return value will be a minimal 673/// integer that is greater than or equal to \p Value and equal to 674/// \p Align * N + \p Skew for some integer N. If \p Skew is larger than 675/// \p Align, its value is adjusted to '\p Skew mod \p Align'. 676/// 677/// Examples: 678/// \code 679/// alignTo(5, 8) = 8 680/// alignTo(17, 8) = 24 681/// alignTo(~0LL, 8) = 0 682/// alignTo(321, 255) = 510 683/// 684/// alignTo(5, 8, 7) = 7 685/// alignTo(17, 8, 1) = 17 686/// alignTo(~0LL, 8, 3) = 3 687/// alignTo(321, 255, 42) = 552 688/// \endcode 689inline uint64_t alignTo(uint64_t Value, uint64_t Align, uint64_t Skew = 0) { 690 assert(Align != 0u && "Align can't be 0."); 691 Skew %= Align; 692 return (Value + Align - 1 - Skew) / Align * Align + Skew; 693} 694 695/// Returns the next integer (mod 2**64) that is greater than or equal to 696/// \p Value and is a multiple of \c Align. \c Align must be non-zero. 697template <uint64_t Align> constexpr inline uint64_t alignTo(uint64_t Value) { 698 static_assert(Align != 0u, "Align must be non-zero"); 699 return (Value + Align - 1) / Align * Align; 700} 701 702/// Returns the integer ceil(Numerator / Denominator). 703inline uint64_t divideCeil(uint64_t Numerator, uint64_t Denominator) { 704 return alignTo(Numerator, Denominator) / Denominator; 705} 706 707/// \c alignTo for contexts where a constant expression is required. 708/// \sa alignTo 709/// 710/// \todo FIXME: remove when \c constexpr becomes really \c constexpr 711template <uint64_t Align> 712struct AlignTo { 713 static_assert(Align != 0u, "Align must be non-zero"); 714 template <uint64_t Value> 715 struct from_value { 716 static const uint64_t value = (Value + Align - 1) / Align * Align; 717 }; 718}; 719 720/// Returns the largest uint64_t less than or equal to \p Value and is 721/// \p Skew mod \p Align. \p Align must be non-zero 722inline uint64_t alignDown(uint64_t Value, uint64_t Align, uint64_t Skew = 0) { 723 assert(Align != 0u && "Align can't be 0."); 724 Skew %= Align; 725 return (Value - Skew) / Align * Align + Skew; 726} 727 728/// Returns the offset to the next integer (mod 2**64) that is greater than 729/// or equal to \p Value and is a multiple of \p Align. \p Align must be 730/// non-zero. 731inline uint64_t OffsetToAlignment(uint64_t Value, uint64_t Align) { 732 return alignTo(Value, Align) - Value; 733} 734 735/// Sign-extend the number in the bottom B bits of X to a 32-bit integer. 736/// Requires 0 < B <= 32. 737template <unsigned B> constexpr inline int32_t SignExtend32(uint32_t X) { 738 static_assert(B > 0, "Bit width can't be 0."); 739 static_assert(B <= 32, "Bit width out of range."); 740 return int32_t(X << (32 - B)) >> (32 - B); 741} 742 743/// Sign-extend the number in the bottom B bits of X to a 32-bit integer. 744/// Requires 0 < B < 32. 745inline int32_t SignExtend32(uint32_t X, unsigned B) { 746 assert(B > 0 && "Bit width can't be 0."); 747 assert(B <= 32 && "Bit width out of range."); 748 return int32_t(X << (32 - B)) >> (32 - B); 749} 750 751/// Sign-extend the number in the bottom B bits of X to a 64-bit integer. 752/// Requires 0 < B < 64. 753template <unsigned B> constexpr inline int64_t SignExtend64(uint64_t x) { 754 static_assert(B > 0, "Bit width can't be 0."); 755 static_assert(B <= 64, "Bit width out of range."); 756 return int64_t(x << (64 - B)) >> (64 - B); 757} 758 759/// Sign-extend the number in the bottom B bits of X to a 64-bit integer. 760/// Requires 0 < B < 64. 761inline int64_t SignExtend64(uint64_t X, unsigned B) { 762 assert(B > 0 && "Bit width can't be 0."); 763 assert(B <= 64 && "Bit width out of range."); 764 return int64_t(X << (64 - B)) >> (64 - B); 765} 766 767/// Subtract two unsigned integers, X and Y, of type T and return the absolute 768/// value of the result. 769template <typename T> 770typename std::enable_if<std::is_unsigned<T>::value, T>::type 771AbsoluteDifference(T X, T Y) { 772 return std::max(X, Y) - std::min(X, Y); 773} 774 775/// Add two unsigned integers, X and Y, of type T. Clamp the result to the 776/// maximum representable value of T on overflow. ResultOverflowed indicates if 777/// the result is larger than the maximum representable value of type T. 778template <typename T> 779typename std::enable_if<std::is_unsigned<T>::value, T>::type 780SaturatingAdd(T X, T Y, bool *ResultOverflowed = nullptr) { 781 bool Dummy; 782 bool &Overflowed = ResultOverflowed ? *ResultOverflowed : Dummy; 783 // Hacker's Delight, p. 29 784 T Z = X + Y; 785 Overflowed = (Z < X || Z < Y); 786 if (Overflowed) 787 return std::numeric_limits<T>::max(); 788 else 789 return Z; 790} 791 792/// Multiply two unsigned integers, X and Y, of type T. Clamp the result to the 793/// maximum representable value of T on overflow. ResultOverflowed indicates if 794/// the result is larger than the maximum representable value of type T. 795template <typename T> 796typename std::enable_if<std::is_unsigned<T>::value, T>::type 797SaturatingMultiply(T X, T Y, bool *ResultOverflowed = nullptr) { 798 bool Dummy; 799 bool &Overflowed = ResultOverflowed ? *ResultOverflowed : Dummy; 800 801 // Hacker's Delight, p. 30 has a different algorithm, but we don't use that 802 // because it fails for uint16_t (where multiplication can have undefined 803 // behavior due to promotion to int), and requires a division in addition 804 // to the multiplication. 805 806 Overflowed = false; 807 808 // Log2(Z) would be either Log2Z or Log2Z + 1. 809 // Special case: if X or Y is 0, Log2_64 gives -1, and Log2Z 810 // will necessarily be less than Log2Max as desired. 811 int Log2Z = Log2_64(X) + Log2_64(Y); 812 const T Max = std::numeric_limits<T>::max(); 813 int Log2Max = Log2_64(Max); 814 if (Log2Z < Log2Max) { 815 return X * Y; 816 } 817 if (Log2Z > Log2Max) { 818 Overflowed = true; 819 return Max; 820 } 821 822 // We're going to use the top bit, and maybe overflow one 823 // bit past it. Multiply all but the bottom bit then add 824 // that on at the end. 825 T Z = (X >> 1) * Y; 826 if (Z & ~(Max >> 1)) { 827 Overflowed = true; 828 return Max; 829 } 830 Z <<= 1; 831 if (X & 1) 832 return SaturatingAdd(Z, Y, ResultOverflowed); 833 834 return Z; 835} 836 837/// Multiply two unsigned integers, X and Y, and add the unsigned integer, A to 838/// the product. Clamp the result to the maximum representable value of T on 839/// overflow. ResultOverflowed indicates if the result is larger than the 840/// maximum representable value of type T. 841template <typename T> 842typename std::enable_if<std::is_unsigned<T>::value, T>::type 843SaturatingMultiplyAdd(T X, T Y, T A, bool *ResultOverflowed = nullptr) { 844 bool Dummy; 845 bool &Overflowed = ResultOverflowed ? *ResultOverflowed : Dummy; 846 847 T Product = SaturatingMultiply(X, Y, &Overflowed); 848 if (Overflowed) 849 return Product; 850 851 return SaturatingAdd(A, Product, &Overflowed); 852} 853 854/// Use this rather than HUGE_VALF; the latter causes warnings on MSVC. 855extern const float huge_valf; 856} // End llvm namespace 857 858#endif 859