From ce6bfd102af5d3431ff19f322fce27e033a34c49 Mon Sep 17 00:00:00 2001 From: Dominic Chen Date: Thu, 21 Apr 2022 15:08:04 -0700 Subject: [PATCH] [libc] Support 32-bit ARM platform tests Set LONG_DOUBLE_IS_DOUBLE, add ifdefs for 128-bit integer types Differential Revision: https://reviews.llvm.org/D124204 --- libc/src/__support/CPP/Limits.h | 3 ++- libc/src/__support/CPP/TypeTraits.h | 7 +++++-- libc/src/__support/FPUtil/PlatformDefs.h | 4 +++- libc/test/src/__support/CPP/limits_test.cpp | 2 ++ libc/test/src/__support/high_precision_decimal_test.cpp | 12 ++++++++++++ libc/test/src/__support/str_to_float_test.cpp | 2 +- libc/test/src/stdlib/strtold_test.cpp | 2 ++ libc/utils/UnitTest/LibcTest.cpp | 6 ++++++ 8 files changed, 33 insertions(+), 5 deletions(-) diff --git a/libc/src/__support/CPP/Limits.h b/libc/src/__support/CPP/Limits.h index 7e5de10..ba6c96f 100644 --- a/libc/src/__support/CPP/Limits.h +++ b/libc/src/__support/CPP/Limits.h @@ -52,6 +52,7 @@ public: static constexpr unsigned long long max() { return ULLONG_MAX; } static constexpr unsigned long long min() { return 0; } }; +#ifdef __SIZEOF_INT128__ template <> class NumericLimits<__uint128_t> { public: static constexpr __uint128_t max() { return ~__uint128_t(0); } @@ -62,7 +63,7 @@ public: static constexpr __int128_t max() { return ~__uint128_t(0) >> 1; } static constexpr __int128_t min() { return __int128_t(1) << 127; } }; - +#endif } // namespace cpp } // namespace __llvm_libc diff --git a/libc/src/__support/CPP/TypeTraits.h b/libc/src/__support/CPP/TypeTraits.h index 0c542f1..b07e25f 100644 --- a/libc/src/__support/CPP/TypeTraits.h +++ b/libc/src/__support/CPP/TypeTraits.h @@ -49,8 +49,11 @@ template struct IsIntegral { IsSameV || IsSameV || IsSameV || IsSameV || IsSameV || IsSameV || - IsSameV || IsSameV || - IsSameV<__uint128_t, TypeNoCV> || IsSameV<__int128_t, TypeNoCV>; + IsSameV || IsSameV +#ifdef __SIZEOF_INT128__ + || IsSameV<__uint128_t, TypeNoCV> || IsSameV<__int128_t, TypeNoCV> +#endif + ; }; template struct IsPointerTypeNoCV : public FalseValue {}; diff --git a/libc/src/__support/FPUtil/PlatformDefs.h b/libc/src/__support/FPUtil/PlatformDefs.h index a32c4af..6f22bc3 100644 --- a/libc/src/__support/FPUtil/PlatformDefs.h +++ b/libc/src/__support/FPUtil/PlatformDefs.h @@ -15,8 +15,10 @@ #define X87_FPU #endif +// https://developer.arm.com/documentation/dui0491/i/C-and-C---Implementation-Details/Basic-data-types // https://developer.apple.com/documentation/xcode/writing-arm64-code-for-apple-platforms -#if defined(_WIN32) || (defined(__APPLE__) && defined(__aarch64__)) +#if defined(_WIN32) || defined(__arm__) || \ + (defined(__APPLE__) && defined(__aarch64__)) #define LONG_DOUBLE_IS_DOUBLE #endif diff --git a/libc/test/src/__support/CPP/limits_test.cpp b/libc/test/src/__support/CPP/limits_test.cpp index fa0ae38..0272b5a 100644 --- a/libc/test/src/__support/CPP/limits_test.cpp +++ b/libc/test/src/__support/CPP/limits_test.cpp @@ -29,6 +29,7 @@ TEST(LlvmLibcLimitsTest, LimitsFollowSpec) { ULLONG_MAX); } +#ifdef __SIZEOF_INT128__ // This checks that the current environment supports 128 bit integers. TEST(LlvmLibcLimitsTest, Int128Works) { __int128_t max128 = ~__uint128_t(0) >> 1; @@ -47,3 +48,4 @@ TEST(LlvmLibcLimitsTest, Int128Works) { __uint128_t(__llvm_libc::cpp::NumericLimits::max())); ASSERT_EQ(__llvm_libc::cpp::NumericLimits<__uint128_t>::max(), umax128); } +#endif diff --git a/libc/test/src/__support/high_precision_decimal_test.cpp b/libc/test/src/__support/high_precision_decimal_test.cpp index 1761dae..46cc572 100644 --- a/libc/test/src/__support/high_precision_decimal_test.cpp +++ b/libc/test/src/__support/high_precision_decimal_test.cpp @@ -344,26 +344,34 @@ TEST(LlvmLibcHighPrecisionDecimalTest, RoundingTest) { EXPECT_EQ(hpd.round_to_integer_type(), uint32_t(1)); EXPECT_EQ(hpd.round_to_integer_type(), uint64_t(1)); +#ifdef __SIZEOF_INT128__ EXPECT_EQ(hpd.round_to_integer_type<__uint128_t>(), __uint128_t(1)); +#endif hpd.shift(1); // shift left 1 to get 2.469 (rounds to 2) EXPECT_EQ(hpd.round_to_integer_type(), uint32_t(2)); EXPECT_EQ(hpd.round_to_integer_type(), uint64_t(2)); +#ifdef __SIZEOF_INT128__ EXPECT_EQ(hpd.round_to_integer_type<__uint128_t>(), __uint128_t(2)); +#endif hpd.shift(1); // shift left 1 to get 4.938 (rounds to 5) EXPECT_EQ(hpd.round_to_integer_type(), uint32_t(5)); EXPECT_EQ(hpd.round_to_integer_type(), uint64_t(5)); +#ifdef __SIZEOF_INT128__ EXPECT_EQ(hpd.round_to_integer_type<__uint128_t>(), __uint128_t(5)); +#endif // 2.5 is right between two integers, so we round to even (2) hpd = __llvm_libc::internal::HighPrecisionDecimal("2.5"); EXPECT_EQ(hpd.round_to_integer_type(), uint32_t(2)); EXPECT_EQ(hpd.round_to_integer_type(), uint64_t(2)); +#ifdef __SIZEOF_INT128__ EXPECT_EQ(hpd.round_to_integer_type<__uint128_t>(), __uint128_t(2)); +#endif // unless it's marked as having truncated, which means it's actually slightly // higher, forcing a round up (3) @@ -371,7 +379,9 @@ TEST(LlvmLibcHighPrecisionDecimalTest, RoundingTest) { EXPECT_EQ(hpd.round_to_integer_type(), uint32_t(3)); EXPECT_EQ(hpd.round_to_integer_type(), uint64_t(3)); +#ifdef __SIZEOF_INT128__ EXPECT_EQ(hpd.round_to_integer_type<__uint128_t>(), __uint128_t(3)); +#endif // Check that the larger int types are being handled properly (overflow is not // handled, so int types that are too small are ignored for this test.) @@ -380,6 +390,7 @@ TEST(LlvmLibcHighPrecisionDecimalTest, RoundingTest) { hpd = __llvm_libc::internal::HighPrecisionDecimal("1099511627776"); EXPECT_EQ(hpd.round_to_integer_type(), uint64_t(1099511627776)); +#ifdef __SIZEOF_INT128__ EXPECT_EQ(hpd.round_to_integer_type<__uint128_t>(), __uint128_t(1099511627776)); @@ -390,4 +401,5 @@ TEST(LlvmLibcHighPrecisionDecimalTest, RoundingTest) { __uint128_t result = __uint128_t(1) << 100; EXPECT_EQ(hpd.round_to_integer_type<__uint128_t>(), result); +#endif } diff --git a/libc/test/src/__support/str_to_float_test.cpp b/libc/test/src/__support/str_to_float_test.cpp index dc70ebc..211e3dc0 100644 --- a/libc/test/src/__support/str_to_float_test.cpp +++ b/libc/test/src/__support/str_to_float_test.cpp @@ -313,7 +313,7 @@ TEST_F(LlvmLibcStrToFloatTest, EiselLemireFloat80Fallback) { ASSERT_FALSE(__llvm_libc::internal::eisel_lemire( 1, -1000, &quadOutputMantissa, &outputExp2)); } -#else +#elif defined(__SIZEOF_INT128__) TEST_F(LlvmLibcStrToFloatTest, EiselLemireFloat128Simple) { eisel_lemire_test(123, 0, (__uint128_t(0x1ec0000000000) << 64), 16389); diff --git a/libc/test/src/stdlib/strtold_test.cpp b/libc/test/src/stdlib/strtold_test.cpp index d077bb1..7583e59 100644 --- a/libc/test/src/stdlib/strtold_test.cpp +++ b/libc/test/src/stdlib/strtold_test.cpp @@ -15,6 +15,7 @@ #include #include +#ifdef __SIZEOF_INT128__ class LlvmLibcStrToLDTest : public __llvm_libc::testing::Test { public: void run_test(const char *inputString, const ptrdiff_t expectedStrLen, @@ -221,3 +222,4 @@ TEST_F(LlvmLibcStrToLDTest, NaNTests) { (__uint128_t(0x7fffc00000) << 40), (__uint128_t(0x7fff800000000000) << 64)); } +#endif diff --git a/libc/utils/UnitTest/LibcTest.cpp b/libc/utils/UnitTest/LibcTest.cpp index ed3ca41..21b54a1 100644 --- a/libc/utils/UnitTest/LibcTest.cpp +++ b/libc/utils/UnitTest/LibcTest.cpp @@ -42,6 +42,7 @@ describeValue(ValType Value) { std::string describeValue(std::string Value) { return std::string(Value); } +#ifdef __SIZEOF_INT128__ // When the value is __uint128_t, also show its hexadecimal digits. // Using template to force exact match, prevent ambiguous promotion. std::string describeValue128(__uint128_t Value) { @@ -61,6 +62,7 @@ template <> std::string describeValue<__int128_t>(__int128_t Value) { template <> std::string describeValue<__uint128_t>(__uint128_t Value) { return describeValue128(Value); } +#endif template void explainDifference(ValType LHS, ValType RHS, const char *LHSStr, @@ -218,10 +220,12 @@ template bool test(RunContext *Ctx, TestCondition Cond, const char *RHSStr, const char *File, unsigned long Line); +#ifdef __SIZEOF_INT128__ template bool test<__int128_t>(RunContext *Ctx, TestCondition Cond, __int128_t LHS, __int128_t RHS, const char *LHSStr, const char *RHSStr, const char *File, unsigned long Line); +#endif template bool test(RunContext *Ctx, TestCondition Cond, unsigned char LHS, unsigned char RHS, @@ -253,10 +257,12 @@ template bool test(RunContext *Ctx, TestCondition Cond, const char *LHSStr, const char *RHSStr, const char *File, unsigned long Line); +#ifdef __SIZEOF_INT128__ template bool test<__uint128_t>(RunContext *Ctx, TestCondition Cond, __uint128_t LHS, __uint128_t RHS, const char *LHSStr, const char *RHSStr, const char *File, unsigned long Line); +#endif } // namespace internal -- 2.7.4