diff options
| author | Connector Switch <c8ef@outlook.com> | 2025-09-05 10:08:04 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-09-05 10:08:04 +0800 |
| commit | 78579b9157c230effa8b5e379e47ae33482689d4 (patch) | |
| tree | ef236d77a16c1ac49d74ac666ab1d2fb4c1f40f5 /libc/include | |
| parent | bbde9c1590c8c7cb2100a86d3cbe8f2f3e25729d (diff) | |
[libc] Implement CMPLX related macros (#156344)
Diffstat (limited to 'libc/include')
| -rw-r--r-- | libc/include/llvm-libc-macros/CMakeLists.txt | 15 | ||||
| -rw-r--r-- | libc/include/llvm-libc-macros/cfloat128-macros.h | 41 | ||||
| -rw-r--r-- | libc/include/llvm-libc-macros/cfloat16-macros.h | 20 | ||||
| -rw-r--r-- | libc/include/llvm-libc-macros/complex-macros.h | 20 | ||||
| -rw-r--r-- | libc/include/llvm-libc-types/CMakeLists.txt | 10 | ||||
| -rw-r--r-- | libc/include/llvm-libc-types/cfloat128.h | 34 | ||||
| -rw-r--r-- | libc/include/llvm-libc-types/cfloat16.h | 11 |
7 files changed, 114 insertions, 37 deletions
diff --git a/libc/include/llvm-libc-macros/CMakeLists.txt b/libc/include/llvm-libc-macros/CMakeLists.txt index 7aa549ddc75d..f71540313f0b 100644 --- a/libc/include/llvm-libc-macros/CMakeLists.txt +++ b/libc/include/llvm-libc-macros/CMakeLists.txt @@ -62,9 +62,24 @@ add_macro_header( ) add_macro_header( + cfloat128_macros + HDR + cfloat128-macros.h +) + +add_macro_header( + cfloat16_macros + HDR + cfloat16-macros.h +) + +add_macro_header( complex_macros HDR complex-macros.h + DEPENDS + .cfloat128_macros + .cfloat16_macros ) add_macro_header( diff --git a/libc/include/llvm-libc-macros/cfloat128-macros.h b/libc/include/llvm-libc-macros/cfloat128-macros.h new file mode 100644 index 000000000000..5f28cfa21aae --- /dev/null +++ b/libc/include/llvm-libc-macros/cfloat128-macros.h @@ -0,0 +1,41 @@ +//===-- Detection of _Complex _Float128 compiler builtin type -------------===// +// +// 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_CFLOAT128_MACROS_H +#define LLVM_LIBC_MACROS_CFLOAT128_MACROS_H + +#include "float-macros.h" // LDBL_MANT_DIG + +// Currently, the complex variant of C23 `_Float128` type is only defined as a +// built-in type in GCC 7 or later, for C and in GCC 13 or later, for C++. For +// clang, the complex variant of `__float128` is defined instead, and only on +// x86-64 targets for clang 11 or later. +// +// TODO: Update the complex variant of C23 `_Float128` type detection again when +// clang supports it. +#ifdef __clang__ +#if (__clang_major__ >= 11) && \ + (defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__)) +// Use _Complex __float128 type. clang uses __SIZEOF_FLOAT128__ or __FLOAT128__ +// macro to notify the availability of __float128 type: +// https://reviews.llvm.org/D15120 +#define LIBC_TYPES_HAS_CFLOAT128 +#endif +#elif defined(__GNUC__) +#if (defined(__STDC_IEC_60559_COMPLEX__) || defined(__SIZEOF_FLOAT128__)) && \ + (__GNUC__ >= 13 || (!defined(__cplusplus))) +#define LIBC_TYPES_HAS_CFLOAT128 +#endif +#endif + +#if !defined(LIBC_TYPES_HAS_CFLOAT128) && (LDBL_MANT_DIG == 113) +#define LIBC_TYPES_HAS_CFLOAT128 +#define LIBC_TYPES_CFLOAT128_IS_COMPLEX_LONG_DOUBLE +#endif + +#endif // LLVM_LIBC_MACROS_CFLOAT128_MACROS_H diff --git a/libc/include/llvm-libc-macros/cfloat16-macros.h b/libc/include/llvm-libc-macros/cfloat16-macros.h new file mode 100644 index 000000000000..1f10adf3e3f2 --- /dev/null +++ b/libc/include/llvm-libc-macros/cfloat16-macros.h @@ -0,0 +1,20 @@ +//===-- Detection of _Complex _Float16 compiler builtin type --------------===// +// +// 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_CFLOAT16_MACROS_H +#define LLVM_LIBC_MACROS_CFLOAT16_MACROS_H + +#if defined(__FLT16_MANT_DIG__) && \ + (!defined(__GNUC__) || __GNUC__ >= 13 || \ + (defined(__clang__) && __clang_major__ >= 14)) && \ + !defined(__arm__) && !defined(_M_ARM) && !defined(__riscv) && \ + !defined(_WIN32) +#define LIBC_TYPES_HAS_CFLOAT16 +#endif + +#endif // LLVM_LIBC_MACROS_CFLOAT16_MACROS_H diff --git a/libc/include/llvm-libc-macros/complex-macros.h b/libc/include/llvm-libc-macros/complex-macros.h index 427c68d289e0..d98c6fdb306c 100644 --- a/libc/include/llvm-libc-macros/complex-macros.h +++ b/libc/include/llvm-libc-macros/complex-macros.h @@ -9,6 +9,9 @@ #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 @@ -19,6 +22,23 @@ // TODO: Add imaginary macros once GCC or Clang support _Imaginary builtin-type. +#define CMPLX(x, y) __builtin_complex((double)(x), (double)(y)) +#define CMPLXF(x, y) __builtin_complex((float)(x), (float)(y)) +#define CMPLXL(x, y) __builtin_complex((long double)(x), (long double)(y)) + +#ifdef LIBC_TYPES_HAS_CFLOAT16 +#if !defined(__clang__) || (__clang_major__ >= 22 && __clang_minor__ > 0) +#define CMPLXF16(x, y) __builtin_complex((_Float16)(x), (_Float16)(y)) +#else +#define CMPLXF16(x, y) \ + ((complex _Float16)(__builtin_complex((float)(x), (float)(y)))) #endif +#endif // LIBC_TYPES_HAS_CFLOAT16 + +#ifdef LIBC_TYPES_HAS_CFLOAT128 +#define CMPLXF128(x, y) __builtin_complex((float128)(x), (float128)(y)) +#endif // LIBC_TYPES_HAS_CFLOAT128 + +#endif // __STDC_NO_COMPLEX__ #endif // __LLVM_LIBC_MACROS_COMPLEX_MACROS_H diff --git a/libc/include/llvm-libc-types/CMakeLists.txt b/libc/include/llvm-libc-types/CMakeLists.txt index fe9e4e397666..70da983be909 100644 --- a/libc/include/llvm-libc-types/CMakeLists.txt +++ b/libc/include/llvm-libc-types/CMakeLists.txt @@ -150,9 +150,15 @@ add_header( HDR cfloat128.h DEPENDS - libc.include.llvm-libc-macros.float_macros + libc.include.llvm-libc-macros.cfloat128_macros +) +add_header( + cfloat16 + HDR + cfloat16.h + DEPENDS + libc.include.llvm-libc-macros.cfloat16_macros ) -add_header(cfloat16 HDR cfloat16.h) add_header(fsblkcnt_t HDR fsblkcnt_t.h) add_header(fsfilcnt_t HDR fsfilcnt_t.h) add_header( diff --git a/libc/include/llvm-libc-types/cfloat128.h b/libc/include/llvm-libc-types/cfloat128.h index 83fad8791013..25b4cc7345a3 100644 --- a/libc/include/llvm-libc-types/cfloat128.h +++ b/libc/include/llvm-libc-types/cfloat128.h @@ -9,36 +9,14 @@ #ifndef LLVM_LIBC_TYPES_CFLOAT128_H #define LLVM_LIBC_TYPES_CFLOAT128_H -#include "../llvm-libc-macros/float-macros.h" // LDBL_MANT_DIG +#include "../llvm-libc-macros/cfloat128-macros.h" -// Currently, the complex variant of C23 `_Float128` type is only defined as a -// built-in type in GCC 7 or later, for C and in GCC 13 or later, for C++. For -// clang, the complex variant of `__float128` is defined instead, and only on -// x86-64 targets for clang 11 or later. -// -// TODO: Update the complex variant of C23 `_Float128` type detection again when -// clang supports it. -#ifdef __clang__ -#if (__clang_major__ >= 11) && \ - (defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__)) -// Use _Complex __float128 type. clang uses __SIZEOF_FLOAT128__ or __FLOAT128__ -// macro to notify the availability of __float128 type: -// https://reviews.llvm.org/D15120 -#define LIBC_TYPES_HAS_CFLOAT128 +#ifdef LIBC_TYPES_HAS_CFLOAT128 +#ifndef LIBC_TYPES_CFLOAT128_IS_COMPLEX_LONG_DOUBLE typedef _Complex __float128 cfloat128; -#endif -#elif defined(__GNUC__) -#if (defined(__STDC_IEC_60559_COMPLEX__) || defined(__SIZEOF_FLOAT128__)) && \ - (__GNUC__ >= 13 || (!defined(__cplusplus))) -#define LIBC_TYPES_HAS_CFLOAT128 -typedef _Complex _Float128 cfloat128; -#endif -#endif - -#if !defined(LIBC_TYPES_HAS_CFLOAT128) && (LDBL_MANT_DIG == 113) -#define LIBC_TYPES_HAS_CFLOAT128 -#define LIBC_TYPES_CFLOAT128_IS_COMPLEX_LONG_DOUBLE +#else typedef _Complex long double cfloat128; -#endif +#endif // LIBC_TYPES_CFLOAT128_IS_COMPLEX_LONG_DOUBLE +#endif // LIBC_TYPES_HAS_CFLOAT128 #endif // LLVM_LIBC_TYPES_CFLOAT128_H diff --git a/libc/include/llvm-libc-types/cfloat16.h b/libc/include/llvm-libc-types/cfloat16.h index 2d4cef756272..644a6469f059 100644 --- a/libc/include/llvm-libc-types/cfloat16.h +++ b/libc/include/llvm-libc-types/cfloat16.h @@ -9,13 +9,10 @@ #ifndef LLVM_LIBC_TYPES_CFLOAT16_H #define LLVM_LIBC_TYPES_CFLOAT16_H -#if defined(__FLT16_MANT_DIG__) && \ - (!defined(__GNUC__) || __GNUC__ >= 13 || \ - (defined(__clang__) && __clang_major__ >= 14)) && \ - !defined(__arm__) && !defined(_M_ARM) && !defined(__riscv) && \ - !defined(_WIN32) -#define LIBC_TYPES_HAS_CFLOAT16 +#include "../llvm-libc-macros/cfloat16-macros.h" + +#ifdef LIBC_TYPES_HAS_CFLOAT16 typedef _Complex _Float16 cfloat16; -#endif +#endif // LIBC_TYPES_HAS_CFLOAT16 #endif // LLVM_LIBC_TYPES_CFLOAT16_H |
