177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//===-- fixxfti_test.c - Test __fixxfti -----------------------------------===//
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 __fixxfti 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 signed long long, rounding toward zero.
2077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
2177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// Assumption: long double is an intel 80 bit floating point type padded with 6 bytes
2277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//             su_int is a 32 bit integral type
2377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//             value in long double is representable in ti_int (no range checking performed)
2477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
2577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// gggg gggg gggg gggg gggg gggg gggg gggg | gggg gggg gggg gggg seee eeee eeee eeee |
2677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// 1mmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm
2777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
2877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoti_int __fixxfti(long double a);
2977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
3077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint test__fixxfti(long double a, ti_int expected)
3177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao{
3277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    ti_int x = __fixxfti(a);
3377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (x != expected)
3477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    {
3577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        utwords xt;
3677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        xt.all = x;
3777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        utwords expectedt;
3877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        expectedt.all = expected;
3977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        printf("error in __fixxfti(%LA) = 0x%.16llX%.16llX, expected 0x%.16llX%.16llX\n",
4077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao               a, xt.s.high, xt.s.low, expectedt.s.high, expectedt.s.low);
4177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    }
4277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    return x != expected;
4377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao}
4477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
4577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaochar assumption_1[sizeof(ti_int) == 2*sizeof(di_int)] = {0};
4677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaochar assumption_2[sizeof(su_int)*CHAR_BIT == 32] = {0};
4777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaochar assumption_3[sizeof(long double)*CHAR_BIT == 128] = {0};
4877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
4977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#endif
5077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
5177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint main()
5277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao{
5377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#if __x86_64
5477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(0.0, 0))
5577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
5677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
5777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(0.5, 0))
5877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
5977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(0.99, 0))
6077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
6177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(1.0, 1))
6277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
6377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(1.5, 1))
6477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
6577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(1.99, 1))
6677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
6777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(2.0, 2))
6877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
6977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(2.01, 2))
7077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
7177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(-0.5, 0))
7277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
7377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(-0.99, 0))
7477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
7577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(-1.0, -1))
7677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
7777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(-1.5, -1))
7877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
7977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(-1.99, -1))
8077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
8177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(-2.0, -2))
8277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
8377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(-2.01, -2))
8477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
8577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
8677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(0x1.FFFFFEp+62, 0x7FFFFF8000000000LL))
8777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
8877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(0x1.FFFFFCp+62, 0x7FFFFF0000000000LL))
8977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
9077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
9177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(-0x1.FFFFFEp+62, make_ti(0xFFFFFFFFFFFFFFFFLL,
9277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                               0x8000008000000000LL)))
9377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
9477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(-0x1.FFFFFCp+62, make_ti(0xFFFFFFFFFFFFFFFFLL,
9577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                               0x8000010000000000LL)))
9677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
9777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
9877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(0x1.FFFFFFFFFFFFFp+62, 0x7FFFFFFFFFFFFC00LL))
9977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
10077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(0x1.FFFFFFFFFFFFEp+62, 0x7FFFFFFFFFFFF800LL))
10177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
10277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
10377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(-0x1.FFFFFFFFFFFFFp+62, make_ti(0xFFFFFFFFFFFFFFFFLL,
10477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                                      0x8000000000000400LL)))
10577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
10677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(-0x1.FFFFFFFFFFFFEp+62, make_ti(0xFFFFFFFFFFFFFFFFLL,
10777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                                      0x8000000000000800LL)))
10877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
10977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
11077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(0x1.FFFFFFFFFFFFFFFCp+62L, 0x7FFFFFFFFFFFFFFFLL))
11177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
11277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(0x1.FFFFFFFFFFFFFFF8p+62L, 0x7FFFFFFFFFFFFFFELL))
11377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
11477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
11577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(-0x1.0000000000000000p+63L, make_ti(0xFFFFFFFFFFFFFFFFLL,
11677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                                          0x8000000000000000LL)))
11777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
11877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(-0x1.FFFFFFFFFFFFFFFCp+62L, make_ti(0xFFFFFFFFFFFFFFFFLL,
11977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                                          0x8000000000000001LL)))
12077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
12177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(-0x1.FFFFFFFFFFFFFFF8p+62L, make_ti(0xFFFFFFFFFFFFFFFFLL,
12277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                                          0x8000000000000002LL)))
12377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
12477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
12577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(0x1.FFFFFFFFFFFFFFFEp+126L, make_ti(0x7FFFFFFFFFFFFFFFLL,
12677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                                          0x8000000000000000LL)))
12777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
12877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(0x1.FFFFFFFFFFFFFFFCp+126L, make_ti(0x7FFFFFFFFFFFFFFFLL,
12977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                                          0x0000000000000000LL)))
13077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
13177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
13277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
13377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(-0x1.0000000000000000p+127L, make_ti(0x8000000000000000LL,
13477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                                           0x0000000000000000LL)))
13577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
13677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(-0x1.FFFFFFFFFFFFFFFEp+126L, make_ti(0x8000000000000000LL,
13777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                                           0x8000000000000000LL)))
13877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
13977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if (test__fixxfti(-0x1.FFFFFFFFFFFFFFFCp+126L, make_ti(0x8000000000000001LL,
14077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                                           0x0000000000000000LL)))
14177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return 1;
14277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#endif
14377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao   return 0;
14477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao}
145