// RUN: %clang_builtins %s %librt -o %t && %run %t
// REQUIRES: librt_has_truncsfhf2

//===--------------- truncsfhf2_test.c - Test __truncsfhf2 ----------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
//
// This file tests __truncsfhf2 for the compiler_rt library.
//
//===----------------------------------------------------------------------===//

#include <stdio.h>

#include "fp_test.h"

uint16_t __truncsfhf2(float a);

int test__truncsfhf2(float a, uint16_t expected)
{
    uint16_t x = __truncsfhf2(a);
    int ret = compareResultH(x, expected);

    if (ret){
        printf("error in test__truncsfhf2(%f) = %#.4x, "
               "expected %#.4x\n", a, x, fromRep16(expected));
    }
    return ret;
}

char assumption_1[sizeof(__fp16) * CHAR_BIT == 16] = {0};

int main()
{
    // qNaN
    if (test__truncsfhf2(makeQNaN32(),
                         UINT16_C(0x7e00)))
        return 1;
    // NaN
    if (test__truncsfhf2(makeNaN32(UINT32_C(0x8000)),
                         UINT16_C(0x7e00)))
        return 1;
    // inf
    if (test__truncsfhf2(makeInf32(),
                         UINT16_C(0x7c00)))
        return 1;
    if (test__truncsfhf2(-makeInf32(),
                         UINT16_C(0xfc00)))
        return 1;
    // zero
    if (test__truncsfhf2(0.0f, UINT16_C(0x0)))
        return 1;
    if (test__truncsfhf2(-0.0f, UINT16_C(0x8000)))
        return 1;

    if (test__truncsfhf2(3.1415926535f,
                         UINT16_C(0x4248)))
        return 1;
    if (test__truncsfhf2(-3.1415926535f,
                         UINT16_C(0xc248)))
        return 1;
    if (test__truncsfhf2(0x1.987124876876324p+100f,
                         UINT16_C(0x7c00)))
        return 1;
    if (test__truncsfhf2(0x1.987124876876324p+12f,
                         UINT16_C(0x6e62)))
        return 1;
    if (test__truncsfhf2(0x1.0p+0f,
                         UINT16_C(0x3c00)))
        return 1;
    if (test__truncsfhf2(0x1.0p-14f,
                         UINT16_C(0x0400)))
        return 1;
    // denormal
    if (test__truncsfhf2(0x1.0p-20f,
                         UINT16_C(0x0010)))
        return 1;
    if (test__truncsfhf2(0x1.0p-24f,
                         UINT16_C(0x0001)))
        return 1;
    if (test__truncsfhf2(-0x1.0p-24f,
                         UINT16_C(0x8001)))
        return 1;
    if (test__truncsfhf2(0x1.5p-25f,
                         UINT16_C(0x0001)))
        return 1;
    // and back to zero
    if (test__truncsfhf2(0x1.0p-25f,
                         UINT16_C(0x0000)))
        return 1;
    if (test__truncsfhf2(-0x1.0p-25f,
                         UINT16_C(0x8000)))
        return 1;
    // max (precise)
    if (test__truncsfhf2(65504.0f,
                         UINT16_C(0x7bff)))
        return 1;
    // max (rounded)
    if (test__truncsfhf2(65519.0f,
                         UINT16_C(0x7bff)))
        return 1;
    // max (to +inf)
    if (test__truncsfhf2(65520.0f,
                         UINT16_C(0x7c00)))
        return 1;
    if (test__truncsfhf2(65536.0f,
                         UINT16_C(0x7c00)))
        return 1;
    if (test__truncsfhf2(-65520.0f,
                         UINT16_C(0xfc00)))
        return 1;
    return 0;
}
