On Wed, 2024-07-03 at 11:59 +0200, Sébastien Michelland wrote: > libgcc's fp-bit.c is quite slow and most modern/developed architectures > have switched to using the soft-fp library. This patch does so for > free-standing/unknown-OS SH3/SH4 builds, using soft-fp's default parameters > for the most part, most notably no exceptions. > > A quick run of Whetstone (built with OpenLibm) on an SH4 machine shows > about x3 speedup (~320 -> 1050 Kwhets/s). > > I'm sending this as RFC because I'm quite unsure about testing. I built > the compiler and ran the benchmark, but I don't know if GCC has a test > for soft-fp correctness and whether I can run that in my non-hosted > environment. Any advice? >
As discussed, the patch was changed to use soft-fp not only for SH3/SH4 but generally for all sh-elf targets. sh-*-linux* and sh-*-rtems* are not affected by that and continue using the fdpbit library for floating-point emulation on no-fpu variants. If that should be changed as well, please let me know. Tested with make -k check RUNTESTFLAGS="--target_board=sh-sim\{-m2/-ml,-m2/-mb}" committed & pushed the attached version to master. Best regards, Oleg Endo
From e95512e2d5a317e8c043f232158df4b38186e51c Mon Sep 17 00:00:00 2001 From: Sébastien Michelland <sebastien.michell...@lcis.grenoble-inp.fr> Date: Thu, 10 Oct 2024 09:24:39 +0900 Subject: [PATCH] SH: Use softfp for sh-elf libgcc/ChangeLog: PR target/29845 * config.host (sh-*-elf*): Replace fdpbit with softfp. * config/sh/sfp-machine.h: New file. Signed-off-by: Sébastien Michelland <sebastien.michell...@lcis.grenoble-inp.fr> --- libgcc/config.host | 2 +- libgcc/config/sh/sfp-machine.h | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 libgcc/config/sh/sfp-machine.h diff --git a/libgcc/config.host b/libgcc/config.host index fa001c5..06fae15 100644 --- a/libgcc/config.host +++ b/libgcc/config.host @@ -1413,9 +1413,9 @@ s390x-ibm-tpf*) extra_parts="crtbeginS.o crtendS.o" md_unwind_header=s390/tpf-unwind.h ;; sh-*-elf* | sh[12346l]*-*-elf*) - tmake_file="$tmake_file sh/t-sh t-crtstuff-pic t-fdpbit" + tmake_file="$tmake_file sh/t-sh t-crtstuff-pic t-softfp-sfdf t-softfp" extra_parts="$extra_parts crt1.o crti.o crtn.o crtbeginS.o crtendS.o \ libic_invalidate_array_4-100.a \ libic_invalidate_array_4-200.a \ libic_invalidate_array_4a.a \ diff --git a/libgcc/config/sh/sfp-machine.h b/libgcc/config/sh/sfp-machine.h new file mode 100644 index 0000000..26f6516 --- /dev/null +++ b/libgcc/config/sh/sfp-machine.h @@ -0,0 +1,83 @@ +/* Software floating-point machine description for SuperH. + +Copyright (C) 2024 Free Software Foundation, Inc. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 3, or (at your option) any later +version. + +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +Under Section 7 of GPL version 3, you are granted additional +permissions described in the GCC Runtime Library Exception, version +3.1, as published by the Free Software Foundation. + +You should have received a copy of the GNU General Public License and +a copy of the GCC Runtime Library Exception along with this program; +see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +<http://www.gnu.org/licenses/>. */ + +#define _FP_W_TYPE_SIZE 32 +#define _FP_W_TYPE unsigned long +#define _FP_WS_TYPE signed long +#define _FP_I_TYPE long + +#define _FP_MUL_MEAT_S(R,X,Y) \ + _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm) +#define _FP_MUL_MEAT_D(R,X,Y) \ + _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm) +#define _FP_MUL_MEAT_Q(R,X,Y) \ + _FP_MUL_MEAT_4_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm) + +#define _FP_DIV_MEAT_S(R,X,Y) _FP_DIV_MEAT_1_udiv_norm(S,R,X,Y) +#define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_2_udiv(D,R,X,Y) +#define _FP_DIV_MEAT_Q(R,X,Y) _FP_DIV_MEAT_4_udiv(Q,R,X,Y) + +#define _FP_NANFRAC_B _FP_QNANBIT_B +#define _FP_NANFRAC_H _FP_QNANBIT_H +#define _FP_NANFRAC_S _FP_QNANBIT_S +#define _FP_NANFRAC_D _FP_QNANBIT_D, 0 +#define _FP_NANFRAC_Q _FP_QNANBIT_Q, 0, 0, 0 + +/* The type of the result of a floating point comparison. This must + match __libgcc_cmp_return__ in GCC for the target. */ +typedef int __gcc_CMPtype __attribute__ ((mode (__libgcc_cmp_return__))); +#define CMPtype __gcc_CMPtype + +#define _FP_NANSIGN_B 0 +#define _FP_NANSIGN_H 0 +#define _FP_NANSIGN_S 0 +#define _FP_NANSIGN_D 0 +#define _FP_NANSIGN_Q 0 + +#define _FP_KEEPNANFRACP 0 +#define _FP_QNANNEGATEDP 0 + +#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP) \ + do { \ + R##_s = _FP_NANSIGN_##fs; \ + _FP_FRAC_SET_##wc(R,_FP_NANFRAC_##fs); \ + R##_c = FP_CLS_NAN; \ + } while (0) + +#define _FP_TININESS_AFTER_ROUNDING 1 + +#define __LITTLE_ENDIAN 1234 +#define __BIG_ENDIAN 4321 + +#if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) +#define __BYTE_ORDER __BIG_ENDIAN +#else +#define __BYTE_ORDER __LITTLE_ENDIAN +#endif + +/* Define ALIASNAME as a strong alias for NAME. */ +# define strong_alias(name, aliasname) _strong_alias(name, aliasname) +# define _strong_alias(name, aliasname) \ + extern __typeof (name) aliasname __attribute__ ((alias (#name))); -- libgit2 1.7.2