1//===-- floatuntisf.c - Test __floatuntisf --------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file tests __floatuntisf for the compiler_rt library.
11//
12//===----------------------------------------------------------------------===//
13
14#include "int_lib.h"
15#include <float.h>
16#include <stdio.h>
17
18#ifdef CRT_HAS_128BIT
19
20// Returns: convert a to a float, rounding toward even.
21
22// Assumption: float is a IEEE 32 bit floating point type
23//             tu_int is a 128 bit integral type
24
25// seee eeee emmm mmmm mmmm mmmm mmmm mmmm
26
27float __floatuntisf(tu_int a);
28
29int test__floatuntisf(tu_int a, float expected)
30{
31    float x = __floatuntisf(a);
32    if (x != expected)
33    {
34        utwords at;
35        at.all = a;
36        printf("error in __floatuntisf(0x%.16llX%.16llX) = %a, expected %a\n",
37               at.s.high, at.s.low, x, expected);
38    }
39    return x != expected;
40}
41
42char assumption_1[sizeof(tu_int) == 2*sizeof(du_int)] = {0};
43char assumption_2[sizeof(tu_int)*CHAR_BIT == 128] = {0};
44char assumption_3[sizeof(float)*CHAR_BIT == 32] = {0};
45
46#endif
47
48int main()
49{
50#ifdef CRT_HAS_128BIT
51    if (test__floatuntisf(0, 0.0F))
52        return 1;
53
54    if (test__floatuntisf(1, 1.0F))
55        return 1;
56    if (test__floatuntisf(2, 2.0F))
57        return 1;
58    if (test__floatuntisf(20, 20.0F))
59        return 1;
60
61    if (test__floatuntisf(0x7FFFFF8000000000LL, 0x1.FFFFFEp+62F))
62        return 1;
63    if (test__floatuntisf(0x7FFFFF0000000000LL, 0x1.FFFFFCp+62F))
64        return 1;
65
66    if (test__floatuntisf(make_ti(0x8000008000000000LL, 0), 0x1.000001p+127F))
67        return 1;
68    if (test__floatuntisf(make_ti(0x8000000000000800LL, 0), 0x1.0p+127F))
69        return 1;
70    if (test__floatuntisf(make_ti(0x8000010000000000LL, 0), 0x1.000002p+127F))
71        return 1;
72
73    if (test__floatuntisf(make_ti(0x8000000000000000LL, 0), 0x1.000000p+127F))
74        return 1;
75
76    if (test__floatuntisf(0x0007FB72E8000000LL, 0x1.FEDCBAp+50F))
77        return 1;
78
79    if (test__floatuntisf(0x0007FB72EA000000LL, 0x1.FEDCBA8p+50F))
80        return 1;
81    if (test__floatuntisf(0x0007FB72EB000000LL, 0x1.FEDCBACp+50F))
82        return 1;
83
84    if (test__floatuntisf(0x0007FB72EC000000LL, 0x1.FEDCBBp+50F))
85        return 1;
86
87    if (test__floatuntisf(0x0007FB72E6000000LL, 0x1.FEDCB98p+50F))
88        return 1;
89    if (test__floatuntisf(0x0007FB72E7000000LL, 0x1.FEDCB9Cp+50F))
90        return 1;
91    if (test__floatuntisf(0x0007FB72E4000000LL, 0x1.FEDCB9p+50F))
92        return 1;
93
94    if (test__floatuntisf(0xFFFFFFFFFFFFFFFELL, 0x1p+64F))
95        return 1;
96    if (test__floatuntisf(0xFFFFFFFFFFFFFFFFLL, 0x1p+64F))
97        return 1;
98
99    if (test__floatuntisf(0x0007FB72E8000000LL, 0x1.FEDCBAp+50F))
100        return 1;
101
102    if (test__floatuntisf(0x0007FB72EA000000LL, 0x1.FEDCBAp+50F))
103        return 1;
104    if (test__floatuntisf(0x0007FB72EB000000LL, 0x1.FEDCBAp+50F))
105        return 1;
106    if (test__floatuntisf(0x0007FB72EBFFFFFFLL, 0x1.FEDCBAp+50F))
107        return 1;
108    if (test__floatuntisf(0x0007FB72EC000000LL, 0x1.FEDCBCp+50F))
109        return 1;
110    if (test__floatuntisf(0x0007FB72E8000001LL, 0x1.FEDCBAp+50F))
111        return 1;
112
113    if (test__floatuntisf(0x0007FB72E6000000LL, 0x1.FEDCBAp+50F))
114        return 1;
115    if (test__floatuntisf(0x0007FB72E7000000LL, 0x1.FEDCBAp+50F))
116        return 1;
117    if (test__floatuntisf(0x0007FB72E7FFFFFFLL, 0x1.FEDCBAp+50F))
118        return 1;
119    if (test__floatuntisf(0x0007FB72E4000001LL, 0x1.FEDCBAp+50F))
120        return 1;
121    if (test__floatuntisf(0x0007FB72E4000000LL, 0x1.FEDCB8p+50F))
122        return 1;
123
124    if (test__floatuntisf(make_ti(0x0000000000001FEDLL, 0xCB90000000000001LL),
125                          0x1.FEDCBAp+76F))
126        return 1;
127    if (test__floatuntisf(make_ti(0x0000000000001FEDLL, 0xCBA0000000000000LL),
128                          0x1.FEDCBAp+76F))
129        return 1;
130    if (test__floatuntisf(make_ti(0x0000000000001FEDLL, 0xCBAFFFFFFFFFFFFFLL),
131                          0x1.FEDCBAp+76F))
132        return 1;
133    if (test__floatuntisf(make_ti(0x0000000000001FEDLL, 0xCBB0000000000000LL),
134                          0x1.FEDCBCp+76F))
135        return 1;
136    if (test__floatuntisf(make_ti(0x0000000000001FEDLL, 0xCBB0000000000001LL),
137                          0x1.FEDCBCp+76F))
138        return 1;
139    if (test__floatuntisf(make_ti(0x0000000000001FEDLL, 0xCBBFFFFFFFFFFFFFLL),
140                          0x1.FEDCBCp+76F))
141        return 1;
142    if (test__floatuntisf(make_ti(0x0000000000001FEDLL, 0xCBC0000000000000LL),
143                          0x1.FEDCBCp+76F))
144        return 1;
145    if (test__floatuntisf(make_ti(0x0000000000001FEDLL, 0xCBC0000000000001LL),
146                          0x1.FEDCBCp+76F))
147        return 1;
148    if (test__floatuntisf(make_ti(0x0000000000001FEDLL, 0xCBD0000000000000LL),
149                          0x1.FEDCBCp+76F))
150        return 1;
151    if (test__floatuntisf(make_ti(0x0000000000001FEDLL, 0xCBD0000000000001LL),
152                          0x1.FEDCBEp+76F))
153        return 1;
154    if (test__floatuntisf(make_ti(0x0000000000001FEDLL, 0xCBDFFFFFFFFFFFFFLL),
155                          0x1.FEDCBEp+76F))
156        return 1;
157    if (test__floatuntisf(make_ti(0x0000000000001FEDLL, 0xCBE0000000000000LL),
158                          0x1.FEDCBEp+76F))
159        return 1;
160
161#else
162    printf("skipped\n");
163#endif
164   return 0;
165}
166