LLVM: include/llvm/Support/MathExtras.h Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

13#ifndef LLVM_SUPPORT_MATHEXTRAS_H

14#define LLVM_SUPPORT_MATHEXTRAS_H

15

19#include

20#include

21#include

22#include

23#include

24#include <type_traits>

25

26namespace llvm {

27

28

29

30

31

32template <typename T, typename U>

34 std::enable_if_t<std::is_integral_v && std::is_integral_v>;

35

36

37template <typename T, typename U, typename = enableif_int<T, U>>

39 std::common_type_t<std::make_unsigned_t, std::make_unsigned_t>;

40template <typename T, typename U, typename = enableif_int<T, U>>

42 std::common_type_t<std::make_signed_t, std::make_signed_t>;

43

44

46

61

62

63template <typename T, typename = std::enable_if_t<std::is_floating_point_v>>

64inline constexpr T sqrtpi_v = T(0x1.c5bf891b4ef6bP+0);

67

68

69

70constexpr const char *pis = "3.141592653589793238462643383279502884",

71 *inv_pis = "0.318309886183790671537767526745028724";

72

73}

74

75

76

78 static_assert(std::is_unsigned_v, "Invalid type!");

79 const unsigned Bits = CHAR_BIT * sizeof(T);

80 assert(N <= Bits && "Invalid bit index");

81 if (N == 0)

82 return 0;

83 return T(-1) >> (Bits - N);

84}

85

86

87

91

92

93

97

98

99

103

104

105

106

108#define R2(n) n, n + 2 * 64, n + 1 * 64, n + 3 * 64

109#define R4(n) R2(n), R2(n + 2 * 16), R2(n + 1 * 16), R2(n + 3 * 16)

110#define R6(n) R4(n), R4(n + 2 * 4), R4(n + 1 * 4), R4(n + 3 * 4)

112#undef R2

113#undef R4

114#undef R6

115};

116

117

119#if __has_builtin(__builtin_bitreverse8)

120 if constexpr (std::is_same_v<T, uint8_t>)

121 return __builtin_bitreverse8(Val);

122#endif

123#if __has_builtin(__builtin_bitreverse16)

124 if constexpr (std::is_same_v<T, uint16_t>)

125 return __builtin_bitreverse16(Val);

126#endif

127#if __has_builtin(__builtin_bitreverse32)

128 if constexpr (std::is_same_v<T, uint32_t>)

129 return __builtin_bitreverse32(Val);

130#endif

131#if __has_builtin(__builtin_bitreverse64)

132 if constexpr (std::is_same_v<T, uint64_t>)

133 return __builtin_bitreverse64(Val);

134#endif

135

136 unsigned char in[sizeof(Val)];

137 unsigned char out[sizeof(Val)];

138 std::memcpy(in, &Val, sizeof(Val));

139 for (unsigned i = 0; i < sizeof(Val); ++i)

141 std::memcpy(&Val, out, sizeof(Val));

142 return Val;

143}

144

145

146

147

148

149

153

154

158

159

163

164

165template constexpr bool isInt(int64_t x) {

166 if constexpr (N == 0)

167 return 0 == x;

168 if constexpr (N == 8)

169 return static_cast<int8_t>(x) == x;

170 if constexpr (N == 16)

171 return static_cast<int16_t>(x) == x;

172 if constexpr (N == 32)

173 return static_cast<int32_t>(x) == x;

174 if constexpr (N < 64)

175 return -(INT64_C(1) << (N - 1)) <= x && x < (INT64_C(1) << (N - 1));

176 (void)x;

177 return true;

178}

179

180

181template <unsigned N, unsigned S>

183 static_assert(S < 64, "isShiftedInt<N, S> with S >= 64 is too much.");

184 static_assert(N + S <= 64, "isShiftedInt<N, S> with N + S > 64 is too wide.");

185 return isInt<N + S>(x) && (x % (UINT64_C(1) << S) == 0);

186}

187

188

190 if constexpr (N < 64)

191 return (x >> N) == 0;

192 (void)x;

193 return true;

194}

195

196

197template <unsigned N, unsigned S>

199 static_assert(S < 64, "isShiftedUInt<N, S> with S >= 64 is too much.");

200 static_assert(N + S <= 64,

201 "isShiftedUInt<N, S> with N + S > 64 is too wide.");

202

203 return isUInt<N + S>(x) && (x % (UINT64_C(1) << S) == 0);

204}

205

206

208 assert(N <= 64 && "integer width out of range");

209

210

211

212

213

214

215

216

217 if (N == 0)

218 return 0;

220}

221

222

223inline constexpr int64_t minIntN(int64_t N) {

224 assert(N <= 64 && "integer width out of range");

225

226 if (N == 0)

227 return 0;

229}

230

231

232inline constexpr int64_t maxIntN(int64_t N) {

233 assert(N <= 64 && "integer width out of range");

234

235

236

237 if (N == 0)

238 return 0;

239 return (UINT64_C(1) << (N - 1)) - 1;

240}

241

242

244 return N >= 64 || (x >> N) == 0;

245}

246

247

248inline constexpr bool isIntN(unsigned N, int64_t x) {

250}

251

252

253

254

258

259

260

264

265

266

270

271

272

276

277

278

282

283

287

288

289

290

291

292

294 unsigned &MaskLen) {

296 return false;

299 return true;

300}

301

302

303

304

305

307 unsigned &MaskLen) {

309 return false;

312 return true;

313}

314

315

316

321

322template <size_t kValue>

323LLVM_DEPRECATED("Use ConstantLog2 instead", "ConstantLog2")

327

328

329

330

334

335

336

340

341

342

343

347

348

349

353

354

355

356template <typename U, typename V, typename T = common_uint<U, V>>

358

359

360

361

362

363 return (A | B) & (1 + ~(A | B));

364}

365

366

368 return (A | B) & (1 + ~(A | B));

369}

370

371

372

374 A |= (A >> 1);

375 A |= (A >> 2);

376 A |= (A >> 4);

377 A |= (A >> 8);

378 A |= (A >> 16);

379 A |= (A >> 32);

380 return A + 1;

381}

382

383

384

390

391

392

393template <typename U, typename V, typename T = common_uint<U, V>>

395 assert(Denominator && "Division by zero");

396 T Bias = (Numerator != 0);

397 return (Numerator - Bias) / Denominator + Bias;

398}

399

400

402 assert(Denominator && "Division by zero");

403 uint64_t Bias = (Numerator != 0);

404 return (Numerator - Bias) / Denominator + Bias;

405}

406

407

408

409template <typename U, typename V>

411 return Numerator == std::numeric_limits::min() && Denominator == -1;

412}

413

414

415

416template <typename U, typename V, typename T = common_sint<U, V>>

418 assert(Denominator && "Division by zero");

420 "Divide would overflow");

421 if (!Numerator)

422 return 0;

423

424 T Bias = Denominator >= 0 ? 1 : -1;

425 bool SameSign = (Numerator >= 0) == (Denominator >= 0);

426 return SameSign ? (Numerator - Bias) / Denominator + 1

427 : Numerator / Denominator;

428}

429

430

431

432template <typename U, typename V, typename T = common_sint<U, V>>

434 assert(Denominator && "Division by zero");

436 "Divide would overflow");

437 if (!Numerator)

438 return 0;

439

440 T Bias = Denominator >= 0 ? -1 : 1;

441 bool SameSign = (Numerator >= 0) == (Denominator >= 0);

442 return SameSign ? Numerator / Denominator

443 : (Numerator - Bias) / Denominator - 1;

444}

445

446

447

448template <typename U, typename V, typename T = common_sint<U, V>>

449constexpr T mod(U Numerator, V Denominator) {

450 assert(Denominator >= 1 && "Mod by non-positive number");

451 T Mod = Numerator % Denominator;

452 return Mod < 0 ? Mod + Denominator : Mod;

453}

454

455

456

457template <typename U, typename V, typename T = common_uint<U, V>>

459 assert(Denominator && "Division by zero");

460 T Mod = Numerator % Denominator;

461 return (Numerator / Denominator) +

462 (Mod > (static_cast<T>(Denominator) - 1) / 2);

463}

464

465

466

467

468

469

470

471

472

473

474

475

476

477template <typename U, typename V, typename T = common_uint<U, V>>

479 assert(Align != 0u && "Align can't be 0.");

481 return CeilDiv * Align;

482}

483

484

486 assert(Align != 0u && "Align can't be 0.");

488 return CeilDiv * Align;

489}

490

491

492template <typename U, typename V, typename T = common_uint<U, V>>

495 "Align must be a power of 2");

496 T NegAlign = static_cast<T>(0) - Align;

497 return (Value + (Align - 1)) & NegAlign;

498}

499

500

503 "Align must be a power of 2");

505 return (Value + (Align - 1)) & NegAlign;

506}

507

508

509

510

511

512

513

514

515

516

517

518

519

520

521

522template <typename U, typename V, typename W,

529

530

531

532

533

534template <auto Align, typename V, typename T = common_uint<decltype(Align), V>>

536 static_assert(Align != 0u, "Align must be non-zero");

538 return CeilDiv * Align;

539}

540

541

542

543

544template <typename U, typename V, typename W = uint8_t,

551

552

553

555 static_assert(B <= 32, "Bit width out of range.");

556 if constexpr (B == 0)

557 return 0;

558 return int32_t(X << (32 - B)) >> (32 - B);

559}

560

561

562

564 assert(B <= 32 && "Bit width out of range.");

565 if (B == 0)

566 return 0;

567 return int32_t(X << (32 - B)) >> (32 - B);

568}

569

570

571

573 static_assert(B <= 64, "Bit width out of range.");

574 if constexpr (B == 0)

575 return 0;

576 return int64_t(x << (64 - B)) >> (64 - B);

577}

578

579

580

582 assert(B <= 64 && "Bit width out of range.");

583 if (B == 0)

584 return 0;

585 return int64_t(X << (64 - B)) >> (64 - B);

586}

587

588

589

590

591template <typename T, typename U = std::make_unsigned_t>

593

594 return X < 0 ? -static_cast<U>(X) : X;

595}

596

597

598

599template <typename U, typename V, typename T = common_uint<U, V>>

601 return X > Y ? (X - Y) : (Y - X);

602}

603

604

605

606

607template

608std::enable_if_t<std::is_unsigned_v, T>

610 bool Dummy;

611 bool &Overflowed = ResultOverflowed ? *ResultOverflowed : Dummy;

612

613 T Z = X + Y;

614 Overflowed = (Z < X || Z < Y);

615 if (Overflowed)

616 return std::numeric_limits::max();

617 else

618 return Z;

619}

620

621

622

623template <class T, class... Ts>

625 Ts... Args) {

626 bool Overflowed = false;

628 if (Overflowed)

629 return SaturatingAdd(std::numeric_limits::max(), T(1), Args...);

631}

632

633

634

635

636template

637std::enable_if_t<std::is_unsigned_v, T>

639 bool Dummy;

640 bool &Overflowed = ResultOverflowed ? *ResultOverflowed : Dummy;

641

642

643

644

645

646

647 Overflowed = false;

648

649

650

651

653 const T Max = std::numeric_limits::max();

654 int Log2Max = Log2_64(Max);

655 if (Log2Z < Log2Max) {

656 return X * Y;

657 }

658 if (Log2Z > Log2Max) {

659 Overflowed = true;

660 return Max;

661 }

662

663

664

665

666 T Z = (X >> 1) * Y;

667 if (Z & ~(Max >> 1)) {

668 Overflowed = true;

669 return Max;

670 }

671 Z <<= 1;

672 if (X & 1)

674

675 return Z;

676}

677

678

679

680

681

682template

683std::enable_if_t<std::is_unsigned_v, T>

685 bool Dummy;

686 bool &Overflowed = ResultOverflowed ? *ResultOverflowed : Dummy;

687

689 if (Overflowed)

690 return Product;

691

693}

694

695

697

698

699

700template

702#if __has_builtin(__builtin_add_overflow)

703 return __builtin_add_overflow(X, Y, &Result);

704#else

705

706 using U = std::make_unsigned_t;

707 const U UX = static_cast<U>(X);

708 const U UY = static_cast<U>(Y);

709 const U UResult = UX + UY;

710

711

712 Result = static_cast<T>(UResult);

713

714

715 if (X > 0 && Y > 0)

716 return Result <= 0;

717

718 if (X < 0 && Y < 0)

719 return Result >= 0;

720 return false;

721#endif

722}

723

724

725

726template

728#if __has_builtin(__builtin_sub_overflow)

729 return __builtin_sub_overflow(X, Y, &Result);

730#else

731

732 using U = std::make_unsigned_t;

733 const U UX = static_cast<U>(X);

734 const U UY = static_cast<U>(Y);

735 const U UResult = UX - UY;

736

737

738 Result = static_cast<T>(UResult);

739

740

742 return Result >= 0;

743

744 if (X >= 0 && Y < 0)

745 return Result <= 0;

746 return false;

747#endif

748}

749

750

751

752template

754#if __has_builtin(__builtin_mul_overflow)

755 return __builtin_mul_overflow(X, Y, &Result);

756#else

757

758 using U = std::make_unsigned_t;

759 const U UX = X < 0 ? (0 - static_cast<U>(X)) : static_cast<U>(X);

760 const U UY = Y < 0 ? (0 - static_cast<U>(Y)) : static_cast<U>(Y);

761 const U UResult = UX * UY;

762

763

764 const bool IsNegative = (X < 0) ^ (Y < 0);

765 Result = IsNegative ? (0 - UResult) : UResult;

766

767

768 if (UX == 0 || UY == 0)

769 return false;

770

771

772

773

774 if (IsNegative)

775 return UX > (static_cast<U>(std::numeric_limits::max()) + U(1)) / UY;

776 else

777 return UX > (static_cast<U>(std::numeric_limits::max())) / UY;

778#endif

779}

780

781

782

783#if defined(__i386__) || defined(_M_IX86)

785#else

787#endif

788

789}

790

791#endif

assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")

static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")

static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")

#define LLVM_DEPRECATED(MSG, FIX)

This file contains library features backported from future STL versions.

static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")

static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")

This file implements the C++20 header.

LLVM Value Representation.

constexpr float inv_sqrtpif

Definition MathExtras.h:55

constexpr double sqrtpi

Definition MathExtras.h:65

constexpr float pif

Definition MathExtras.h:53

constexpr float sqrtpif

Definition MathExtras.h:66

constexpr float log10ef

Definition MathExtras.h:52

constexpr float ln10f

Definition MathExtras.h:50

constexpr float phif

Definition MathExtras.h:60

constexpr const char * pis

Definition MathExtras.h:70

constexpr float sqrt3f

Definition MathExtras.h:58

constexpr float log2ef

Definition MathExtras.h:51

constexpr float sqrt2f

Definition MathExtras.h:56

constexpr const char * inv_pis

Definition MathExtras.h:71

constexpr float inv_pif

Definition MathExtras.h:54

constexpr T sqrtpi_v

Definition MathExtras.h:64

constexpr float inv_sqrt2f

Definition MathExtras.h:57

constexpr float egammaf

Definition MathExtras.h:48

constexpr float ln2f

Definition MathExtras.h:49

constexpr float ef

Definition MathExtras.h:47

constexpr float inv_sqrt3f

Definition MathExtras.h:59

This is an optimization pass for GlobalISel generic memory operations.

@ Low

Lower the current thread's priority such that it does not affect foreground tasks significantly.

unsigned Log2_32_Ceil(uint32_t Value)

Return the ceil log base 2 of the specified value, 32 if the value is zero.

Definition MathExtras.h:344

std::enable_if_t< std::is_signed_v< T >, T > MulOverflow(T X, T Y, T &Result)

Multiply two signed integers, computing the two's complement truncated result, returning true if an o...

Definition MathExtras.h:753

constexpr bool divideSignedWouldOverflow(U Numerator, V Denominator)

Definition MathExtras.h:410

LLVM_ATTRIBUTE_ALWAYS_INLINE DynamicAPInt mod(const DynamicAPInt &LHS, const DynamicAPInt &RHS)

is always non-negative.

constexpr uint64_t maxUIntN(uint64_t N)

Gets the maximum value for a N-bit unsigned integer.

Definition MathExtras.h:207

constexpr size_t CTLog2()

Definition MathExtras.h:324

constexpr bool isInt(int64_t x)

Checks if an integer fits into the given bit width.

Definition MathExtras.h:165

unsigned Log2_64_Ceil(uint64_t Value)

Return the ceil log base 2 of the specified value, 64 if the value is zero.

Definition MathExtras.h:350

constexpr bool isMask_32(uint32_t Value)

Return true if the argument is a non-empty sequence of ones starting at the least significant bit wit...

Definition MathExtras.h:255

constexpr T divideFloorSigned(U Numerator, V Denominator)

Returns the integer floor(Numerator / Denominator).

Definition MathExtras.h:433

constexpr int64_t minIntN(int64_t N)

Gets the minimum value for a N-bit signed integer.

Definition MathExtras.h:223

constexpr size_t ConstantLog2()

Compile time Log2.

Definition MathExtras.h:317

constexpr T maskLeadingOnes(unsigned N)

Create a bitmask with the N left-most bits set to 1, and all other bits set to 0.

Definition MathExtras.h:88

constexpr bool isUIntN(unsigned N, uint64_t x)

Checks if an unsigned integer fits into the given (dynamic) bit width.

Definition MathExtras.h:243

constexpr T alignDown(U Value, V Align, W Skew=0)

Returns the largest unsigned integer less than or equal to Value and is Skew mod Align.

Definition MathExtras.h:546

constexpr bool isPowerOf2_64(uint64_t Value)

Return true if the argument is a power of two > 0 (64 bit edition.)

Definition MathExtras.h:284

constexpr bool isShiftedMask_32(uint32_t Value)

Return true if the argument contains a non-empty sequence of ones with the remainder zero (32 bit ver...

Definition MathExtras.h:267

constexpr int popcount(T Value) noexcept

Count the number of set bits in a value.

unsigned Log2_64(uint64_t Value)

Return the floor log base 2 of the specified value, -1 if the value is zero.

Definition MathExtras.h:337

uint64_t PowerOf2Ceil(uint64_t A)

Returns the power of two which is greater than or equal to the given value.

Definition MathExtras.h:385

int countr_zero(T Val)

Count number of 0's from the least significant bit to the most stopping at the first 1.

constexpr bool isShiftedMask_64(uint64_t Value)

Return true if the argument contains a non-empty sequence of ones with the remainder zero (64 bit ver...

Definition MathExtras.h:273

constexpr T MinAlign(U A, V B)

A and B are either alignments or offsets.

Definition MathExtras.h:357

constexpr T divideNearest(U Numerator, V Denominator)

Returns (Numerator / Denominator) rounded by round-half-up.

Definition MathExtras.h:458

constexpr bool has_single_bit(T Value) noexcept

unsigned Log2_32(uint32_t Value)

Return the floor log base 2 of the specified value, -1 if the value is zero.

Definition MathExtras.h:331

int countl_zero(T Val)

Count number of 0's from the most significant bit to the least stopping at the first 1.

constexpr bool isPowerOf2_32(uint32_t Value)

Return true if the argument is a power of two > 0.

Definition MathExtras.h:279

constexpr uint32_t Hi_32(uint64_t Value)

Return the high 32 bits of a 64 bit value.

Definition MathExtras.h:150

constexpr T alignToPowerOf2(U Value, V Align)

Will overflow only if result is not representable in T.

Definition MathExtras.h:493

constexpr bool isMask_64(uint64_t Value)

Return true if the argument is a non-empty sequence of ones starting at the least significant bit wit...

Definition MathExtras.h:261

std::enable_if_t< std::is_unsigned_v< T >, T > SaturatingMultiplyAdd(T X, T Y, T A, bool *ResultOverflowed=nullptr)

Multiply two unsigned integers, X and Y, and add the unsigned integer, A to the product.

Definition MathExtras.h:684

constexpr bool isUInt(uint64_t x)

Checks if an unsigned integer fits into the given bit width.

Definition MathExtras.h:189

std::common_type_t< std::make_unsigned_t< T >, std::make_unsigned_t< U > > common_uint

Definition MathExtras.h:38

constexpr T divideCeilSigned(U Numerator, V Denominator)

Returns the integer ceil(Numerator / Denominator).

Definition MathExtras.h:417

constexpr uint32_t Lo_32(uint64_t Value)

Return the low 32 bits of a 64 bit value.

Definition MathExtras.h:155

constexpr T maskLeadingZeros(unsigned N)

Create a bitmask with the N left-most bits set to 0, and all other bits set to 1.

Definition MathExtras.h:100

@ Mod

The access may modify the value stored in memory.

constexpr T divideCeil(U Numerator, V Denominator)

Returns the integer ceil(Numerator / Denominator).

Definition MathExtras.h:394

LLVM_ABI const float huge_valf

Use this rather than HUGE_VALF; the latter causes warnings on MSVC.

std::enable_if_t< std::is_unsigned_v< T >, T > SaturatingMultiply(T X, T Y, bool *ResultOverflowed=nullptr)

Multiply two unsigned integers, X and Y, of type T.

Definition MathExtras.h:638

constexpr T maskTrailingZeros(unsigned N)

Create a bitmask with the N right-most bits set to 0, and all other bits set to 1.

Definition MathExtras.h:94

std::common_type_t< std::make_signed_t< T >, std::make_signed_t< U > > common_sint

Definition MathExtras.h:41

uint64_t alignTo(uint64_t Size, Align A)

Returns a multiple of A needed to store Size bytes.

constexpr T AbsoluteDifference(U X, V Y)

Subtract two unsigned integers, X and Y, of type T and return the absolute value of the result.

Definition MathExtras.h:600

constexpr U AbsoluteValue(T X)

Return the absolute value of a signed integer, converted to the corresponding unsigned integer type.

Definition MathExtras.h:592

constexpr bool isShiftedInt(int64_t x)

Checks if a signed integer is an N bit number shifted left by S.

Definition MathExtras.h:182

constexpr int64_t maxIntN(int64_t N)

Gets the maximum value for a N-bit signed integer.

Definition MathExtras.h:232

constexpr int32_t SignExtend32(uint32_t X)

Sign-extend the number in the bottom B bits of X to a 32-bit integer.

Definition MathExtras.h:554

constexpr int countr_zero_constexpr(T Val)

Count number of 0's from the least significant bit to the most stopping at the first 1.

constexpr bool isIntN(unsigned N, int64_t x)

Checks if an signed integer fits into the given (dynamic) bit width.

Definition MathExtras.h:248

constexpr T reverseBits(T Val)

Reverse the bits in Val.

Definition MathExtras.h:118

constexpr int64_t SignExtend64(uint64_t x)

Sign-extend the number in the bottom B bits of X to a 64-bit integer.

Definition MathExtras.h:572

std::enable_if_t< std::is_signed_v< T >, T > AddOverflow(T X, T Y, T &Result)

Add two signed integers, computing the two's complement truncated result, returning true if overflow ...

Definition MathExtras.h:701

float stack_float_t

Type to force float point values onto the stack, so that x86 doesn't add hidden precision,...

Definition MathExtras.h:786

std::enable_if_t< std::is_signed_v< T >, T > SubOverflow(T X, T Y, T &Result)

Subtract two signed integers, computing the two's complement truncated result, returning true if an o...

Definition MathExtras.h:727

std::enable_if_t< std::is_integral_v< T > &&std::is_integral_v< U > > enableif_int

Some template parameter helpers to optimize for bitwidth, for functions that take multiple arguments.

Definition MathExtras.h:33

static const unsigned char BitReverseTable256[256]

Macro compressed bit reversal table for 256 bits.

Definition MathExtras.h:107

constexpr T maskTrailingOnes(unsigned N)

Create a bitmask with the N right-most bits set to 1, and all other bits set to 0.

Definition MathExtras.h:77

std::enable_if_t< std::is_unsigned_v< T >, T > SaturatingAdd(T X, T Y, bool *ResultOverflowed=nullptr)

Add two unsigned integers, X and Y, of type T.

Definition MathExtras.h:609

constexpr bool isShiftedUInt(uint64_t x)

Checks if a unsigned integer is an N bit number shifted left by S.

Definition MathExtras.h:198

constexpr uint64_t Make_64(uint32_t High, uint32_t Low)

Make a 64-bit integer from a high / low pair of 32-bit integers.

Definition MathExtras.h:160

constexpr uint64_t NextPowerOf2(uint64_t A)

Returns the next power of two (in 64-bits) that is strictly greater than A.

Definition MathExtras.h:373

This struct is a compact representation of a valid (non-zero power of two) alignment.