[compiler-rt] [builtins] Support building the 128-bit float functions on i386 (PR #122658)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Jan 12 23:29:10 PST 2025
https://github.com/zhangtianhao6 updated https://github.com/llvm/llvm-project/pull/122658
>From fe61e4aeae112ec6a1ed1d3d2bd0537a582eea9f Mon Sep 17 00:00:00 2001
From: zhangtianhao6 <zhangtianhao6 at huawei.com>
Date: Mon, 13 Jan 2025 10:34:37 +0800
Subject: [PATCH] [builtins] Support building the 128-bit float functions on
i386
GCC provides these functions (e.g.__subtf3) in libgcc on i386.
Since Clang supports float128, we can also enable the existing code in i386 for ABI compatible.
---
compiler-rt/lib/builtins/CMakeLists.txt | 3 ++-
compiler-rt/lib/builtins/extendxftf2.c | 3 ++-
compiler-rt/lib/builtins/trunctfxf2.c | 3 ++-
compiler-rt/test/builtins/Unit/extendxftf2_test.c | 6 +++---
compiler-rt/test/builtins/Unit/trunctfxf2_test.c | 6 +++---
5 files changed, 12 insertions(+), 9 deletions(-)
diff --git a/compiler-rt/lib/builtins/CMakeLists.txt b/compiler-rt/lib/builtins/CMakeLists.txt
index 19316c52d12ce8..f8a3b5c7f7271e 100644
--- a/compiler-rt/lib/builtins/CMakeLists.txt
+++ b/compiler-rt/lib/builtins/CMakeLists.txt
@@ -356,6 +356,7 @@ if (NOT MSVC)
set(i386_SOURCES
${GENERIC_SOURCES}
${x86_ARCH_SOURCES}
+ ${GENERIC_TF_SOURCES}
i386/ashldi3.S
i386/ashrdi3.S
i386/divdi3.S
@@ -906,7 +907,7 @@ else ()
# For RISCV32, we must force enable int128 for compiling long
# double routines.
- if(COMPILER_RT_ENABLE_SOFTWARE_INT128 OR "${arch}" STREQUAL "riscv32")
+ if(COMPILER_RT_ENABLE_SOFTWARE_INT128 OR "${arch}" STREQUAL "riscv32" OR "${arch}" STREQUAL "i386")
list(APPEND BUILTIN_CFLAGS_${arch} -fforce-enable-int128)
endif()
diff --git a/compiler-rt/lib/builtins/extendxftf2.c b/compiler-rt/lib/builtins/extendxftf2.c
index c1d97b5cfa1515..06dbfe4db48a54 100644
--- a/compiler-rt/lib/builtins/extendxftf2.c
+++ b/compiler-rt/lib/builtins/extendxftf2.c
@@ -12,7 +12,8 @@
#define QUAD_PRECISION
#include "fp_lib.h"
-#if defined(CRT_HAS_TF_MODE) && __LDBL_MANT_DIG__ == 64 && defined(__x86_64__)
+#if defined(CRT_HAS_TF_MODE) && __LDBL_MANT_DIG__ == 64 && \
+ (defined(__x86_64__) || defined(__i386__))
#define SRC_80
#define DST_QUAD
#include "fp_extend_impl.inc"
diff --git a/compiler-rt/lib/builtins/trunctfxf2.c b/compiler-rt/lib/builtins/trunctfxf2.c
index 49bd32d42aacb8..3dd96e30df1f2c 100644
--- a/compiler-rt/lib/builtins/trunctfxf2.c
+++ b/compiler-rt/lib/builtins/trunctfxf2.c
@@ -12,7 +12,8 @@
#define QUAD_PRECISION
#include "fp_lib.h"
-#if defined(CRT_HAS_TF_MODE) && __LDBL_MANT_DIG__ == 64 && defined(__x86_64__)
+#if defined(CRT_HAS_TF_MODE) && __LDBL_MANT_DIG__ == 64 && \
+ (defined(__x86_64__) || defined(__i386__))
#define SRC_QUAD
#define DST_80
diff --git a/compiler-rt/test/builtins/Unit/extendxftf2_test.c b/compiler-rt/test/builtins/Unit/extendxftf2_test.c
index 7c3b0abdc39246..e82dd674040f9d 100644
--- a/compiler-rt/test/builtins/Unit/extendxftf2_test.c
+++ b/compiler-rt/test/builtins/Unit/extendxftf2_test.c
@@ -1,10 +1,10 @@
-// RUN: %clang_builtins %s %librt -o %t && %run %t
+// RUN: %clang_builtins %s %librt -fforce-enable-int128 -o %t && %run %t
// REQUIRES: librt_has_extendxftf2
#include "int_lib.h"
#include <stdio.h>
-#if __LDBL_MANT_DIG__ == 64 && defined(__x86_64__) && \
+#if __LDBL_MANT_DIG__ == 64 && (defined(__x86_64__) || defined(__i386__)) && \
(defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__))
#include "fp_test.h"
@@ -28,7 +28,7 @@ char assumption_1[sizeof(long double) * CHAR_BIT == 128] = {0};
#endif
int main() {
-#if __LDBL_MANT_DIG__ == 64 && defined(__x86_64__) && \
+#if __LDBL_MANT_DIG__ == 64 && (defined(__x86_64__) || defined(__i386__)) && \
(defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__))
// qNaN
if (test__extendxftf2(makeQNaN80(), UINT64_C(0x7fff800000000000),
diff --git a/compiler-rt/test/builtins/Unit/trunctfxf2_test.c b/compiler-rt/test/builtins/Unit/trunctfxf2_test.c
index 76885e255e4c49..ea88732aa7f1aa 100644
--- a/compiler-rt/test/builtins/Unit/trunctfxf2_test.c
+++ b/compiler-rt/test/builtins/Unit/trunctfxf2_test.c
@@ -1,10 +1,10 @@
-// RUN: %clang_builtins %s %librt -o %t && %run %t
+// RUN: %clang_builtins %s %librt -fforce-enable-int128 -o %t && %run %t
// REQUIRES: librt_has_trunctfxf2
#include "int_lib.h"
#include <stdio.h>
-#if __LDBL_MANT_DIG__ == 64 && defined(__x86_64__) && \
+#if __LDBL_MANT_DIG__ == 64 && (defined(__x86_64__) || defined(__i386__)) && \
(defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__))
#include "fp_test.h"
@@ -28,7 +28,7 @@ char assumption_1[sizeof(long double) * CHAR_BIT == 128] = {0};
#endif
int main() {
-#if __LDBL_MANT_DIG__ == 64 && defined(__x86_64__) && \
+#if __LDBL_MANT_DIG__ == 64 && (defined(__x86_64__) || defined(__i386__)) && \
(defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__))
// qNaN
if (test__trunctfxf2(makeQNaN128(), UINT64_C(0x7FFF),
More information about the llvm-commits
mailing list