blob: c207440b9b735422f4ed8ee397e36896370aa9ec [file] [edit]
#!/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
print("// clang-format off")
print(
"// This file is auto-generated via "
"llvm/utils/generate-apfloat-pow5-table.py."
)
print("// Do not edit manually.")
for exponent, value_words in table:
print(f"// 5^{exponent}")
for word in value_words:
print(f"UINT64_C(0x{word:016X}),")
print(" // clang-format on")
if __name__ == "__main__":
main()