16c3f53c7SSiva Chandra Reddy //===-- TestMatchers.cpp ----------------------------------------*- C++ -*-===//
26c3f53c7SSiva Chandra Reddy //
36c3f53c7SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
46c3f53c7SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
56c3f53c7SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66c3f53c7SSiva Chandra Reddy //
76c3f53c7SSiva Chandra Reddy //===----------------------------------------------------------------------===//
86c3f53c7SSiva Chandra Reddy
96c3f53c7SSiva Chandra Reddy #include "FPMatcher.h"
106c3f53c7SSiva Chandra Reddy
116c3f53c7SSiva Chandra Reddy #include "src/__support/FPUtil/FPBits.h"
126c3f53c7SSiva Chandra Reddy
13*ff137478SMichael Jones #include "utils/UnitTest/StringUtils.h"
14*ff137478SMichael Jones
158cd81274STue Ly #include <sstream>
166c3f53c7SSiva Chandra Reddy #include <string>
176c3f53c7SSiva Chandra Reddy
186c3f53c7SSiva Chandra Reddy namespace __llvm_libc {
196c3f53c7SSiva Chandra Reddy namespace fputil {
206c3f53c7SSiva Chandra Reddy namespace testing {
216c3f53c7SSiva Chandra Reddy
228cd81274STue Ly template <typename ValType, typename StreamType>
236c3f53c7SSiva Chandra Reddy cpp::EnableIfType<cpp::IsFloatingPointType<ValType>::Value, void>
describeValue(const char * label,ValType value,StreamType & stream)248cd81274STue Ly describeValue(const char *label, ValType value, StreamType &stream) {
256c3f53c7SSiva Chandra Reddy stream << label;
266c3f53c7SSiva Chandra Reddy
276c3f53c7SSiva Chandra Reddy FPBits<ValType> bits(value);
281c92911eSMichael Jones if (bits.is_nan()) {
296c3f53c7SSiva Chandra Reddy stream << "(NaN)";
301c92911eSMichael Jones } else if (bits.is_inf()) {
311c92911eSMichael Jones if (bits.get_sign())
326c3f53c7SSiva Chandra Reddy stream << "(-Infinity)";
336c3f53c7SSiva Chandra Reddy else
346c3f53c7SSiva Chandra Reddy stream << "(+Infinity)";
356c3f53c7SSiva Chandra Reddy } else {
366c3f53c7SSiva Chandra Reddy constexpr int exponentWidthInHex =
371c92911eSMichael Jones (fputil::ExponentWidth<ValType>::VALUE - 1) / 4 + 1;
386c3f53c7SSiva Chandra Reddy constexpr int mantissaWidthInHex =
391c92911eSMichael Jones (fputil::MantissaWidth<ValType>::VALUE - 1) / 4 + 1;
408cd81274STue Ly constexpr int bitsWidthInHex =
418cd81274STue Ly sizeof(typename fputil::FPBits<ValType>::UIntType) * 2;
426c3f53c7SSiva Chandra Reddy
438cd81274STue Ly stream << "0x"
44*ff137478SMichael Jones << int_to_hex<typename fputil::FPBits<ValType>::UIntType>(
458cd81274STue Ly bits.uintval(), bitsWidthInHex)
468cd81274STue Ly << ", (S | E | M) = (" << (bits.get_sign() ? '1' : '0') << " | 0x"
47*ff137478SMichael Jones << int_to_hex<uint16_t>(bits.get_unbiased_exponent(),
486c3f53c7SSiva Chandra Reddy exponentWidthInHex)
498cd81274STue Ly << " | 0x"
50*ff137478SMichael Jones << int_to_hex<typename fputil::FPBits<ValType>::UIntType>(
518cd81274STue Ly bits.get_mantissa(), mantissaWidthInHex)
528cd81274STue Ly << ")";
536c3f53c7SSiva Chandra Reddy }
546c3f53c7SSiva Chandra Reddy
556c3f53c7SSiva Chandra Reddy stream << '\n';
566c3f53c7SSiva Chandra Reddy }
576c3f53c7SSiva Chandra Reddy
586c3f53c7SSiva Chandra Reddy template void describeValue<float>(const char *, float,
596c3f53c7SSiva Chandra Reddy testutils::StreamWrapper &);
606c3f53c7SSiva Chandra Reddy template void describeValue<double>(const char *, double,
616c3f53c7SSiva Chandra Reddy testutils::StreamWrapper &);
626c3f53c7SSiva Chandra Reddy template void describeValue<long double>(const char *, long double,
636c3f53c7SSiva Chandra Reddy testutils::StreamWrapper &);
646c3f53c7SSiva Chandra Reddy
658cd81274STue Ly template void describeValue<float>(const char *, float, std::stringstream &);
668cd81274STue Ly template void describeValue<double>(const char *, double, std::stringstream &);
678cd81274STue Ly template void describeValue<long double>(const char *, long double,
688cd81274STue Ly std::stringstream &);
698cd81274STue Ly
706c3f53c7SSiva Chandra Reddy } // namespace testing
716c3f53c7SSiva Chandra Reddy } // namespace fputil
726c3f53c7SSiva Chandra Reddy } // namespace __llvm_libc
73