aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLulu Cheng <chenglulu@loongson.cn>2025-04-07 10:00:27 +0800
committerLulu Cheng <chenglulu@loongson.cn>2025-04-07 17:01:53 +0800
commit1534f0099c98ea14c08a401302b05edf2231f411 (patch)
tree2077001716bedde6067146b7b32e611eb5484005
parentf085dbf97ed4445830127c955909ff2b887ded69 (diff)
downloadgcc-1534f0099c98ea14c08a401302b05edf2231f411.zip
gcc-1534f0099c98ea14c08a401302b05edf2231f411.tar.gz
gcc-1534f0099c98ea14c08a401302b05edf2231f411.tar.bz2
LoongArch: Add LoongArch architecture detection to __float128 support in libgfortran and libquadmath [PR119408].
In GCC14, LoongArch added __float128 as an alias for _Float128. In commit r15-8962, support for q/Q suffixes for 128-bit floating point numbers. This will cause the compiler to automatically link libquadmath when compiling Fortran programs. But on LoongArch `long double` is IEEE quad, so there is no need to implement libquadmath. This causes link failure. PR target/119408 libgfortran/ChangeLog: * acinclude.m4: When checking for __float128 support, determine whether the current architecture is LoongArch. If so, return false. * configure: Regenerate. libquadmath/ChangeLog: * configure.ac: When checking for __float128 support, determine whether the current architecture is LoongArch. If so, return false. * configure: Regenerate. Sigend-off-by: Xi Ruoyao <xry111@xry111.site> Sigend-off-by: Jakub Jelinek <jakub@redhat.com>
-rw-r--r--libgfortran/acinclude.m44
-rwxr-xr-xlibgfortran/configure8
-rwxr-xr-xlibquadmath/configure8
-rw-r--r--libquadmath/configure.ac4
4 files changed, 24 insertions, 0 deletions
diff --git a/libgfortran/acinclude.m4 b/libgfortran/acinclude.m4
index a73207e..23fd621 100644
--- a/libgfortran/acinclude.m4
+++ b/libgfortran/acinclude.m4
@@ -274,6 +274,10 @@ AC_DEFUN([LIBGFOR_CHECK_FLOAT128], [
AC_CACHE_CHECK([whether we have a usable _Float128 type],
libgfor_cv_have_float128, [
GCC_TRY_COMPILE_OR_LINK([
+ #ifdef __loongarch__
+ #error On LoongArch we should use long double instead; __float128 is only for porting existing code easier.
+ #endif
+
_Float128 foo (_Float128 x)
{
_Complex _Float128 z1, z2;
diff --git a/libgfortran/configure b/libgfortran/configure
index 11a1bc5..9898a94 100755
--- a/libgfortran/configure
+++ b/libgfortran/configure
@@ -30283,6 +30283,10 @@ else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
+ #ifdef __loongarch__
+ #error On LoongArch we should use long double instead; __float128 is only for porting existing code easier.
+ #endif
+
_Float128 foo (_Float128 x)
{
_Complex _Float128 z1, z2;
@@ -30336,6 +30340,10 @@ fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
+ #ifdef __loongarch__
+ #error On LoongArch we should use long double instead; __float128 is only for porting existing code easier.
+ #endif
+
_Float128 foo (_Float128 x)
{
_Complex _Float128 z1, z2;
diff --git a/libquadmath/configure b/libquadmath/configure
index 49d7080..f82dd3d 100755
--- a/libquadmath/configure
+++ b/libquadmath/configure
@@ -12843,6 +12843,10 @@ else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
+ #ifdef __loongarch__
+ #error On LoongArch we should use long double instead; __float128 is only for porting existing code easier.
+ #endif
+
#if (!defined(_ARCH_PPC)) || defined(__LONG_DOUBLE_IEEE128__)
typedef _Complex float __attribute__((mode(TC))) __complex128;
#else
@@ -12894,6 +12898,10 @@ fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
+ #ifdef __loongarch__
+ #error On LoongArch we should use long double instead; __float128 is only for porting existing code easier.
+ #endif
+
#if (!defined(_ARCH_PPC)) || defined(__LONG_DOUBLE_IEEE128__)
typedef _Complex float __attribute__((mode(TC))) __complex128;
#else
diff --git a/libquadmath/configure.ac b/libquadmath/configure.ac
index 349be26..c64a848 100644
--- a/libquadmath/configure.ac
+++ b/libquadmath/configure.ac
@@ -233,6 +233,10 @@ AM_CONDITIONAL(LIBQUAD_USE_SYMVER_SUN, [test "x$quadmath_use_symver" = xsun])
AC_CACHE_CHECK([whether __float128 is supported], [libquad_cv_have_float128],
[GCC_TRY_COMPILE_OR_LINK([
+ #ifdef __loongarch__
+ #error On LoongArch we should use long double instead; __float128 is only for porting existing code easier.
+ #endif
+
#if (!defined(_ARCH_PPC)) || defined(__LONG_DOUBLE_IEEE128__)
typedef _Complex float __attribute__((mode(TC))) __complex128;
#else