public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: caiyinyu <caiyinyu@loongson.cn>
To: Joseph Myers <josmyers@redhat.com>
Cc: libc-alpha@sourceware.org, adhemerval.zanella@linaro.org,
	xry111@xry111.site, xuchenghua@loongson.cn
Subject: Re: [PATCH] LoongArch: Add soft floating-point fe* function implementations.
Date: Sun, 31 Mar 2024 18:31:22 +0800	[thread overview]
Message-ID: <fe0e6a4f-d4ff-59dc-209c-3a5807f40640@loongson.cn> (raw)
In-Reply-To: <b8b3e43f-77b6-c2ea-1be8-9828b4684a14@redhat.com>


在 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


>


  parent reply	other threads:[~2024-03-31 10:31 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-26 12:46 caiyinyu
2024-03-26 17:34 ` Joseph Myers
2024-03-27  8:42   ` caiyinyu
2024-03-27 17:10     ` Joseph Myers
2024-03-31 10:14       ` caiyinyu
2024-04-01 13:19         ` Florian Weimer
2024-04-02  3:40           ` caiyinyu
2024-04-02 10:40             ` Xi Ruoyao
2024-04-02 11:45               ` Florian Weimer
2024-04-02 12:02                 ` Xi Ruoyao
2024-04-02 12:34                   ` Florian Weimer
2024-04-02 12:12               ` Andreas Schwab
2024-04-02 21:18             ` Joseph Myers
2024-03-31 10:31       ` caiyinyu [this message]
2024-04-02 21:10         ` Joseph Myers
2024-04-02 14:46 caiyinyu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=fe0e6a4f-d4ff-59dc-209c-3a5807f40640@loongson.cn \
    --to=caiyinyu@loongson.cn \
    --cc=adhemerval.zanella@linaro.org \
    --cc=josmyers@redhat.com \
    --cc=libc-alpha@sourceware.org \
    --cc=xry111@xry111.site \
    --cc=xuchenghua@loongson.cn \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).