1 // RUN: %clang_builtins %s %librt -o %t && %run %t
2 // REQUIRES: librt_has_fixdfti
3 // REQUIRES: int128
4 
5 #include "int_lib.h"
6 #include <stdio.h>
7 
8 #ifdef CRT_HAS_128BIT
9 
10 // Returns: convert a to a signed long long, rounding toward zero.
11 
12 // Assumption: double is a IEEE 64 bit floating point type
13 //             su_int is a 32 bit integral type
14 //             value in double is representable in ti_int (no range checking performed)
15 
16 // seee eeee eeee mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm
17 
18 COMPILER_RT_ABI ti_int __fixdfti(double a);
19 
test__fixdfti(double a,ti_int expected)20 int test__fixdfti(double a, ti_int expected)
21 {
22     ti_int x = __fixdfti(a);
23     if (x != expected)
24     {
25         twords xt;
26         xt.all = x;
27         twords expectedt;
28         expectedt.all = expected;
29         printf("error in __fixdfti(%A) = 0x%.16llX%.16llX, expected 0x%.16llX%.16llX\n",
30         a, xt.s.high, xt.s.low, expectedt.s.high, expectedt.s.low);
31     }
32     return x != expected;
33 }
34 
35 char assumption_1[sizeof(ti_int) == 2*sizeof(di_int)] = {0};
36 char assumption_2[sizeof(su_int)*CHAR_BIT == 32] = {0};
37 char assumption_3[sizeof(double)*CHAR_BIT == 64] = {0};
38 
39 #endif
40 
main()41 int main()
42 {
43 #ifdef CRT_HAS_128BIT
44     if (test__fixdfti(0.0, 0))
45         return 1;
46 
47     if (test__fixdfti(0.5, 0))
48         return 1;
49     if (test__fixdfti(0.99, 0))
50         return 1;
51     if (test__fixdfti(1.0, 1))
52         return 1;
53     if (test__fixdfti(1.5, 1))
54         return 1;
55     if (test__fixdfti(1.99, 1))
56         return 1;
57     if (test__fixdfti(2.0, 2))
58         return 1;
59     if (test__fixdfti(2.01, 2))
60         return 1;
61     if (test__fixdfti(-0.5, 0))
62         return 1;
63     if (test__fixdfti(-0.99, 0))
64         return 1;
65     if (test__fixdfti(-1.0, -1))
66         return 1;
67     if (test__fixdfti(-1.5, -1))
68         return 1;
69     if (test__fixdfti(-1.99, -1))
70         return 1;
71     if (test__fixdfti(-2.0, -2))
72         return 1;
73     if (test__fixdfti(-2.01, -2))
74         return 1;
75 
76     if (test__fixdfti(0x1.FFFFFEp+62, 0x7FFFFF8000000000LL))
77         return 1;
78     if (test__fixdfti(0x1.FFFFFCp+62, 0x7FFFFF0000000000LL))
79         return 1;
80 
81     if (test__fixdfti(-0x1.FFFFFEp+62, make_ti(0xFFFFFFFFFFFFFFFFLL,
82                                                0x8000008000000000LL)))
83         return 1;
84     if (test__fixdfti(-0x1.FFFFFCp+62, make_ti(0xFFFFFFFFFFFFFFFFLL,
85                                                0x8000010000000000LL)))
86         return 1;
87 
88     if (test__fixdfti(0x1.FFFFFFFFFFFFFp+62, 0x7FFFFFFFFFFFFC00LL))
89         return 1;
90     if (test__fixdfti(0x1.FFFFFFFFFFFFEp+62, 0x7FFFFFFFFFFFF800LL))
91         return 1;
92 
93     if (test__fixdfti(-0x1.FFFFFFFFFFFFFp+62, make_ti(0xFFFFFFFFFFFFFFFFLL,
94                                                       0x8000000000000400LL)))
95         return 1;
96     if (test__fixdfti(-0x1.FFFFFFFFFFFFEp+62, make_ti(0xFFFFFFFFFFFFFFFFLL,
97                                                       0x8000000000000800LL)))
98         return 1;
99 
100     if (test__fixdfti(0x1.FFFFFFFFFFFFFp+126, make_ti(0x7FFFFFFFFFFFFC00LL, 0)))
101         return 1;
102     if (test__fixdfti(0x1.FFFFFFFFFFFFEp+126, make_ti(0x7FFFFFFFFFFFF800LL, 0)))
103         return 1;
104 
105     if (test__fixdfti(-0x1.FFFFFFFFFFFFFp+126, make_ti(0x8000000000000400LL, 0)))
106         return 1;
107     if (test__fixdfti(-0x1.FFFFFFFFFFFFEp+126, make_ti(0x8000000000000800LL, 0)))
108         return 1;
109 
110 #else
111     printf("skipped\n");
112 #endif
113    return 0;
114 }
115