// RUN: %clang_builtins %s %librt -o %t && %run %t // REQUIRES: librt_has_truncxfhf2 #include #include "fp_test.h" #if HAS_80_BIT_LONG_DOUBLE TYPE_FP16 __truncxfhf2(xf_float f); int test_truncxfhf2(uint16_t inputHi, uint64_t inputLo, uint16_t e) { xf_float a = F80FromRep80(inputHi, inputLo); TYPE_FP16 x = __truncxfhf2(a); int ret = compareResultH(x, e); if (ret) { printf("error in test__truncxfhf2(%Lf) = %#.4x, " "expected %#.4x\n", a, toRep16(x), e); } return ret; } int main() { // Small positive value if (test_truncxfhf2(UINT16_C(0x3ffb), UINT64_C(0xccc0000000000000), UINT16_C(0x2e66))) return 1; // Small negative value if (test_truncxfhf2(UINT16_C(0xbffb), UINT64_C(0xccc0000000000000), UINT16_C(0xae66))) return 1; // Zero if (test_truncxfhf2(UINT16_C(0x0), UINT64_C(0x0), UINT16_C(0))) return 1; // Smallest positive non-zero value if (test_truncxfhf2(UINT16_C(0x3fef), UINT64_C(0x8000000000000000), UINT16_C(0x0100))) return 1; // Smallest negative non-zero value if (test_truncxfhf2(UINT16_C(0xbfef), UINT64_C(0x8000000000000000), UINT16_C(0x8100))) return 1; // Positive infinity if (test_truncxfhf2(UINT16_C(0x7fff), UINT64_C(0x8000000000000000), UINT16_C(0x7c00))) return 1; // Negative infinity if (test_truncxfhf2(UINT16_C(0xffff), UINT64_C(0x8000000000000000), UINT16_C(0xfc00))) return 1; // NaN if (test_truncxfhf2(UINT16_C(0x7fff), UINT64_C(0xc000000000000000), UINT16_C(0x7e00))) return 1; return 0; } #else int main() { printf("skipped\n"); return 0; } #endif