[llvm] [APFloat][Perf] Improve fp literal parsing speed + stack usage (PR #221701)
Lewis Crawford via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 7 04:11:01 PDT 2026
https://github.com/LewisCrawford updated https://github.com/llvm/llvm-project/pull/221701
>From a48962219eeb94d3ce1b394ae0f0ae4fdc22a0ad Mon Sep 17 00:00:00 2001
From: Lewis Crawford <lcrawford at nvidia.com>
Date: Mon, 7 Sep 2026 08:59:15 +0000
Subject: [PATCH 1/2] [APFloat][Perf] Improve fp literal parsing speed + stack
usage
Rewrite APFloat decimal conversion to reduce stack use and speed up floating-point literal parsing.
On an `llvm-as` test of 100k randomized half/float/double/fp128 global constants, assembly time fell from 666 ms to 551 ms (17.3%) and peak stack use fell from 25,912 B to 6,640 B (74.4%).
To achieve these results, there are several optimizations:
- Precomputing the powers-of-five factors, replacing a 1,205-word runtime workspace with a 601-word constant table sufficient to construct powers through 5^16383.
- Replacing the two fixed 600-word stack-based scratch/destination buffers with SmallVectors that are dynamically sized based on the input, drastically reducing stack usage.
- These SmallVectors allow for 16 64-bit words to be stored on the stack (enough to cover ordinary f16/f32 inputs, which only need 2-6 words), and larger doubles and fp128s get allocated on the heap instead.
---
llvm/lib/Support/APFloat.cpp | 70 ++-
llvm/lib/Support/APFloatPowerOfFiveTable.inc | 612 +++++++++++++++++++
llvm/unittests/ADT/APFloatTest.cpp | 28 +
llvm/utils/generate-apfloat-pow5-table.py | 48 ++
4 files changed, 734 insertions(+), 24 deletions(-)
create mode 100644 llvm/lib/Support/APFloatPowerOfFiveTable.inc
create mode 100644 llvm/utils/generate-apfloat-pow5-table.py
diff --git a/llvm/lib/Support/APFloat.cpp b/llvm/lib/Support/APFloat.cpp
index 59a6ba3867d40..8b1cc70ce734a 100644
--- a/llvm/lib/Support/APFloat.cpp
+++ b/llvm/lib/Support/APFloat.cpp
@@ -17,6 +17,7 @@
#include "llvm/ADT/FloatingPointMode.h"
#include "llvm/ADT/FoldingSet.h"
#include "llvm/ADT/Hashing.h"
+#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringRef.h"
@@ -27,6 +28,7 @@
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/raw_ostream.h"
#include <cstring>
+#include <iterator>
#include <limits.h>
/// Shared headers from LLVM libc
@@ -309,11 +311,21 @@ bool APFloatBase::isLosslesslyConvertibleTo(const fltSemantics &From,
requires two parts to hold the single-part result). So we add an
extra one to guarantee enough space whilst multiplying. */
const unsigned int maxExponent = 16383;
-const unsigned int maxPrecision = 113;
-const unsigned int maxPowerOfFiveExponent = maxExponent + maxPrecision - 1;
-const unsigned int maxPowerOfFiveParts =
- 2 +
- ((maxPowerOfFiveExponent * 815) / (351 * APFloatBase::integerPartWidth));
+
+// Decimal exponents in the f16 and f32 ranges need at most 2 and 6 parts.
+// Keep 16 parts (128 bytes) inline: enough for 5^413, but not a large stack
+// frame. Longer fractional spellings use heap storage.
+static constexpr unsigned NumPow5PartsOnStack = 16;
+
+static unsigned int powerOfFivePartsForExponent(unsigned int power) {
+ assert(power <= maxExponent);
+
+ // 815 / 351 is an upper bound on log2(5). Reserve an additional part for
+ // tcFullMultiply, which writes the full product width even when its most
+ // significant part is zero.
+ return 2 +
+ ((power * 815) / (351 * APFloatBase::integerPartWidth));
+}
unsigned int APFloatBase::semanticsPrecision(const fltSemantics &semantics) {
return semantics.precision;
@@ -764,36 +776,43 @@ ulpsFromBoundary(const APFloatBase::integerPart *parts, unsigned int bits,
return ~(APFloatBase::integerPart) 0; /* A lot. */
}
+static constexpr unsigned PowerOfFivePartCounts[] = {1, 1, 2, 3, 5, 10,
+ 19, 38, 75, 149, 298};
+
+static constexpr APFloatBase::integerPart PowerOfFiveParts[] = {
+#include "APFloatPowerOfFiveTable.inc"
+};
+
+static_assert([] {
+ unsigned Sum = 0;
+ for (unsigned Count : PowerOfFivePartCounts)
+ Sum += Count;
+ return Sum;
+}() == std::size(PowerOfFiveParts));
+
/* Place pow(5, power) in DST, and return the number of parts used.
DST must be at least one part larger than size of the answer. */
static unsigned int
powerOf5(APFloatBase::integerPart *dst, unsigned int power) {
static const APFloatBase::integerPart firstEightPowers[] = { 1, 5, 25, 125, 625, 3125, 15625, 78125 };
- APFloatBase::integerPart pow5s[maxPowerOfFiveParts * 2 + 5];
- pow5s[0] = 78125 * 5;
- unsigned int partsCount = 1;
- APFloatBase::integerPart scratch[maxPowerOfFiveParts], *p1, *p2, *pow5;
- assert(power <= maxExponent);
+ SmallVector<APFloatBase::integerPart, NumPow5PartsOnStack> scratch;
+ scratch.resize_for_overwrite(powerOfFivePartsForExponent(power));
+
+ APFloatBase::integerPart *p1, *p2;
+ const APFloatBase::integerPart *pow5;
p1 = dst;
- p2 = scratch;
+ p2 = scratch.data();
*p1 = firstEightPowers[power & 7];
power >>= 3;
unsigned result = 1;
- pow5 = pow5s;
+ pow5 = PowerOfFiveParts;
for (unsigned int n = 0; power; power >>= 1, n++) {
- /* Calculate pow(5,pow(2,n+3)) if we haven't yet. */
- if (n != 0) {
- APInt::tcFullMultiply(pow5, pow5 - partsCount, pow5 - partsCount,
- partsCount, partsCount);
- partsCount *= 2;
- if (pow5[partsCount - 1] == 0)
- partsCount--;
- }
+ unsigned partsCount = PowerOfFivePartCounts[n];
if (power & 1) {
APFloatBase::integerPart *tmp;
@@ -2967,7 +2986,10 @@ IEEEFloat::roundSignificandWithExponent(const integerPart *decSigParts,
unsigned sigPartCount, int exp,
roundingMode rounding_mode) {
fltSemantics calcSemantics = { 32767, -32767, 0, 0 };
- integerPart pow5Parts[maxPowerOfFiveParts];
+ unsigned int power = exp >= 0 ? exp : -exp;
+ unsigned int pow5PartCapacity = powerOfFivePartsForExponent(power);
+ SmallVector<integerPart, NumPow5PartsOnStack> pow5Parts;
+ pow5Parts.resize_for_overwrite(pow5PartCapacity);
bool isNearest = rounding_mode == rmNearestTiesToEven ||
rounding_mode == rmNearestTiesToAway;
@@ -2975,7 +2997,7 @@ IEEEFloat::roundSignificandWithExponent(const integerPart *decSigParts,
unsigned parts = partCountForBits(semantics->precision + 11);
/* Calculate pow(5, abs(exp)). */
- unsigned pow5PartCount = powerOf5(pow5Parts, exp >= 0 ? exp : -exp);
+ unsigned pow5PartCount = powerOf5(pow5Parts.data(), power);
for (;; parts *= 2) {
unsigned int excessPrecision, truncatedBits;
@@ -2990,8 +3012,8 @@ IEEEFloat::roundSignificandWithExponent(const integerPart *decSigParts,
opStatus sigStatus = decSig.convertFromUnsignedParts(
decSigParts, sigPartCount, rmNearestTiesToEven);
- opStatus powStatus = pow5.convertFromUnsignedParts(pow5Parts, pow5PartCount,
- rmNearestTiesToEven);
+ opStatus powStatus = pow5.convertFromUnsignedParts(
+ pow5Parts.data(), pow5PartCount, rmNearestTiesToEven);
/* Add exp, as 10^n = 5^n * 2^n. */
decSig.exponent += exp;
diff --git a/llvm/lib/Support/APFloatPowerOfFiveTable.inc b/llvm/lib/Support/APFloatPowerOfFiveTable.inc
new file mode 100644
index 0000000000000..4b8a8b5687761
--- /dev/null
+++ b/llvm/lib/Support/APFloatPowerOfFiveTable.inc
@@ -0,0 +1,612 @@
+// 5^8
+UINT64_C(0x000000000005F5E1),
+// 5^16
+UINT64_C(0x0000002386F26FC1),
+// 5^32
+UINT64_C(0x2D6D415B85ACEF81),
+UINT64_C(0x00000000000004EE),
+// 5^64
+UINT64_C(0x6E38ED64BF6A1F01),
+UINT64_C(0xE93FF9F4DAA797ED),
+UINT64_C(0x0000000000184F03),
+// 5^128
+UINT64_C(0x03DF99092E953E01),
+UINT64_C(0x2374E42F0F1538FD),
+UINT64_C(0xC404DC08D3CFF5EC),
+UINT64_C(0xA6337F19BCCDB0DA),
+UINT64_C(0x0000024EE91F2603),
+// 5^256
+UINT64_C(0xBED3875B982E7C01),
+UINT64_C(0x12152F87D8D99F72),
+UINT64_C(0xCF4A6E706BDE50C6),
+UINT64_C(0x26B2716ED595D80F),
+UINT64_C(0x1D153624ADC666B0),
+UINT64_C(0x63FF540E3C42D35A),
+UINT64_C(0x65F9EF17CC5573C0),
+UINT64_C(0x80DCC7F755BC28F2),
+UINT64_C(0x5FDCEFCEF46EEDDC),
+UINT64_C(0x00000000000553F7),
+// 5^512
+UINT64_C(0x77F27267FC6CF801),
+UINT64_C(0x5D96976F8F9546DC),
+UINT64_C(0xC31E1AD9B83A8A97),
+UINT64_C(0x94E6574746C40513),
+UINT64_C(0x4475B579C88976C1),
+UINT64_C(0xAA1DA1BF28F8733B),
+UINT64_C(0x1E25CFEA703ED321),
+UINT64_C(0xBC51FB2EB21A2F22),
+UINT64_C(0xBFA3EDAC96E14F5D),
+UINT64_C(0xE7FC7153329C57AE),
+UINT64_C(0x85A91924C3FC0695),
+UINT64_C(0xB2908EE0F95F635E),
+UINT64_C(0x1366732A93ABADE4),
+UINT64_C(0x69BE5B0E9449775C),
+UINT64_C(0xB099BC817343AFAC),
+UINT64_C(0xA269974845A71D46),
+UINT64_C(0x8A0B1F138CB07303),
+UINT64_C(0xC1D238D98CAB8A97),
+UINT64_C(0x0000001C633415D4),
+// 5^1024
+UINT64_C(0xF55B2B722919F001),
+UINT64_C(0x1EC29F866E7C215B),
+UINT64_C(0x15C51A88991C4E87),
+UINT64_C(0x4C7D1E1A140AC535),
+UINT64_C(0x0ED1440ECC2CD819),
+UINT64_C(0x7DE16CFB896634EE),
+UINT64_C(0x9FCE837D1E43F61F),
+UINT64_C(0x233E55C7231D2B9C),
+UINT64_C(0xF451218B65DC60D7),
+UINT64_C(0xC96359861C5CD134),
+UINT64_C(0xA7E89431922BBB9F),
+UINT64_C(0x62BE695A9F9F2A07),
+UINT64_C(0x045B7A748E1042C4),
+UINT64_C(0x8AD822A51ABE1DE3),
+UINT64_C(0xD814B505BA34C411),
+UINT64_C(0x8FC51A16BF3FDEB3),
+UINT64_C(0xF56DEEECB1B896BC),
+UINT64_C(0xB6F4654B31FB6BFD),
+UINT64_C(0x6B7595FB101A3616),
+UINT64_C(0x80D98089DC1A47FE),
+UINT64_C(0x9A20288280BDA5A5),
+UINT64_C(0xFC8F1F9031EB0F66),
+UINT64_C(0xE26A7B7E976A3310),
+UINT64_C(0x3CE3A0B8DF68368A),
+UINT64_C(0x75A351A28E4262CE),
+UINT64_C(0x445975836CB0B6C9),
+UINT64_C(0xC356E38A31B5653F),
+UINT64_C(0x0190FBA035FAABA6),
+UINT64_C(0x88BC491B9FC4ED52),
+UINT64_C(0x005B80411640114A),
+UINT64_C(0x1E8D4649F4F3235E),
+UINT64_C(0x73C5534936A8DE06),
+UINT64_C(0xC1A6970CA7E6BD2A),
+UINT64_C(0xD2DB49EF47187094),
+UINT64_C(0xAE6209D4926C3F5B),
+UINT64_C(0x34F4A3C62D433949),
+UINT64_C(0xD9D61A05D4305D94),
+UINT64_C(0x0000000000000325),
+// 5^2048
+UINT64_C(0xE30968651333E001),
+UINT64_C(0x49E28DCFB27D4D3F),
+UINT64_C(0xEE87E354EC2E4721),
+UINT64_C(0x368B8ABBB6067584),
+UINT64_C(0x2ED56D55A5E5A191),
+UINT64_C(0xEA50D142FD827773),
+UINT64_C(0x98342C9E51B78DB2),
+UINT64_C(0x866ED6F1C850DABC),
+UINT64_C(0x9279498719342C12),
+UINT64_C(0x66912E4AD2F869C2),
+UINT64_C(0x57A7842D71C7FD8F),
+UINT64_C(0xFB7FEDCC235552EB),
+UINT64_C(0x38209CE1F3861CE0),
+UINT64_C(0x34C101349713B449),
+UINT64_C(0xA7A8289C8C6C54DE),
+UINT64_C(0xE3CB64F32DBB6643),
+UINT64_C(0xE3892EE98074FF01),
+UINT64_C(0xA8F16F9210C17F94),
+UINT64_C(0x967ABBB3A8281ED6),
+UINT64_C(0x9952FBED5A151440),
+UINT64_C(0xAFE609C313B41E44),
+UINT64_C(0xF111821FA2BCA416),
+UINT64_C(0x91BAC974FB1264B4),
+UINT64_C(0x8E48FF35D6C7D6AB),
+UINT64_C(0xC4A656654419BD43),
+UINT64_C(0x33554C36685E5510),
+UINT64_C(0x0DBD21FEAB498697),
+UINT64_C(0x982DA4663CFE491D),
+UINT64_C(0x9E110C7BCBEA4CA7),
+UINT64_C(0x5FC5A04779C56B8A),
+UINT64_C(0x1AA9F44484D80E2E),
+UINT64_C(0x6A57B1AB730F203C),
+UINT64_C(0x87A7DC62D752F7A6),
+UINT64_C(0x40660460944545FF),
+UINT64_C(0xC9AC375D77C1A42F),
+UINT64_C(0x744695F0E866D7EF),
+UINT64_C(0xA1FC6B9681428C85),
+UINT64_C(0x7BF03C19D7917C7B),
+UINT64_C(0x5715F7915B33EB41),
+UINT64_C(0xDB0708FD8F6CAE5F),
+UINT64_C(0x785CE6B7B125AC8E),
+UINT64_C(0x6F46EADB56C6815B),
+UINT64_C(0x195355D84EEEBEEE),
+UINT64_C(0x9D7389C0A244DE3C),
+UINT64_C(0xCF99D01953761ABD),
+UINT64_C(0x0D76CE39DE9EC24B),
+UINT64_C(0x2E55ECEE70BEB181),
+UINT64_C(0xF56D9D4BD5F86079),
+UINT64_C(0x13EF5A83FB8886FB),
+UINT64_C(0x3F3389A4408F43C5),
+UINT64_C(0x58CCF45CFAD37943),
+UINT64_C(0x415C7F3EF82DF846),
+UINT64_C(0x8B3D5CF42915E818),
+UINT64_C(0xF8DBB57A6A445F27),
+UINT64_C(0x8AD803ECCA8F0070),
+UINT64_C(0x038F9245B2E87C34),
+UINT64_C(0xC7C9DEE0BEDD8A6C),
+UINT64_C(0x2AD3FA140EAC7D56),
+UINT64_C(0xF775677CE0DE0840),
+UINT64_C(0x92BE221EF1BD0AD5),
+UINT64_C(0xCE9D04A487FA1FB9),
+UINT64_C(0x3F6F7024D2C36FA9),
+UINT64_C(0x907855EEB028AF62),
+UINT64_C(0x4EFAC5DCD83E49D6),
+UINT64_C(0x77CD8C6BE7151AAB),
+UINT64_C(0x0AF908B40A753B7D),
+UINT64_C(0xE50F30278C983623),
+UINT64_C(0x1D08E2D694222771),
+UINT64_C(0xF2EE5CA6F7E928E6),
+UINT64_C(0x11EB962B1B61B93C),
+UINT64_C(0xCE2BCBA19648B21C),
+UINT64_C(0x7BBEBE3034F77154),
+UINT64_C(0x8CE329ACE526A319),
+UINT64_C(0xB5DC53D5DE4A74D2),
+UINT64_C(0x000000000009E8B3),
+// 5^4096
+UINT64_C(0xD4724E8D2A67C001),
+UINT64_C(0xF89A1E908EFE7AE7),
+UINT64_C(0x54E05154EF084117),
+UINT64_C(0x506BE82913B1BB51),
+UINT64_C(0xE599574EFB29B172),
+UINT64_C(0x806C0ED3F0DA6146),
+UINT64_C(0x45155E93B86AE5BE),
+UINT64_C(0x7E1E7C34C0591CC2),
+UINT64_C(0x1D1F4CCE7C4823DA),
+UINT64_C(0xD6BFDF759B8BA1E8),
+UINT64_C(0xC2DFAE78E341BE10),
+UINT64_C(0x0F237F1A016B67B2),
+UINT64_C(0xAF6A25743DBEABCD),
+UINT64_C(0x142E0E80CAB3E6D7),
+UINT64_C(0x2C23481161959127),
+UINT64_C(0xCB4BF98287009701),
+UINT64_C(0x88052F8CF8169C84),
+UINT64_C(0xBC13176168DDE6D4),
+UINT64_C(0x54AB9C41FF0B0905),
+UINT64_C(0x1A1C304E7613B224),
+UINT64_C(0x441C2D473BFE167B),
+UINT64_C(0x78F061814F6CEA9C),
+UINT64_C(0x30C7AE41EB659FB8),
+UINT64_C(0xA1EBCAD7947E0D0E),
+UINT64_C(0x2130504DD97D9556),
+UINT64_C(0xF2ACD5071A8309CB),
+UINT64_C(0xFD82373A3F8EC72A),
+UINT64_C(0x280F4D3295A842BC),
+UINT64_C(0x811A4F04F3618AC0),
+UINT64_C(0xD3967A1B6DC3A5B4),
+UINT64_C(0xDCFE388F15B8C898),
+UINT64_C(0x8738B909454EB2A0),
+UINT64_C(0x2BD9CC1110C4E996),
+UINT64_C(0x655FEC303297CD0C),
+UINT64_C(0xF4090EE8AE0725B1),
+UINT64_C(0x398C6FED037D19EE),
+UINT64_C(0xC994A4503B9AF26B),
+UINT64_C(0x75A697B2B5341743),
+UINT64_C(0x3CCB5B92AC50B9C1),
+UINT64_C(0xA8329761FFE06205),
+UINT64_C(0xEB83CADBDFEA5242),
+UINT64_C(0x3C20EE69E79DADF7),
+UINT64_C(0x7021B97A1E0A6817),
+UINT64_C(0x176CA776743074FA),
+UINT64_C(0xECA19BEB77FB8AF6),
+UINT64_C(0xAF63B71292BAF1DE),
+UINT64_C(0xA4EB8F8CDE35C88B),
+UINT64_C(0x40B464A0E137D5E9),
+UINT64_C(0x42923BBD87D1CDE8),
+UINT64_C(0x2E2690F3CD8F62FF),
+UINT64_C(0x59C89F1B095EDC16),
+UINT64_C(0x5138753D1FA8FD5D),
+UINT64_C(0x80152F18390A2B29),
+UINT64_C(0xF984D83E2DD8D925),
+UINT64_C(0xC19E1FAF7A872E74),
+UINT64_C(0xECF9B5D0ED4D542D),
+UINT64_C(0xC53C0ADF9462EA75),
+UINT64_C(0x37A2D4390CAEA134),
+UINT64_C(0x2181327EC8FA2E8A),
+UINT64_C(0x2D2408206E7BB827),
+UINT64_C(0x5893D4B850BE10E0),
+UINT64_C(0x1F2B2322AB312BB9),
+UINT64_C(0xBF627EDE440B3F25),
+UINT64_C(0xB608B89572DAC789),
+UINT64_C(0x86DEB3F078787E2A),
+UINT64_C(0xBB9373F46FEE7AAB),
+UINT64_C(0xF7D8B57E27ECF57B),
+UINT64_C(0x3D04E8D2FCA26A9F),
+UINT64_C(0x3172826AC9DF13CB),
+UINT64_C(0xA8FCD8E0CD9E8D7C),
+UINT64_C(0x307641D9B2C39497),
+UINT64_C(0x2608C4CF1CC939C1),
+UINT64_C(0x3D326A7EB6D1C7BF),
+UINT64_C(0x8E13E25FEEAF19E6),
+UINT64_C(0x2DFE6D97EE63302B),
+UINT64_C(0xE41D3CC425971D58),
+UINT64_C(0xAB8DB59A0A80627C),
+UINT64_C(0xE90AFB779EEA37C8),
+UINT64_C(0x9EE3352C90CA19CF),
+UINT64_C(0xFE78D6823613C850),
+UINT64_C(0x5B060904788F6E50),
+UINT64_C(0x3FECB534B71BD1A4),
+UINT64_C(0x20C33857B32C450C),
+UINT64_C(0x0239F4CEA6E9CFDA),
+UINT64_C(0xA19ADB9548497187),
+UINT64_C(0x95ACA6A8B492ED8A),
+UINT64_C(0xCF1B23504DCD6CD9),
+UINT64_C(0x1A67778CFBE8B12A),
+UINT64_C(0xC32DA38338EB3ACC),
+UINT64_C(0xA03F40A8FB126AB1),
+UINT64_C(0xE9CE4724ED5BF546),
+UINT64_C(0x73A130D84C4A74FD),
+UINT64_C(0xA2EBD6C1D9960E2D),
+UINT64_C(0x6F233B7C94AB6FEB),
+UINT64_C(0x8E7B9A7349126080),
+UINT64_C(0xD298F9994B8C9091),
+UINT64_C(0xA96DDEFF35E836B5),
+UINT64_C(0x6B0DD9BC96119B31),
+UINT64_C(0x282566FBC6CC3F8D),
+UINT64_C(0xD6769F3B72B882E7),
+UINT64_C(0x00FC509BA674343D),
+UINT64_C(0xD6266A3FDCBF7789),
+UINT64_C(0x4E89541BAE9641FD),
+UINT64_C(0x53400D0311953407),
+UINT64_C(0xE5B533458E0DD75A),
+UINT64_C(0x108B89BC108F19AD),
+UINT64_C(0xE03B2B6341A4C954),
+UINT64_C(0x97ACED8E437B3D7F),
+UINT64_C(0x2C5508C2CBD66670),
+UINT64_C(0x5C4F2EF0650EBC69),
+UINT64_C(0x9985A2DF904FF6BF),
+UINT64_C(0x5ED8D2399FADDD9E),
+UINT64_C(0xE3E51CB925585832),
+UINT64_C(0x56C02D9A0FF4F1D4),
+UINT64_C(0xC1A08A138C4EF804),
+UINT64_C(0xE6D2767113FD01C8),
+UINT64_C(0x9D0176CCA7C234F4),
+UINT64_C(0x4D8BFA89D0D73DF2),
+UINT64_C(0x2B17E0B2544F10CD),
+UINT64_C(0xFD86FE49B70A5C7D),
+UINT64_C(0x214495BBDF373F41),
+UINT64_C(0x00D313D584E857FD),
+UINT64_C(0xA4BA47440496FCBE),
+UINT64_C(0xAEC29E6EE8CAC982),
+UINT64_C(0x7000A51987EC7038),
+UINT64_C(0xFF66E42CAEEE333B),
+UINT64_C(0x03B4F63B8AFD6B25),
+UINT64_C(0x5AB8D9C7BD7991DC),
+UINT64_C(0x48741A6C2ED4684E),
+UINT64_C(0x2FDC6349AF06940D),
+UINT64_C(0xE974996FB03D7ECD),
+UINT64_C(0x52EC8721AC7867F9),
+UINT64_C(0x8EDD2D00BCDD9D4A),
+UINT64_C(0x41C759F83557DE06),
+UINT64_C(0xA75409F23956D4B9),
+UINT64_C(0xB6100FAB123CD8A1),
+UINT64_C(0x2E8D623B3E7B21E2),
+UINT64_C(0xBCA35F7792959DA2),
+UINT64_C(0x35FCB457200C03A5),
+UINT64_C(0xF74EB9281BB6C6E4),
+UINT64_C(0x87CC1D213D5D0B54),
+UINT64_C(0x18AE42404964046F),
+UINT64_C(0x8BD2B496D868B275),
+UINT64_C(0xC234D8F51C5563F4),
+UINT64_C(0xF9151FFFF868E970),
+UINT64_C(0x271133EEAE7BE4A2),
+UINT64_C(0x25254932BB0FD922),
+UINT64_C(0x104BCD64A60A9FC0),
+UINT64_C(0x0000006230290145),
+// 5^8192
+UINT64_C(0x9F34522664CF8001),
+UINT64_C(0x7B8D5053644963E5),
+UINT64_C(0xB945C82F49F0AA29),
+UINT64_C(0x933B6BB8430FF478),
+UINT64_C(0x64C501D45FF82D0A),
+UINT64_C(0x9EC1E1B373BBF174),
+UINT64_C(0xE90106893BFBE803),
+UINT64_C(0x3FEF8D80F7390D8E),
+UINT64_C(0x2C73446BF31D1325),
+UINT64_C(0x1C19E379F5CA7A92),
+UINT64_C(0xF52D9D9C270AF2BE),
+UINT64_C(0x3ABF72E1EB2BED48),
+UINT64_C(0x7ECF35084AC4FFC2),
+UINT64_C(0x38597A5A22019A82),
+UINT64_C(0x9A51FF6EBE6A7B3C),
+UINT64_C(0x0C0ABE9DA2D28437),
+UINT64_C(0xC79887FF7C9EC6EA),
+UINT64_C(0x436420D05851C899),
+UINT64_C(0x72B5547FEFEAD581),
+UINT64_C(0x077AD8F899B1D2B5),
+UINT64_C(0x3B4305ED5CDDBF5B),
+UINT64_C(0x2D88F3FDE3861AC7),
+UINT64_C(0x393220AA3D6B43BE),
+UINT64_C(0x1CD62095E5382405),
+UINT64_C(0x87A0D1E161A10C96),
+UINT64_C(0x68C933E6CA95A55D),
+UINT64_C(0x778089BB9EE082E2),
+UINT64_C(0xFBB6D8D441429EE9),
+UINT64_C(0x26CF5471C529500D),
+UINT64_C(0xD6C9B14068B9BE29),
+UINT64_C(0x8415185207BE635A),
+UINT64_C(0x83730335B5572182),
+UINT64_C(0xDD312D31EB2300B4),
+UINT64_C(0x488DA59C05D6DD9B),
+UINT64_C(0xDA2C2E4037784D25),
+UINT64_C(0x6A57D7206A8D92FA),
+UINT64_C(0xF07A8632950B41AC),
+UINT64_C(0x2ECAD06ACD55F062),
+UINT64_C(0x34C98BB0E6A3DFE7),
+UINT64_C(0xB60521B19C767D8F),
+UINT64_C(0xE87D16BE752AAFD1),
+UINT64_C(0xE58A8B0C9DE1D728),
+UINT64_C(0x2FA2C119C6013830),
+UINT64_C(0x519B40C83C4F9156),
+UINT64_C(0xAB78701B5058FC8F),
+UINT64_C(0xC502A554ADC59C47),
+UINT64_C(0x6647F04C0FB3286F),
+UINT64_C(0x5EA495C89DB4076E),
+UINT64_C(0xB4F00F8B9C74FAB1),
+UINT64_C(0xD092B4C6897C7A3C),
+UINT64_C(0x32F31FA8283E0340),
+UINT64_C(0x67B63DE2EEB708CC),
+UINT64_C(0xEF2BC02B4F7B3C8B),
+UINT64_C(0xC49344C0DA14BFE3),
+UINT64_C(0xB6C4E69EAABC85BE),
+UINT64_C(0x63A110162ECE8AA6),
+UINT64_C(0x726AE4D919CFBA4D),
+UINT64_C(0xEE6AE7070FC90B42),
+UINT64_C(0x4D9AABC54290B04A),
+UINT64_C(0xF34906CDFB2B070E),
+UINT64_C(0x52CA97091FF54B0A),
+UINT64_C(0x164315700B42BFE1),
+UINT64_C(0x6B5565BB980F3076),
+UINT64_C(0x9CE63C76EB8C4C4A),
+UINT64_C(0x3DA24C53B9E4C771),
+UINT64_C(0xB50E3C666F0266FA),
+UINT64_C(0x01BB4B9676E34F79),
+UINT64_C(0x0FBEA1249948CF3E),
+UINT64_C(0xA1FA4EDC86BEAD12),
+UINT64_C(0xC3B97BF9D11E901C),
+UINT64_C(0x370CA58E71730E03),
+UINT64_C(0x886467E248B19715),
+UINT64_C(0x3C727E24DB237497),
+UINT64_C(0x8E67D76E2116CCD2),
+UINT64_C(0x34BDEDD3F973AECF),
+UINT64_C(0xB042AB0531D680EC),
+UINT64_C(0xFC5C3C17770E96A0),
+UINT64_C(0xB8204ECEAB6F1874),
+UINT64_C(0x416C0CED5843F3A5),
+UINT64_C(0x9578018311DD112F),
+UINT64_C(0x7E0E8613B1C74BD8),
+UINT64_C(0xA79FFC1096C6453B),
+UINT64_C(0xFCD6DA0AB2157651),
+UINT64_C(0x3DD0CCAC836A34A7),
+UINT64_C(0x496049ED316E5A36),
+UINT64_C(0xDEA1A97D0322BCB2),
+UINT64_C(0x39578D53CDF2AA5A),
+UINT64_C(0x030565C91D1AA931),
+UINT64_C(0x324E0A27D198CBED),
+UINT64_C(0x284325345DB83E8A),
+UINT64_C(0x5CB134C090BF23E8),
+UINT64_C(0x009E5051DD0ADAB6),
+UINT64_C(0x7E36A6D7F8AD61DA),
+UINT64_C(0xBDFFE6AA84C75E57),
+UINT64_C(0x138D680EB5D5532E),
+UINT64_C(0x4A5F74A1BD84DDAC),
+UINT64_C(0x55538CFACCFF00D1),
+UINT64_C(0x48528011B0948B8C),
+UINT64_C(0x9E047AD7E345F82E),
+UINT64_C(0xEA77BEF06EE770FF),
+UINT64_C(0x2F1625670FC13669),
+UINT64_C(0x0614686C869426AC),
+UINT64_C(0x4263ED823A3FF464),
+UINT64_C(0x57205A7AB3589B47),
+UINT64_C(0xAE6FC46B213F24AD),
+UINT64_C(0xD92B133F3DE03E4E),
+UINT64_C(0x1B49C24A315A589B),
+UINT64_C(0x1641C13873381BCB),
+UINT64_C(0xBC680ADA7BC99425),
+UINT64_C(0x962E9884A5CFBC9A),
+UINT64_C(0xFC8D12F60A960D70),
+UINT64_C(0x60ACC868ED18EF4C),
+UINT64_C(0x131130369AEA5D14),
+UINT64_C(0x2D99A5B0C747C87E),
+UINT64_C(0x006B36583A369BB3),
+UINT64_C(0xE43FA6E6118A5135),
+UINT64_C(0xA13DC05EB4947190),
+UINT64_C(0x0DBD7170D7733DB8),
+UINT64_C(0x117ED7E7C3FB67D1),
+UINT64_C(0xC05FE99EE2D72A49),
+UINT64_C(0xD971A25B9638DB40),
+UINT64_C(0x1A1595594239D468),
+UINT64_C(0xC1117392850A223C),
+UINT64_C(0x567B5FC022D2DBD8),
+UINT64_C(0xC051007A92C5B4EB),
+UINT64_C(0xFB35572011CC0099),
+UINT64_C(0x398481616907810D),
+UINT64_C(0x61D19EF25E8534F4),
+UINT64_C(0x8A0AB03C2EE8C466),
+UINT64_C(0x879AA514C234AF76),
+UINT64_C(0x59E5DA579774A235),
+UINT64_C(0xF339BD5A9BC466B3),
+UINT64_C(0xBBB5FD6744AB026D),
+UINT64_C(0x3685C9F22B977202),
+UINT64_C(0x7054359E03E5DC00),
+UINT64_C(0x9BA11F085239CFB0),
+UINT64_C(0x9C258687F8237562),
+UINT64_C(0x52C7BF8FA3B510DD),
+UINT64_C(0x3245E079B31ED0CF),
+UINT64_C(0xBAEE38C7FF9FF8D3),
+UINT64_C(0xF702B3B9F17D5562),
+UINT64_C(0xCBCA275DCC4C8563),
+UINT64_C(0xE817DBACE005D9D1),
+UINT64_C(0x62CEE35005C6920A),
+UINT64_C(0x19E049B90F1DEAC0),
+UINT64_C(0xB2A27A1659599F74),
+UINT64_C(0x7DCEF00DF0911D5A),
+UINT64_C(0x375522513603DD66),
+UINT64_C(0x5FA022DA97813735),
+UINT64_C(0xEFBE57C20D849416),
+UINT64_C(0x5761929630A0E592),
+UINT64_C(0x11735043C953CC47),
+UINT64_C(0xC0444BE0A83526AD),
+UINT64_C(0x16FF5136B5F8463C),
+UINT64_C(0xF037572C2A0A6631),
+UINT64_C(0xB1BF8DAAD30464DA),
+UINT64_C(0x0F3E9E7E7F5718F7),
+UINT64_C(0xC26F2624E5A4CFE7),
+UINT64_C(0xDFE8F4858C9B5AE4),
+UINT64_C(0xC64A1509F6FA82E3),
+UINT64_C(0x3024B220ACB24AEA),
+UINT64_C(0xDDCDFEDDDDB02AC0),
+UINT64_C(0x384C86C3D834C574),
+UINT64_C(0xDD48A571D904E099),
+UINT64_C(0x77B35C744550A05F),
+UINT64_C(0xAAEBDC6D81E85F71),
+UINT64_C(0xD4CDC0540F9BB0B1),
+UINT64_C(0x845786AF7AF4DF85),
+UINT64_C(0xDF2A91CAE5E53887),
+UINT64_C(0x5689A3C4F6A58211),
+UINT64_C(0xA705983A8CF6AA15),
+UINT64_C(0x2CE7FEF09FBF2F52),
+UINT64_C(0x4A3B536548E84A62),
+UINT64_C(0xD48A0872F8281A47),
+UINT64_C(0xF0929C3E8423DCF6),
+UINT64_C(0xE9EC071B044A5049),
+UINT64_C(0x20E30C1B17DECC36),
+UINT64_C(0x3342196A45FC2813),
+UINT64_C(0x6601E33746AFB7F9),
+UINT64_C(0xF18094D130754439),
+UINT64_C(0x61410DD1D38B4112),
+UINT64_C(0xD97D4DD8D8796B36),
+UINT64_C(0x8080519147E9BC0B),
+UINT64_C(0xCDE438C11584E2DA),
+UINT64_C(0x409659A1955D24F1),
+UINT64_C(0x5A09635F1B0950B1),
+UINT64_C(0x615472B965B1FEBE),
+UINT64_C(0x6308E067525DC00A),
+UINT64_C(0xD4E705A44089E2D4),
+UINT64_C(0x32C18B2643FC9209),
+UINT64_C(0xAF2711534447A5FA),
+UINT64_C(0x4DC4F0D23617CADC),
+UINT64_C(0x6AA116EF692EB386),
+UINT64_C(0x0641DC0B655991BC),
+UINT64_C(0xC655966454469597),
+UINT64_C(0x4BDC0D1A749C0FE8),
+UINT64_C(0xC5292A61A7D3381E),
+UINT64_C(0x42474CC24EB65FDC),
+UINT64_C(0x19DFC9EEF2C6B173),
+UINT64_C(0xBECE2EE30A19A199),
+UINT64_C(0xAA03AA7CC68B778D),
+UINT64_C(0xAE54D2BEC8DB86F0),
+UINT64_C(0xDEE3F48FB92A01E0),
+UINT64_C(0xF6AE28526023C0A9),
+UINT64_C(0xA441CB9EA233763B),
+UINT64_C(0x3A8BB4B73246DDDD),
+UINT64_C(0x308EF2C844FAA3C3),
+UINT64_C(0xD2862534FD1C8516),
+UINT64_C(0x62336F6F3B25EBE7),
+UINT64_C(0x0B8E2CE60C336A45),
+UINT64_C(0x11EEA1F2E867F171),
+UINT64_C(0x68DF4903523972EC),
+UINT64_C(0x51EF4CB750C05824),
+UINT64_C(0x3FFAE115CB4DF2A8),
+UINT64_C(0x3ED1635FB51ACA2F),
+UINT64_C(0x0A5AC09FD6FF1CC6),
+UINT64_C(0x0A3DC76FDE8ED9D6),
+UINT64_C(0x37991DDE5DC2D8DD),
+UINT64_C(0x80AD6E13F95BACB2),
+UINT64_C(0xD4F8C7A6163005EE),
+UINT64_C(0xA4760F083225D180),
+UINT64_C(0x9B2B1A875FFF004D),
+UINT64_C(0x5CD00B66E7EA8576),
+UINT64_C(0x285DD80DEC478452),
+UINT64_C(0x4301B3A120112439),
+UINT64_C(0xFACBB68CFF879FC8),
+UINT64_C(0xB17FDF84AF6AF6B8),
+UINT64_C(0xF4489576C208D9F1),
+UINT64_C(0xADCC862C8794A6E9),
+UINT64_C(0x931685A40E83E54C),
+UINT64_C(0x1E40293BAB01C580),
+UINT64_C(0x1F1DDF7FCAD784FA),
+UINT64_C(0xCEE722B26B856084),
+UINT64_C(0x74254EB41C39938B),
+UINT64_C(0xB9C26D9AC7CCEBF4),
+UINT64_C(0x2E3ECE246B08DFB9),
+UINT64_C(0xDFF60410981455EC),
+UINT64_C(0xE06FA38BBC804E2B),
+UINT64_C(0x72E53C52B534540C),
+UINT64_C(0xB2A5C05A02DFB2EF),
+UINT64_C(0x973133385002A2A5),
+UINT64_C(0xD61DF455597C53FF),
+UINT64_C(0x39AC2EC534E5261A),
+UINT64_C(0x388B7539C6BC0CAB),
+UINT64_C(0x00EAC7043F732FC0),
+UINT64_C(0xC089971E92FB21D9),
+UINT64_C(0x7AF93F8FB4FFA503),
+UINT64_C(0xA8311B2372E353B6),
+UINT64_C(0x1DE496CA8266C9AF),
+UINT64_C(0xD6FA0B51DBDB16B0),
+UINT64_C(0xBD5630899991A5EF),
+UINT64_C(0x0954A1E3168CBE0F),
+UINT64_C(0x53D09723537B9245),
+UINT64_C(0x86558CB92867272D),
+UINT64_C(0xFAC85D100B83F026),
+UINT64_C(0x1E5DDB95F8562951),
+UINT64_C(0x48D27B92AD3668C8),
+UINT64_C(0x19B58A99C930B7E6),
+UINT64_C(0xA9CDA917A3DE74E3),
+UINT64_C(0x7A4DD16ECB6E35EE),
+UINT64_C(0x4D84073F4C80E9D5),
+UINT64_C(0x9CFFCFC074A95BA8),
+UINT64_C(0x15796372D28485EB),
+UINT64_C(0x77EDA8DF5717E9CD),
+UINT64_C(0xADB965E1AB473C4E),
+UINT64_C(0x5BC05659FFAD6959),
+UINT64_C(0xFB2402276ED63880),
+UINT64_C(0xD15FDDDF2014850B),
+UINT64_C(0xB538F37DFDD74592),
+UINT64_C(0x1473396F3A8E2E82),
+UINT64_C(0x3CE41A21F6A5EDF8),
+UINT64_C(0x754E82640CC4351A),
+UINT64_C(0xC7821B96AAB95E73),
+UINT64_C(0xC242FAAAF42FF463),
+UINT64_C(0x087E260EDD00AC65),
+UINT64_C(0x0DBE032817D193F5),
+UINT64_C(0xF9D10F96844A63C9),
+UINT64_C(0xBAF127EC85AA91DD),
+UINT64_C(0xCE85E6A50AB6DABB),
+UINT64_C(0xE7B56A161AF5D24F),
+UINT64_C(0x57D1D79FCD6C5A19),
+UINT64_C(0xEC4DD2F05DFC2B28),
+UINT64_C(0x8D72216A18FE64A1),
+UINT64_C(0x72F14A085F222077),
+UINT64_C(0x3BF038ABD8B09B11),
+UINT64_C(0xC4265D7CC6CF1F44),
+UINT64_C(0x46398D2CDAB1B0E7),
+UINT64_C(0xB6E705D37DCFDC68),
+UINT64_C(0x362C11834AAFD1E6),
+UINT64_C(0xF6AC98B7D8701107),
+UINT64_C(0xD6649424AD114D7E),
+UINT64_C(0xDDD1C6E4C40AB551),
+UINT64_C(0xC9D284C8A132030F),
+UINT64_C(0x824069EEDB1F662A),
+UINT64_C(0xC846B3AD4157904B),
+UINT64_C(0x0A248C17D38481CA),
+UINT64_C(0xE8745FEBC846831F),
+UINT64_C(0x00000000000025A8),
diff --git a/llvm/unittests/ADT/APFloatTest.cpp b/llvm/unittests/ADT/APFloatTest.cpp
index e161071e63af4..35e97c6b2d9ea 100644
--- a/llvm/unittests/ADT/APFloatTest.cpp
+++ b/llvm/unittests/ADT/APFloatTest.cpp
@@ -1393,6 +1393,34 @@ TEST(APFloatTest, fromZeroDecimalLargeExponentString) {
EXPECT_EQ(0.0, APFloat(APFloat::IEEEdouble(), StringRef("0e1234" "\0" "2", 6)).convertToDouble());
}
+TEST(APFloatTest, DecimalStringsUseLargePowersOfFive) {
+ // These values are just below one, so they cannot take the early obvious
+ // underflow path. The number of fractional digits is the power passed to
+ // powerOf5(). Together, the cases exercise the high entries and different
+ // combinations of the precomputed powers-of-five table.
+ struct TestCase {
+ const fltSemantics &Sem;
+ unsigned FractionalDigits;
+ };
+ const TestCase Tests[] = {
+ {APFloat::IEEEhalf(), 8192},
+ {APFloat::IEEEsingle(), 12288},
+ {APFloat::IEEEdouble(), 16376},
+ {APFloat::IEEEquad(), 16383},
+ };
+
+ for (const TestCase &Test : Tests) {
+ std::string Input = "0." + std::string(Test.FractionalDigits, '9');
+ APFloat Value(Test.Sem);
+ auto StatusOr =
+ Value.convertFromString(Input, APFloat::rmNearestTiesToEven);
+ ASSERT_TRUE(!!StatusOr) << Test.FractionalDigits;
+ EXPECT_TRUE(*StatusOr & APFloat::opInexact) << Test.FractionalDigits;
+ EXPECT_TRUE(Value.bitwiseIsEqual(APFloat::getOne(Test.Sem, false)))
+ << Test.FractionalDigits;
+ }
+}
+
TEST(APFloatTest, fromZeroHexadecimalString) {
EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0p1").convertToDouble());
EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x0p1").convertToDouble());
diff --git a/llvm/utils/generate-apfloat-pow5-table.py b/llvm/utils/generate-apfloat-pow5-table.py
new file mode 100644
index 0000000000000..90729e8b90c8d
--- /dev/null
+++ b/llvm/utils/generate-apfloat-pow5-table.py
@@ -0,0 +1,48 @@
+#!/usr/bin/env python3
+# ===----------------------------------------------------------------------===#
+#
+# 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
+#
+# ===----------------------------------------------------------------------===#
+"""Generate the powers-of-five table used by APFloat.cpp.
+
+Run from the llvm source directory:
+
+ utils/generate-apfloat-pow5-table.py > lib/Support/APFloatPowerOfFiveTable.inc
+"""
+
+MAX_EXPONENT = 16383
+WORD_BITS = 64
+
+
+def words(value):
+ """Return VALUE as little-endian 64-bit words."""
+ result = []
+ while value:
+ result.append(value & ((1 << WORD_BITS) - 1))
+ value >>= WORD_BITS
+ return result
+
+
+def main():
+ table = []
+ exponent = 8
+ # Python integers have arbitrary precision, so this and the repeated
+ # squaring below compute each power exactly.
+ value = 5**exponent
+ while exponent <= MAX_EXPONENT:
+ value_words = words(value)
+ table.append((exponent, value_words))
+ exponent *= 2
+ value *= value
+
+ for exponent, value_words in table:
+ print(f"// 5^{exponent}")
+ for word in value_words:
+ print(f"UINT64_C(0x{word:016X}),")
+
+
+if __name__ == "__main__":
+ main()
>From e969fb50a1a2eedd650dec01b1d113d81ec47832 Mon Sep 17 00:00:00 2001
From: Lewis Crawford <lcrawford at nvidia.com>
Date: Mon, 7 Sep 2026 11:10:37 +0000
Subject: [PATCH 2/2] Fix clang-format issues
---
llvm/lib/Support/APFloat.cpp | 8 +-
llvm/lib/Support/APFloatPowerOfFiveTable.inc | 923 +++++++------------
llvm/utils/generate-apfloat-pow5-table.py | 16 +-
3 files changed, 329 insertions(+), 618 deletions(-)
diff --git a/llvm/lib/Support/APFloat.cpp b/llvm/lib/Support/APFloat.cpp
index 8b1cc70ce734a..f8a2612bb1423 100644
--- a/llvm/lib/Support/APFloat.cpp
+++ b/llvm/lib/Support/APFloat.cpp
@@ -17,8 +17,8 @@
#include "llvm/ADT/FloatingPointMode.h"
#include "llvm/ADT/FoldingSet.h"
#include "llvm/ADT/Hashing.h"
-#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/STLExtras.h"
+#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/StringSwitch.h"
@@ -323,8 +323,7 @@ static unsigned int powerOfFivePartsForExponent(unsigned int power) {
// 815 / 351 is an upper bound on log2(5). Reserve an additional part for
// tcFullMultiply, which writes the full product width even when its most
// significant part is zero.
- return 2 +
- ((power * 815) / (351 * APFloatBase::integerPartWidth));
+ return 2 + ((power * 815) / (351 * APFloatBase::integerPartWidth));
}
unsigned int APFloatBase::semanticsPrecision(const fltSemantics &semantics) {
@@ -794,7 +793,8 @@ static_assert([] {
DST must be at least one part larger than size of the answer. */
static unsigned int
powerOf5(APFloatBase::integerPart *dst, unsigned int power) {
- static const APFloatBase::integerPart firstEightPowers[] = { 1, 5, 25, 125, 625, 3125, 15625, 78125 };
+ static const APFloatBase::integerPart firstEightPowers[] = {
+ 1, 5, 25, 125, 625, 3125, 15625, 78125};
SmallVector<APFloatBase::integerPart, NumPow5PartsOnStack> scratch;
scratch.resize_for_overwrite(powerOfFivePartsForExponent(power));
diff --git a/llvm/lib/Support/APFloatPowerOfFiveTable.inc b/llvm/lib/Support/APFloatPowerOfFiveTable.inc
index 4b8a8b5687761..802e039742387 100644
--- a/llvm/lib/Support/APFloatPowerOfFiveTable.inc
+++ b/llvm/lib/Support/APFloatPowerOfFiveTable.inc
@@ -1,612 +1,315 @@
// 5^8
UINT64_C(0x000000000005F5E1),
-// 5^16
-UINT64_C(0x0000002386F26FC1),
-// 5^32
-UINT64_C(0x2D6D415B85ACEF81),
-UINT64_C(0x00000000000004EE),
-// 5^64
-UINT64_C(0x6E38ED64BF6A1F01),
-UINT64_C(0xE93FF9F4DAA797ED),
-UINT64_C(0x0000000000184F03),
-// 5^128
-UINT64_C(0x03DF99092E953E01),
-UINT64_C(0x2374E42F0F1538FD),
-UINT64_C(0xC404DC08D3CFF5EC),
-UINT64_C(0xA6337F19BCCDB0DA),
-UINT64_C(0x0000024EE91F2603),
-// 5^256
-UINT64_C(0xBED3875B982E7C01),
-UINT64_C(0x12152F87D8D99F72),
-UINT64_C(0xCF4A6E706BDE50C6),
-UINT64_C(0x26B2716ED595D80F),
-UINT64_C(0x1D153624ADC666B0),
-UINT64_C(0x63FF540E3C42D35A),
-UINT64_C(0x65F9EF17CC5573C0),
-UINT64_C(0x80DCC7F755BC28F2),
-UINT64_C(0x5FDCEFCEF46EEDDC),
-UINT64_C(0x00000000000553F7),
-// 5^512
-UINT64_C(0x77F27267FC6CF801),
-UINT64_C(0x5D96976F8F9546DC),
-UINT64_C(0xC31E1AD9B83A8A97),
-UINT64_C(0x94E6574746C40513),
-UINT64_C(0x4475B579C88976C1),
-UINT64_C(0xAA1DA1BF28F8733B),
-UINT64_C(0x1E25CFEA703ED321),
-UINT64_C(0xBC51FB2EB21A2F22),
-UINT64_C(0xBFA3EDAC96E14F5D),
-UINT64_C(0xE7FC7153329C57AE),
-UINT64_C(0x85A91924C3FC0695),
-UINT64_C(0xB2908EE0F95F635E),
-UINT64_C(0x1366732A93ABADE4),
-UINT64_C(0x69BE5B0E9449775C),
-UINT64_C(0xB099BC817343AFAC),
-UINT64_C(0xA269974845A71D46),
-UINT64_C(0x8A0B1F138CB07303),
-UINT64_C(0xC1D238D98CAB8A97),
-UINT64_C(0x0000001C633415D4),
-// 5^1024
-UINT64_C(0xF55B2B722919F001),
-UINT64_C(0x1EC29F866E7C215B),
-UINT64_C(0x15C51A88991C4E87),
-UINT64_C(0x4C7D1E1A140AC535),
-UINT64_C(0x0ED1440ECC2CD819),
-UINT64_C(0x7DE16CFB896634EE),
-UINT64_C(0x9FCE837D1E43F61F),
-UINT64_C(0x233E55C7231D2B9C),
-UINT64_C(0xF451218B65DC60D7),
-UINT64_C(0xC96359861C5CD134),
-UINT64_C(0xA7E89431922BBB9F),
-UINT64_C(0x62BE695A9F9F2A07),
-UINT64_C(0x045B7A748E1042C4),
-UINT64_C(0x8AD822A51ABE1DE3),
-UINT64_C(0xD814B505BA34C411),
-UINT64_C(0x8FC51A16BF3FDEB3),
-UINT64_C(0xF56DEEECB1B896BC),
-UINT64_C(0xB6F4654B31FB6BFD),
-UINT64_C(0x6B7595FB101A3616),
-UINT64_C(0x80D98089DC1A47FE),
-UINT64_C(0x9A20288280BDA5A5),
-UINT64_C(0xFC8F1F9031EB0F66),
-UINT64_C(0xE26A7B7E976A3310),
-UINT64_C(0x3CE3A0B8DF68368A),
-UINT64_C(0x75A351A28E4262CE),
-UINT64_C(0x445975836CB0B6C9),
-UINT64_C(0xC356E38A31B5653F),
-UINT64_C(0x0190FBA035FAABA6),
-UINT64_C(0x88BC491B9FC4ED52),
-UINT64_C(0x005B80411640114A),
-UINT64_C(0x1E8D4649F4F3235E),
-UINT64_C(0x73C5534936A8DE06),
-UINT64_C(0xC1A6970CA7E6BD2A),
-UINT64_C(0xD2DB49EF47187094),
-UINT64_C(0xAE6209D4926C3F5B),
-UINT64_C(0x34F4A3C62D433949),
-UINT64_C(0xD9D61A05D4305D94),
-UINT64_C(0x0000000000000325),
-// 5^2048
-UINT64_C(0xE30968651333E001),
-UINT64_C(0x49E28DCFB27D4D3F),
-UINT64_C(0xEE87E354EC2E4721),
-UINT64_C(0x368B8ABBB6067584),
-UINT64_C(0x2ED56D55A5E5A191),
-UINT64_C(0xEA50D142FD827773),
-UINT64_C(0x98342C9E51B78DB2),
-UINT64_C(0x866ED6F1C850DABC),
-UINT64_C(0x9279498719342C12),
-UINT64_C(0x66912E4AD2F869C2),
-UINT64_C(0x57A7842D71C7FD8F),
-UINT64_C(0xFB7FEDCC235552EB),
-UINT64_C(0x38209CE1F3861CE0),
-UINT64_C(0x34C101349713B449),
-UINT64_C(0xA7A8289C8C6C54DE),
-UINT64_C(0xE3CB64F32DBB6643),
-UINT64_C(0xE3892EE98074FF01),
-UINT64_C(0xA8F16F9210C17F94),
-UINT64_C(0x967ABBB3A8281ED6),
-UINT64_C(0x9952FBED5A151440),
-UINT64_C(0xAFE609C313B41E44),
-UINT64_C(0xF111821FA2BCA416),
-UINT64_C(0x91BAC974FB1264B4),
-UINT64_C(0x8E48FF35D6C7D6AB),
-UINT64_C(0xC4A656654419BD43),
-UINT64_C(0x33554C36685E5510),
-UINT64_C(0x0DBD21FEAB498697),
-UINT64_C(0x982DA4663CFE491D),
-UINT64_C(0x9E110C7BCBEA4CA7),
-UINT64_C(0x5FC5A04779C56B8A),
-UINT64_C(0x1AA9F44484D80E2E),
-UINT64_C(0x6A57B1AB730F203C),
-UINT64_C(0x87A7DC62D752F7A6),
-UINT64_C(0x40660460944545FF),
-UINT64_C(0xC9AC375D77C1A42F),
-UINT64_C(0x744695F0E866D7EF),
-UINT64_C(0xA1FC6B9681428C85),
-UINT64_C(0x7BF03C19D7917C7B),
-UINT64_C(0x5715F7915B33EB41),
-UINT64_C(0xDB0708FD8F6CAE5F),
-UINT64_C(0x785CE6B7B125AC8E),
-UINT64_C(0x6F46EADB56C6815B),
-UINT64_C(0x195355D84EEEBEEE),
-UINT64_C(0x9D7389C0A244DE3C),
-UINT64_C(0xCF99D01953761ABD),
-UINT64_C(0x0D76CE39DE9EC24B),
-UINT64_C(0x2E55ECEE70BEB181),
-UINT64_C(0xF56D9D4BD5F86079),
-UINT64_C(0x13EF5A83FB8886FB),
-UINT64_C(0x3F3389A4408F43C5),
-UINT64_C(0x58CCF45CFAD37943),
-UINT64_C(0x415C7F3EF82DF846),
-UINT64_C(0x8B3D5CF42915E818),
-UINT64_C(0xF8DBB57A6A445F27),
-UINT64_C(0x8AD803ECCA8F0070),
-UINT64_C(0x038F9245B2E87C34),
-UINT64_C(0xC7C9DEE0BEDD8A6C),
-UINT64_C(0x2AD3FA140EAC7D56),
-UINT64_C(0xF775677CE0DE0840),
-UINT64_C(0x92BE221EF1BD0AD5),
-UINT64_C(0xCE9D04A487FA1FB9),
-UINT64_C(0x3F6F7024D2C36FA9),
-UINT64_C(0x907855EEB028AF62),
-UINT64_C(0x4EFAC5DCD83E49D6),
-UINT64_C(0x77CD8C6BE7151AAB),
-UINT64_C(0x0AF908B40A753B7D),
-UINT64_C(0xE50F30278C983623),
-UINT64_C(0x1D08E2D694222771),
-UINT64_C(0xF2EE5CA6F7E928E6),
-UINT64_C(0x11EB962B1B61B93C),
-UINT64_C(0xCE2BCBA19648B21C),
-UINT64_C(0x7BBEBE3034F77154),
-UINT64_C(0x8CE329ACE526A319),
-UINT64_C(0xB5DC53D5DE4A74D2),
-UINT64_C(0x000000000009E8B3),
-// 5^4096
-UINT64_C(0xD4724E8D2A67C001),
-UINT64_C(0xF89A1E908EFE7AE7),
-UINT64_C(0x54E05154EF084117),
-UINT64_C(0x506BE82913B1BB51),
-UINT64_C(0xE599574EFB29B172),
-UINT64_C(0x806C0ED3F0DA6146),
-UINT64_C(0x45155E93B86AE5BE),
-UINT64_C(0x7E1E7C34C0591CC2),
-UINT64_C(0x1D1F4CCE7C4823DA),
-UINT64_C(0xD6BFDF759B8BA1E8),
-UINT64_C(0xC2DFAE78E341BE10),
-UINT64_C(0x0F237F1A016B67B2),
-UINT64_C(0xAF6A25743DBEABCD),
-UINT64_C(0x142E0E80CAB3E6D7),
-UINT64_C(0x2C23481161959127),
-UINT64_C(0xCB4BF98287009701),
-UINT64_C(0x88052F8CF8169C84),
-UINT64_C(0xBC13176168DDE6D4),
-UINT64_C(0x54AB9C41FF0B0905),
-UINT64_C(0x1A1C304E7613B224),
-UINT64_C(0x441C2D473BFE167B),
-UINT64_C(0x78F061814F6CEA9C),
-UINT64_C(0x30C7AE41EB659FB8),
-UINT64_C(0xA1EBCAD7947E0D0E),
-UINT64_C(0x2130504DD97D9556),
-UINT64_C(0xF2ACD5071A8309CB),
-UINT64_C(0xFD82373A3F8EC72A),
-UINT64_C(0x280F4D3295A842BC),
-UINT64_C(0x811A4F04F3618AC0),
-UINT64_C(0xD3967A1B6DC3A5B4),
-UINT64_C(0xDCFE388F15B8C898),
-UINT64_C(0x8738B909454EB2A0),
-UINT64_C(0x2BD9CC1110C4E996),
-UINT64_C(0x655FEC303297CD0C),
-UINT64_C(0xF4090EE8AE0725B1),
-UINT64_C(0x398C6FED037D19EE),
-UINT64_C(0xC994A4503B9AF26B),
-UINT64_C(0x75A697B2B5341743),
-UINT64_C(0x3CCB5B92AC50B9C1),
-UINT64_C(0xA8329761FFE06205),
-UINT64_C(0xEB83CADBDFEA5242),
-UINT64_C(0x3C20EE69E79DADF7),
-UINT64_C(0x7021B97A1E0A6817),
-UINT64_C(0x176CA776743074FA),
-UINT64_C(0xECA19BEB77FB8AF6),
-UINT64_C(0xAF63B71292BAF1DE),
-UINT64_C(0xA4EB8F8CDE35C88B),
-UINT64_C(0x40B464A0E137D5E9),
-UINT64_C(0x42923BBD87D1CDE8),
-UINT64_C(0x2E2690F3CD8F62FF),
-UINT64_C(0x59C89F1B095EDC16),
-UINT64_C(0x5138753D1FA8FD5D),
-UINT64_C(0x80152F18390A2B29),
-UINT64_C(0xF984D83E2DD8D925),
-UINT64_C(0xC19E1FAF7A872E74),
-UINT64_C(0xECF9B5D0ED4D542D),
-UINT64_C(0xC53C0ADF9462EA75),
-UINT64_C(0x37A2D4390CAEA134),
-UINT64_C(0x2181327EC8FA2E8A),
-UINT64_C(0x2D2408206E7BB827),
-UINT64_C(0x5893D4B850BE10E0),
-UINT64_C(0x1F2B2322AB312BB9),
-UINT64_C(0xBF627EDE440B3F25),
-UINT64_C(0xB608B89572DAC789),
-UINT64_C(0x86DEB3F078787E2A),
-UINT64_C(0xBB9373F46FEE7AAB),
-UINT64_C(0xF7D8B57E27ECF57B),
-UINT64_C(0x3D04E8D2FCA26A9F),
-UINT64_C(0x3172826AC9DF13CB),
-UINT64_C(0xA8FCD8E0CD9E8D7C),
-UINT64_C(0x307641D9B2C39497),
-UINT64_C(0x2608C4CF1CC939C1),
-UINT64_C(0x3D326A7EB6D1C7BF),
-UINT64_C(0x8E13E25FEEAF19E6),
-UINT64_C(0x2DFE6D97EE63302B),
-UINT64_C(0xE41D3CC425971D58),
-UINT64_C(0xAB8DB59A0A80627C),
-UINT64_C(0xE90AFB779EEA37C8),
-UINT64_C(0x9EE3352C90CA19CF),
-UINT64_C(0xFE78D6823613C850),
-UINT64_C(0x5B060904788F6E50),
-UINT64_C(0x3FECB534B71BD1A4),
-UINT64_C(0x20C33857B32C450C),
-UINT64_C(0x0239F4CEA6E9CFDA),
-UINT64_C(0xA19ADB9548497187),
-UINT64_C(0x95ACA6A8B492ED8A),
-UINT64_C(0xCF1B23504DCD6CD9),
-UINT64_C(0x1A67778CFBE8B12A),
-UINT64_C(0xC32DA38338EB3ACC),
-UINT64_C(0xA03F40A8FB126AB1),
-UINT64_C(0xE9CE4724ED5BF546),
-UINT64_C(0x73A130D84C4A74FD),
-UINT64_C(0xA2EBD6C1D9960E2D),
-UINT64_C(0x6F233B7C94AB6FEB),
-UINT64_C(0x8E7B9A7349126080),
-UINT64_C(0xD298F9994B8C9091),
-UINT64_C(0xA96DDEFF35E836B5),
-UINT64_C(0x6B0DD9BC96119B31),
-UINT64_C(0x282566FBC6CC3F8D),
-UINT64_C(0xD6769F3B72B882E7),
-UINT64_C(0x00FC509BA674343D),
-UINT64_C(0xD6266A3FDCBF7789),
-UINT64_C(0x4E89541BAE9641FD),
-UINT64_C(0x53400D0311953407),
-UINT64_C(0xE5B533458E0DD75A),
-UINT64_C(0x108B89BC108F19AD),
-UINT64_C(0xE03B2B6341A4C954),
-UINT64_C(0x97ACED8E437B3D7F),
-UINT64_C(0x2C5508C2CBD66670),
-UINT64_C(0x5C4F2EF0650EBC69),
-UINT64_C(0x9985A2DF904FF6BF),
-UINT64_C(0x5ED8D2399FADDD9E),
-UINT64_C(0xE3E51CB925585832),
-UINT64_C(0x56C02D9A0FF4F1D4),
-UINT64_C(0xC1A08A138C4EF804),
-UINT64_C(0xE6D2767113FD01C8),
-UINT64_C(0x9D0176CCA7C234F4),
-UINT64_C(0x4D8BFA89D0D73DF2),
-UINT64_C(0x2B17E0B2544F10CD),
-UINT64_C(0xFD86FE49B70A5C7D),
-UINT64_C(0x214495BBDF373F41),
-UINT64_C(0x00D313D584E857FD),
-UINT64_C(0xA4BA47440496FCBE),
-UINT64_C(0xAEC29E6EE8CAC982),
-UINT64_C(0x7000A51987EC7038),
-UINT64_C(0xFF66E42CAEEE333B),
-UINT64_C(0x03B4F63B8AFD6B25),
-UINT64_C(0x5AB8D9C7BD7991DC),
-UINT64_C(0x48741A6C2ED4684E),
-UINT64_C(0x2FDC6349AF06940D),
-UINT64_C(0xE974996FB03D7ECD),
-UINT64_C(0x52EC8721AC7867F9),
-UINT64_C(0x8EDD2D00BCDD9D4A),
-UINT64_C(0x41C759F83557DE06),
-UINT64_C(0xA75409F23956D4B9),
-UINT64_C(0xB6100FAB123CD8A1),
-UINT64_C(0x2E8D623B3E7B21E2),
-UINT64_C(0xBCA35F7792959DA2),
-UINT64_C(0x35FCB457200C03A5),
-UINT64_C(0xF74EB9281BB6C6E4),
-UINT64_C(0x87CC1D213D5D0B54),
-UINT64_C(0x18AE42404964046F),
-UINT64_C(0x8BD2B496D868B275),
-UINT64_C(0xC234D8F51C5563F4),
-UINT64_C(0xF9151FFFF868E970),
-UINT64_C(0x271133EEAE7BE4A2),
-UINT64_C(0x25254932BB0FD922),
-UINT64_C(0x104BCD64A60A9FC0),
-UINT64_C(0x0000006230290145),
-// 5^8192
-UINT64_C(0x9F34522664CF8001),
-UINT64_C(0x7B8D5053644963E5),
-UINT64_C(0xB945C82F49F0AA29),
-UINT64_C(0x933B6BB8430FF478),
-UINT64_C(0x64C501D45FF82D0A),
-UINT64_C(0x9EC1E1B373BBF174),
-UINT64_C(0xE90106893BFBE803),
-UINT64_C(0x3FEF8D80F7390D8E),
-UINT64_C(0x2C73446BF31D1325),
-UINT64_C(0x1C19E379F5CA7A92),
-UINT64_C(0xF52D9D9C270AF2BE),
-UINT64_C(0x3ABF72E1EB2BED48),
-UINT64_C(0x7ECF35084AC4FFC2),
-UINT64_C(0x38597A5A22019A82),
-UINT64_C(0x9A51FF6EBE6A7B3C),
-UINT64_C(0x0C0ABE9DA2D28437),
-UINT64_C(0xC79887FF7C9EC6EA),
-UINT64_C(0x436420D05851C899),
-UINT64_C(0x72B5547FEFEAD581),
-UINT64_C(0x077AD8F899B1D2B5),
-UINT64_C(0x3B4305ED5CDDBF5B),
-UINT64_C(0x2D88F3FDE3861AC7),
-UINT64_C(0x393220AA3D6B43BE),
-UINT64_C(0x1CD62095E5382405),
-UINT64_C(0x87A0D1E161A10C96),
-UINT64_C(0x68C933E6CA95A55D),
-UINT64_C(0x778089BB9EE082E2),
-UINT64_C(0xFBB6D8D441429EE9),
-UINT64_C(0x26CF5471C529500D),
-UINT64_C(0xD6C9B14068B9BE29),
-UINT64_C(0x8415185207BE635A),
-UINT64_C(0x83730335B5572182),
-UINT64_C(0xDD312D31EB2300B4),
-UINT64_C(0x488DA59C05D6DD9B),
-UINT64_C(0xDA2C2E4037784D25),
-UINT64_C(0x6A57D7206A8D92FA),
-UINT64_C(0xF07A8632950B41AC),
-UINT64_C(0x2ECAD06ACD55F062),
-UINT64_C(0x34C98BB0E6A3DFE7),
-UINT64_C(0xB60521B19C767D8F),
-UINT64_C(0xE87D16BE752AAFD1),
-UINT64_C(0xE58A8B0C9DE1D728),
-UINT64_C(0x2FA2C119C6013830),
-UINT64_C(0x519B40C83C4F9156),
-UINT64_C(0xAB78701B5058FC8F),
-UINT64_C(0xC502A554ADC59C47),
-UINT64_C(0x6647F04C0FB3286F),
-UINT64_C(0x5EA495C89DB4076E),
-UINT64_C(0xB4F00F8B9C74FAB1),
-UINT64_C(0xD092B4C6897C7A3C),
-UINT64_C(0x32F31FA8283E0340),
-UINT64_C(0x67B63DE2EEB708CC),
-UINT64_C(0xEF2BC02B4F7B3C8B),
-UINT64_C(0xC49344C0DA14BFE3),
-UINT64_C(0xB6C4E69EAABC85BE),
-UINT64_C(0x63A110162ECE8AA6),
-UINT64_C(0x726AE4D919CFBA4D),
-UINT64_C(0xEE6AE7070FC90B42),
-UINT64_C(0x4D9AABC54290B04A),
-UINT64_C(0xF34906CDFB2B070E),
-UINT64_C(0x52CA97091FF54B0A),
-UINT64_C(0x164315700B42BFE1),
-UINT64_C(0x6B5565BB980F3076),
-UINT64_C(0x9CE63C76EB8C4C4A),
-UINT64_C(0x3DA24C53B9E4C771),
-UINT64_C(0xB50E3C666F0266FA),
-UINT64_C(0x01BB4B9676E34F79),
-UINT64_C(0x0FBEA1249948CF3E),
-UINT64_C(0xA1FA4EDC86BEAD12),
-UINT64_C(0xC3B97BF9D11E901C),
-UINT64_C(0x370CA58E71730E03),
-UINT64_C(0x886467E248B19715),
-UINT64_C(0x3C727E24DB237497),
-UINT64_C(0x8E67D76E2116CCD2),
-UINT64_C(0x34BDEDD3F973AECF),
-UINT64_C(0xB042AB0531D680EC),
-UINT64_C(0xFC5C3C17770E96A0),
-UINT64_C(0xB8204ECEAB6F1874),
-UINT64_C(0x416C0CED5843F3A5),
-UINT64_C(0x9578018311DD112F),
-UINT64_C(0x7E0E8613B1C74BD8),
-UINT64_C(0xA79FFC1096C6453B),
-UINT64_C(0xFCD6DA0AB2157651),
-UINT64_C(0x3DD0CCAC836A34A7),
-UINT64_C(0x496049ED316E5A36),
-UINT64_C(0xDEA1A97D0322BCB2),
-UINT64_C(0x39578D53CDF2AA5A),
-UINT64_C(0x030565C91D1AA931),
-UINT64_C(0x324E0A27D198CBED),
-UINT64_C(0x284325345DB83E8A),
-UINT64_C(0x5CB134C090BF23E8),
-UINT64_C(0x009E5051DD0ADAB6),
-UINT64_C(0x7E36A6D7F8AD61DA),
-UINT64_C(0xBDFFE6AA84C75E57),
-UINT64_C(0x138D680EB5D5532E),
-UINT64_C(0x4A5F74A1BD84DDAC),
-UINT64_C(0x55538CFACCFF00D1),
-UINT64_C(0x48528011B0948B8C),
-UINT64_C(0x9E047AD7E345F82E),
-UINT64_C(0xEA77BEF06EE770FF),
-UINT64_C(0x2F1625670FC13669),
-UINT64_C(0x0614686C869426AC),
-UINT64_C(0x4263ED823A3FF464),
-UINT64_C(0x57205A7AB3589B47),
-UINT64_C(0xAE6FC46B213F24AD),
-UINT64_C(0xD92B133F3DE03E4E),
-UINT64_C(0x1B49C24A315A589B),
-UINT64_C(0x1641C13873381BCB),
-UINT64_C(0xBC680ADA7BC99425),
-UINT64_C(0x962E9884A5CFBC9A),
-UINT64_C(0xFC8D12F60A960D70),
-UINT64_C(0x60ACC868ED18EF4C),
-UINT64_C(0x131130369AEA5D14),
-UINT64_C(0x2D99A5B0C747C87E),
-UINT64_C(0x006B36583A369BB3),
-UINT64_C(0xE43FA6E6118A5135),
-UINT64_C(0xA13DC05EB4947190),
-UINT64_C(0x0DBD7170D7733DB8),
-UINT64_C(0x117ED7E7C3FB67D1),
-UINT64_C(0xC05FE99EE2D72A49),
-UINT64_C(0xD971A25B9638DB40),
-UINT64_C(0x1A1595594239D468),
-UINT64_C(0xC1117392850A223C),
-UINT64_C(0x567B5FC022D2DBD8),
-UINT64_C(0xC051007A92C5B4EB),
-UINT64_C(0xFB35572011CC0099),
-UINT64_C(0x398481616907810D),
-UINT64_C(0x61D19EF25E8534F4),
-UINT64_C(0x8A0AB03C2EE8C466),
-UINT64_C(0x879AA514C234AF76),
-UINT64_C(0x59E5DA579774A235),
-UINT64_C(0xF339BD5A9BC466B3),
-UINT64_C(0xBBB5FD6744AB026D),
-UINT64_C(0x3685C9F22B977202),
-UINT64_C(0x7054359E03E5DC00),
-UINT64_C(0x9BA11F085239CFB0),
-UINT64_C(0x9C258687F8237562),
-UINT64_C(0x52C7BF8FA3B510DD),
-UINT64_C(0x3245E079B31ED0CF),
-UINT64_C(0xBAEE38C7FF9FF8D3),
-UINT64_C(0xF702B3B9F17D5562),
-UINT64_C(0xCBCA275DCC4C8563),
-UINT64_C(0xE817DBACE005D9D1),
-UINT64_C(0x62CEE35005C6920A),
-UINT64_C(0x19E049B90F1DEAC0),
-UINT64_C(0xB2A27A1659599F74),
-UINT64_C(0x7DCEF00DF0911D5A),
-UINT64_C(0x375522513603DD66),
-UINT64_C(0x5FA022DA97813735),
-UINT64_C(0xEFBE57C20D849416),
-UINT64_C(0x5761929630A0E592),
-UINT64_C(0x11735043C953CC47),
-UINT64_C(0xC0444BE0A83526AD),
-UINT64_C(0x16FF5136B5F8463C),
-UINT64_C(0xF037572C2A0A6631),
-UINT64_C(0xB1BF8DAAD30464DA),
-UINT64_C(0x0F3E9E7E7F5718F7),
-UINT64_C(0xC26F2624E5A4CFE7),
-UINT64_C(0xDFE8F4858C9B5AE4),
-UINT64_C(0xC64A1509F6FA82E3),
-UINT64_C(0x3024B220ACB24AEA),
-UINT64_C(0xDDCDFEDDDDB02AC0),
-UINT64_C(0x384C86C3D834C574),
-UINT64_C(0xDD48A571D904E099),
-UINT64_C(0x77B35C744550A05F),
-UINT64_C(0xAAEBDC6D81E85F71),
-UINT64_C(0xD4CDC0540F9BB0B1),
-UINT64_C(0x845786AF7AF4DF85),
-UINT64_C(0xDF2A91CAE5E53887),
-UINT64_C(0x5689A3C4F6A58211),
-UINT64_C(0xA705983A8CF6AA15),
-UINT64_C(0x2CE7FEF09FBF2F52),
-UINT64_C(0x4A3B536548E84A62),
-UINT64_C(0xD48A0872F8281A47),
-UINT64_C(0xF0929C3E8423DCF6),
-UINT64_C(0xE9EC071B044A5049),
-UINT64_C(0x20E30C1B17DECC36),
-UINT64_C(0x3342196A45FC2813),
-UINT64_C(0x6601E33746AFB7F9),
-UINT64_C(0xF18094D130754439),
-UINT64_C(0x61410DD1D38B4112),
-UINT64_C(0xD97D4DD8D8796B36),
-UINT64_C(0x8080519147E9BC0B),
-UINT64_C(0xCDE438C11584E2DA),
-UINT64_C(0x409659A1955D24F1),
-UINT64_C(0x5A09635F1B0950B1),
-UINT64_C(0x615472B965B1FEBE),
-UINT64_C(0x6308E067525DC00A),
-UINT64_C(0xD4E705A44089E2D4),
-UINT64_C(0x32C18B2643FC9209),
-UINT64_C(0xAF2711534447A5FA),
-UINT64_C(0x4DC4F0D23617CADC),
-UINT64_C(0x6AA116EF692EB386),
-UINT64_C(0x0641DC0B655991BC),
-UINT64_C(0xC655966454469597),
-UINT64_C(0x4BDC0D1A749C0FE8),
-UINT64_C(0xC5292A61A7D3381E),
-UINT64_C(0x42474CC24EB65FDC),
-UINT64_C(0x19DFC9EEF2C6B173),
-UINT64_C(0xBECE2EE30A19A199),
-UINT64_C(0xAA03AA7CC68B778D),
-UINT64_C(0xAE54D2BEC8DB86F0),
-UINT64_C(0xDEE3F48FB92A01E0),
-UINT64_C(0xF6AE28526023C0A9),
-UINT64_C(0xA441CB9EA233763B),
-UINT64_C(0x3A8BB4B73246DDDD),
-UINT64_C(0x308EF2C844FAA3C3),
-UINT64_C(0xD2862534FD1C8516),
-UINT64_C(0x62336F6F3B25EBE7),
-UINT64_C(0x0B8E2CE60C336A45),
-UINT64_C(0x11EEA1F2E867F171),
-UINT64_C(0x68DF4903523972EC),
-UINT64_C(0x51EF4CB750C05824),
-UINT64_C(0x3FFAE115CB4DF2A8),
-UINT64_C(0x3ED1635FB51ACA2F),
-UINT64_C(0x0A5AC09FD6FF1CC6),
-UINT64_C(0x0A3DC76FDE8ED9D6),
-UINT64_C(0x37991DDE5DC2D8DD),
-UINT64_C(0x80AD6E13F95BACB2),
-UINT64_C(0xD4F8C7A6163005EE),
-UINT64_C(0xA4760F083225D180),
-UINT64_C(0x9B2B1A875FFF004D),
-UINT64_C(0x5CD00B66E7EA8576),
-UINT64_C(0x285DD80DEC478452),
-UINT64_C(0x4301B3A120112439),
-UINT64_C(0xFACBB68CFF879FC8),
-UINT64_C(0xB17FDF84AF6AF6B8),
-UINT64_C(0xF4489576C208D9F1),
-UINT64_C(0xADCC862C8794A6E9),
-UINT64_C(0x931685A40E83E54C),
-UINT64_C(0x1E40293BAB01C580),
-UINT64_C(0x1F1DDF7FCAD784FA),
-UINT64_C(0xCEE722B26B856084),
-UINT64_C(0x74254EB41C39938B),
-UINT64_C(0xB9C26D9AC7CCEBF4),
-UINT64_C(0x2E3ECE246B08DFB9),
-UINT64_C(0xDFF60410981455EC),
-UINT64_C(0xE06FA38BBC804E2B),
-UINT64_C(0x72E53C52B534540C),
-UINT64_C(0xB2A5C05A02DFB2EF),
-UINT64_C(0x973133385002A2A5),
-UINT64_C(0xD61DF455597C53FF),
-UINT64_C(0x39AC2EC534E5261A),
-UINT64_C(0x388B7539C6BC0CAB),
-UINT64_C(0x00EAC7043F732FC0),
-UINT64_C(0xC089971E92FB21D9),
-UINT64_C(0x7AF93F8FB4FFA503),
-UINT64_C(0xA8311B2372E353B6),
-UINT64_C(0x1DE496CA8266C9AF),
-UINT64_C(0xD6FA0B51DBDB16B0),
-UINT64_C(0xBD5630899991A5EF),
-UINT64_C(0x0954A1E3168CBE0F),
-UINT64_C(0x53D09723537B9245),
-UINT64_C(0x86558CB92867272D),
-UINT64_C(0xFAC85D100B83F026),
-UINT64_C(0x1E5DDB95F8562951),
-UINT64_C(0x48D27B92AD3668C8),
-UINT64_C(0x19B58A99C930B7E6),
-UINT64_C(0xA9CDA917A3DE74E3),
-UINT64_C(0x7A4DD16ECB6E35EE),
-UINT64_C(0x4D84073F4C80E9D5),
-UINT64_C(0x9CFFCFC074A95BA8),
-UINT64_C(0x15796372D28485EB),
-UINT64_C(0x77EDA8DF5717E9CD),
-UINT64_C(0xADB965E1AB473C4E),
-UINT64_C(0x5BC05659FFAD6959),
-UINT64_C(0xFB2402276ED63880),
-UINT64_C(0xD15FDDDF2014850B),
-UINT64_C(0xB538F37DFDD74592),
-UINT64_C(0x1473396F3A8E2E82),
-UINT64_C(0x3CE41A21F6A5EDF8),
-UINT64_C(0x754E82640CC4351A),
-UINT64_C(0xC7821B96AAB95E73),
-UINT64_C(0xC242FAAAF42FF463),
-UINT64_C(0x087E260EDD00AC65),
-UINT64_C(0x0DBE032817D193F5),
-UINT64_C(0xF9D10F96844A63C9),
-UINT64_C(0xBAF127EC85AA91DD),
-UINT64_C(0xCE85E6A50AB6DABB),
-UINT64_C(0xE7B56A161AF5D24F),
-UINT64_C(0x57D1D79FCD6C5A19),
-UINT64_C(0xEC4DD2F05DFC2B28),
-UINT64_C(0x8D72216A18FE64A1),
-UINT64_C(0x72F14A085F222077),
-UINT64_C(0x3BF038ABD8B09B11),
-UINT64_C(0xC4265D7CC6CF1F44),
-UINT64_C(0x46398D2CDAB1B0E7),
-UINT64_C(0xB6E705D37DCFDC68),
-UINT64_C(0x362C11834AAFD1E6),
-UINT64_C(0xF6AC98B7D8701107),
-UINT64_C(0xD6649424AD114D7E),
-UINT64_C(0xDDD1C6E4C40AB551),
-UINT64_C(0xC9D284C8A132030F),
-UINT64_C(0x824069EEDB1F662A),
-UINT64_C(0xC846B3AD4157904B),
-UINT64_C(0x0A248C17D38481CA),
-UINT64_C(0xE8745FEBC846831F),
-UINT64_C(0x00000000000025A8),
+ // 5^16
+ UINT64_C(0x0000002386F26FC1),
+ // 5^32
+ UINT64_C(0x2D6D415B85ACEF81), UINT64_C(0x00000000000004EE),
+ // 5^64
+ UINT64_C(0x6E38ED64BF6A1F01), UINT64_C(0xE93FF9F4DAA797ED),
+ UINT64_C(0x0000000000184F03),
+ // 5^128
+ UINT64_C(0x03DF99092E953E01), UINT64_C(0x2374E42F0F1538FD),
+ UINT64_C(0xC404DC08D3CFF5EC), UINT64_C(0xA6337F19BCCDB0DA),
+ UINT64_C(0x0000024EE91F2603),
+ // 5^256
+ UINT64_C(0xBED3875B982E7C01), UINT64_C(0x12152F87D8D99F72),
+ UINT64_C(0xCF4A6E706BDE50C6), UINT64_C(0x26B2716ED595D80F),
+ UINT64_C(0x1D153624ADC666B0), UINT64_C(0x63FF540E3C42D35A),
+ UINT64_C(0x65F9EF17CC5573C0), UINT64_C(0x80DCC7F755BC28F2),
+ UINT64_C(0x5FDCEFCEF46EEDDC), UINT64_C(0x00000000000553F7),
+ // 5^512
+ UINT64_C(0x77F27267FC6CF801), UINT64_C(0x5D96976F8F9546DC),
+ UINT64_C(0xC31E1AD9B83A8A97), UINT64_C(0x94E6574746C40513),
+ UINT64_C(0x4475B579C88976C1), UINT64_C(0xAA1DA1BF28F8733B),
+ UINT64_C(0x1E25CFEA703ED321), UINT64_C(0xBC51FB2EB21A2F22),
+ UINT64_C(0xBFA3EDAC96E14F5D), UINT64_C(0xE7FC7153329C57AE),
+ UINT64_C(0x85A91924C3FC0695), UINT64_C(0xB2908EE0F95F635E),
+ UINT64_C(0x1366732A93ABADE4), UINT64_C(0x69BE5B0E9449775C),
+ UINT64_C(0xB099BC817343AFAC), UINT64_C(0xA269974845A71D46),
+ UINT64_C(0x8A0B1F138CB07303), UINT64_C(0xC1D238D98CAB8A97),
+ UINT64_C(0x0000001C633415D4),
+ // 5^1024
+ UINT64_C(0xF55B2B722919F001), UINT64_C(0x1EC29F866E7C215B),
+ UINT64_C(0x15C51A88991C4E87), UINT64_C(0x4C7D1E1A140AC535),
+ UINT64_C(0x0ED1440ECC2CD819), UINT64_C(0x7DE16CFB896634EE),
+ UINT64_C(0x9FCE837D1E43F61F), UINT64_C(0x233E55C7231D2B9C),
+ UINT64_C(0xF451218B65DC60D7), UINT64_C(0xC96359861C5CD134),
+ UINT64_C(0xA7E89431922BBB9F), UINT64_C(0x62BE695A9F9F2A07),
+ UINT64_C(0x045B7A748E1042C4), UINT64_C(0x8AD822A51ABE1DE3),
+ UINT64_C(0xD814B505BA34C411), UINT64_C(0x8FC51A16BF3FDEB3),
+ UINT64_C(0xF56DEEECB1B896BC), UINT64_C(0xB6F4654B31FB6BFD),
+ UINT64_C(0x6B7595FB101A3616), UINT64_C(0x80D98089DC1A47FE),
+ UINT64_C(0x9A20288280BDA5A5), UINT64_C(0xFC8F1F9031EB0F66),
+ UINT64_C(0xE26A7B7E976A3310), UINT64_C(0x3CE3A0B8DF68368A),
+ UINT64_C(0x75A351A28E4262CE), UINT64_C(0x445975836CB0B6C9),
+ UINT64_C(0xC356E38A31B5653F), UINT64_C(0x0190FBA035FAABA6),
+ UINT64_C(0x88BC491B9FC4ED52), UINT64_C(0x005B80411640114A),
+ UINT64_C(0x1E8D4649F4F3235E), UINT64_C(0x73C5534936A8DE06),
+ UINT64_C(0xC1A6970CA7E6BD2A), UINT64_C(0xD2DB49EF47187094),
+ UINT64_C(0xAE6209D4926C3F5B), UINT64_C(0x34F4A3C62D433949),
+ UINT64_C(0xD9D61A05D4305D94), UINT64_C(0x0000000000000325),
+ // 5^2048
+ UINT64_C(0xE30968651333E001), UINT64_C(0x49E28DCFB27D4D3F),
+ UINT64_C(0xEE87E354EC2E4721), UINT64_C(0x368B8ABBB6067584),
+ UINT64_C(0x2ED56D55A5E5A191), UINT64_C(0xEA50D142FD827773),
+ UINT64_C(0x98342C9E51B78DB2), UINT64_C(0x866ED6F1C850DABC),
+ UINT64_C(0x9279498719342C12), UINT64_C(0x66912E4AD2F869C2),
+ UINT64_C(0x57A7842D71C7FD8F), UINT64_C(0xFB7FEDCC235552EB),
+ UINT64_C(0x38209CE1F3861CE0), UINT64_C(0x34C101349713B449),
+ UINT64_C(0xA7A8289C8C6C54DE), UINT64_C(0xE3CB64F32DBB6643),
+ UINT64_C(0xE3892EE98074FF01), UINT64_C(0xA8F16F9210C17F94),
+ UINT64_C(0x967ABBB3A8281ED6), UINT64_C(0x9952FBED5A151440),
+ UINT64_C(0xAFE609C313B41E44), UINT64_C(0xF111821FA2BCA416),
+ UINT64_C(0x91BAC974FB1264B4), UINT64_C(0x8E48FF35D6C7D6AB),
+ UINT64_C(0xC4A656654419BD43), UINT64_C(0x33554C36685E5510),
+ UINT64_C(0x0DBD21FEAB498697), UINT64_C(0x982DA4663CFE491D),
+ UINT64_C(0x9E110C7BCBEA4CA7), UINT64_C(0x5FC5A04779C56B8A),
+ UINT64_C(0x1AA9F44484D80E2E), UINT64_C(0x6A57B1AB730F203C),
+ UINT64_C(0x87A7DC62D752F7A6), UINT64_C(0x40660460944545FF),
+ UINT64_C(0xC9AC375D77C1A42F), UINT64_C(0x744695F0E866D7EF),
+ UINT64_C(0xA1FC6B9681428C85), UINT64_C(0x7BF03C19D7917C7B),
+ UINT64_C(0x5715F7915B33EB41), UINT64_C(0xDB0708FD8F6CAE5F),
+ UINT64_C(0x785CE6B7B125AC8E), UINT64_C(0x6F46EADB56C6815B),
+ UINT64_C(0x195355D84EEEBEEE), UINT64_C(0x9D7389C0A244DE3C),
+ UINT64_C(0xCF99D01953761ABD), UINT64_C(0x0D76CE39DE9EC24B),
+ UINT64_C(0x2E55ECEE70BEB181), UINT64_C(0xF56D9D4BD5F86079),
+ UINT64_C(0x13EF5A83FB8886FB), UINT64_C(0x3F3389A4408F43C5),
+ UINT64_C(0x58CCF45CFAD37943), UINT64_C(0x415C7F3EF82DF846),
+ UINT64_C(0x8B3D5CF42915E818), UINT64_C(0xF8DBB57A6A445F27),
+ UINT64_C(0x8AD803ECCA8F0070), UINT64_C(0x038F9245B2E87C34),
+ UINT64_C(0xC7C9DEE0BEDD8A6C), UINT64_C(0x2AD3FA140EAC7D56),
+ UINT64_C(0xF775677CE0DE0840), UINT64_C(0x92BE221EF1BD0AD5),
+ UINT64_C(0xCE9D04A487FA1FB9), UINT64_C(0x3F6F7024D2C36FA9),
+ UINT64_C(0x907855EEB028AF62), UINT64_C(0x4EFAC5DCD83E49D6),
+ UINT64_C(0x77CD8C6BE7151AAB), UINT64_C(0x0AF908B40A753B7D),
+ UINT64_C(0xE50F30278C983623), UINT64_C(0x1D08E2D694222771),
+ UINT64_C(0xF2EE5CA6F7E928E6), UINT64_C(0x11EB962B1B61B93C),
+ UINT64_C(0xCE2BCBA19648B21C), UINT64_C(0x7BBEBE3034F77154),
+ UINT64_C(0x8CE329ACE526A319), UINT64_C(0xB5DC53D5DE4A74D2),
+ UINT64_C(0x000000000009E8B3),
+ // 5^4096
+ UINT64_C(0xD4724E8D2A67C001), UINT64_C(0xF89A1E908EFE7AE7),
+ UINT64_C(0x54E05154EF084117), UINT64_C(0x506BE82913B1BB51),
+ UINT64_C(0xE599574EFB29B172), UINT64_C(0x806C0ED3F0DA6146),
+ UINT64_C(0x45155E93B86AE5BE), UINT64_C(0x7E1E7C34C0591CC2),
+ UINT64_C(0x1D1F4CCE7C4823DA), UINT64_C(0xD6BFDF759B8BA1E8),
+ UINT64_C(0xC2DFAE78E341BE10), UINT64_C(0x0F237F1A016B67B2),
+ UINT64_C(0xAF6A25743DBEABCD), UINT64_C(0x142E0E80CAB3E6D7),
+ UINT64_C(0x2C23481161959127), UINT64_C(0xCB4BF98287009701),
+ UINT64_C(0x88052F8CF8169C84), UINT64_C(0xBC13176168DDE6D4),
+ UINT64_C(0x54AB9C41FF0B0905), UINT64_C(0x1A1C304E7613B224),
+ UINT64_C(0x441C2D473BFE167B), UINT64_C(0x78F061814F6CEA9C),
+ UINT64_C(0x30C7AE41EB659FB8), UINT64_C(0xA1EBCAD7947E0D0E),
+ UINT64_C(0x2130504DD97D9556), UINT64_C(0xF2ACD5071A8309CB),
+ UINT64_C(0xFD82373A3F8EC72A), UINT64_C(0x280F4D3295A842BC),
+ UINT64_C(0x811A4F04F3618AC0), UINT64_C(0xD3967A1B6DC3A5B4),
+ UINT64_C(0xDCFE388F15B8C898), UINT64_C(0x8738B909454EB2A0),
+ UINT64_C(0x2BD9CC1110C4E996), UINT64_C(0x655FEC303297CD0C),
+ UINT64_C(0xF4090EE8AE0725B1), UINT64_C(0x398C6FED037D19EE),
+ UINT64_C(0xC994A4503B9AF26B), UINT64_C(0x75A697B2B5341743),
+ UINT64_C(0x3CCB5B92AC50B9C1), UINT64_C(0xA8329761FFE06205),
+ UINT64_C(0xEB83CADBDFEA5242), UINT64_C(0x3C20EE69E79DADF7),
+ UINT64_C(0x7021B97A1E0A6817), UINT64_C(0x176CA776743074FA),
+ UINT64_C(0xECA19BEB77FB8AF6), UINT64_C(0xAF63B71292BAF1DE),
+ UINT64_C(0xA4EB8F8CDE35C88B), UINT64_C(0x40B464A0E137D5E9),
+ UINT64_C(0x42923BBD87D1CDE8), UINT64_C(0x2E2690F3CD8F62FF),
+ UINT64_C(0x59C89F1B095EDC16), UINT64_C(0x5138753D1FA8FD5D),
+ UINT64_C(0x80152F18390A2B29), UINT64_C(0xF984D83E2DD8D925),
+ UINT64_C(0xC19E1FAF7A872E74), UINT64_C(0xECF9B5D0ED4D542D),
+ UINT64_C(0xC53C0ADF9462EA75), UINT64_C(0x37A2D4390CAEA134),
+ UINT64_C(0x2181327EC8FA2E8A), UINT64_C(0x2D2408206E7BB827),
+ UINT64_C(0x5893D4B850BE10E0), UINT64_C(0x1F2B2322AB312BB9),
+ UINT64_C(0xBF627EDE440B3F25), UINT64_C(0xB608B89572DAC789),
+ UINT64_C(0x86DEB3F078787E2A), UINT64_C(0xBB9373F46FEE7AAB),
+ UINT64_C(0xF7D8B57E27ECF57B), UINT64_C(0x3D04E8D2FCA26A9F),
+ UINT64_C(0x3172826AC9DF13CB), UINT64_C(0xA8FCD8E0CD9E8D7C),
+ UINT64_C(0x307641D9B2C39497), UINT64_C(0x2608C4CF1CC939C1),
+ UINT64_C(0x3D326A7EB6D1C7BF), UINT64_C(0x8E13E25FEEAF19E6),
+ UINT64_C(0x2DFE6D97EE63302B), UINT64_C(0xE41D3CC425971D58),
+ UINT64_C(0xAB8DB59A0A80627C), UINT64_C(0xE90AFB779EEA37C8),
+ UINT64_C(0x9EE3352C90CA19CF), UINT64_C(0xFE78D6823613C850),
+ UINT64_C(0x5B060904788F6E50), UINT64_C(0x3FECB534B71BD1A4),
+ UINT64_C(0x20C33857B32C450C), UINT64_C(0x0239F4CEA6E9CFDA),
+ UINT64_C(0xA19ADB9548497187), UINT64_C(0x95ACA6A8B492ED8A),
+ UINT64_C(0xCF1B23504DCD6CD9), UINT64_C(0x1A67778CFBE8B12A),
+ UINT64_C(0xC32DA38338EB3ACC), UINT64_C(0xA03F40A8FB126AB1),
+ UINT64_C(0xE9CE4724ED5BF546), UINT64_C(0x73A130D84C4A74FD),
+ UINT64_C(0xA2EBD6C1D9960E2D), UINT64_C(0x6F233B7C94AB6FEB),
+ UINT64_C(0x8E7B9A7349126080), UINT64_C(0xD298F9994B8C9091),
+ UINT64_C(0xA96DDEFF35E836B5), UINT64_C(0x6B0DD9BC96119B31),
+ UINT64_C(0x282566FBC6CC3F8D), UINT64_C(0xD6769F3B72B882E7),
+ UINT64_C(0x00FC509BA674343D), UINT64_C(0xD6266A3FDCBF7789),
+ UINT64_C(0x4E89541BAE9641FD), UINT64_C(0x53400D0311953407),
+ UINT64_C(0xE5B533458E0DD75A), UINT64_C(0x108B89BC108F19AD),
+ UINT64_C(0xE03B2B6341A4C954), UINT64_C(0x97ACED8E437B3D7F),
+ UINT64_C(0x2C5508C2CBD66670), UINT64_C(0x5C4F2EF0650EBC69),
+ UINT64_C(0x9985A2DF904FF6BF), UINT64_C(0x5ED8D2399FADDD9E),
+ UINT64_C(0xE3E51CB925585832), UINT64_C(0x56C02D9A0FF4F1D4),
+ UINT64_C(0xC1A08A138C4EF804), UINT64_C(0xE6D2767113FD01C8),
+ UINT64_C(0x9D0176CCA7C234F4), UINT64_C(0x4D8BFA89D0D73DF2),
+ UINT64_C(0x2B17E0B2544F10CD), UINT64_C(0xFD86FE49B70A5C7D),
+ UINT64_C(0x214495BBDF373F41), UINT64_C(0x00D313D584E857FD),
+ UINT64_C(0xA4BA47440496FCBE), UINT64_C(0xAEC29E6EE8CAC982),
+ UINT64_C(0x7000A51987EC7038), UINT64_C(0xFF66E42CAEEE333B),
+ UINT64_C(0x03B4F63B8AFD6B25), UINT64_C(0x5AB8D9C7BD7991DC),
+ UINT64_C(0x48741A6C2ED4684E), UINT64_C(0x2FDC6349AF06940D),
+ UINT64_C(0xE974996FB03D7ECD), UINT64_C(0x52EC8721AC7867F9),
+ UINT64_C(0x8EDD2D00BCDD9D4A), UINT64_C(0x41C759F83557DE06),
+ UINT64_C(0xA75409F23956D4B9), UINT64_C(0xB6100FAB123CD8A1),
+ UINT64_C(0x2E8D623B3E7B21E2), UINT64_C(0xBCA35F7792959DA2),
+ UINT64_C(0x35FCB457200C03A5), UINT64_C(0xF74EB9281BB6C6E4),
+ UINT64_C(0x87CC1D213D5D0B54), UINT64_C(0x18AE42404964046F),
+ UINT64_C(0x8BD2B496D868B275), UINT64_C(0xC234D8F51C5563F4),
+ UINT64_C(0xF9151FFFF868E970), UINT64_C(0x271133EEAE7BE4A2),
+ UINT64_C(0x25254932BB0FD922), UINT64_C(0x104BCD64A60A9FC0),
+ UINT64_C(0x0000006230290145),
+ // 5^8192
+ UINT64_C(0x9F34522664CF8001), UINT64_C(0x7B8D5053644963E5),
+ UINT64_C(0xB945C82F49F0AA29), UINT64_C(0x933B6BB8430FF478),
+ UINT64_C(0x64C501D45FF82D0A), UINT64_C(0x9EC1E1B373BBF174),
+ UINT64_C(0xE90106893BFBE803), UINT64_C(0x3FEF8D80F7390D8E),
+ UINT64_C(0x2C73446BF31D1325), UINT64_C(0x1C19E379F5CA7A92),
+ UINT64_C(0xF52D9D9C270AF2BE), UINT64_C(0x3ABF72E1EB2BED48),
+ UINT64_C(0x7ECF35084AC4FFC2), UINT64_C(0x38597A5A22019A82),
+ UINT64_C(0x9A51FF6EBE6A7B3C), UINT64_C(0x0C0ABE9DA2D28437),
+ UINT64_C(0xC79887FF7C9EC6EA), UINT64_C(0x436420D05851C899),
+ UINT64_C(0x72B5547FEFEAD581), UINT64_C(0x077AD8F899B1D2B5),
+ UINT64_C(0x3B4305ED5CDDBF5B), UINT64_C(0x2D88F3FDE3861AC7),
+ UINT64_C(0x393220AA3D6B43BE), UINT64_C(0x1CD62095E5382405),
+ UINT64_C(0x87A0D1E161A10C96), UINT64_C(0x68C933E6CA95A55D),
+ UINT64_C(0x778089BB9EE082E2), UINT64_C(0xFBB6D8D441429EE9),
+ UINT64_C(0x26CF5471C529500D), UINT64_C(0xD6C9B14068B9BE29),
+ UINT64_C(0x8415185207BE635A), UINT64_C(0x83730335B5572182),
+ UINT64_C(0xDD312D31EB2300B4), UINT64_C(0x488DA59C05D6DD9B),
+ UINT64_C(0xDA2C2E4037784D25), UINT64_C(0x6A57D7206A8D92FA),
+ UINT64_C(0xF07A8632950B41AC), UINT64_C(0x2ECAD06ACD55F062),
+ UINT64_C(0x34C98BB0E6A3DFE7), UINT64_C(0xB60521B19C767D8F),
+ UINT64_C(0xE87D16BE752AAFD1), UINT64_C(0xE58A8B0C9DE1D728),
+ UINT64_C(0x2FA2C119C6013830), UINT64_C(0x519B40C83C4F9156),
+ UINT64_C(0xAB78701B5058FC8F), UINT64_C(0xC502A554ADC59C47),
+ UINT64_C(0x6647F04C0FB3286F), UINT64_C(0x5EA495C89DB4076E),
+ UINT64_C(0xB4F00F8B9C74FAB1), UINT64_C(0xD092B4C6897C7A3C),
+ UINT64_C(0x32F31FA8283E0340), UINT64_C(0x67B63DE2EEB708CC),
+ UINT64_C(0xEF2BC02B4F7B3C8B), UINT64_C(0xC49344C0DA14BFE3),
+ UINT64_C(0xB6C4E69EAABC85BE), UINT64_C(0x63A110162ECE8AA6),
+ UINT64_C(0x726AE4D919CFBA4D), UINT64_C(0xEE6AE7070FC90B42),
+ UINT64_C(0x4D9AABC54290B04A), UINT64_C(0xF34906CDFB2B070E),
+ UINT64_C(0x52CA97091FF54B0A), UINT64_C(0x164315700B42BFE1),
+ UINT64_C(0x6B5565BB980F3076), UINT64_C(0x9CE63C76EB8C4C4A),
+ UINT64_C(0x3DA24C53B9E4C771), UINT64_C(0xB50E3C666F0266FA),
+ UINT64_C(0x01BB4B9676E34F79), UINT64_C(0x0FBEA1249948CF3E),
+ UINT64_C(0xA1FA4EDC86BEAD12), UINT64_C(0xC3B97BF9D11E901C),
+ UINT64_C(0x370CA58E71730E03), UINT64_C(0x886467E248B19715),
+ UINT64_C(0x3C727E24DB237497), UINT64_C(0x8E67D76E2116CCD2),
+ UINT64_C(0x34BDEDD3F973AECF), UINT64_C(0xB042AB0531D680EC),
+ UINT64_C(0xFC5C3C17770E96A0), UINT64_C(0xB8204ECEAB6F1874),
+ UINT64_C(0x416C0CED5843F3A5), UINT64_C(0x9578018311DD112F),
+ UINT64_C(0x7E0E8613B1C74BD8), UINT64_C(0xA79FFC1096C6453B),
+ UINT64_C(0xFCD6DA0AB2157651), UINT64_C(0x3DD0CCAC836A34A7),
+ UINT64_C(0x496049ED316E5A36), UINT64_C(0xDEA1A97D0322BCB2),
+ UINT64_C(0x39578D53CDF2AA5A), UINT64_C(0x030565C91D1AA931),
+ UINT64_C(0x324E0A27D198CBED), UINT64_C(0x284325345DB83E8A),
+ UINT64_C(0x5CB134C090BF23E8), UINT64_C(0x009E5051DD0ADAB6),
+ UINT64_C(0x7E36A6D7F8AD61DA), UINT64_C(0xBDFFE6AA84C75E57),
+ UINT64_C(0x138D680EB5D5532E), UINT64_C(0x4A5F74A1BD84DDAC),
+ UINT64_C(0x55538CFACCFF00D1), UINT64_C(0x48528011B0948B8C),
+ UINT64_C(0x9E047AD7E345F82E), UINT64_C(0xEA77BEF06EE770FF),
+ UINT64_C(0x2F1625670FC13669), UINT64_C(0x0614686C869426AC),
+ UINT64_C(0x4263ED823A3FF464), UINT64_C(0x57205A7AB3589B47),
+ UINT64_C(0xAE6FC46B213F24AD), UINT64_C(0xD92B133F3DE03E4E),
+ UINT64_C(0x1B49C24A315A589B), UINT64_C(0x1641C13873381BCB),
+ UINT64_C(0xBC680ADA7BC99425), UINT64_C(0x962E9884A5CFBC9A),
+ UINT64_C(0xFC8D12F60A960D70), UINT64_C(0x60ACC868ED18EF4C),
+ UINT64_C(0x131130369AEA5D14), UINT64_C(0x2D99A5B0C747C87E),
+ UINT64_C(0x006B36583A369BB3), UINT64_C(0xE43FA6E6118A5135),
+ UINT64_C(0xA13DC05EB4947190), UINT64_C(0x0DBD7170D7733DB8),
+ UINT64_C(0x117ED7E7C3FB67D1), UINT64_C(0xC05FE99EE2D72A49),
+ UINT64_C(0xD971A25B9638DB40), UINT64_C(0x1A1595594239D468),
+ UINT64_C(0xC1117392850A223C), UINT64_C(0x567B5FC022D2DBD8),
+ UINT64_C(0xC051007A92C5B4EB), UINT64_C(0xFB35572011CC0099),
+ UINT64_C(0x398481616907810D), UINT64_C(0x61D19EF25E8534F4),
+ UINT64_C(0x8A0AB03C2EE8C466), UINT64_C(0x879AA514C234AF76),
+ UINT64_C(0x59E5DA579774A235), UINT64_C(0xF339BD5A9BC466B3),
+ UINT64_C(0xBBB5FD6744AB026D), UINT64_C(0x3685C9F22B977202),
+ UINT64_C(0x7054359E03E5DC00), UINT64_C(0x9BA11F085239CFB0),
+ UINT64_C(0x9C258687F8237562), UINT64_C(0x52C7BF8FA3B510DD),
+ UINT64_C(0x3245E079B31ED0CF), UINT64_C(0xBAEE38C7FF9FF8D3),
+ UINT64_C(0xF702B3B9F17D5562), UINT64_C(0xCBCA275DCC4C8563),
+ UINT64_C(0xE817DBACE005D9D1), UINT64_C(0x62CEE35005C6920A),
+ UINT64_C(0x19E049B90F1DEAC0), UINT64_C(0xB2A27A1659599F74),
+ UINT64_C(0x7DCEF00DF0911D5A), UINT64_C(0x375522513603DD66),
+ UINT64_C(0x5FA022DA97813735), UINT64_C(0xEFBE57C20D849416),
+ UINT64_C(0x5761929630A0E592), UINT64_C(0x11735043C953CC47),
+ UINT64_C(0xC0444BE0A83526AD), UINT64_C(0x16FF5136B5F8463C),
+ UINT64_C(0xF037572C2A0A6631), UINT64_C(0xB1BF8DAAD30464DA),
+ UINT64_C(0x0F3E9E7E7F5718F7), UINT64_C(0xC26F2624E5A4CFE7),
+ UINT64_C(0xDFE8F4858C9B5AE4), UINT64_C(0xC64A1509F6FA82E3),
+ UINT64_C(0x3024B220ACB24AEA), UINT64_C(0xDDCDFEDDDDB02AC0),
+ UINT64_C(0x384C86C3D834C574), UINT64_C(0xDD48A571D904E099),
+ UINT64_C(0x77B35C744550A05F), UINT64_C(0xAAEBDC6D81E85F71),
+ UINT64_C(0xD4CDC0540F9BB0B1), UINT64_C(0x845786AF7AF4DF85),
+ UINT64_C(0xDF2A91CAE5E53887), UINT64_C(0x5689A3C4F6A58211),
+ UINT64_C(0xA705983A8CF6AA15), UINT64_C(0x2CE7FEF09FBF2F52),
+ UINT64_C(0x4A3B536548E84A62), UINT64_C(0xD48A0872F8281A47),
+ UINT64_C(0xF0929C3E8423DCF6), UINT64_C(0xE9EC071B044A5049),
+ UINT64_C(0x20E30C1B17DECC36), UINT64_C(0x3342196A45FC2813),
+ UINT64_C(0x6601E33746AFB7F9), UINT64_C(0xF18094D130754439),
+ UINT64_C(0x61410DD1D38B4112), UINT64_C(0xD97D4DD8D8796B36),
+ UINT64_C(0x8080519147E9BC0B), UINT64_C(0xCDE438C11584E2DA),
+ UINT64_C(0x409659A1955D24F1), UINT64_C(0x5A09635F1B0950B1),
+ UINT64_C(0x615472B965B1FEBE), UINT64_C(0x6308E067525DC00A),
+ UINT64_C(0xD4E705A44089E2D4), UINT64_C(0x32C18B2643FC9209),
+ UINT64_C(0xAF2711534447A5FA), UINT64_C(0x4DC4F0D23617CADC),
+ UINT64_C(0x6AA116EF692EB386), UINT64_C(0x0641DC0B655991BC),
+ UINT64_C(0xC655966454469597), UINT64_C(0x4BDC0D1A749C0FE8),
+ UINT64_C(0xC5292A61A7D3381E), UINT64_C(0x42474CC24EB65FDC),
+ UINT64_C(0x19DFC9EEF2C6B173), UINT64_C(0xBECE2EE30A19A199),
+ UINT64_C(0xAA03AA7CC68B778D), UINT64_C(0xAE54D2BEC8DB86F0),
+ UINT64_C(0xDEE3F48FB92A01E0), UINT64_C(0xF6AE28526023C0A9),
+ UINT64_C(0xA441CB9EA233763B), UINT64_C(0x3A8BB4B73246DDDD),
+ UINT64_C(0x308EF2C844FAA3C3), UINT64_C(0xD2862534FD1C8516),
+ UINT64_C(0x62336F6F3B25EBE7), UINT64_C(0x0B8E2CE60C336A45),
+ UINT64_C(0x11EEA1F2E867F171), UINT64_C(0x68DF4903523972EC),
+ UINT64_C(0x51EF4CB750C05824), UINT64_C(0x3FFAE115CB4DF2A8),
+ UINT64_C(0x3ED1635FB51ACA2F), UINT64_C(0x0A5AC09FD6FF1CC6),
+ UINT64_C(0x0A3DC76FDE8ED9D6), UINT64_C(0x37991DDE5DC2D8DD),
+ UINT64_C(0x80AD6E13F95BACB2), UINT64_C(0xD4F8C7A6163005EE),
+ UINT64_C(0xA4760F083225D180), UINT64_C(0x9B2B1A875FFF004D),
+ UINT64_C(0x5CD00B66E7EA8576), UINT64_C(0x285DD80DEC478452),
+ UINT64_C(0x4301B3A120112439), UINT64_C(0xFACBB68CFF879FC8),
+ UINT64_C(0xB17FDF84AF6AF6B8), UINT64_C(0xF4489576C208D9F1),
+ UINT64_C(0xADCC862C8794A6E9), UINT64_C(0x931685A40E83E54C),
+ UINT64_C(0x1E40293BAB01C580), UINT64_C(0x1F1DDF7FCAD784FA),
+ UINT64_C(0xCEE722B26B856084), UINT64_C(0x74254EB41C39938B),
+ UINT64_C(0xB9C26D9AC7CCEBF4), UINT64_C(0x2E3ECE246B08DFB9),
+ UINT64_C(0xDFF60410981455EC), UINT64_C(0xE06FA38BBC804E2B),
+ UINT64_C(0x72E53C52B534540C), UINT64_C(0xB2A5C05A02DFB2EF),
+ UINT64_C(0x973133385002A2A5), UINT64_C(0xD61DF455597C53FF),
+ UINT64_C(0x39AC2EC534E5261A), UINT64_C(0x388B7539C6BC0CAB),
+ UINT64_C(0x00EAC7043F732FC0), UINT64_C(0xC089971E92FB21D9),
+ UINT64_C(0x7AF93F8FB4FFA503), UINT64_C(0xA8311B2372E353B6),
+ UINT64_C(0x1DE496CA8266C9AF), UINT64_C(0xD6FA0B51DBDB16B0),
+ UINT64_C(0xBD5630899991A5EF), UINT64_C(0x0954A1E3168CBE0F),
+ UINT64_C(0x53D09723537B9245), UINT64_C(0x86558CB92867272D),
+ UINT64_C(0xFAC85D100B83F026), UINT64_C(0x1E5DDB95F8562951),
+ UINT64_C(0x48D27B92AD3668C8), UINT64_C(0x19B58A99C930B7E6),
+ UINT64_C(0xA9CDA917A3DE74E3), UINT64_C(0x7A4DD16ECB6E35EE),
+ UINT64_C(0x4D84073F4C80E9D5), UINT64_C(0x9CFFCFC074A95BA8),
+ UINT64_C(0x15796372D28485EB), UINT64_C(0x77EDA8DF5717E9CD),
+ UINT64_C(0xADB965E1AB473C4E), UINT64_C(0x5BC05659FFAD6959),
+ UINT64_C(0xFB2402276ED63880), UINT64_C(0xD15FDDDF2014850B),
+ UINT64_C(0xB538F37DFDD74592), UINT64_C(0x1473396F3A8E2E82),
+ UINT64_C(0x3CE41A21F6A5EDF8), UINT64_C(0x754E82640CC4351A),
+ UINT64_C(0xC7821B96AAB95E73), UINT64_C(0xC242FAAAF42FF463),
+ UINT64_C(0x087E260EDD00AC65), UINT64_C(0x0DBE032817D193F5),
+ UINT64_C(0xF9D10F96844A63C9), UINT64_C(0xBAF127EC85AA91DD),
+ UINT64_C(0xCE85E6A50AB6DABB), UINT64_C(0xE7B56A161AF5D24F),
+ UINT64_C(0x57D1D79FCD6C5A19), UINT64_C(0xEC4DD2F05DFC2B28),
+ UINT64_C(0x8D72216A18FE64A1), UINT64_C(0x72F14A085F222077),
+ UINT64_C(0x3BF038ABD8B09B11), UINT64_C(0xC4265D7CC6CF1F44),
+ UINT64_C(0x46398D2CDAB1B0E7), UINT64_C(0xB6E705D37DCFDC68),
+ UINT64_C(0x362C11834AAFD1E6), UINT64_C(0xF6AC98B7D8701107),
+ UINT64_C(0xD6649424AD114D7E), UINT64_C(0xDDD1C6E4C40AB551),
+ UINT64_C(0xC9D284C8A132030F), UINT64_C(0x824069EEDB1F662A),
+ UINT64_C(0xC846B3AD4157904B), UINT64_C(0x0A248C17D38481CA),
+ UINT64_C(0xE8745FEBC846831F), UINT64_C(0x00000000000025A8),
diff --git a/llvm/utils/generate-apfloat-pow5-table.py b/llvm/utils/generate-apfloat-pow5-table.py
index 90729e8b90c8d..2809be2eb710c 100644
--- a/llvm/utils/generate-apfloat-pow5-table.py
+++ b/llvm/utils/generate-apfloat-pow5-table.py
@@ -38,10 +38,18 @@ def main():
exponent *= 2
value *= value
- for exponent, value_words in table:
- print(f"// 5^{exponent}")
- for word in value_words:
- print(f"UINT64_C(0x{word:016X}),")
+ # This is included within an initializer. Keep the generated layout in
+ # the form produced by clang-format: after the first entry, two 64-bit
+ # words fit on each indented line.
+ for index, (exponent, value_words) in enumerate(table):
+ indent = "" if index == 0 else " "
+ print(f"{indent}// 5^{exponent}")
+ for word_index in range(0, len(value_words), 2):
+ line = ", ".join(
+ f"UINT64_C(0x{word:016X})"
+ for word in value_words[word_index : word_index + 2]
+ )
+ print(f"{indent}{line},")
if __name__ == "__main__":
More information about the llvm-commits
mailing list