177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//===-- fixunssfti_test.c - Test __fixunssfti -----------------------------===//
277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//
377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//                     The LLVM Compiler Infrastructure
477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//
577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// This file is distributed under the University of Illinois Open Source
677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// License. See LICENSE.TXT for details.
777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//
877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//===----------------------------------------------------------------------===//
977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//
1077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// This file tests __fixunssfti for the compiler_rt library.
1177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//
1277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//===----------------------------------------------------------------------===//
1377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
1477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#if __x86_64
1577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
1677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#include "int_lib.h"
1777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#include <stdio.h>
1877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
1977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// Returns: convert a to a unsigned long long, rounding toward zero.
2077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//          Negative values all become zero.
2177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
2277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// Assumption: float is a IEEE 32 bit floating point type
2377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//             tu_int is a 64 bit integral type
2477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//             value in float is representable in tu_int or is negative
2577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//                 (no range checking performed)
2677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
2777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// seee eeee emmm mmmm mmmm mmmm mmmm mmmm
2877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
2977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotu_int __fixunssfti(float a);
3077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
3177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint test__fixunssfti(float a, tu_int expected)
3277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao{
3377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    tu_int x = __fixunssfti(a);
3477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (x != expected)
3577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    {
3677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        utwords xt;
3777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        xt.all = x;
3877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        utwords expectedt;
3977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        expectedt.all = expected;
4077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        printf("error in __fixunssfti(%A) = 0x%.16llX%.16llX, expected 0x%.16llX%.16llX\n",
4177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao               a, xt.s.high, xt.s.low, expectedt.s.high, expectedt.s.low);
4277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    }
4377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    return x != expected;
4477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao}
4577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
4677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaochar assumption_1[sizeof(tu_int) == 2*sizeof(di_int)] = {0};
4777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaochar assumption_2[sizeof(su_int)*CHAR_BIT == 32] = {0};
4877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaochar assumption_3[sizeof(float)*CHAR_BIT == 32] = {0};
4977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
5077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#endif
5177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
5277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint main()
5377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao{
5477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#if __x86_64
5577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunssfti(0.0F, 0))
5677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
5777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
5877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunssfti(0.5F, 0))
5977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
6077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunssfti(0.99F, 0))
6177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
6277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunssfti(1.0F, 1))
6377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
6477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunssfti(1.5F, 1))
6577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
6677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunssfti(1.99F, 1))
6777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
6877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunssfti(2.0F, 2))
6977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
7077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunssfti(2.01F, 2))
7177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
7277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunssfti(-0.5F, 0))
7377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
7477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunssfti(-0.99F, 0))
7577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
7677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#if !TARGET_LIBGCC
7777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunssfti(-1.0F, 0))  // libgcc ignores "returns 0 for negative input" spec
7877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
7977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunssfti(-1.5F, 0))
8077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
8177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunssfti(-1.99F, 0))
8277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
8377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunssfti(-2.0F, 0))
8477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
8577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunssfti(-2.01F, 0))
8677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
8777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#endif
8877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
8977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunssfti(0x1.FFFFFEp+63F, 0xFFFFFF0000000000LL))
9077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
9177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunssfti(0x1.000000p+63F, 0x8000000000000000LL))
9277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
9377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunssfti(0x1.FFFFFEp+62F, 0x7FFFFF8000000000LL))
9477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
9577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunssfti(0x1.FFFFFCp+62F, 0x7FFFFF0000000000LL))
9677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
9777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
9877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunssfti(0x1.FFFFFEp+127F, make_ti(0xFFFFFF0000000000LL, 0)))
9977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
10077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunssfti(0x1.000000p+127F, make_ti(0x8000000000000000LL, 0)))
10177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
10277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunssfti(0x1.FFFFFEp+126F, make_ti(0x7FFFFF8000000000LL, 0)))
10377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
10477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunssfti(0x1.FFFFFCp+126F, make_ti(0x7FFFFF0000000000LL, 0)))
10577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
10677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
10777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#if !TARGET_LIBGCC
10877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunssfti(-0x1.FFFFFEp+62F, 0x0000000000000000LL))
10977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
11077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunssfti(-0x1.FFFFFCp+62F, 0x0000000000000000LL))
11177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
11277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunssfti(-0x1.FFFFFEp+126F, 0x0000000000000000LL))
11377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
11477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunssfti(-0x1.FFFFFCp+126F, 0x0000000000000000LL))
11577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
11677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#endif
11777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
11877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#endif
11977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao   return 0;
12077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao}
121