//===-- Unittests for shared math functions in constexpr context ----------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #define LIBC_ENABLE_CONSTEXPR 1 #include "shared/math.h" #include "test/UnitTest/Test.h" #ifdef LIBC_USE_CONSTEXPR //===----------------------------------------------------------------------===// // Double Tests //===----------------------------------------------------------------------===// static_assert(0 == [] { double cx = 0.0; double x = 0.0; return LIBC_NAMESPACE::shared::canonicalize(&cx, &x); }()); static_assert(0.0 == LIBC_NAMESPACE::shared::ceil(0.0)); static_assert(0.0 == LIBC_NAMESPACE::shared::copysign(0.0, 0.0)); static_assert(1.0 == LIBC_NAMESPACE::shared::fabs(-1.0)); static_assert(1.0 == LIBC_NAMESPACE::shared::fdim(1.0, 0.0)); static_assert(0.0f == LIBC_NAMESPACE::shared::fdiv(0.0, 1.0)); static_assert(1.0 == LIBC_NAMESPACE::shared::floor(1.2)); static_assert(2.0 == LIBC_NAMESPACE::shared::fmaximum_mag_num(1.0, 2.0)); static_assert(0.0 == LIBC_NAMESPACE::shared::log(1.0)); static_assert(0.0 == LIBC_NAMESPACE::shared::fmaximum(0.0, 0.0)); static_assert(0.0 == LIBC_NAMESPACE::shared::fminimum(0.0, 0.0)); static_assert(0.0 == LIBC_NAMESPACE::shared::fmin(0.0, 0.0)); static_assert(0.0 == LIBC_NAMESPACE::shared::fmax(0.0, 0.0)); static_assert(0.0 == LIBC_NAMESPACE::shared::fmaximum_num(0.0, 0.0)); static_assert(0.0 == LIBC_NAMESPACE::shared::fminimum_num(0.0, 0.0)); static_assert(0.0 == LIBC_NAMESPACE::shared::fromfp(0.0, 0, 32)); static_assert(0.0 == LIBC_NAMESPACE::shared::fromfpx(0.0, 0, 32)); static_assert(0.0 == LIBC_NAMESPACE::shared::ufromfp(0.0, 0, 32)); static_assert(0.0 == LIBC_NAMESPACE::shared::ufromfpx(0.0, 0, 32)); static_assert(0.0 == LIBC_NAMESPACE::shared::fmaximum_mag(0.0, 0.0)); static_assert(0.0 == LIBC_NAMESPACE::shared::fminimum_mag(0.0, 0.0)); static_assert(-1.0 == [] { double getpayload_x = 0.0; return LIBC_NAMESPACE::shared::getpayload(&getpayload_x); }()); constexpr double TOTALORDER_X = 0.0; constexpr double TOTALORDER_Y = 0.0; static_assert(1 == LIBC_NAMESPACE::shared::totalorder(&TOTALORDER_X, &TOTALORDER_Y)); constexpr double TOTALORDERMAG_X = 0.0; constexpr double TOTALORDERMAG_Y = 0.0; static_assert(1 == LIBC_NAMESPACE::shared::totalordermag(&TOTALORDERMAG_X, &TOTALORDERMAG_Y)); static_assert(0.0 == LIBC_NAMESPACE::shared::fmod(4.0, 2.0)); static_assert(0.0 == [] { double iptr = 0; return LIBC_NAMESPACE::shared::modf(0, &iptr); }()); static_assert(0.0 == LIBC_NAMESPACE::shared::fminimum_mag_num(0.0, 0.0)); static_assert(0.0 == LIBC_NAMESPACE::shared::remainder(1.0, 1.0)); static_assert(0.0 == [] { int exp{}; return LIBC_NAMESPACE::shared::remquo(1.0, 1.0, &exp); }()); static_assert(0.0 == LIBC_NAMESPACE::shared::ldexp(0.0, 0.0)); static_assert(0.0 == LIBC_NAMESPACE::shared::scalbln(0.0, 0.0)); static_assert(0.0 == LIBC_NAMESPACE::shared::scalbn(0.0, 0.0)); static_assert(0 == [] { double setpayload_x = 0.0; return LIBC_NAMESPACE::shared::setpayload(&setpayload_x, 0.0); }()); static_assert(0.0 == [] { int exp{}; return LIBC_NAMESPACE::shared::frexp(0.0, &exp); }()); static_assert(0LL == LIBC_NAMESPACE::shared::llrint(0.0)); static_assert(0LL == LIBC_NAMESPACE::shared::llround(0.0)); static_assert(0L == LIBC_NAMESPACE::shared::lrint(0.0)); static_assert(0L == LIBC_NAMESPACE::shared::lround(0.0)); static_assert(0.0 == LIBC_NAMESPACE::shared::nearbyint(0.0)); static_assert(0.0 == LIBC_NAMESPACE::shared::nextafter(0.0, 0.0)); static_assert(0.0 == LIBC_NAMESPACE::shared::rint(0.0)); // TODO: iscanonical clashes with a macro defined in // static_assert(1 == LIBC_NAMESPACE::shared::iscanonical(0.0)); // TODO: issignaling clashes with a macro defined in // static_assert(0.0 == LIBC_NAMESPACE::shared::issignaling(0.0)); static_assert(1 == [] { const char arg{}; return LIBC_NAMESPACE::fputil::FPBits( LIBC_NAMESPACE::shared::nan(&arg)) .is_nan(); }()); static_assert(0.0 == LIBC_NAMESPACE::shared::round(0.0)); static_assert(0.0 == LIBC_NAMESPACE::shared::roundeven(0.0)); static_assert(0.0 == LIBC_NAMESPACE::shared::trunc(0.0)); // TODO: isnan clashes with a macro defined in // static_assert(0 == LIBC_NAMESPACE::shared::isnan(0.0)); //===----------------------------------------------------------------------===// // Float Tests //===----------------------------------------------------------------------===// static_assert(0 == [] { float cx = 0.0f; float x = 0.0f; return LIBC_NAMESPACE::shared::canonicalizef(&cx, &x); }()); static_assert(0.0f == LIBC_NAMESPACE::shared::ceilf(0.0f)); static_assert(0.0f == LIBC_NAMESPACE::shared::copysignf(0.0f, 0.0f)); static_assert(1.0f == LIBC_NAMESPACE::shared::fabsf(-1.0f)); static_assert(0.0f == LIBC_NAMESPACE::shared::fadd(0.0, 0.0)); static_assert(1.0f == LIBC_NAMESPACE::shared::fdimf(1.0f, 0.0f)); static_assert(2.0f == LIBC_NAMESPACE::shared::fmaximum_mag_numf(1.0f, 2.0f)); static_assert(0.0f == LIBC_NAMESPACE::shared::floorf(0.0f)); static_assert(0.0f == LIBC_NAMESPACE::shared::fmaximumf(0.0f, 0.0f)); static_assert(0.0f == LIBC_NAMESPACE::shared::fminimumf(0.0f, 0.0f)); static_assert(0.0f == LIBC_NAMESPACE::shared::fminf(0.0f, 0.0f)); static_assert(0.0f == LIBC_NAMESPACE::shared::fmaxf(0.0f, 0.0f)); static_assert(0.0f == LIBC_NAMESPACE::shared::fmaximum_numf(0.0f, 0.0f)); static_assert(0.0f == LIBC_NAMESPACE::shared::fminimum_numf(0.0f, 0.0f)); static_assert(0.0f == LIBC_NAMESPACE::shared::fromfp(0.0f, 0, 32)); static_assert(0.0f == LIBC_NAMESPACE::shared::fromfpx(0.0f, 0, 32)); static_assert(0.0f == LIBC_NAMESPACE::shared::ufromfpf(0.0f, 0, 32)); static_assert(0.0f == LIBC_NAMESPACE::shared::ufromfpxf(0.0f, 0, 32)); static_assert(0.0f == LIBC_NAMESPACE::shared::fmaximum_magf(0.0f, 0.0f)); static_assert(0.0f == LIBC_NAMESPACE::shared::fminimum_magf(0.0f, 0.0f)); static_assert(-1.0f == [] { float getpayload_x = 0.0f; return LIBC_NAMESPACE::shared::getpayloadf(&getpayload_x); }()); constexpr float TOTALORDERF_X = 0.0f; constexpr float TOTALORDERF_Y = 0.0f; static_assert(1 == LIBC_NAMESPACE::shared::totalorderf(&TOTALORDERF_X, &TOTALORDERF_Y)); constexpr float TOTALORDERMAGF_X = 0.0f; constexpr float TOTALORDERMAGF_Y = 0.0f; static_assert(1 == LIBC_NAMESPACE::shared::totalordermagf(&TOTALORDERMAGF_X, &TOTALORDERMAGF_Y)); static_assert(0.0f == LIBC_NAMESPACE::shared::fmodf(4.0f, 2.0f)); static_assert(0.0f == [] { float iptr = 0.0f; return LIBC_NAMESPACE::shared::modff(0.0f, &iptr); }()); static_assert(0.0f == LIBC_NAMESPACE::shared::fminimum_mag_numf(0.0f, 0.0f)); static_assert(0.0f == LIBC_NAMESPACE::shared::remainderf(1.0f, 1.0f)); static_assert(0.0f == [] { int exp{}; return LIBC_NAMESPACE::shared::remquof(1.0f, 1.0f, &exp); }()); static_assert(0.0f == LIBC_NAMESPACE::shared::scalblnf(0.0f, 0.0)); static_assert(0.0f == LIBC_NAMESPACE::shared::scalbnf(0.0f, 0.0)); static_assert(0 == [] { float setpayload_x = 0.0f; return LIBC_NAMESPACE::shared::setpayloadf(&setpayload_x, 0.0f); }()); static_assert(0.0f == LIBC_NAMESPACE::shared::fmul(0.0, 0.0)); static_assert(0.0f == LIBC_NAMESPACE::shared::fsub(0.0, 0.0)); static_assert(0LL == LIBC_NAMESPACE::shared::llrintf(0.0f)); static_assert(0LL == LIBC_NAMESPACE::shared::llroundf(0.0f)); static_assert(0L == LIBC_NAMESPACE::shared::lrintf(0.0f)); static_assert(0L == LIBC_NAMESPACE::shared::lroundf(0.0f)); static_assert(0.0f == LIBC_NAMESPACE::shared::nearbyintf(0.0f)); static_assert(0.0f == LIBC_NAMESPACE::shared::nextafterf(0.0f, 0.0f)); static_assert(0.0f == LIBC_NAMESPACE::shared::rintf(0.0f)); static_assert(1 == LIBC_NAMESPACE::shared::iscanonicalf(0.0f)); static_assert(0.0 == LIBC_NAMESPACE::shared::issignalingf(0.0f)); static_assert(1 == [] { const char arg{}; return LIBC_NAMESPACE::fputil::FPBits( LIBC_NAMESPACE::shared::nanf(&arg)) .is_nan(); }()); static_assert(0.0f == LIBC_NAMESPACE::shared::roundf(0.0f)); static_assert(0.0f == LIBC_NAMESPACE::shared::roundevenf(0.0f)); static_assert(0.0f == LIBC_NAMESPACE::shared::truncf(0.0f)); static_assert(0 == LIBC_NAMESPACE::shared::isnanf(0.0f)); //===----------------------------------------------------------------------===// // Float16 Tests //===----------------------------------------------------------------------===// #ifdef LIBC_TYPES_HAS_FLOAT16 static_assert(0 == [] { float16 cx = 0.0f16; float16 x = 0.0f16; return LIBC_NAMESPACE::shared::canonicalizef16(&cx, &x); }()); static_assert(0.0f16 == LIBC_NAMESPACE::shared::ceilf16(0.0f16)); static_assert(0.0f16 == LIBC_NAMESPACE::shared::copysignf16(0.0f16, 0.0f16)); static_assert(3.0f16 == LIBC_NAMESPACE::shared::f16add(1.0, 2.0)); static_assert(3.0f16 == LIBC_NAMESPACE::shared::f16addf(1.0f, 2.0f)); // TODO: make available after long double problem is fixed #if 0 static_assert(3.0f16 == LIBC_NAMESPACE::shared::f16addl(1.0L, 2.0L)); #endif #ifdef LIBC_TYPES_HAS_FLOAT128 static_assert(3.0f16 == LIBC_NAMESPACE::shared::f16addf128(float128(1.0), float128(2.0))); #endif static_assert(1.0f16 == LIBC_NAMESPACE::shared::fabsf16(-1.0f16)); static_assert(1.0f16 == LIBC_NAMESPACE::shared::fdimf16(1.0f16, 0.0f16)); static_assert(3.0f16 == LIBC_NAMESPACE::shared::floorf16(3.7f16)); static_assert(0.0f16 == LIBC_NAMESPACE::shared::fmaximumf16(0.0f16, 0.0f16)); static_assert(0.0f16 == LIBC_NAMESPACE::shared::fminimumf16(0.0f16, 0.0f16)); static_assert(0.0f16 == LIBC_NAMESPACE::shared::fminf16(0.0f16, 0.0f16)); static_assert(0.0f16 == LIBC_NAMESPACE::shared::fmaxf16(0.0f16, 0.0f16)); static_assert(0.0f16 == LIBC_NAMESPACE::shared::fmaximum_numf16(0.0f16, 0.0f16)); static_assert(0.0f16 == LIBC_NAMESPACE::shared::fminimum_numf16(0.0f16, 0.0f16)); static_assert(0.0f16 == LIBC_NAMESPACE::shared::fromfpf16(0.0f16, 0, 32)); static_assert(0.0f16 == LIBC_NAMESPACE::shared::fromfpxf16(0.0f16, 0, 32)); static_assert(-1.0f16 == [] { float16 getpayload_x = 0.0f16; return LIBC_NAMESPACE::shared::getpayloadf16(&getpayload_x); }()); static_assert(0.0f16 == LIBC_NAMESPACE::shared::ufromfpf16(0.0f16, 0, 32)); static_assert(0.0f16 == LIBC_NAMESPACE::shared::ufromfpxf16(0.0f16, 0, 32)); static_assert(0.0f16 == LIBC_NAMESPACE::shared::fmaximum_magf16(0.0f16, 0.0f16)); static_assert(0.0f16 == LIBC_NAMESPACE::shared::fminimum_magf16(0.0f16, 0.0f16)); constexpr float16 TOTALORDERF16_X = 0.0f16; constexpr float16 TOTALORDERF16_Y = 0.0f16; static_assert(1 == LIBC_NAMESPACE::shared::totalorderf16(&TOTALORDERF16_X, &TOTALORDERF16_Y)); constexpr float16 TOTALORDERMAGF16_X = 0.0f16; constexpr float16 TOTALORDERMAGF16_Y = 0.0f16; static_assert(1 == LIBC_NAMESPACE::shared::totalordermagf16(&TOTALORDERMAGF16_X, &TOTALORDERMAGF16_Y)); static_assert(0.0f16 == LIBC_NAMESPACE::shared::fmodf16(4.0f16, 2.0f16)); static_assert(0.0f16 == [] { float16 iptr{}; return LIBC_NAMESPACE::shared::modff16(0.0f16, &iptr); }()); static_assert(0.0f16 == LIBC_NAMESPACE::shared::fmaximum_mag_numf16(0.0f16, 0.0f16)); static_assert(0.0f16 == LIBC_NAMESPACE::shared::fminimum_mag_numf16(0.0f16, 0.0f16)); static_assert(0.0f16 == LIBC_NAMESPACE::shared::remainderf16(1.0f16, 1.0f16)); static_assert(0.0f16 == [] { int exp{}; return LIBC_NAMESPACE::shared::remquof16(1.0f16, 1.0f16, &exp); }()); static_assert(0.0f16 == LIBC_NAMESPACE::shared::scalblnf16(0.0f16, 0.0)); static_assert(0.0f16 == LIBC_NAMESPACE::shared::scalbnf16(0.0f16, 0.0)); static_assert(0 == [] { float16 setpayload_x = 0.0f16; return LIBC_NAMESPACE::shared::setpayloadf16(&setpayload_x, 0.0f16); }()); static_assert(0LL == LIBC_NAMESPACE::shared::llrintf16(0.0f16)); static_assert(0LL == LIBC_NAMESPACE::shared::llroundf16(0.0f16)); static_assert(0L == LIBC_NAMESPACE::shared::lrintf16(0.0f16)); static_assert(0L == LIBC_NAMESPACE::shared::lroundf16(0.0f16)); static_assert(0.0f16 == LIBC_NAMESPACE::shared::nearbyintf16(0.0f16)); static_assert(0.0f16 == LIBC_NAMESPACE::shared::nextafterf16(0.0f16, 0.0f16)); static_assert(0.0f16 == LIBC_NAMESPACE::shared::rintf16(0.0f16)); static_assert(1 == LIBC_NAMESPACE::shared::iscanonicalf16(0.0f16)); static_assert(0 == LIBC_NAMESPACE::shared::isnanf16(0.0f16)); static_assert(0.0 == LIBC_NAMESPACE::shared::issignalingf16(0.0f16)); static_assert(1 == [] { const char arg{}; return LIBC_NAMESPACE::fputil::FPBits( LIBC_NAMESPACE::shared::nanf16(&arg)) .is_nan(); }()); static_assert(0.0f16 == LIBC_NAMESPACE::shared::roundf16(0.0f16)); static_assert(0.0f16 == LIBC_NAMESPACE::shared::roundevenf16(0.0f16)); static_assert(0.0f16 == LIBC_NAMESPACE::shared::truncf16(0.0f16)); #endif // LIBC_TYPES_HAS_FLOAT16 //===----------------------------------------------------------------------===// // Long Double Tests //===----------------------------------------------------------------------===// // TODO(issue#185232): Mark as constexpr once the refactor is done. #if 0 // Temporarily disable long double tests static_assert(0 == [] { long double cx = 0.0L; long double x = 0.0L; return LIBC_NAMESPACE::shared::canonicalizel(&cx, &x); }()); static_assert(0.0L == LIBC_NAMESPACE::shared::ceill(0.0L)); static_assert(0.0L == LIBC_NAMESPACE::shared::copysignl(0.0L, 0.0L)); static_assert(0.0 == LIBC_NAMESPACE::shared::ddivl(0.0L, 1.0L)); static_assert(0.0 == LIBC_NAMESPACE::shared::dmull(0.0L, 1.0L)); static_assert(1.0L == LIBC_NAMESPACE::shared::fabsl(-1.0L)); static_assert(0.0f == LIBC_NAMESPACE::shared::faddl(0.0L, 0.0L)); static_assert(1.0L == LIBC_NAMESPACE::shared::fdiml(1.0L, 0.0L)); static_assert(0.0f == LIBC_NAMESPACE::shared::fdivl(0.0L, 1.0L)); static_assert(0.0L == LIBC_NAMESPACE::shared::floorl(0.0L)); static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::bf16subl(0.0L, 0.0L)); static_assert(0.0L == LIBC_NAMESPACE::shared::sqrtl(0.0L)); static_assert(0.0L == LIBC_NAMESPACE::shared::fmaximuml(0.0L, 0.0L)); static_assert(0.0L == LIBC_NAMESPACE::shared::fminimuml(0.0L, 0.0L)); static_assert(0.0L == LIBC_NAMESPACE::shared::fminl(0.0L, 0.0L)); static_assert(0.0L == LIBC_NAMESPACE::shared::fmaxl(0.0L, 0.0L)); static_assert(0.0L == LIBC_NAMESPACE::shared::fmaximum_numl(0.0L, 0.0L)); static_assert(0.0L == LIBC_NAMESPACE::shared::fminimum_numl(0.0L, 0.0L)); static_assert(0.0L == LIBC_NAMESPACE::shared::fromfpl(0.0L, 0, 32)); static_assert(0.0L == LIBC_NAMESPACE::shared::fromfpxl(0.0L, 0, 32)); static_assert(0.0L == LIBC_NAMESPACE::shared::ufromfpl(0.0L, 0, 32)); static_assert(-1.0L == [] { long double getpayload_x = 0.0L; return LIBC_NAMESPACE::shared::getpayloadl(&getpayload_x); }()); static_assert(0.0L == LIBC_NAMESPACE::shared::ufromfpxl(0.0L, 0, 32)); static_assert(0.0L == LIBC_NAMESPACE::shared::fmaximum_magl(0.0L, 0.0L)); static_assert(0.0L == LIBC_NAMESPACE::shared::fminimum_magl(0.0L, 0.0L)); constexpr long double TOTALORDERL_X = 0.0L; constexpr long double TOTALORDERL_Y = 0.0L; static_assert(1 == LIBC_NAMESPACE::shared::totalorderl(&TOTALORDERL_X, &TOTALORDERL_Y)); constexpr long double TOTALORDERMAGL_X = 0.0L; constexpr long double TOTALORDERMAGL_Y = 0.0L; static_assert(1 == LIBC_NAMESPACE::shared::totalordermagl(&TOTALORDERMAGL_X, &TOTALORDERMAGL_Y)); static_assert(0.0L == LIBC_NAMESPACE::shared::fmodl(4.0L, 2.0L)); static_assert(0.0L == [] { long double iptr{}; return LIBC_NAMESPACE::shared::modfl(0.0L, &iptr); }()); static_assert(0.0L == LIBC_NAMESPACE::shared::fmaximum_mag_numl(0.0L, 0.0L)); static_assert(0.0L == LIBC_NAMESPACE::shared::fminimum_mag_numl(0.0L, 0.0L)); static_assert(0.0L == LIBC_NAMESPACE::shared::remainderl(1.0L, 1.0L)); static_assert(0.0L == [] { int exp{}; return LIBC_NAMESPACE::shared::remquol(1.0L, 1.0L, &exp); }()); static_assert(0.0L == LIBC_NAMESPACE::shared::ldexpl(0.0L, 0.0)); static_assert(0.0L == LIBC_NAMESPACE::shared::scalblnl(0.0L, 0.0)); static_assert(0.0L == LIBC_NAMESPACE::shared::scalbnl(0.0L, 0.0)); static_assert(0 == [] { long double setpayload_x = 0.0L; return LIBC_NAMESPACE::shared::setpayloadl(&setpayload_x, 0.0L); }()); static_assert(0.0f == LIBC_NAMESPACE::shared::fmull(0.0L, 0.0L)); static_assert(0.0f == LIBC_NAMESPACE::shared::fsubl(0.0L, 0.0L)); static_assert(0.0L == [] { int exp{}; return LIBC_NAMESPACE::shared::frexpl(0.0L, &exp); }()); static_assert(0LL == LIBC_NAMESPACE::shared::llrintl(0.0L)); static_assert(0LL == LIBC_NAMESPACE::shared::llroundl(0.0L)); static_assert(0L == LIBC_NAMESPACE::shared::lrintl(0.0L)); static_assert(0L == LIBC_NAMESPACE::shared::lroundl(0.0L)); static_assert(0.0L == LIBC_NAMESPACE::shared::nearbyintl(0.0L)); static_assert(0.0L == LIBC_NAMESPACE::shared::nextafterl(0.0L, 0.0L)); static_assert(0.0L == LIBC_NAMESPACE::shared::rintl(0.0L)); static_assert(1 == LIBC_NAMESPACE::shared::iscanonicall(0.0L)); static_assert(0.0 == LIBC_NAMESPACE::shared::issignalingl(0.0L)); static_assert(1 == [] { const char arg{}; return LIBC_NAMESPACE::fputil::FPBits(LIBC_NAMESPACE::shared::nanl(&arg)).is_nan(); }()); static_assert(0.0L == LIBC_NAMESPACE::shared::roundl(0.0L)); static_assert(0.0L == LIBC_NAMESPACE::shared::roundevenl(0.0L)); static_assert(0.0L == LIBC_NAMESPACE::shared::truncl(0.0L)); static_assert(0 == LIBC_NAMESPACE::shared::isnanl(0.0L)); #endif //===----------------------------------------------------------------------===// // Float128 Tests //===----------------------------------------------------------------------===// #ifdef LIBC_TYPES_HAS_FLOAT128 static_assert(0 == [] { float128 cx = float128(0.0); float128 x = float128(0.0); return LIBC_NAMESPACE::shared::canonicalizef128(&cx, &x); }()); static_assert(float128(0.0) == LIBC_NAMESPACE::shared::ceilf128(float128(0.0))); static_assert(float128(1.0) == LIBC_NAMESPACE::shared::fabsf128(float128(-1.0))); static_assert(float128(0.0) == LIBC_NAMESPACE::shared::copysignf128(float128(0.0), float128(0.0))); static_assert(0.0 == LIBC_NAMESPACE::shared::ddivf128(float128(0.0), float128(1.0))); static_assert(0.0 == LIBC_NAMESPACE::shared::dmulf128(float128(0.0), float128(1.0))); static_assert(0.0f == LIBC_NAMESPACE::shared::faddf128(float128(0.0), float128(0.0))); static_assert(float128(1.0) == LIBC_NAMESPACE::shared::fdimf128(float128(1.0), float128(0.0))); static_assert(0.0f == LIBC_NAMESPACE::shared::fdivf128(float128(0.0), float128(1.0))); static_assert(float128(0.0) == LIBC_NAMESPACE::shared::floorf128(float128(0.0))); static_assert(float128(0.0) == LIBC_NAMESPACE::shared::fmaximumf128(float128(0.0), float128(0.0))); static_assert(float128(0.0) == LIBC_NAMESPACE::shared::fminimumf128(float128(0.0), float128(0.0))); static_assert(float128(0.0) == LIBC_NAMESPACE::shared::fminf128(float128(0.0), float128(0.0))); static_assert(0.0 == LIBC_NAMESPACE::shared::dsqrtf128(float128(0.0))); static_assert(float128(0.0) == LIBC_NAMESPACE::shared::fmaxf128(float128(0.0), float128(0.0))); static_assert(float128(0.0) == LIBC_NAMESPACE::shared::fmaximum_numf128(float128(0.0), float128(0.0))); static_assert(float128(0.0) == LIBC_NAMESPACE::shared::fminimum_numf128(float128(0.0), float128(0.0))); static_assert(float128(0.0) == LIBC_NAMESPACE::shared::fromfpf128(float128(0.0), 0, 32)); static_assert(float128(0.0) == LIBC_NAMESPACE::shared::fromfpxf128(float128(0.0), 0, 32)); static_assert(float128(-1.0) == [] { float128 getpayload_x = float128(0.0); return LIBC_NAMESPACE::shared::getpayloadf128(&getpayload_x); }()); static_assert(float128(0.0) == LIBC_NAMESPACE::shared::ufromfpf128(float128(0.0), 0, 32)); static_assert(float128(0.0) == LIBC_NAMESPACE::shared::ufromfpxf128(float128(0.0), 0, 32)); static_assert(float128(0.0) == LIBC_NAMESPACE::shared::fmaximum_magf128(float128(0.0), float128(0.0))); static_assert(float128(0.0) == LIBC_NAMESPACE::shared::fminimum_magf128(float128(0.0), float128(0.0))); constexpr float128 TOTALORDERF128_X = float128(0.0); constexpr float128 TOTALORDERF128_Y = float128(0.0); static_assert(1 == LIBC_NAMESPACE::shared::totalorderf128(&TOTALORDERF128_X, &TOTALORDERF128_Y)); constexpr float128 TOTALORDERMAGF128_X = float128(0.0); constexpr float128 TOTALORDERMAGF128_Y = float128(0.0); static_assert(1 == LIBC_NAMESPACE::shared::totalordermagf128(&TOTALORDERMAGF128_X, &TOTALORDERMAGF128_Y)); static_assert(0 == LIBC_NAMESPACE::shared::fmodf128(float128(4.0), float128(2.0))); static_assert(float128(0.0) == [] { float128 iptr{}; return LIBC_NAMESPACE::shared::modff128(float128(0.0), &iptr); }()); static_assert(float128(0.0) == LIBC_NAMESPACE::shared::fmaximum_mag_numf128(float128(0.0), float128(0.0))); static_assert(float128(0.0) == LIBC_NAMESPACE::shared::fminimum_mag_numf128(float128(0.0), float128(0.0))); static_assert(float128(0.0) == LIBC_NAMESPACE::shared::remainderf128(float128(1.0), float128(1.0))); static_assert(float128(0.0) == [] { int exp{}; return LIBC_NAMESPACE::shared::remquof128(float128(1.0), float128(1.0), &exp); }()); static_assert(float128(0.0) == LIBC_NAMESPACE::shared::scalblnf128(float128(0.0), 0.0)); static_assert(float128(0.0) == LIBC_NAMESPACE::shared::scalbnf128(float128(0.0), 0.0)); static_assert(0 == [] { float128 setpayload_x = float128(0.0); return LIBC_NAMESPACE::shared::setpayloadf128(&setpayload_x, float128(0.0)); }()); static_assert(0.0f == LIBC_NAMESPACE::shared::fmulf128(float128(0.0), float128(0.0))); static_assert(0.0f == LIBC_NAMESPACE::shared::fsubf128(float128(0.0), float128(0.0))); static_assert(0LL == LIBC_NAMESPACE::shared::llrintf128(float128(0.0))); static_assert(0LL == LIBC_NAMESPACE::shared::llroundf128(float128(0.0))); static_assert(0L == LIBC_NAMESPACE::shared::lrintf128(float128(0.0))); static_assert(0L == LIBC_NAMESPACE::shared::lroundf128(float128(0.0))); static_assert(float128(0.0) == LIBC_NAMESPACE::shared::nearbyintf128(float128(0.0))); static_assert(float128(0.0) == LIBC_NAMESPACE::shared::nextafterf128(float128(0.0), float128(0.0))); static_assert(float128(0.0) == LIBC_NAMESPACE::shared::rintf128(float128(0.0))); static_assert(1 == LIBC_NAMESPACE::shared::iscanonicalf128(float128(0.0))); static_assert(0.0 == LIBC_NAMESPACE::shared::issignalingf128(float128(0.0))); static_assert(1 == [] { const char arg{}; return LIBC_NAMESPACE::fputil::FPBits( LIBC_NAMESPACE::shared::nanf128(&arg)) .is_nan(); }()); static_assert(float128(0.0) == LIBC_NAMESPACE::shared::roundf128(float128(0.0))); static_assert(float128(0.0) == LIBC_NAMESPACE::shared::roundevenf128(float128(0.0))); static_assert(float128(0.0) == LIBC_NAMESPACE::shared::truncf128(float128(0.0))); #endif // LIBC_TYPES_HAS_FLOAT128 //===----------------------------------------------------------------------===// // BFloat16 Tests //===----------------------------------------------------------------------===// static_assert(0 == [] { bfloat16 cx = bfloat16(0.0); bfloat16 x = bfloat16(0.0); return LIBC_NAMESPACE::shared::canonicalizebf16(&cx, &x); }()); static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::asinbf16(bfloat16(0.0))); static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::ceilbf16(bfloat16(0.0))); static_assert(bfloat16(1.0) == LIBC_NAMESPACE::shared::fabsbf16(bfloat16(-1.0))); static_assert(bfloat16(2.0) == LIBC_NAMESPACE::shared::fmaximum_mag_numbf16(bfloat16(1.0), bfloat16(2.0))); static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::copysignbf16(bfloat16(0.0), bfloat16(0.0))); static_assert(bfloat16(1.0) == LIBC_NAMESPACE::shared::fdimbf16(bfloat16(1.0), bfloat16(0.0))); static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::floorbf16(bfloat16(0.0f))); static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::logbbf16(bfloat16(1.0f))); static_assert(0 == LIBC_NAMESPACE::shared::ilogbbf16(bfloat16(1.0))); static_assert(0L == LIBC_NAMESPACE::shared::llogbbf16(bfloat16(1.0))); static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::fmaximumbf16(bfloat16(0.0), bfloat16(0.0))); static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::fminimumbf16(bfloat16(0.0), bfloat16(0.0))); static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::fminbf16(bfloat16(0.0), bfloat16(0.0))); static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::fmaxbf16(bfloat16(0.0), bfloat16(0.0))); static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::fmaximum_numbf16(bfloat16(0.0), bfloat16(0.0))); static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::fminimum_numbf16(bfloat16(0.0), bfloat16(0.0))); static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::fromfpbf16(bfloat16(0.0), 0, 32)); static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::fromfpxbf16(bfloat16(0.0), 0, 32)); static_assert(bfloat16(-1.0) == [] { bfloat16 getpayload_x = bfloat16(0.0); return LIBC_NAMESPACE::shared::getpayloadbf16(&getpayload_x); }()); static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::ufromfpbf16(bfloat16(0.0), 0, 32)); static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::ufromfpxbf16(bfloat16(0.0), 0, 32)); static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::fmaximum_magbf16(bfloat16(0.0), bfloat16(0.0))); static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::fminimum_magbf16(bfloat16(0.0), bfloat16(0.0))); constexpr bfloat16 TOTALORDERBF16_X = bfloat16(0.0); constexpr bfloat16 TOTALORDERBF16_Y = bfloat16(0.0); static_assert(1 == LIBC_NAMESPACE::shared::totalorderbf16(&TOTALORDERBF16_X, &TOTALORDERBF16_Y)); constexpr bfloat16 TOTALORDERMAGBF16_X = bfloat16(0.0); constexpr bfloat16 TOTALORDERMAGBF16_Y = bfloat16(0.0); static_assert(1 == LIBC_NAMESPACE::shared::totalordermagbf16(&TOTALORDERMAGBF16_X, &TOTALORDERMAGBF16_Y)); static_assert(0 == LIBC_NAMESPACE::shared::fmodbf16(bfloat16(4.0), bfloat16(2.0))); static_assert(bfloat16(0.0) == [] { bfloat16 iptr{}; return LIBC_NAMESPACE::shared::modfbf16(bfloat16(0.0), &iptr); }()); static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::fminimum_mag_numbf16(bfloat16(0.0), bfloat16(0.0))); static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::remainderbf16(bfloat16(1.0), bfloat16(1.0))); static_assert(bfloat16(0.0) == [] { int exp{}; return LIBC_NAMESPACE::shared::remquobf16(bfloat16(1.0), bfloat16(1.0), &exp); }()); static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::ldexpbf16(bfloat16(0.0), 0.0)); static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::scalblnbf16(bfloat16(0.0), 0.0)); static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::scalbnbf16(bfloat16(0.0), 0.0)); static_assert(0 == [] { bfloat16 setpayload_x = bfloat16(0.0); return LIBC_NAMESPACE::shared::setpayloadbf16(&setpayload_x, bfloat16(0.0)); }()); static_assert(bfloat16(0.0) == [] { int exp{}; return LIBC_NAMESPACE::shared::frexpbf16(bfloat16(0.0), &exp); }()); static_assert(0LL == LIBC_NAMESPACE::shared::llroundbf16(bfloat16(0.0))); static_assert(0LL == LIBC_NAMESPACE::shared::llrintbf16(bfloat16(0.0))); static_assert(0L == LIBC_NAMESPACE::shared::lrintbf16(bfloat16(0.0))); static_assert(0L == LIBC_NAMESPACE::shared::lroundbf16(bfloat16(0.0))); static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::nearbyintbf16(bfloat16(0.0))); static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::nextafterbf16(bfloat16(0.0), bfloat16(0.0))); static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::rintbf16(bfloat16(0.0))); static_assert(1 == LIBC_NAMESPACE::shared::iscanonicalbf16(bfloat16(0.0))); static_assert(0 == LIBC_NAMESPACE::shared::issignalingbf16(bfloat16(0.0))); static_assert(bfloat16(1) == [] { const char arg{}; return LIBC_NAMESPACE::fputil::FPBits( LIBC_NAMESPACE::shared::nanbf16(&arg)) .is_nan(); }()); static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::roundbf16(bfloat16(0.0))); static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::roundevenbf16(bfloat16(0.0))); static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::truncbf16(bfloat16(0.0))); #endif // LIBC_USE_CONTEXPR TEST(LlvmLibcSharedMathTest, ConstantEvaluation) {}