1 //===-- TestMatchers.cpp ----------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "FPMatcher.h" 10 11 #include "src/__support/FPUtil/FPBits.h" 12 13 #include "utils/UnitTest/StringUtils.h" 14 15 #include <sstream> 16 #include <string> 17 18 namespace __llvm_libc { 19 namespace fputil { 20 namespace testing { 21 22 template <typename ValType, typename StreamType> 23 cpp::EnableIfType<cpp::IsFloatingPointType<ValType>::Value, void> 24 describeValue(const char *label, ValType value, StreamType &stream) { 25 stream << label; 26 27 FPBits<ValType> bits(value); 28 if (bits.is_nan()) { 29 stream << "(NaN)"; 30 } else if (bits.is_inf()) { 31 if (bits.get_sign()) 32 stream << "(-Infinity)"; 33 else 34 stream << "(+Infinity)"; 35 } else { 36 constexpr int exponentWidthInHex = 37 (fputil::ExponentWidth<ValType>::VALUE - 1) / 4 + 1; 38 constexpr int mantissaWidthInHex = 39 (fputil::MantissaWidth<ValType>::VALUE - 1) / 4 + 1; 40 constexpr int bitsWidthInHex = 41 sizeof(typename fputil::FPBits<ValType>::UIntType) * 2; 42 43 stream << "0x" 44 << int_to_hex<typename fputil::FPBits<ValType>::UIntType>( 45 bits.uintval(), bitsWidthInHex) 46 << ", (S | E | M) = (" << (bits.get_sign() ? '1' : '0') << " | 0x" 47 << int_to_hex<uint16_t>(bits.get_unbiased_exponent(), 48 exponentWidthInHex) 49 << " | 0x" 50 << int_to_hex<typename fputil::FPBits<ValType>::UIntType>( 51 bits.get_mantissa(), mantissaWidthInHex) 52 << ")"; 53 } 54 55 stream << '\n'; 56 } 57 58 template void describeValue<float>(const char *, float, 59 testutils::StreamWrapper &); 60 template void describeValue<double>(const char *, double, 61 testutils::StreamWrapper &); 62 template void describeValue<long double>(const char *, long double, 63 testutils::StreamWrapper &); 64 65 template void describeValue<float>(const char *, float, std::stringstream &); 66 template void describeValue<double>(const char *, double, std::stringstream &); 67 template void describeValue<long double>(const char *, long double, 68 std::stringstream &); 69 70 } // namespace testing 71 } // namespace fputil 72 } // namespace __llvm_libc 73