// RUN: %clang_builtins %s %librt -o %t && %run %t
//===-- fixunstfti_test.c - Test __fixunstfti -----------------------------===//
//
// 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 __fixunstfti for the compiler_rt library.
//
//===----------------------------------------------------------------------===//

#include <stdio.h>

// UNSUPPORTED: mips

#if __LDBL_MANT_DIG__ == 113

#include "fp_test.h"
#include "int_lib.h"

// Returns: convert a to a unsigned long long, rounding toward zero.
//          Negative values all become zero.

// Assumption: long double is a 128 bit floating point type
//             tu_int is a 128 bit integral type
//             value in long double is representable in tu_int or is negative 
//                 (no range checking performed)

COMPILER_RT_ABI tu_int __fixunstfti(long double a);

int test__fixunstfti(long double a, tu_int expected)
{
    tu_int x = __fixunstfti(a);
    if (x != expected)
    {
        twords xt;
        xt.all = x;

        twords expectedt;
        expectedt.all = expected;

        printf("error in __fixunstfti(%.20Lf) = 0x%.16llX%.16llX, "
               "expected 0x%.16llX%.16llX\n",
               a, xt.s.high, xt.s.low, expectedt.s.high, expectedt.s.low);
    }
    return x != expected;
}

char assumption_1[sizeof(tu_int) == 4*sizeof(su_int)] = {0};
char assumption_2[sizeof(tu_int)*CHAR_BIT == 128] = {0};
char assumption_3[sizeof(long double)*CHAR_BIT == 128] = {0};

#endif

int main()
{
#if __LDBL_MANT_DIG__ == 113
    if (test__fixunstfti(makeInf128(), make_ti(0xffffffffffffffffLL,
                                               0xffffffffffffffffLL)))
        return 1;

    if (test__fixunstfti(0.0, 0))
        return 1;

    if (test__fixunstfti(0.5, 0))
        return 1;
    if (test__fixunstfti(0.99, 0))
        return 1;
    if (test__fixunstfti(1.0, 1))
        return 1;
    if (test__fixunstfti(1.5, 1))
        return 1;
    if (test__fixunstfti(1.99, 1))
        return 1;
    if (test__fixunstfti(2.0, 2))
        return 1;
    if (test__fixunstfti(2.01, 2))
        return 1;
    if (test__fixunstfti(-0.01, 0))
        return 1;
    if (test__fixunstfti(-0.99, 0))
        return 1;

    if (test__fixunstfti(0x1.p+128, make_ti(0xffffffffffffffffLL,
                                            0xffffffffffffffffLL)))
        return 1;

    if (test__fixunstfti(0x1.FFFFFEp+126, make_ti(0x7fffff8000000000LL, 0x0)))
        return 1;
    if (test__fixunstfti(0x1.FFFFFEp+127, make_ti(0xffffff0000000000LL, 0x0)))
        return 1;
    if (test__fixunstfti(0x1.FFFFFEp+128, make_ti(0xffffffffffffffffLL,
                                                  0xffffffffffffffffLL)))
        return 1;
    if (test__fixunstfti(0x1.FFFFFEp+129, make_ti(0xffffffffffffffffLL,
                                                  0xffffffffffffffffLL)))
        return 1;

#else
    printf("skipped\n");
#endif
   return 0;
}
