1//===-- powitf2_test.cpp - Test __powitf2 ---------------------------------===//
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 __powitf2 for the compiler_rt library.
11//
12//===----------------------------------------------------------------------===//
13
14#include <stdio.h>
15
16#if _ARCH_PPC
17
18#include "int_lib.h"
19#include <math.h>
20
21// Returns: a ^ b
22
23COMPILER_RT_ABI long double __powitf2(long double a, si_int b);
24
25int test__powitf2(long double a, si_int b, long double expected)
26{
27    long double x = __powitf2(a, b);
28    int correct = (x == expected) && (signbit(x) == signbit(expected));
29    if (!correct)
30        printf("error in __powitf2(%Lf, %d) = %Lf, expected %Lf\n",
31               a, b, x, expected);
32    return !correct;
33}
34
35#endif
36
37int main()
38{
39#if _ARCH_PPC
40    if (test__powitf2(0, 0, 1))
41        return 1;
42    if (test__powitf2(1, 0, 1))
43        return 1;
44    if (test__powitf2(1.5, 0, 1))
45        return 1;
46    if (test__powitf2(2, 0, 1))
47        return 1;
48    if (test__powitf2(INFINITY, 0, 1))
49        return 1;
50
51    if (test__powitf2(-0., 0, 1))
52        return 1;
53    if (test__powitf2(-1, 0, 1))
54        return 1;
55    if (test__powitf2(-1.5, 0, 1))
56        return 1;
57    if (test__powitf2(-2, 0, 1))
58        return 1;
59    if (test__powitf2(-INFINITY, 0, 1))
60        return 1;
61
62    if (test__powitf2(0, 1, 0))
63        return 1;
64    if (test__powitf2(0, 2, 0))
65        return 1;
66    if (test__powitf2(0, 3, 0))
67        return 1;
68    if (test__powitf2(0, 4, 0))
69        return 1;
70    if (test__powitf2(0, 0x7FFFFFFE, 0))
71        return 1;
72    if (test__powitf2(0, 0x7FFFFFFF, 0))
73        return 1;
74
75    if (test__powitf2(-0., 1, -0.))
76        return 1;
77    if (test__powitf2(-0., 2, 0))
78        return 1;
79    if (test__powitf2(-0., 3, -0.))
80        return 1;
81    if (test__powitf2(-0., 4, 0))
82        return 1;
83    if (test__powitf2(-0., 0x7FFFFFFE, 0))
84        return 1;
85    if (test__powitf2(-0., 0x7FFFFFFF, -0.))
86        return 1;
87
88    if (test__powitf2(1, 1, 1))
89        return 1;
90    if (test__powitf2(1, 2, 1))
91        return 1;
92    if (test__powitf2(1, 3, 1))
93        return 1;
94    if (test__powitf2(1, 4, 1))
95        return 1;
96    if (test__powitf2(1, 0x7FFFFFFE, 1))
97        return 1;
98    if (test__powitf2(1, 0x7FFFFFFF, 1))
99        return 1;
100
101    if (test__powitf2(INFINITY, 1, INFINITY))
102        return 1;
103    if (test__powitf2(INFINITY, 2, INFINITY))
104        return 1;
105    if (test__powitf2(INFINITY, 3, INFINITY))
106        return 1;
107    if (test__powitf2(INFINITY, 4, INFINITY))
108        return 1;
109    if (test__powitf2(INFINITY, 0x7FFFFFFE, INFINITY))
110        return 1;
111    if (test__powitf2(INFINITY, 0x7FFFFFFF, INFINITY))
112        return 1;
113
114    if (test__powitf2(-INFINITY, 1, -INFINITY))
115        return 1;
116    if (test__powitf2(-INFINITY, 2, INFINITY))
117        return 1;
118    if (test__powitf2(-INFINITY, 3, -INFINITY))
119        return 1;
120    if (test__powitf2(-INFINITY, 4, INFINITY))
121        return 1;
122    if (test__powitf2(-INFINITY, 0x7FFFFFFE, INFINITY))
123        return 1;
124    if (test__powitf2(-INFINITY, 0x7FFFFFFF, -INFINITY))
125        return 1;
126
127    if (test__powitf2(0, -1, INFINITY))
128        return 1;
129    if (test__powitf2(0, -2, INFINITY))
130        return 1;
131    if (test__powitf2(0, -3, INFINITY))
132        return 1;
133    if (test__powitf2(0, -4, INFINITY))
134        return 1;
135    if (test__powitf2(0, 0x80000002, INFINITY))
136        return 1;
137    if (test__powitf2(0, 0x80000001, INFINITY))
138        return 1;
139    if (test__powitf2(0, 0x80000000, INFINITY))
140        return 1;
141
142    if (test__powitf2(-0., -1, -INFINITY))
143        return 1;
144    if (test__powitf2(-0., -2, INFINITY))
145        return 1;
146    if (test__powitf2(-0., -3, -INFINITY))
147        return 1;
148    if (test__powitf2(-0., -4, INFINITY))
149        return 1;
150    if (test__powitf2(-0., 0x80000002, INFINITY))
151        return 1;
152    if (test__powitf2(-0., 0x80000001, -INFINITY))
153        return 1;
154    if (test__powitf2(-0., 0x80000000, INFINITY))
155        return 1;
156
157    if (test__powitf2(1, -1, 1))
158        return 1;
159    if (test__powitf2(1, -2, 1))
160        return 1;
161    if (test__powitf2(1, -3, 1))
162        return 1;
163    if (test__powitf2(1, -4, 1))
164        return 1;
165    if (test__powitf2(1, 0x80000002, 1))
166        return 1;
167    if (test__powitf2(1, 0x80000001, 1))
168        return 1;
169    if (test__powitf2(1, 0x80000000, 1))
170        return 1;
171
172    if (test__powitf2(INFINITY, -1, 0))
173        return 1;
174    if (test__powitf2(INFINITY, -2, 0))
175        return 1;
176    if (test__powitf2(INFINITY, -3, 0))
177        return 1;
178    if (test__powitf2(INFINITY, -4, 0))
179        return 1;
180    if (test__powitf2(INFINITY, 0x80000002, 0))
181        return 1;
182    if (test__powitf2(INFINITY, 0x80000001, 0))
183        return 1;
184    if (test__powitf2(INFINITY, 0x80000000, 0))
185        return 1;
186
187    if (test__powitf2(-INFINITY, -1, -0.))
188        return 1;
189    if (test__powitf2(-INFINITY, -2, 0))
190        return 1;
191    if (test__powitf2(-INFINITY, -3, -0.))
192        return 1;
193    if (test__powitf2(-INFINITY, -4, 0))
194        return 1;
195    if (test__powitf2(-INFINITY, 0x80000002, 0))
196        return 1;
197    if (test__powitf2(-INFINITY, 0x80000001, -0.))
198        return 1;
199    if (test__powitf2(-INFINITY, 0x80000000, 0))
200        return 1;
201
202    if (test__powitf2(2, 10, 1024.))
203        return 1;
204    if (test__powitf2(-2, 10, 1024.))
205        return 1;
206    if (test__powitf2(2, -10, 1/1024.))
207        return 1;
208    if (test__powitf2(-2, -10, 1/1024.))
209        return 1;
210
211    if (test__powitf2(2, 19, 524288.))
212        return 1;
213    if (test__powitf2(-2, 19, -524288.))
214        return 1;
215    if (test__powitf2(2, -19, 1/524288.))
216        return 1;
217    if (test__powitf2(-2, -19, -1/524288.))
218        return 1;
219
220    if (test__powitf2(2, 31, 2147483648.))
221        return 1;
222    if (test__powitf2(-2, 31, -2147483648.))
223        return 1;
224    if (test__powitf2(2, -31, 1/2147483648.))
225        return 1;
226    if (test__powitf2(-2, -31, -1/2147483648.))
227        return 1;
228
229#else
230    printf("skipped\n");
231#endif
232    return 0;
233}
234