Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / clang / test / Headers / Inputs / include / complex
blobbd43cd952d7cdfb046b6b5f6befe6e5aa2f513d7
1 #pragma once
3 #include <cmath>
5 #define INFINITY (__builtin_inff())
6 #define NAN (__builtin_nanf (""))
8 namespace std {
10 // Taken from libc++
11 template <class _Tp>
12 class complex {
13 public:
14   typedef _Tp value_type;
16 private:
17   value_type __re_;
18   value_type __im_;
20 public:
21   complex(const value_type &__re = value_type(), const value_type &__im = value_type())
22       : __re_(__re), __im_(__im) {}
23   template <class _Xp>
24   complex(const complex<_Xp> &__c)
25       : __re_(__c.real()), __im_(__c.imag()) {}
27   value_type real() const { return __re_; }
28   value_type imag() const { return __im_; }
30   void real(value_type __re) { __re_ = __re; }
31   void imag(value_type __im) { __im_ = __im; }
33   complex &operator=(const value_type &__re) {
34     __re_ = __re;
35     __im_ = value_type();
36     return *this;
37   }
38   complex &operator+=(const value_type &__re) {
39     __re_ += __re;
40     return *this;
41   }
42   complex &operator-=(const value_type &__re) {
43     __re_ -= __re;
44     return *this;
45   }
46   complex &operator*=(const value_type &__re) {
47     __re_ *= __re;
48     __im_ *= __re;
49     return *this;
50   }
51   complex &operator/=(const value_type &__re) {
52     __re_ /= __re;
53     __im_ /= __re;
54     return *this;
55   }
57   template <class _Xp>
58   complex &operator=(const complex<_Xp> &__c) {
59     __re_ = __c.real();
60     __im_ = __c.imag();
61     return *this;
62   }
63   template <class _Xp>
64   complex &operator+=(const complex<_Xp> &__c) {
65     __re_ += __c.real();
66     __im_ += __c.imag();
67     return *this;
68   }
69   template <class _Xp>
70   complex &operator-=(const complex<_Xp> &__c) {
71     __re_ -= __c.real();
72     __im_ -= __c.imag();
73     return *this;
74   }
75   template <class _Xp>
76   complex &operator*=(const complex<_Xp> &__c) {
77     *this = *this * complex(__c.real(), __c.imag());
78     return *this;
79   }
80   template <class _Xp>
81   complex &operator/=(const complex<_Xp> &__c) {
82     *this = *this / complex(__c.real(), __c.imag());
83     return *this;
84   }
87 template <class _Tp>
88 inline complex<_Tp>
89 operator+(const complex<_Tp> &__x, const complex<_Tp> &__y) {
90   complex<_Tp> __t(__x);
91   __t += __y;
92   return __t;
95 template <class _Tp>
96 inline complex<_Tp>
97 operator+(const complex<_Tp> &__x, const _Tp &__y) {
98   complex<_Tp> __t(__x);
99   __t += __y;
100   return __t;
103 template <class _Tp>
104 inline complex<_Tp>
105 operator+(const _Tp &__x, const complex<_Tp> &__y) {
106   complex<_Tp> __t(__y);
107   __t += __x;
108   return __t;
111 template <class _Tp>
112 inline complex<_Tp>
113 operator-(const complex<_Tp> &__x, const complex<_Tp> &__y) {
114   complex<_Tp> __t(__x);
115   __t -= __y;
116   return __t;
119 template <class _Tp>
120 inline complex<_Tp>
121 operator-(const complex<_Tp> &__x, const _Tp &__y) {
122   complex<_Tp> __t(__x);
123   __t -= __y;
124   return __t;
127 template <class _Tp>
128 inline complex<_Tp>
129 operator-(const _Tp &__x, const complex<_Tp> &__y) {
130   complex<_Tp> __t(-__y);
131   __t += __x;
132   return __t;
135 template <class _Tp>
136 complex<_Tp>
137 operator*(const complex<_Tp> &__z, const complex<_Tp> &__w) {
138   _Tp __a = __z.real();
139   _Tp __b = __z.imag();
140   _Tp __c = __w.real();
141   _Tp __d = __w.imag();
142   _Tp __ac = __a * __c;
143   _Tp __bd = __b * __d;
144   _Tp __ad = __a * __d;
145   _Tp __bc = __b * __c;
146   _Tp __x = __ac - __bd;
147   _Tp __y = __ad + __bc;
148   if (std::isnan(__x) && std::isnan(__y)) {
149     bool __recalc = false;
150     if (std::isinf(__a) || std::isinf(__b)) {
151       __a = copysign(std::isinf(__a) ? _Tp(1) : _Tp(0), __a);
152       __b = copysign(std::isinf(__b) ? _Tp(1) : _Tp(0), __b);
153       if (std::isnan(__c))
154         __c = copysign(_Tp(0), __c);
155       if (std::isnan(__d))
156         __d = copysign(_Tp(0), __d);
157       __recalc = true;
158     }
159     if (std::isinf(__c) || std::isinf(__d)) {
160       __c = copysign(std::isinf(__c) ? _Tp(1) : _Tp(0), __c);
161       __d = copysign(std::isinf(__d) ? _Tp(1) : _Tp(0), __d);
162       if (std::isnan(__a))
163         __a = copysign(_Tp(0), __a);
164       if (std::isnan(__b))
165         __b = copysign(_Tp(0), __b);
166       __recalc = true;
167     }
168     if (!__recalc && (std::isinf(__ac) || std::isinf(__bd) ||
169                       std::isinf(__ad) || std::isinf(__bc))) {
170       if (std::isnan(__a))
171         __a = copysign(_Tp(0), __a);
172       if (std::isnan(__b))
173         __b = copysign(_Tp(0), __b);
174       if (std::isnan(__c))
175         __c = copysign(_Tp(0), __c);
176       if (std::isnan(__d))
177         __d = copysign(_Tp(0), __d);
178       __recalc = true;
179     }
180     if (__recalc) {
181       __x = _Tp(INFINITY) * (__a * __c - __b * __d);
182       __y = _Tp(INFINITY) * (__a * __d + __b * __c);
183     }
184   }
185   return complex<_Tp>(__x, __y);
188 template <class _Tp>
189 inline complex<_Tp>
190 operator*(const complex<_Tp> &__x, const _Tp &__y) {
191   complex<_Tp> __t(__x);
192   __t *= __y;
193   return __t;
196 template <class _Tp>
197 inline complex<_Tp>
198 operator*(const _Tp &__x, const complex<_Tp> &__y) {
199   complex<_Tp> __t(__y);
200   __t *= __x;
201   return __t;
204 template <class _Tp>
205 complex<_Tp>
206 operator/(const complex<_Tp> &__z, const complex<_Tp> &__w) {
207   int __ilogbw = 0;
208   _Tp __a = __z.real();
209   _Tp __b = __z.imag();
210   _Tp __c = __w.real();
211   _Tp __d = __w.imag();
212   _Tp __logbw = logb(fmax(fabs(__c), fabs(__d)));
213   if (std::isfinite(__logbw)) {
214     __ilogbw = static_cast<int>(__logbw);
215     __c = scalbn(__c, -__ilogbw);
216     __d = scalbn(__d, -__ilogbw);
217   }
218   _Tp __denom = __c * __c + __d * __d;
219   _Tp __x = scalbn((__a * __c + __b * __d) / __denom, -__ilogbw);
220   _Tp __y = scalbn((__b * __c - __a * __d) / __denom, -__ilogbw);
221   if (std::isnan(__x) && std::isnan(__y)) {
222     if ((__denom == _Tp(0)) && (!std::isnan(__a) || !std::isnan(__b))) {
223       __x = copysign(_Tp(INFINITY), __c) * __a;
224       __y = copysign(_Tp(INFINITY), __c) * __b;
225     } else if ((std::isinf(__a) || std::isinf(__b)) && std::isfinite(__c) && std::isfinite(__d)) {
226       __a = copysign(std::isinf(__a) ? _Tp(1) : _Tp(0), __a);
227       __b = copysign(std::isinf(__b) ? _Tp(1) : _Tp(0), __b);
228       __x = _Tp(INFINITY) * (__a * __c + __b * __d);
229       __y = _Tp(INFINITY) * (__b * __c - __a * __d);
230     } else if (std::isinf(__logbw) && __logbw > _Tp(0) && std::isfinite(__a) && std::isfinite(__b)) {
231       __c = copysign(std::isinf(__c) ? _Tp(1) : _Tp(0), __c);
232       __d = copysign(std::isinf(__d) ? _Tp(1) : _Tp(0), __d);
233       __x = _Tp(0) * (__a * __c + __b * __d);
234       __y = _Tp(0) * (__b * __c - __a * __d);
235     }
236   }
237   return complex<_Tp>(__x, __y);
240 template <class _Tp>
241 inline complex<_Tp>
242 operator/(const complex<_Tp> &__x, const _Tp &__y) {
243   return complex<_Tp>(__x.real() / __y, __x.imag() / __y);
246 template <class _Tp>
247 inline complex<_Tp>
248 operator/(const _Tp &__x, const complex<_Tp> &__y) {
249   complex<_Tp> __t(__x);
250   __t /= __y;
251   return __t;
254 template <class _Tp>
255 inline complex<_Tp>
256 operator+(const complex<_Tp> &__x) {
257   return __x;
260 template <class _Tp>
261 inline complex<_Tp>
262 operator-(const complex<_Tp> &__x) {
263   return complex<_Tp>(-__x.real(), -__x.imag());
266 template <class _Tp>
267 inline bool
268 operator==(const complex<_Tp> &__x, const complex<_Tp> &__y) {
269   return __x.real() == __y.real() && __x.imag() == __y.imag();
272 template <class _Tp>
273 inline bool
274 operator==(const complex<_Tp> &__x, const _Tp &__y) {
275   return __x.real() == __y && __x.imag() == 0;
278 template <class _Tp>
279 inline bool
280 operator==(const _Tp &__x, const complex<_Tp> &__y) {
281   return __x == __y.real() && 0 == __y.imag();
284 template <class _Tp>
285 inline bool
286 operator!=(const complex<_Tp> &__x, const complex<_Tp> &__y) {
287   return !(__x == __y);
290 template <class _Tp>
291 inline bool
292 operator!=(const complex<_Tp> &__x, const _Tp &__y) {
293   return !(__x == __y);
296 template <class _Tp>
297 inline bool
298 operator!=(const _Tp &__x, const complex<_Tp> &__y) {
299   return !(__x == __y);
302 template <class _Tp> _Tp abs(const std::complex<_Tp> &__c);
304 // arg
306 template <class _Tp> _Tp arg(const std::complex<_Tp> &__c);
308 // norm
310 template <class _Tp> _Tp norm(const std::complex<_Tp> &__c);
312 // conj
314 template <class _Tp> std::complex<_Tp> conj(const std::complex<_Tp> &__c);
316 // proj
318 template <class _Tp> std::complex<_Tp> proj(const std::complex<_Tp> &__c);
320 // polar
322 template <class _Tp>
323 complex<_Tp> polar(const _Tp &__rho, const _Tp &__theta = _Tp());
325 // log
327 template <class _Tp> std::complex<_Tp> log(const std::complex<_Tp> &__x);
329 // log10
331 template <class _Tp> std::complex<_Tp> log10(const std::complex<_Tp> &__x);
333 // sqrt
335 template <class _Tp>
336 std::complex<_Tp> sqrt(const std::complex<_Tp> &__x);
338 // exp
340 template <class _Tp>
341 std::complex<_Tp> exp(const std::complex<_Tp> &__x);
343 // pow
345 template <class _Tp>
346 std::complex<_Tp> pow(const std::complex<_Tp> &__x,
347                       const std::complex<_Tp> &__y);
349 // __sqr, computes pow(x, 2)
351 template <class _Tp> std::complex<_Tp> __sqr(const std::complex<_Tp> &__x);
353 // asinh
355 template <class _Tp>
356 std::complex<_Tp> asinh(const std::complex<_Tp> &__x);
358 // acosh
360 template <class _Tp>
361 std::complex<_Tp> acosh(const std::complex<_Tp> &__x);
363 // atanh
365 template <class _Tp>
366 std::complex<_Tp> atanh(const std::complex<_Tp> &__x);
368 // sinh
370 template <class _Tp>
371 std::complex<_Tp> sinh(const std::complex<_Tp> &__x);
373 // cosh
375 template <class _Tp>
376 std::complex<_Tp> cosh(const std::complex<_Tp> &__x);
378 // tanh
380 template <class _Tp>
381 std::complex<_Tp> tanh(const std::complex<_Tp> &__x);
383 // asin
385 template <class _Tp>
386 std::complex<_Tp> asin(const std::complex<_Tp> &__x);
388 // acos
390 template <class _Tp>
391 std::complex<_Tp> acos(const std::complex<_Tp> &__x);
393 // atan
395 template <class _Tp>
396 std::complex<_Tp> atan(const std::complex<_Tp> &__x);
398 // sin
400 template <class _Tp>
401 std::complex<_Tp> sin(const std::complex<_Tp> &__x);
403 // cos
405 template <class _Tp> std::complex<_Tp> cos(const std::complex<_Tp> &__x);
407 // tan
409 template <class _Tp>
410 std::complex<_Tp> tan(const std::complex<_Tp> &__x);
412 } // namespace std