// RUN: %clang_builtins %s %librt -o %t && %run %t // REQUIRES: librt_has_extendhftf2 #include "int_lib.h" #include #if __LDBL_MANT_DIG__ == 113 && defined(COMPILER_RT_HAS_FLOAT16) #include "fp_test.h" COMPILER_RT_ABI long double __extendhftf2(TYPE_FP16 a); int test__extendhftf2(TYPE_FP16 a, uint64_t expectedHi, uint64_t expectedLo) { long double x = __extendhftf2(a); int ret = compareResultLD(x, expectedHi, expectedLo); if (ret) { printf("error in test__extendhftf2(%#.4x) = %.20Lf, " "expected %.20Lf\n", toRep16(a), x, fromRep128(expectedHi, expectedLo)); } return ret; } char assumption_1[sizeof(TYPE_FP16) * CHAR_BIT == 16] = {0}; #endif int main() { #if __LDBL_MANT_DIG__ == 113 && defined(COMPILER_RT_HAS_FLOAT16) // qNaN if (test__extendhftf2(makeQNaN16(), UINT64_C(0x7fff800000000000), UINT64_C(0x0))) return 1; // NaN if (test__extendhftf2(makeNaN16(UINT16_C(0x0100)), UINT64_C(0x7fff400000000000), UINT64_C(0x0))) return 1; // inf if (test__extendhftf2(makeInf16(), UINT64_C(0x7fff000000000000), UINT64_C(0x0))) return 1; if (test__extendhftf2(-makeInf16(), UINT64_C(0xffff000000000000), UINT64_C(0x0))) return 1; // zero if (test__extendhftf2(fromRep16(0x0U), UINT64_C(0x0), UINT64_C(0x0))) return 1; if (test__extendhftf2(fromRep16(0x8000U), UINT64_C(0x8000000000000000), UINT64_C(0x0))) return 1; // denormal if (test__extendhftf2(fromRep16(0x0010U), UINT64_C(0x3feb000000000000), UINT64_C(0x0000000000000000))) return 1; if (test__extendhftf2(fromRep16(0x0001U), UINT64_C(0x3fe7000000000000), UINT64_C(0x0000000000000000))) return 1; if (test__extendhftf2(fromRep16(0x8001U), UINT64_C(0xbfe7000000000000), UINT64_C(0x0000000000000000))) return 1; // pi if (test__extendhftf2(fromRep16(0x4248U), UINT64_C(0x4000920000000000), UINT64_C(0x0000000000000000))) return 1; if (test__extendhftf2(fromRep16(0xc248U), UINT64_C(0xc000920000000000), UINT64_C(0x0000000000000000))) return 1; if (test__extendhftf2(fromRep16(0x508cU), UINT64_C(0x4004230000000000), UINT64_C(0x0))) return 1; if (test__extendhftf2(fromRep16(0x1bb7U), UINT64_C(0x3ff6edc000000000), UINT64_C(0x0))) return 1; #else printf("skipped\n"); #endif return 0; }