1 | // RUN: %clang_builtins %s %librt -o %t && %run %t |
2 | // REQUIRES: librt_has_floattixf |
3 | // REQUIRES: x86-target-arch |
4 | |
5 | #include "int_lib.h" |
6 | #include <float.h> |
7 | #include <stdio.h> |
8 | |
9 | #if defined(CRT_HAS_128BIT) && HAS_80_BIT_LONG_DOUBLE |
10 | |
11 | // Returns: convert a to a long double, rounding toward even. |
12 | |
13 | // Assumption: long double is a IEEE 80 bit floating point type padded to 128 bits |
14 | // ti_int is a 128 bit integral type |
15 | |
16 | // gggg gggg gggg gggg gggg gggg gggg gggg | gggg gggg gggg gggg seee eeee eeee eeee | |
17 | // 1mmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm |
18 | |
19 | COMPILER_RT_ABI long double __floattixf(ti_int a); |
20 | |
21 | int test__floattixf(ti_int a, long double expected) |
22 | { |
23 | long double x = __floattixf(a); |
24 | if (x != expected) |
25 | { |
26 | twords at; |
27 | at.all = a; |
28 | printf(format: "error in __floattixf(0x%.16llX%.16llX) = %LA, expected %LA\n" , |
29 | at.s.high, at.s.low, x, expected); |
30 | } |
31 | return x != expected; |
32 | } |
33 | |
34 | COMPILE_TIME_ASSERT(sizeof(ti_int) == 2*sizeof(di_int)); |
35 | COMPILE_TIME_ASSERT(sizeof(ti_int)*CHAR_BIT == 128); |
36 | COMPILE_TIME_ASSERT(sizeof(long double)*CHAR_BIT == 128); |
37 | |
38 | #endif |
39 | |
40 | int main() |
41 | { |
42 | #if defined(CRT_HAS_128BIT) && HAS_80_BIT_LONG_DOUBLE |
43 | if (test__floattixf(a: 0, expected: 0.0)) |
44 | return 1; |
45 | |
46 | if (test__floattixf(a: 1, expected: 1.0)) |
47 | return 1; |
48 | if (test__floattixf(a: 2, expected: 2.0)) |
49 | return 1; |
50 | if (test__floattixf(a: 20, expected: 20.0)) |
51 | return 1; |
52 | if (test__floattixf(a: -1, expected: -1.0)) |
53 | return 1; |
54 | if (test__floattixf(a: -2, expected: -2.0)) |
55 | return 1; |
56 | if (test__floattixf(a: -20, expected: -20.0)) |
57 | return 1; |
58 | |
59 | if (test__floattixf(a: 0x7FFFFF8000000000LL, expected: 0x1.FFFFFEp+62)) |
60 | return 1; |
61 | if (test__floattixf(a: 0x7FFFFFFFFFFFF800LL, expected: 0x1.FFFFFFFFFFFFEp+62)) |
62 | return 1; |
63 | if (test__floattixf(a: 0x7FFFFF0000000000LL, expected: 0x1.FFFFFCp+62)) |
64 | return 1; |
65 | if (test__floattixf(a: 0x7FFFFFFFFFFFF000LL, expected: 0x1.FFFFFFFFFFFFCp+62)) |
66 | return 1; |
67 | |
68 | if (test__floattixf(a: make_ti(h: 0x8000008000000000LL, l: 0), expected: -0x1.FFFFFEp+126)) |
69 | return 1; |
70 | if (test__floattixf(a: make_ti(h: 0x8000000000000800LL, l: 0), expected: -0x1.FFFFFFFFFFFFEp+126)) |
71 | return 1; |
72 | if (test__floattixf(a: make_ti(h: 0x8000010000000000LL, l: 0), expected: -0x1.FFFFFCp+126)) |
73 | return 1; |
74 | if (test__floattixf(a: make_ti(h: 0x8000000000001000LL, l: 0), expected: -0x1.FFFFFFFFFFFFCp+126)) |
75 | return 1; |
76 | |
77 | if (test__floattixf(a: make_ti(h: 0x8000000000000000LL, l: 0), expected: -0x1.000000p+127)) |
78 | return 1; |
79 | if (test__floattixf(a: make_ti(h: 0x8000000000000001LL, l: 0), expected: -0x1.FFFFFFFFFFFFFFFCp+126L)) |
80 | return 1; |
81 | |
82 | if (test__floattixf(a: 0x0007FB72E8000000LL, expected: 0x1.FEDCBAp+50)) |
83 | return 1; |
84 | |
85 | if (test__floattixf(a: 0x0007FB72EA000000LL, expected: 0x1.FEDCBA8p+50)) |
86 | return 1; |
87 | if (test__floattixf(a: 0x0007FB72EB000000LL, expected: 0x1.FEDCBACp+50)) |
88 | return 1; |
89 | if (test__floattixf(a: 0x0007FB72EBFFFFFFLL, expected: 0x1.FEDCBAFFFFFFCp+50)) |
90 | return 1; |
91 | if (test__floattixf(a: 0x0007FB72EC000000LL, expected: 0x1.FEDCBBp+50)) |
92 | return 1; |
93 | if (test__floattixf(a: 0x0007FB72E8000001LL, expected: 0x1.FEDCBA0000004p+50)) |
94 | return 1; |
95 | |
96 | if (test__floattixf(a: 0x0007FB72E6000000LL, expected: 0x1.FEDCB98p+50)) |
97 | return 1; |
98 | if (test__floattixf(a: 0x0007FB72E7000000LL, expected: 0x1.FEDCB9Cp+50)) |
99 | return 1; |
100 | if (test__floattixf(a: 0x0007FB72E7FFFFFFLL, expected: 0x1.FEDCB9FFFFFFCp+50)) |
101 | return 1; |
102 | if (test__floattixf(a: 0x0007FB72E4000001LL, expected: 0x1.FEDCB90000004p+50)) |
103 | return 1; |
104 | if (test__floattixf(a: 0x0007FB72E4000000LL, expected: 0x1.FEDCB9p+50)) |
105 | return 1; |
106 | |
107 | if (test__floattixf(a: 0x023479FD0E092DC0LL, expected: 0x1.1A3CFE870496Ep+57)) |
108 | return 1; |
109 | if (test__floattixf(a: 0x023479FD0E092DA1LL, expected: 0x1.1A3CFE870496D08p+57L)) |
110 | return 1; |
111 | if (test__floattixf(a: 0x023479FD0E092DB0LL, expected: 0x1.1A3CFE870496D8p+57L)) |
112 | return 1; |
113 | if (test__floattixf(a: 0x023479FD0E092DB8LL, expected: 0x1.1A3CFE870496DCp+57L)) |
114 | return 1; |
115 | if (test__floattixf(a: 0x023479FD0E092DB6LL, expected: 0x1.1A3CFE870496DBp+57L)) |
116 | return 1; |
117 | if (test__floattixf(a: 0x023479FD0E092DBFLL, expected: 0x1.1A3CFE870496DF8p+57L)) |
118 | return 1; |
119 | if (test__floattixf(a: 0x023479FD0E092DC1LL, expected: 0x1.1A3CFE870496E08p+57L)) |
120 | return 1; |
121 | if (test__floattixf(a: 0x023479FD0E092DC7LL, expected: 0x1.1A3CFE870496E38p+57L)) |
122 | return 1; |
123 | if (test__floattixf(a: 0x023479FD0E092DC8LL, expected: 0x1.1A3CFE870496E4p+57L)) |
124 | return 1; |
125 | if (test__floattixf(a: 0x023479FD0E092DCFLL, expected: 0x1.1A3CFE870496E78p+57L)) |
126 | return 1; |
127 | if (test__floattixf(a: 0x023479FD0E092DD0LL, expected: 0x1.1A3CFE870496E8p+57L)) |
128 | return 1; |
129 | if (test__floattixf(a: 0x023479FD0E092DD1LL, expected: 0x1.1A3CFE870496E88p+57L)) |
130 | return 1; |
131 | if (test__floattixf(a: 0x023479FD0E092DD8LL, expected: 0x1.1A3CFE870496ECp+57L)) |
132 | return 1; |
133 | if (test__floattixf(a: 0x023479FD0E092DDFLL, expected: 0x1.1A3CFE870496EF8p+57L)) |
134 | return 1; |
135 | if (test__floattixf(a: 0x023479FD0E092DE0LL, expected: 0x1.1A3CFE870496Fp+57)) |
136 | return 1; |
137 | |
138 | if (test__floattixf(a: make_ti(h: 0x023479FD0E092DC0LL, l: 0), expected: 0x1.1A3CFE870496Ep+121L)) |
139 | return 1; |
140 | if (test__floattixf(a: make_ti(h: 0x023479FD0E092DA1LL, l: 1), expected: 0x1.1A3CFE870496D08p+121L)) |
141 | return 1; |
142 | if (test__floattixf(a: make_ti(h: 0x023479FD0E092DB0LL, l: 2), expected: 0x1.1A3CFE870496D8p+121L)) |
143 | return 1; |
144 | if (test__floattixf(a: make_ti(h: 0x023479FD0E092DB8LL, l: 3), expected: 0x1.1A3CFE870496DCp+121L)) |
145 | return 1; |
146 | if (test__floattixf(a: make_ti(h: 0x023479FD0E092DB6LL, l: 4), expected: 0x1.1A3CFE870496DBp+121L)) |
147 | return 1; |
148 | if (test__floattixf(a: make_ti(h: 0x023479FD0E092DBFLL, l: 5), expected: 0x1.1A3CFE870496DF8p+121L)) |
149 | return 1; |
150 | if (test__floattixf(a: make_ti(h: 0x023479FD0E092DC1LL, l: 6), expected: 0x1.1A3CFE870496E08p+121L)) |
151 | return 1; |
152 | if (test__floattixf(a: make_ti(h: 0x023479FD0E092DC7LL, l: 7), expected: 0x1.1A3CFE870496E38p+121L)) |
153 | return 1; |
154 | if (test__floattixf(a: make_ti(h: 0x023479FD0E092DC8LL, l: 8), expected: 0x1.1A3CFE870496E4p+121L)) |
155 | return 1; |
156 | if (test__floattixf(a: make_ti(h: 0x023479FD0E092DCFLL, l: 9), expected: 0x1.1A3CFE870496E78p+121L)) |
157 | return 1; |
158 | if (test__floattixf(a: make_ti(h: 0x023479FD0E092DD0LL, l: 0), expected: 0x1.1A3CFE870496E8p+121L)) |
159 | return 1; |
160 | if (test__floattixf(a: make_ti(h: 0x023479FD0E092DD1LL, l: 11), expected: 0x1.1A3CFE870496E88p+121L)) |
161 | return 1; |
162 | if (test__floattixf(a: make_ti(h: 0x023479FD0E092DD8LL, l: 12), expected: 0x1.1A3CFE870496ECp+121L)) |
163 | return 1; |
164 | if (test__floattixf(a: make_ti(h: 0x023479FD0E092DDFLL, l: 13), expected: 0x1.1A3CFE870496EF8p+121L)) |
165 | return 1; |
166 | if (test__floattixf(a: make_ti(h: 0x023479FD0E092DE0LL, l: 14), expected: 0x1.1A3CFE870496Fp+121L)) |
167 | return 1; |
168 | |
169 | if (test__floattixf(a: make_ti(h: 0, l: 0xFFFFFFFFFFFFFFFFLL), expected: 0x1.FFFFFFFFFFFFFFFEp+63L)) |
170 | return 1; |
171 | |
172 | if (test__floattixf(a: make_ti(h: 0x0000123456789012LL, l: 0x3456100000000001LL), |
173 | expected: 0x1.2345678901234562p+108L)) |
174 | return 1; |
175 | if (test__floattixf(a: make_ti(h: 0x0000123456789012LL, l: 0x3456200000000000LL), |
176 | expected: 0x1.2345678901234562p+108L)) |
177 | return 1; |
178 | if (test__floattixf(a: make_ti(h: 0x0000123456789012LL, l: 0x34562FFFFFFFFFFFLL), |
179 | expected: 0x1.2345678901234562p+108L)) |
180 | return 1; |
181 | if (test__floattixf(a: make_ti(h: 0x0000123456789012LL, l: 0x3456300000000000LL), |
182 | expected: 0x1.2345678901234564p+108L)) |
183 | return 1; |
184 | if (test__floattixf(a: make_ti(h: 0x0000123456789012LL, l: 0x3456400000000000LL), |
185 | expected: 0x1.2345678901234564p+108L)) |
186 | return 1; |
187 | if (test__floattixf(a: make_ti(h: 0x0000123456789012LL, l: 0x34564FFFFFFFFFFFLL), |
188 | expected: 0x1.2345678901234564p+108L)) |
189 | return 1; |
190 | if (test__floattixf(a: make_ti(h: 0x0000123456789012LL, l: 0x3456500000000000LL), |
191 | expected: 0x1.2345678901234564p+108L)) |
192 | return 1; |
193 | if (test__floattixf(a: make_ti(h: 0x0000123456789012LL, l: 0x3456500000000001LL), |
194 | expected: 0x1.2345678901234566p+108L)) |
195 | return 1; |
196 | if (test__floattixf(a: make_ti(h: 0x0000123456789012LL, l: 0x34566FFFFFFFFFFFLL), |
197 | expected: 0x1.2345678901234566p+108L)) |
198 | return 1; |
199 | #else |
200 | printf("skipped\n" ); |
201 | #endif |
202 | return 0; |
203 | } |
204 | |