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