xref: /netbsd-src/sys/external/bsd/compiler_rt/dist/test/Unit/fixunsxfti_test.c (revision b9829059e8a75f40496c2d279251f331078ac82e)
1*b9829059Sjoerg //===-- fixunsxfti_test.c - Test __fixunsxfti -----------------------------===//
2*b9829059Sjoerg //
3*b9829059Sjoerg //                     The LLVM Compiler Infrastructure
4*b9829059Sjoerg //
5*b9829059Sjoerg // This file is dual licensed under the MIT and the University of Illinois Open
6*b9829059Sjoerg // Source Licenses. See LICENSE.TXT for details.
7*b9829059Sjoerg //
8*b9829059Sjoerg //===----------------------------------------------------------------------===//
9*b9829059Sjoerg //
10*b9829059Sjoerg // This file tests __fixunsxfti for the compiler_rt library.
11*b9829059Sjoerg //
12*b9829059Sjoerg //===----------------------------------------------------------------------===//
13*b9829059Sjoerg 
14*b9829059Sjoerg #if __x86_64
15*b9829059Sjoerg 
16*b9829059Sjoerg #include "int_lib.h"
17*b9829059Sjoerg #include <stdio.h>
18*b9829059Sjoerg 
19*b9829059Sjoerg // Returns: convert a to a unsigned long long, rounding toward zero.
20*b9829059Sjoerg //          Negative values all become zero.
21*b9829059Sjoerg 
22*b9829059Sjoerg // Assumption: long double is an intel 80 bit floating point type padded with 6 bytes
23*b9829059Sjoerg //             tu_int is a 64 bit integral type
24*b9829059Sjoerg //             value in long double is representable in tu_int or is negative
25*b9829059Sjoerg //                 (no range checking performed)
26*b9829059Sjoerg 
27*b9829059Sjoerg // gggg gggg gggg gggg gggg gggg gggg gggg | gggg gggg gggg gggg seee eeee eeee eeee |
28*b9829059Sjoerg // 1mmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm
29*b9829059Sjoerg 
30*b9829059Sjoerg tu_int __fixunsxfti(long double a);
31*b9829059Sjoerg 
test__fixunsxfti(long double a,tu_int expected)32*b9829059Sjoerg int test__fixunsxfti(long double a, tu_int expected)
33*b9829059Sjoerg {
34*b9829059Sjoerg     tu_int x = __fixunsxfti(a);
35*b9829059Sjoerg     if (x != expected)
36*b9829059Sjoerg     {
37*b9829059Sjoerg         utwords xt;
38*b9829059Sjoerg         xt.all = x;
39*b9829059Sjoerg         utwords expectedt;
40*b9829059Sjoerg         expectedt.all = expected;
41*b9829059Sjoerg         printf("error in __fixunsxfti(%LA) = 0x%.16llX%.16llX, expected 0x%.16llX%.16llX\n",
42*b9829059Sjoerg                a, xt.s.high, xt.s.low, expectedt.s.high, expectedt.s.low);
43*b9829059Sjoerg     }
44*b9829059Sjoerg     return x != expected;
45*b9829059Sjoerg }
46*b9829059Sjoerg 
47*b9829059Sjoerg char assumption_1[sizeof(tu_int) == 2*sizeof(du_int)] = {0};
48*b9829059Sjoerg char assumption_2[sizeof(tu_int)*CHAR_BIT == 128] = {0};
49*b9829059Sjoerg char assumption_3[sizeof(long double)*CHAR_BIT == 128] = {0};
50*b9829059Sjoerg 
51*b9829059Sjoerg #endif
52*b9829059Sjoerg 
main()53*b9829059Sjoerg int main()
54*b9829059Sjoerg {
55*b9829059Sjoerg #if __x86_64
56*b9829059Sjoerg     if (test__fixunsxfti(0.0, 0))
57*b9829059Sjoerg         return 1;
58*b9829059Sjoerg 
59*b9829059Sjoerg     if (test__fixunsxfti(0.5, 0))
60*b9829059Sjoerg         return 1;
61*b9829059Sjoerg     if (test__fixunsxfti(0.99, 0))
62*b9829059Sjoerg         return 1;
63*b9829059Sjoerg     if (test__fixunsxfti(1.0, 1))
64*b9829059Sjoerg         return 1;
65*b9829059Sjoerg     if (test__fixunsxfti(1.5, 1))
66*b9829059Sjoerg         return 1;
67*b9829059Sjoerg     if (test__fixunsxfti(1.99, 1))
68*b9829059Sjoerg         return 1;
69*b9829059Sjoerg     if (test__fixunsxfti(2.0, 2))
70*b9829059Sjoerg         return 1;
71*b9829059Sjoerg     if (test__fixunsxfti(2.01, 2))
72*b9829059Sjoerg         return 1;
73*b9829059Sjoerg     if (test__fixunsxfti(-0.5, 0))
74*b9829059Sjoerg         return 1;
75*b9829059Sjoerg     if (test__fixunsxfti(-0.99, 0))
76*b9829059Sjoerg         return 1;
77*b9829059Sjoerg     if (test__fixunsxfti(-1.0, 0))
78*b9829059Sjoerg         return 1;
79*b9829059Sjoerg     if (test__fixunsxfti(-1.5, 0))
80*b9829059Sjoerg         return 1;
81*b9829059Sjoerg     if (test__fixunsxfti(-1.99, 0))
82*b9829059Sjoerg         return 1;
83*b9829059Sjoerg     if (test__fixunsxfti(-2.0, 0))
84*b9829059Sjoerg         return 1;
85*b9829059Sjoerg     if (test__fixunsxfti(-2.01, 0))
86*b9829059Sjoerg         return 1;
87*b9829059Sjoerg 
88*b9829059Sjoerg     if (test__fixunsxfti(0x1.FFFFFEp+62, 0x7FFFFF8000000000LL))
89*b9829059Sjoerg         return 1;
90*b9829059Sjoerg     if (test__fixunsxfti(0x1.FFFFFCp+62, 0x7FFFFF0000000000LL))
91*b9829059Sjoerg         return 1;
92*b9829059Sjoerg 
93*b9829059Sjoerg     if (test__fixunsxfti(-0x1.FFFFFEp+62, 0))
94*b9829059Sjoerg         return 1;
95*b9829059Sjoerg     if (test__fixunsxfti(-0x1.FFFFFCp+62, 0))
96*b9829059Sjoerg         return 1;
97*b9829059Sjoerg 
98*b9829059Sjoerg     if (test__fixunsxfti(0x1.FFFFFFFFFFFFFp+62, 0x7FFFFFFFFFFFFC00LL))
99*b9829059Sjoerg         return 1;
100*b9829059Sjoerg     if (test__fixunsxfti(0x1.FFFFFFFFFFFFEp+62, 0x7FFFFFFFFFFFF800LL))
101*b9829059Sjoerg         return 1;
102*b9829059Sjoerg 
103*b9829059Sjoerg     if (test__fixunsxfti(-0x1.FFFFFFFFFFFFFp+62, 0))
104*b9829059Sjoerg         return 1;
105*b9829059Sjoerg     if (test__fixunsxfti(-0x1.FFFFFFFFFFFFEp+62, 0))
106*b9829059Sjoerg         return 1;
107*b9829059Sjoerg 
108*b9829059Sjoerg     if (test__fixunsxfti(0x1.FFFFFFFFFFFFFFFEp+63L, 0xFFFFFFFFFFFFFFFFLL))
109*b9829059Sjoerg         return 1;
110*b9829059Sjoerg     if (test__fixunsxfti(0x1.0000000000000002p+63L, 0x8000000000000001LL))
111*b9829059Sjoerg         return 1;
112*b9829059Sjoerg     if (test__fixunsxfti(0x1.0000000000000000p+63L, 0x8000000000000000LL))
113*b9829059Sjoerg         return 1;
114*b9829059Sjoerg     if (test__fixunsxfti(0x1.FFFFFFFFFFFFFFFCp+62L, 0x7FFFFFFFFFFFFFFFLL))
115*b9829059Sjoerg         return 1;
116*b9829059Sjoerg     if (test__fixunsxfti(0x1.FFFFFFFFFFFFFFF8p+62L, 0x7FFFFFFFFFFFFFFELL))
117*b9829059Sjoerg         return 1;
118*b9829059Sjoerg 
119*b9829059Sjoerg     if (test__fixunsxfti(-0x1.0000000000000000p+63L, 0))
120*b9829059Sjoerg         return 1;
121*b9829059Sjoerg     if (test__fixunsxfti(-0x1.FFFFFFFFFFFFFFFCp+62L, 0))
122*b9829059Sjoerg         return 1;
123*b9829059Sjoerg     if (test__fixunsxfti(-0x1.FFFFFFFFFFFFFFF8p+62L, 0))
124*b9829059Sjoerg         return 1;
125*b9829059Sjoerg 
126*b9829059Sjoerg     if (test__fixunsxfti(0x1.FFFFFFFFFFFFFFFEp+127L, make_ti(0xFFFFFFFFFFFFFFFFLL, 0)))
127*b9829059Sjoerg         return 1;
128*b9829059Sjoerg     if (test__fixunsxfti(0x1.0000000000000002p+127L, make_ti(0x8000000000000001LL, 0)))
129*b9829059Sjoerg         return 1;
130*b9829059Sjoerg     if (test__fixunsxfti(0x1.0000000000000000p+127L, make_ti(0x8000000000000000LL, 0)))
131*b9829059Sjoerg         return 1;
132*b9829059Sjoerg     if (test__fixunsxfti(0x1.FFFFFFFFFFFFFFFCp+126L, make_ti(0x7FFFFFFFFFFFFFFFLL, 0)))
133*b9829059Sjoerg         return 1;
134*b9829059Sjoerg     if (test__fixunsxfti(0x1.FFFFFFFFFFFFFFF8p+126L, make_ti(0x7FFFFFFFFFFFFFFELL, 0)))
135*b9829059Sjoerg         return 1;
136*b9829059Sjoerg 
137*b9829059Sjoerg #else
138*b9829059Sjoerg     printf("skipped\n");
139*b9829059Sjoerg #endif
140*b9829059Sjoerg    return 0;
141*b9829059Sjoerg }
142