//===-- Definition of macros to be used with complex functions ------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef __LLVM_LIBC_MACROS_COMPLEX_MACROS_H #define __LLVM_LIBC_MACROS_COMPLEX_MACROS_H #include "cfloat128-macros.h" #include "cfloat16-macros.h" #ifndef __STDC_NO_COMPLEX__ #define __STDC_VERSION_COMPLEX_H__ 202311L #define complex _Complex #define _Complex_I ((_Complex float)1.0fi) #define I _Complex_I // TODO: Add imaginary macros once GCC or Clang support _Imaginary builtin-type. #if __has_builtin(__builtin_complex) #define __CMPLX(r, i, t) (__builtin_complex((t)(r), (t)(i))) #else #define __CMPLX(r, i, t) ((_Complex t){(t)(r), (t)(i)}) #endif #define CMPLX(r, i) __CMPLX(r, i, double) #define CMPLXF(r, i) __CMPLX(r, i, float) #define CMPLXL(r, i) __CMPLX(r, i, long double) #ifdef LIBC_TYPES_HAS_CFLOAT16 #if !defined(__clang__) || (__clang_major__ >= 22 && __clang_minor__ > 0) #define CMPLXF16(r, i) __CMPLX(r, i, _Float16) #else #define CMPLXF16(r, i) ((complex _Float16)(__CMPLX(r, i, float))) #endif #endif // LIBC_TYPES_HAS_CFLOAT16 #ifdef LIBC_TYPES_HAS_CFLOAT128 #ifdef LIBC_TYPES_CFLOAT128_IS_COMPLEX_LONG_DOUBLE #define CMPLXF128(r, i) __CMPLX(r, i, long double) #else #define CMPLXF128(r, i) __CMPLX(r, i, float128) #endif // LIBC_TYPES_CFLOAT128_IS_COMPLEX_LONG_DOUBLE #endif // LIBC_TYPES_HAS_CFLOAT128 #endif // __STDC_NO_COMPLEX__ #endif // __LLVM_LIBC_MACROS_COMPLEX_MACROS_H