|
22 | 22 |
|
23 | 23 | // TODO: Add imaginary macros once GCC or Clang support _Imaginary builtin-type.
|
24 | 24 |
|
25 |
| -#define CMPLX(x, y) __builtin_complex((double)(x), (double)(y)) |
26 |
| -#define CMPLXF(x, y) __builtin_complex((float)(x), (float)(y)) |
27 |
| -#define CMPLXL(x, y) __builtin_complex((long double)(x), (long double)(y)) |
| 25 | +#if __has_builtin(__builtin_complex) |
| 26 | +#define __CMPLX(r, i, t) (__builtin_complex((t)(r), (t)(i))) |
| 27 | +#else |
| 28 | +#define __CMPLX(r, i, t) ((_Complex t){(t)(r), (t)(i)}) |
| 29 | +#endif |
| 30 | + |
| 31 | +#define CMPLX(r, i) __CMPLX(r, i, double) |
| 32 | +#define CMPLXF(r, i) __CMPLX(r, i, float) |
| 33 | +#define CMPLXL(r, i) __CMPLX(r, i, long double) |
28 | 34 |
|
29 | 35 | #ifdef LIBC_TYPES_HAS_CFLOAT16
|
30 | 36 | #if !defined(__clang__) || (__clang_major__ >= 22 && __clang_minor__ > 0)
|
31 |
| -#define CMPLXF16(x, y) __builtin_complex((_Float16)(x), (_Float16)(y)) |
| 37 | +#define CMPLXF16(r, i) __CMPLX(r, i, _Float16) |
32 | 38 | #else
|
33 |
| -#define CMPLXF16(x, y) \ |
34 |
| - ((complex _Float16)(__builtin_complex((float)(x), (float)(y)))) |
| 39 | +#define CMPLXF16(r, i) ((complex _Float16)(__CMPLX(r, i, float))) |
35 | 40 | #endif
|
36 | 41 | #endif // LIBC_TYPES_HAS_CFLOAT16
|
37 | 42 |
|
38 | 43 | #ifdef LIBC_TYPES_HAS_CFLOAT128
|
39 |
| -#define CMPLXF128(x, y) __builtin_complex((float128)(x), (float128)(y)) |
| 44 | +#define CMPLXF128(r, i) __CMPLX(r, i, float128) |
40 | 45 | #endif // LIBC_TYPES_HAS_CFLOAT128
|
41 | 46 |
|
42 | 47 | #endif // __STDC_NO_COMPLEX__
|
|
0 commit comments