1*71db0c75SAndroid Build Coastguard Worker //===-- Utility class to test int to fixed point conversions ----*- C++ -*-===// 2*71db0c75SAndroid Build Coastguard Worker // 3*71db0c75SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*71db0c75SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information. 5*71db0c75SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*71db0c75SAndroid Build Coastguard Worker // 7*71db0c75SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 8*71db0c75SAndroid Build Coastguard Worker 9*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/Test.h" 10*71db0c75SAndroid Build Coastguard Worker 11*71db0c75SAndroid Build Coastguard Worker #include "include/llvm-libc-types/stdfix-types.h" 12*71db0c75SAndroid Build Coastguard Worker #include "src/__support/CPP/bit.h" 13*71db0c75SAndroid Build Coastguard Worker #include "src/__support/fixed_point/fx_bits.h" 14*71db0c75SAndroid Build Coastguard Worker 15*71db0c75SAndroid Build Coastguard Worker template <typename T, typename XType> 16*71db0c75SAndroid Build Coastguard Worker class FxBitsTest : public LIBC_NAMESPACE::testing::Test { 17*71db0c75SAndroid Build Coastguard Worker using FXRep = LIBC_NAMESPACE::fixed_point::FXRep<T>; 18*71db0c75SAndroid Build Coastguard Worker static constexpr T zero = FXRep::ZERO(); 19*71db0c75SAndroid Build Coastguard Worker static constexpr T min = FXRep::MIN(); 20*71db0c75SAndroid Build Coastguard Worker static constexpr T max = FXRep::MAX(); 21*71db0c75SAndroid Build Coastguard Worker static constexpr T half = static_cast<T>(0.5); 22*71db0c75SAndroid Build Coastguard Worker static constexpr T quarter = static_cast<T>(0.25); 23*71db0c75SAndroid Build Coastguard Worker static constexpr T one = 24*71db0c75SAndroid Build Coastguard Worker (FXRep::INTEGRAL_LEN > 0) ? static_cast<T>(1) : FXRep::MAX(); 25*71db0c75SAndroid Build Coastguard Worker static constexpr T eps = FXRep::EPS(); get_one_or_saturated_fraction()26*71db0c75SAndroid Build Coastguard Worker constexpr XType get_one_or_saturated_fraction() { 27*71db0c75SAndroid Build Coastguard Worker if (FXRep::INTEGRAL_LEN > 0) { 28*71db0c75SAndroid Build Coastguard Worker return static_cast<XType>(static_cast<XType>(0x1) << FXRep::FRACTION_LEN); 29*71db0c75SAndroid Build Coastguard Worker } else { 30*71db0c75SAndroid Build Coastguard Worker return static_cast<XType>( 31*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::mask_trailing_ones<typename FXRep::StorageType, 32*71db0c75SAndroid Build Coastguard Worker FXRep::FRACTION_LEN>()); 33*71db0c75SAndroid Build Coastguard Worker } 34*71db0c75SAndroid Build Coastguard Worker } 35*71db0c75SAndroid Build Coastguard Worker 36*71db0c75SAndroid Build Coastguard Worker public: 37*71db0c75SAndroid Build Coastguard Worker typedef T (*FxBitsFunc)(XType); 38*71db0c75SAndroid Build Coastguard Worker test_special_numbers(FxBitsFunc func)39*71db0c75SAndroid Build Coastguard Worker void test_special_numbers(FxBitsFunc func) { 40*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(zero, func(0)); 41*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(eps, func(0x1)); 42*71db0c75SAndroid Build Coastguard Worker // x.1000... 43*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(half, func(static_cast<XType>(0x1) << (FXRep::FRACTION_LEN - 1))); 44*71db0c75SAndroid Build Coastguard Worker // Occupy the bit to the left of the fixed point for Accum types 45*71db0c75SAndroid Build Coastguard Worker // Saturate fraction portion for Fract types 46*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(one, func(get_one_or_saturated_fraction())); 47*71db0c75SAndroid Build Coastguard Worker } 48*71db0c75SAndroid Build Coastguard Worker }; 49*71db0c75SAndroid Build Coastguard Worker 50*71db0c75SAndroid Build Coastguard Worker #define LIST_FXBITS_TEST(Name, T, XType, func) \ 51*71db0c75SAndroid Build Coastguard Worker using LlvmLibc##Name##BitsTest = FxBitsTest<T, XType>; \ 52*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibc##Name##BitsTest, SpecialNumbers) { \ 53*71db0c75SAndroid Build Coastguard Worker test_special_numbers(&func); \ 54*71db0c75SAndroid Build Coastguard Worker } \ 55*71db0c75SAndroid Build Coastguard Worker static_assert(true, "Require semicolon.") 56