diff --git a/libc/include/llvm-libc-macros/float-macros.h b/libc/include/llvm-libc-macros/float-macros.h index a25ef60a293d3..38a3a771cca54 100644 --- a/libc/include/llvm-libc-macros/float-macros.h +++ b/libc/include/llvm-libc-macros/float-macros.h @@ -9,6 +9,12 @@ #ifndef LLVM_LIBC_MACROS_FLOAT_MACROS_H #define LLVM_LIBC_MACROS_FLOAT_MACROS_H +// __has_builtin is a Clang extension; GCC < 10 doesn't define it, which +// turns a bare `#if __has_builtin(...)` into a preprocessor syntax error. +#ifndef __has_builtin +#define __has_builtin(x) 0 +#endif + #ifndef FLT_RADIX #define FLT_RADIX __FLT_RADIX__ #endif // FLT_RADIX diff --git a/libc/shared/builtins.h b/libc/shared/builtins.h new file mode 100644 index 0000000000000..338755314d309 --- /dev/null +++ b/libc/shared/builtins.h @@ -0,0 +1,22 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// This header aggregates LLVM-libc's shared compiler-rt builtins so that +/// they can be reused by compiler-rt's builtins. +/// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SHARED_BUILTINS_H +#define LLVM_LIBC_SHARED_BUILTINS_H + +#include "libc_common.h" + +#include "builtins/addtf3.h" + +#endif // LLVM_LIBC_SHARED_BUILTINS_H diff --git a/libc/shared/builtins/addtf3.h b/libc/shared/builtins/addtf3.h new file mode 100644 index 0000000000000..33534beeb91c7 --- /dev/null +++ b/libc/shared/builtins/addtf3.h @@ -0,0 +1,35 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// This header exposes LLVM-libc's __addtf3 implementation as shared::addtf3 +/// so that it can be reused by compiler-rt's builtins. +/// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SHARED_BUILTINS_ADDTF3_H +#define LLVM_LIBC_SHARED_BUILTINS_ADDTF3_H + +#include "include/llvm-libc-types/float128.h" + +#ifdef LIBC_TYPES_HAS_FLOAT128 + +#include "shared/libc_common.h" +#include "src/__support/builtins/addtf3.h" + +namespace LIBC_NAMESPACE_DECL { +namespace shared { + +using builtins::addtf3; + +} // namespace shared +} // namespace LIBC_NAMESPACE_DECL + +#endif // LIBC_TYPES_HAS_FLOAT128 + +#endif // LLVM_LIBC_SHARED_BUILTINS_ADDTF3_H diff --git a/libc/src/__support/CMakeLists.txt b/libc/src/__support/CMakeLists.txt index 9d08b4bcf7303..c09ca012c3594 100644 --- a/libc/src/__support/CMakeLists.txt +++ b/libc/src/__support/CMakeLists.txt @@ -472,6 +472,7 @@ add_subdirectory(wchar) add_subdirectory(wctype) add_subdirectory(math) +add_subdirectory(builtins) if(LIBC_COMPILER_HAS_EXT_VECTOR_TYPE) add_subdirectory(mathvec) endif() diff --git a/libc/src/__support/FPUtil/dyadic_float.h b/libc/src/__support/FPUtil/dyadic_float.h index 7e4ea2f1a81be..d99a14f35f38e 100644 --- a/libc/src/__support/FPUtil/dyadic_float.h +++ b/libc/src/__support/FPUtil/dyadic_float.h @@ -415,6 +415,9 @@ template struct DyadicFloat { if constexpr (cpp::is_same_v #if defined(LIBC_TYPES_HAS_FLOAT16) && !defined(__LIBC_USE_FLOAT16_CONVERSION) || cpp::is_same_v +#endif +#if defined(LIBC_TYPES_HAS_FLOAT128) + || cpp::is_same_v #endif ) return generic_as(); diff --git a/libc/src/__support/builtins/CMakeLists.txt b/libc/src/__support/builtins/CMakeLists.txt new file mode 100644 index 0000000000000..c4982887d0a7c --- /dev/null +++ b/libc/src/__support/builtins/CMakeLists.txt @@ -0,0 +1,9 @@ +add_header_library( + addtf3 + HDRS + addtf3.h + DEPENDS + libc.include.llvm-libc-types.float128 + libc.src.__support.FPUtil.generic.add_sub + libc.src.__support.macros.config +) diff --git a/libc/src/__support/builtins/addtf3.h b/libc/src/__support/builtins/addtf3.h new file mode 100644 index 0000000000000..f33036f53ec30 --- /dev/null +++ b/libc/src/__support/builtins/addtf3.h @@ -0,0 +1,38 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// This header exposes LLVM-libc's __addtf3 implementation as +/// builtins::addtf3 so that it can be reused by compiler-rt's builtins. +/// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_BUILTINS_ADDTF3_H +#define LLVM_LIBC_SRC___SUPPORT_BUILTINS_ADDTF3_H + +#include "include/llvm-libc-types/float128.h" + +#ifdef LIBC_TYPES_HAS_FLOAT128 + +#include "src/__support/FPUtil/generic/add_sub.h" +#include "src/__support/macros/config.h" + +namespace LIBC_NAMESPACE_DECL { +namespace builtins { + +// Mirrors the compiler-rt __addtf3 ABI: a + b at float128 precision. +LIBC_INLINE float128 addtf3(float128 x, float128 y) { + return fputil::generic::add(x, y); +} + +} // namespace builtins +} // namespace LIBC_NAMESPACE_DECL + +#endif // LIBC_TYPES_HAS_FLOAT128 + +#endif // LLVM_LIBC_SRC___SUPPORT_BUILTINS_ADDTF3_H diff --git a/libc/test/shared/CMakeLists.txt b/libc/test/shared/CMakeLists.txt index 7a5c3a369c2fc..0f8027e2e0057 100644 --- a/libc/test/shared/CMakeLists.txt +++ b/libc/test/shared/CMakeLists.txt @@ -814,6 +814,16 @@ add_fp_unittest( ) endif() # LIBC_TEST_SKIP_SHARED_MATH_TESTS +add_fp_unittest( + shared_builtins_test + SUITE + libc-shared-tests + SRCS + shared_builtins_test.cpp + DEPENDS + libc.src.__support.builtins.addtf3 +) + add_fp_unittest( shared_str_to_num_test SUITE diff --git a/libc/test/shared/shared_builtins_test.cpp b/libc/test/shared/shared_builtins_test.cpp new file mode 100644 index 0000000000000..67d40b349cef3 --- /dev/null +++ b/libc/test/shared/shared_builtins_test.cpp @@ -0,0 +1,29 @@ +//===-- Unittests for shared builtins -------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "shared/builtins.h" +#include "test/UnitTest/FPMatcher.h" +#include "test/UnitTest/Test.h" + +TEST(LlvmLibcSharedBuiltinsTest, AllFloat) { + // TODO: assertions for shared::*sf3 builtins. +} + +TEST(LlvmLibcSharedBuiltinsTest, AllDouble) { + // TODO: assertions for shared::*df3 builtins. +} + +#ifdef LIBC_TYPES_HAS_FLOAT128 + +TEST(LlvmLibcSharedBuiltinsTest, AllFloat128) { + namespace shared = LIBC_NAMESPACE::shared; + + EXPECT_FP_EQ(float128(3.0), shared::addtf3(float128(1.0), float128(2.0))); +} + +#endif // LIBC_TYPES_HAS_FLOAT128