brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.0 KiB · d349192 Raw
82 lines · c
1//===-- Unittests for str_to_float ----------------------------------------===//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-exception6//7//===----------------------------------------------------------------------===//8 9#include "src/__support/FPUtil/FPBits.h"10#include "src/__support/macros/config.h"11#include "src/__support/str_to_float.h"12#include "src/__support/uint128.h"13 14#include "test/UnitTest/Test.h"15 16namespace LIBC_NAMESPACE_DECL {17 18template <typename T> struct LlvmLibcStrToFloatTest : public testing::Test {19  using StorageType = typename fputil::FPBits<T>::StorageType;20 21  void clinger_fast_path_test(const StorageType inputMantissa,22                              const int32_t inputExp10,23                              const StorageType expectedOutputMantissa,24                              const uint32_t expectedOutputExp2) {25    StorageType actual_output_mantissa = 0;26    uint32_t actual_output_exp2 = 0;27 28    auto result = internal::clinger_fast_path<T>({inputMantissa, inputExp10});29 30    ASSERT_TRUE(result.has_value());31 32    actual_output_mantissa = result->mantissa;33    actual_output_exp2 = static_cast<uint32_t>(result->exponent);34 35    EXPECT_EQ(actual_output_mantissa, expectedOutputMantissa);36    EXPECT_EQ(actual_output_exp2, expectedOutputExp2);37  }38 39  void clinger_fast_path_fails_test(const StorageType inputMantissa,40                                    const int32_t inputExp10) {41    ASSERT_FALSE(internal::clinger_fast_path<T>({inputMantissa, inputExp10})42                     .has_value());43  }44 45  void eisel_lemire_test(const StorageType inputMantissa,46                         const int32_t inputExp10,47                         const StorageType expectedOutputMantissa,48                         const uint32_t expectedOutputExp2) {49    StorageType actual_output_mantissa = 0;50    uint32_t actual_output_exp2 = 0;51 52    auto result = internal::eisel_lemire<T>({inputMantissa, inputExp10});53 54    ASSERT_TRUE(result.has_value());55 56    actual_output_mantissa = result->mantissa;57    actual_output_exp2 = static_cast<uint32_t>(result->exponent);58 59    EXPECT_EQ(actual_output_mantissa, expectedOutputMantissa);60    EXPECT_EQ(actual_output_exp2, expectedOutputExp2);61  }62 63  void simple_decimal_conversion_test(const char *__restrict numStart,64                                      const StorageType expectedOutputMantissa,65                                      const uint32_t expectedOutputExp2,66                                      const int expectedErrno = 0) {67    StorageType actual_output_mantissa = 0;68    uint32_t actual_output_exp2 = 0;69 70    auto result = internal::simple_decimal_conversion<T>(numStart);71 72    actual_output_mantissa = result.num.mantissa;73    actual_output_exp2 = static_cast<uint32_t>(result.num.exponent);74 75    EXPECT_EQ(actual_output_mantissa, expectedOutputMantissa);76    EXPECT_EQ(actual_output_exp2, expectedOutputExp2);77    EXPECT_EQ(result.error, expectedErrno);78  }79};80 81} // namespace LIBC_NAMESPACE_DECL82