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