[PATCH v1 2/5] LoongArch: Add support for LA32 in sysdeps/loongarch/fpu

mengqinggang mengqinggang@loongson.cn
Tue Dec 2 12:57:02 GMT 2025


---
 sysdeps/loongarch/fpu/e_scalb.c                  | 10 ++++++++++
 sysdeps/loongarch/fpu/e_scalbf.c                 | 10 ++++++++++
 sysdeps/loongarch/fpu/math-use-builtins-llrint.h |  2 +-
 sysdeps/loongarch/fpu/math-use-builtins-logb.h   |  2 +-
 sysdeps/loongarch/fpu/math-use-builtins-lrint.h  |  2 +-
 sysdeps/loongarch/fpu/math-use-builtins-rint.h   |  2 +-
 sysdeps/loongarch/fpu/math-use-builtins-sqrt.h   | 10 ++++++++--
 sysdeps/loongarch/fpu/s_scalbn.c                 | 10 ++++++++++
 sysdeps/loongarch/fpu/s_scalbnf.c                |  8 ++++++++
 sysdeps/loongarch/fpu/w_ilogb-impl.h             |  8 ++++++++
 sysdeps/loongarch/fpu/w_ilogbf-impl.h            |  8 ++++++++
 11 files changed, 66 insertions(+), 6 deletions(-)

diff --git a/sysdeps/loongarch/fpu/e_scalb.c b/sysdeps/loongarch/fpu/e_scalb.c
index 039cbd6ac8..439e38c6a7 100644
--- a/sysdeps/loongarch/fpu/e_scalb.c
+++ b/sysdeps/loongarch/fpu/e_scalb.c
@@ -16,6 +16,8 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
+#ifdef __loongarch64
+
 #define NO_MATH_REDIRECT
 #include <math.h>
 #include <libm-alias-finite.h>
@@ -57,4 +59,12 @@ __ieee754_scalb (double x, double fn)
 
   return x;
 }
+
 libm_alias_finite (__ieee754_scalb, __scalb)
+
+#else /* #ifdef __loongarch64 */
+
+#include <sysdeps/generic/math-type-macros-double.h>
+#include <math/e_scalb_template.c>
+
+#endif /* #ifdef __loongarch64 */
diff --git a/sysdeps/loongarch/fpu/e_scalbf.c b/sysdeps/loongarch/fpu/e_scalbf.c
index 4a4092cf40..c8196f7d6e 100644
--- a/sysdeps/loongarch/fpu/e_scalbf.c
+++ b/sysdeps/loongarch/fpu/e_scalbf.c
@@ -16,6 +16,8 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
+#ifdef __loongarch64
+
 #define NO_MATH_REDIRECT
 #include <math.h>
 #include <libm-alias-finite.h>
@@ -57,4 +59,12 @@ __ieee754_scalbf (float x, float fn)
 
   return x;
 }
+
 libm_alias_finite (__ieee754_scalbf, __scalbf)
+
+#else /* #ifdef __loongarch64 */
+
+#include <sysdeps/generic/math-type-macros-float.h>
+#include <math/e_scalb_template.c>
+
+#endif /* #ifdef __loongarch64 */
diff --git a/sysdeps/loongarch/fpu/math-use-builtins-llrint.h b/sysdeps/loongarch/fpu/math-use-builtins-llrint.h
index bee5910b09..82f89d41f9 100644
--- a/sysdeps/loongarch/fpu/math-use-builtins-llrint.h
+++ b/sysdeps/loongarch/fpu/math-use-builtins-llrint.h
@@ -1,4 +1,4 @@
-#if __GNUC_PREREQ (13, 0)
+#if __GNUC_PREREQ (13, 0) && __loongarch_grlen == 64
 # define USE_LLRINT_BUILTIN 1
 # define USE_LLRINTF_BUILTIN 1
 #else
diff --git a/sysdeps/loongarch/fpu/math-use-builtins-logb.h b/sysdeps/loongarch/fpu/math-use-builtins-logb.h
index b1c3f30dc4..d8ca3d1aa2 100644
--- a/sysdeps/loongarch/fpu/math-use-builtins-logb.h
+++ b/sysdeps/loongarch/fpu/math-use-builtins-logb.h
@@ -1,4 +1,4 @@
-#if __GNUC_PREREQ (13, 0)
+#if __GNUC_PREREQ (13, 0) && __loongarch_grlen == 64
 # define USE_LOGB_BUILTIN 1
 # define USE_LOGBF_BUILTIN 1
 #else
diff --git a/sysdeps/loongarch/fpu/math-use-builtins-lrint.h b/sysdeps/loongarch/fpu/math-use-builtins-lrint.h
index 7df8aac81f..80345fdf3f 100644
--- a/sysdeps/loongarch/fpu/math-use-builtins-lrint.h
+++ b/sysdeps/loongarch/fpu/math-use-builtins-lrint.h
@@ -1,4 +1,4 @@
-#if __GNUC_PREREQ (13, 0)
+#if __GNUC_PREREQ (13, 0) && __loongarch_grlen == 64
 # define USE_LRINT_BUILTIN 1
 # define USE_LRINTF_BUILTIN 1
 #else
diff --git a/sysdeps/loongarch/fpu/math-use-builtins-rint.h b/sysdeps/loongarch/fpu/math-use-builtins-rint.h
index cd91482f5f..73ce3e45bc 100644
--- a/sysdeps/loongarch/fpu/math-use-builtins-rint.h
+++ b/sysdeps/loongarch/fpu/math-use-builtins-rint.h
@@ -1,4 +1,4 @@
-#if __GNUC_PREREQ (13, 0)
+#if __GNUC_PREREQ (13, 0) && __loongarch_grlen == 64
 #  define USE_RINT_BUILTIN 1
 #  define USE_RINTF_BUILTIN 1
 #else
diff --git a/sysdeps/loongarch/fpu/math-use-builtins-sqrt.h b/sysdeps/loongarch/fpu/math-use-builtins-sqrt.h
index e94c915ba6..f031bd7536 100644
--- a/sysdeps/loongarch/fpu/math-use-builtins-sqrt.h
+++ b/sysdeps/loongarch/fpu/math-use-builtins-sqrt.h
@@ -1,4 +1,10 @@
-#define USE_SQRT_BUILTIN 1
-#define USE_SQRTF_BUILTIN 1
+#if __loongarch_grlen == 64
+  #define USE_SQRT_BUILTIN 1
+  #define USE_SQRTF_BUILTIN 1
+#else
+  #define USE_SQRT_BUILTIN 0
+  #define USE_SQRTF_BUILTIN 0
+#endif
+
 #define USE_SQRTL_BUILTIN 0
 #define USE_SQRTF128_BUILTIN 0
diff --git a/sysdeps/loongarch/fpu/s_scalbn.c b/sysdeps/loongarch/fpu/s_scalbn.c
index 34d4cd40a0..cff78c7965 100644
--- a/sysdeps/loongarch/fpu/s_scalbn.c
+++ b/sysdeps/loongarch/fpu/s_scalbn.c
@@ -16,14 +16,24 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
+#ifdef __loongarch64
+
 #define NO_MATH_REDIRECT
 #include <math.h>
 
+/* Return x * 2^fn.  */
 double
 __scalbn (double x, int fn)
 {
   double tmp;
+  /* Move fn to exp.  */
   asm volatile ("movgr2fr.d \t%0, %1" : "=f" (tmp) : "r" (fn));
   asm volatile ("fscaleb.d \t%0, %1, %2" : "=f" (x) : "f" (x), "f" (tmp));
   return x;
 }
+
+#else /* #ifdef __loongarch64 */
+
+#include <sysdeps/ieee754/dbl-64/s_scalbn.c>
+
+#endif /* #ifdef __loongarch64 */
diff --git a/sysdeps/loongarch/fpu/s_scalbnf.c b/sysdeps/loongarch/fpu/s_scalbnf.c
index fde18cf9c1..933fae8e3d 100644
--- a/sysdeps/loongarch/fpu/s_scalbnf.c
+++ b/sysdeps/loongarch/fpu/s_scalbnf.c
@@ -16,6 +16,8 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
+#ifdef __loongarch64
+
 #define NO_MATH_REDIRECT
 #include <math.h>
 
@@ -27,3 +29,9 @@ __scalbnf (float x, int fn)
   asm volatile ("fscaleb.s \t%0, %1, %2" : "=f" (x) : "f" (x), "f" (tmp));
   return x;
 }
+
+#else /* #ifdef __loongarch64 */
+
+#include <sysdeps/ieee754/flt-32/s_scalbnf.c>
+
+#endif /* #ifdef __loongarch64 */
diff --git a/sysdeps/loongarch/fpu/w_ilogb-impl.h b/sysdeps/loongarch/fpu/w_ilogb-impl.h
index 1905373189..dd14ea791d 100644
--- a/sysdeps/loongarch/fpu/w_ilogb-impl.h
+++ b/sysdeps/loongarch/fpu/w_ilogb-impl.h
@@ -16,6 +16,8 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
+#ifdef __loongarch64
+
 #include <fpu_control.h>
 
 static inline RET_TYPE
@@ -35,3 +37,9 @@ IMPL_NAME (double x)
       return x;
     }
 }
+
+#else /* #ifdef __loongarch64 */
+
+#include <sysdeps/ieee754/dbl-64/w_ilogb-impl.h>
+
+#endif /* #ifdef __loongarch64 */
diff --git a/sysdeps/loongarch/fpu/w_ilogbf-impl.h b/sysdeps/loongarch/fpu/w_ilogbf-impl.h
index 9cb4172c26..4527dbcd39 100644
--- a/sysdeps/loongarch/fpu/w_ilogbf-impl.h
+++ b/sysdeps/loongarch/fpu/w_ilogbf-impl.h
@@ -16,6 +16,8 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
+#ifdef __loongarch64
+
 #include <fpu_control.h>
 
 static inline RET_TYPE
@@ -35,3 +37,9 @@ IMPL_NAME (float x)
       return x;
     }
 }
+
+#else /* #ifdef __loongarch64 */
+
+#include <sysdeps/ieee754/flt-32/w_ilogbf-impl.h>
+
+#endif /* #ifdef __loongarch64 */
-- 
2.34.1



More information about the Libc-alpha mailing list