Skip to content

Commit 9539cbf

Browse files
authored
[libc] Add detection support for float16 (#73372)
1 parent 2869053 commit 9539cbf

File tree

1 file changed

+56
-18
lines changed
  • libc/src/__support/macros/properties

1 file changed

+56
-18
lines changed

libc/src/__support/macros/properties/float.h

Lines changed: 56 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,32 +15,70 @@
1515
#include "src/__support/macros/properties/compiler.h"
1616
#include "src/__support/macros/properties/os.h"
1717

18-
// https://developer.arm.com/documentation/dui0491/i/C-and-C---Implementation-Details/Basic-data-types
19-
// https://developer.apple.com/documentation/xcode/writing-arm64-code-for-apple-platforms
20-
// https://docs.amd.com/bundle/HIP-Programming-Guide-v5.1/page/Programming_with_HIP.html
21-
#if defined(LIBC_TARGET_OS_IS_WINDOWS) || \
22-
(defined(LIBC_TARGET_OS_IS_MACOS) && \
23-
defined(LIBC_TARGET_ARCH_IS_AARCH64)) || \
24-
defined(LIBC_TARGET_ARCH_IS_ARM) || defined(LIBC_TARGET_ARCH_IS_NVPTX) || \
25-
defined(LIBC_TARGET_ARCH_IS_AMDGPU)
18+
#include <float.h> // LDBL_MANT_DIG
19+
20+
// 'long double' properties.
21+
#if (LDBL_MANT_DIG == DBL_MANT_DIG)
22+
// TODO: Replace with LIBC_LONG_DOUBLE_IS_DOUBLE
2623
#define LONG_DOUBLE_IS_DOUBLE
2724
#endif
28-
29-
#if !defined(LONG_DOUBLE_IS_DOUBLE) && defined(LIBC_TARGET_ARCH_IS_X86)
25+
#if (LDBL_MANT_DIG == 64)
26+
// TODO: Replace with LIBC_LONG_DOUBLE_IS_X86_BIN80
3027
#define SPECIAL_X86_LONG_DOUBLE
28+
#elif (LDBL_MANT_DIG == 113)
29+
#define LIBC_LONG_DOUBLE_IS_IEEE754_BIN128
3130
#endif
3231

33-
// Check compiler features
34-
#if defined(FLT128_MANT_DIG)
35-
#define LIBC_COMPILER_HAS_FLOAT128
32+
// float16 support.
33+
#if defined(LIBC_TARGET_ARCH_IS_X86_64)
34+
#if (defined(LIBC_COMPILER_CLANG_VER) && (LIBC_COMPILER_CLANG_VER >= 1500)) || \
35+
(defined(LIBC_COMPILER_GCC_VER) && (LIBC_COMPILER_GCC_VER >= 1201))
36+
#define LIBC_COMPILER_HAS_C23_FLOAT16
37+
#endif
38+
#endif
39+
#if defined(LIBC_TARGET_ARCH_IS_AARCH64)
40+
#if (defined(LIBC_COMPILER_CLANG_VER) && (LIBC_COMPILER_CLANG_VER >= 0900)) || \
41+
(defined(LIBC_COMPILER_GCC_VER) && (LIBC_COMPILER_GCC_VER >= 1301))
42+
#define LIBC_COMPILER_HAS_C23_FLOAT16
43+
#endif
44+
#endif
45+
#if defined(LIBC_TARGET_ARCH_IS_ANY_RISCV)
46+
#if (defined(LIBC_COMPILER_CLANG_VER) && (LIBC_COMPILER_CLANG_VER >= 1300)) || \
47+
(defined(LIBC_COMPILER_GCC_VER) && (LIBC_COMPILER_GCC_VER >= 1301))
48+
#define LIBC_COMPILER_HAS_C23_FLOAT16
49+
#endif
50+
#endif
51+
52+
#if defined(LIBC_COMPILER_HAS_C23_FLOAT16)
53+
using float16 = _Float16;
54+
#define LIBC_HAS_FLOAT16
55+
#endif
56+
57+
// float128 support.
58+
#if (defined(LIBC_COMPILER_GCC_VER) && (LIBC_COMPILER_GCC_VER >= 1301)) && \
59+
(defined(LIBC_TARGET_ARCH_IS_AARCH64) || \
60+
defined(LIBC_TARGET_ARCH_IS_ANY_RISCV) || \
61+
defined(LIBC_TARGET_ARCH_IS_X86_64))
62+
#define LIBC_COMPILER_HAS_C23_FLOAT128
63+
#endif
64+
#if (defined(LIBC_COMPILER_CLANG_VER) && (LIBC_COMPILER_CLANG_VER >= 0500)) && \
65+
(defined(LIBC_TARGET_ARCH_IS_X86_64))
66+
#define LIBC_COMPILER_HAS_FLOAT128_EXTENSION
67+
#endif
68+
69+
#if defined(LIBC_COMPILER_HAS_C23_FLOAT128)
3670
using float128 = _Float128;
37-
#elif defined(__SIZEOF_FLOAT128__)
38-
#define LIBC_COMPILER_HAS_FLOAT128
71+
#elif defined(LIBC_COMPILER_HAS_FLOAT128_EXTENSION)
3972
using float128 = __float128;
40-
#elif (defined(__linux__) && defined(__aarch64__))
41-
#define LIBC_COMPILER_HAS_FLOAT128
42-
#define LIBC_FLOAT128_IS_LONG_DOUBLE
73+
#elif defined(LIBC_LONG_DOUBLE_IS_IEEE754_BIN128)
4374
using float128 = long double;
4475
#endif
4576

77+
#if defined(LIBC_COMPILER_HAS_C23_FLOAT128) || \
78+
defined(LIBC_COMPILER_HAS_FLOAT128_EXTENSION) || \
79+
defined(LIBC_LONG_DOUBLE_IS_IEEE754_BIN128)
80+
// TODO: Replace with LIBC_HAS_FLOAT128
81+
#define LIBC_COMPILER_HAS_FLOAT128
82+
#endif
83+
4684
#endif // LLVM_LIBC_SRC___SUPPORT_MACROS_PROPERTIES_FLOAT_H

0 commit comments

Comments
 (0)