[PATCH] LoongArch: Add soft floating-point fe* function implementations.

caiyinyu caiyinyu@loongson.cn
Sun Mar 31 10:31:22 GMT 2024


在 2024/3/28 上午1:10, Joseph Myers 写道:
> On Wed, 27 Mar 2024, caiyinyu wrote:
>
>> Yes, this patch does make sense in both libc and libm and it can be proved by
>> the following glibc tests:
> Please explain more how it works.
>
>> All the functions Implemented in this patch are exported from libm.so the same
>> as powerpc nofpu.
> I'm talking about functions such as __adddf3 (which would need to be
> exported from libc, not libm, to provide exceptions / rounding modes
> support for software floating point).  I don't see them in any Versions
> file for LoongArch.
>
> Furthermore, this patch isn't changing sfp-machine.h for LoongArch, which
> uses fpu_control.h to get rounding mode / exceptions state, and it isn't
> changing how fpu_control.h uses constant 0 for that state in the
> soft-float case.  So I don't see how it would produce *working* exceptions
> / rounding modes support for software floating-point arithmetic.

I revised and submitted the version 2 patch:

The main corrections in the version 2 patch are:
1. Correcting the nofpu libc files:  sim-full.c sfp-machine.h soft-supp.h.
2. Updating/modifying the fpu/nofpu libc 
Versions/libc.abilist/localplt.data files.

v1: https://sourceware.org/pipermail/libc-alpha/2024-March/155597.html
v2: https://sourceware.org/pipermail/libc-alpha/2024-March/155707.html

LoongArch soft float support was added in version 2.37, but the fe* 
functions
were not completely added. I want to backport this patch if possible
(it requires some modifications) to the 2.37/38/39/master branch, so the 
version of
the relevant symbols in  Versions is GLIBC_2.37.

Here is the difference between v1 and v2 :
1.
diff --git a/sysdeps/loongarch/nofpu/sim-full.c 
b/sysdeps/loongarch/nofpu/sim-full.c
index a2bbb9f880..b10e5b2f4d 100644
--- a/sysdeps/loongarch/nofpu/sim-full.c
+++ b/sysdeps/loongarch/nofpu/sim-full.c
@@ -16,8 +16,22 @@
     License along with the GNU C Library.  If not, see
     <https://www.gnu.org/licenses/>.  */

+#include "soft-fp.h"
  #include "soft-supp.h"
+#include <signal.h>

  /* By default, no exceptions should trap.  */
  __thread int __sim_cw_thread;
  libc_hidden_tls_def (__sim_cw_thread);
+
+void
+__simulate_exceptions (int excepts)
+{
+  int enable;
+  __sim_cw_thread |= excepts;
+
+  enable = __sim_cw_thread & _FPU_ENABLE_MASK;
+  if (excepts & __sim_cw_thread & (enable << ENABLE_SHIFT))
+    raise (SIGFPE);
+}
+libc_hidden_def (__simulate_exceptions)
diff --git a/sysdeps/loongarch/nofpu/soft-supp.h 
b/sysdeps/loongarch/nofpu/soft-supp.h
index 37d83399e8..8d3ba09764 100644
--- a/sysdeps/loongarch/nofpu/soft-supp.h
+++ b/sysdeps/loongarch/nofpu/soft-supp.h
@@ -18,3 +18,5 @@

  extern __thread int __sim_cw_thread attribute_tls_model_ie;
  libc_hidden_tls_proto (__sim_cw_thread, tls_model ("initial-exec"));
+
+extern void __simulate_exceptions (int excepts);
diff --git a/sysdeps/loongarch/sfp-machine.h 
b/sysdeps/loongarch/sfp-machine.h
index cbf66500db..eda6c66423 100644
--- a/sysdeps/loongarch/sfp-machine.h
+++ b/sysdeps/loongarch/sfp-machine.h
@@ -64,10 +64,6 @@
      } \
    while (0)

-#define _FP_DECL_EX fpu_control_t _fcw
-
-#define FP_ROUNDMODE (_fcw & 0x300)
-
  #define FP_RND_NEAREST FE_TONEAREST
  #define FP_RND_ZERO FE_TOWARDZERO
  #define FP_RND_PINF FE_UPWARD
@@ -82,6 +78,8 @@
  #define _FP_TININESS_AFTER_ROUNDING 1

  #ifdef __loongarch_hard_float
+#define _FP_DECL_EX fpu_control_t _fcw
+#define FP_ROUNDMODE (_fcw & 0x300)
  #define FP_INIT_ROUNDMODE \
    do \
      { \
@@ -98,5 +96,12 @@
    while (0)
  #define FP_TRAPPING_EXCEPTIONS ((_fcw << 16) & 0x1f0000)
  #else
-#define FP_INIT_ROUNDMODE _fcw = FP_RND_NEAREST
+#define FP_HANDLE_EXCEPTIONS    __simulate_exceptions (_fex)
+#define FP_ROUNDMODE        (__sim_cw_thread & _FPU_RC_MASK)
+#define FP_TRAPPING_EXCEPTIONS    (__sim_cw_thread & _FPU_ENABLE_MASK)
+
+extern __thread int __sim_cw_thread attribute_tls_model_ie;
+libc_hidden_tls_proto (__sim_cw_thread, tls_model ("initial-exec"));
+extern void __simulate_exceptions (int excepts);
+libc_hidden_proto (__simulate_exceptions)
  #endif

2. libc.abilist is too long so not listed here.
diff --git a/sysdeps/loongarch/nofpu/Versions 
b/sysdeps/loongarch/nofpu/Versions
index 6d7f6aae6c..73b6a71bbd 100644
--- a/sysdeps/loongarch/nofpu/Versions
+++ b/sysdeps/loongarch/nofpu/Versions
@@ -1,5 +1,13 @@
  libc {
+  GLIBC_2.37 {
+    __adddf3; __addsf3; __divdf3; __divsf3; __eqdf2; __eqsf2;
+    __extendsfdf2; __fixdfsi; __fixsfsi;
+    __fixunsdfsi; __fixunssfsi;
+    __floatsidf; __floatsisf;
+    __gedf2; __gesf2; __ledf2; __lesf2; __muldf3; __mulsf3;
+    __negdf2; __negsf2; __subdf3; __subsf3; __truncdfsf2;
+  }
    GLIBC_PRIVATE {
-    __sim_cw_thread;
+    __sim_cw_thread; __simulate_exceptions;
    }
  }
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/fpu/localplt.data 
b/sysdeps/unix/sysv/linux/loongarch/lp64/fpu/localplt.data
new file mode 100644
index 0000000000..547b1c1b7f
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/fpu/localplt.data
@@ -0,0 +1,7 @@
+# See scripts/check-localplt.awk for how this file is processed.
+# PLT use is required for the malloc family and for matherr because
+# users can define their own functions and have library internals call 
them.
+libc.so: calloc
+libc.so: free
+libc.so: malloc
+libc.so: realloc
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/nofpu/Implies 
b/sysdeps/unix/sysv/linux/loongarch/lp64/nofpu/Implies
new file mode 100644
index 0000000000..1090fb545a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/nofpu/Implies
@@ -0,0 +1 @@
+loongarch/nofpu
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/nofpu/localplt.data 
b/sysdeps/unix/sysv/linux/loongarch/lp64/nofpu/localplt.data
new file mode 100644
index 0000000000..d40826c783
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/nofpu/localplt.data
@@ -0,0 +1,23 @@
+# See scripts/check-localplt.awk for how this file is processed.
+# PLT use is required for the malloc family and for matherr because
+# users can define their own functions and have library internals call 
them.
+libc.so: calloc
+libc.so: free
+libc.so: malloc
+libc.so: realloc
+libc.so: __fixsfsi
+libc.so: __divsf3
+libc.so: __adddf3
+libc.so: __eqdf2
+libc.so: __gedf2
+libc.so: __floatsisf
+libc.so: __eqsf2
+libc.so: __subsf3
+libc.so: __mulsf3
+libc.so: __muldf3
+libc.so: __subdf3
+libc.so: __divdf3
+libc.so: __ledf2
+libc.so: __floatsidf
+libc.so: __extendsfdf2
+libc.so: __addsf3


>



More information about the Libc-alpha mailing list