177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//===-- fixunsdfdi_test.c - Test __fixunsdfdi -----------------------------===//
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 __fixunsdfdi for the compiler_rt library.
1177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//
1277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//===----------------------------------------------------------------------===//
1377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
1477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#include "int_lib.h"
1577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#include <stdio.h>
1677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
1777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// Returns: convert a to a unsigned long long, rounding toward zero.
1877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//          Negative values all become zero.
1977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
2077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// Assumption: double is a IEEE 64 bit floating point type
2177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//             du_int is a 64 bit integral type
2277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//             value in double is representable in du_int or is negative
2377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//                 (no range checking performed)
2477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
2577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// seee eeee eeee mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm
2677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
2777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodu_int __fixunsdfdi(double a);
2877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
2977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint test__fixunsdfdi(double a, du_int expected)
3077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao{
3177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    du_int x = __fixunsdfdi(a);
3277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (x != expected)
3377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        printf("error in __fixunsdfdi(%A) = %llX, expected %llX\n", a, x, expected);
3477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    return x != expected;
3577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao}
3677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
3777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaochar assumption_1[sizeof(du_int) == 2*sizeof(su_int)] = {0};
3877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaochar assumption_2[sizeof(su_int)*CHAR_BIT == 32] = {0};
3977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaochar assumption_3[sizeof(double)*CHAR_BIT == 64] = {0};
4077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
4177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint main()
4277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao{
4377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunsdfdi(0.0, 0))
4477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
4577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
4677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunsdfdi(0.5, 0))
4777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
4877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunsdfdi(0.99, 0))
4977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
5077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunsdfdi(1.0, 1))
5177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
5277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunsdfdi(1.5, 1))
5377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
5477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunsdfdi(1.99, 1))
5577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
5677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunsdfdi(2.0, 2))
5777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
5877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunsdfdi(2.01, 2))
5977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
6077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunsdfdi(-0.5, 0))
6177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
6277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunsdfdi(-0.99, 0))
6377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
6477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#if !TARGET_LIBGCC
6577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunsdfdi(-1.0, 0))  // libgcc ignores "returns 0 for negative input" spec
6677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
6777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunsdfdi(-1.5, 0))
6877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
6977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunsdfdi(-1.99, 0))
7077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
7177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunsdfdi(-2.0, 0))
7277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
7377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunsdfdi(-2.01, 0))
7477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
7577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#endif
7677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
7777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunsdfdi(0x1.FFFFFEp+62, 0x7FFFFF8000000000LL))
7877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
7977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunsdfdi(0x1.FFFFFCp+62, 0x7FFFFF0000000000LL))
8077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
8177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
8277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#if !TARGET_LIBGCC
8377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunsdfdi(-0x1.FFFFFEp+62, 0))
8477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
8577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunsdfdi(-0x1.FFFFFCp+62, 0))
8677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
8777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#endif
8877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
8977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunsdfdi(0x1.FFFFFFFFFFFFFp+63, 0xFFFFFFFFFFFFF800LL))
9077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
9177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunsdfdi(0x1.0000000000000p+63, 0x8000000000000000LL))
9277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
9377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunsdfdi(0x1.FFFFFFFFFFFFFp+62, 0x7FFFFFFFFFFFFC00LL))
9477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
9577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunsdfdi(0x1.FFFFFFFFFFFFEp+62, 0x7FFFFFFFFFFFF800LL))
9677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
9777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
9877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#if !TARGET_LIBGCC
9977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunsdfdi(-0x1.FFFFFFFFFFFFFp+62, 0))
10077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
10177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixunsdfdi(-0x1.FFFFFFFFFFFFEp+62, 0))
10277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
10377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#endif
10477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
10577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao   return 0;
10677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao}
107