For cores without a hardware multiplier, set respective optabs with library functions which use software implementation of multiplication.
The implementation was copied from the RL78 backend. gcc/ChangeLog: * config/pru/pru.cc (pru_init_libfuncs): Set softmpy libgcc functions for optab multiplication entries if TARGET_OPT_MUL option is not set. libgcc/ChangeLog: * config/pru/libgcc-eabi.ver: Add __pruabi_softmpyi and __pruabi_softmpyll symbols. * config/pru/t-pru: Add softmpy source files. * config/pru/pru-softmpy.h: New file. * config/pru/softmpyi.c: New file. * config/pru/softmpyll.c: New file. Signed-off-by: Dimitar Dimitrov <dimi...@dinux.eu> --- gcc/config/pru/pru.cc | 11 +++++++- libgcc/config/pru/libgcc-eabi.ver | 6 +++++ libgcc/config/pru/pru-softmpy.h | 42 +++++++++++++++++++++++++++++++ libgcc/config/pru/softmpyi.c | 37 +++++++++++++++++++++++++++ libgcc/config/pru/softmpyll.c | 37 +++++++++++++++++++++++++++ libgcc/config/pru/t-pru | 2 ++ 6 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 libgcc/config/pru/pru-softmpy.h create mode 100644 libgcc/config/pru/softmpyi.c create mode 100644 libgcc/config/pru/softmpyll.c diff --git a/gcc/config/pru/pru.cc b/gcc/config/pru/pru.cc index 322e3196a6e..3fdc56e373b 100644 --- a/gcc/config/pru/pru.cc +++ b/gcc/config/pru/pru.cc @@ -941,10 +941,19 @@ pru_init_libfuncs (void) /* Long long. */ set_optab_libfunc (ashr_optab, DImode, "__pruabi_asrll"); - set_optab_libfunc (smul_optab, DImode, "__pruabi_mpyll"); set_optab_libfunc (ashl_optab, DImode, "__pruabi_lslll"); set_optab_libfunc (lshr_optab, DImode, "__pruabi_lsrll"); + if (TARGET_OPT_MUL) + { + set_optab_libfunc (smul_optab, DImode, "__pruabi_mpyll"); + } + else + { + set_optab_libfunc (smul_optab, DImode, "__pruabi_softmpyll"); + set_optab_libfunc (smul_optab, SImode, "__pruabi_softmpyi"); + } + set_optab_libfunc (sdiv_optab, SImode, "__pruabi_divi"); set_optab_libfunc (udiv_optab, SImode, "__pruabi_divu"); set_optab_libfunc (smod_optab, SImode, "__pruabi_remi"); diff --git a/libgcc/config/pru/libgcc-eabi.ver b/libgcc/config/pru/libgcc-eabi.ver index e8f7fe250d5..ded8e7305cb 100644 --- a/libgcc/config/pru/libgcc-eabi.ver +++ b/libgcc/config/pru/libgcc-eabi.ver @@ -86,3 +86,9 @@ GCC_9.0.0 { __gnu_eqsf2 __gnu_eqdf2 } + +%inherit GCC_16.0.0 GCC_9.0.0 +GCC_16.0.0 { + __pruabi_softmpyi + __pruabi_softmpyll +} diff --git a/libgcc/config/pru/pru-softmpy.h b/libgcc/config/pru/pru-softmpy.h new file mode 100644 index 00000000000..9f46e6c7466 --- /dev/null +++ b/libgcc/config/pru/pru-softmpy.h @@ -0,0 +1,42 @@ +/* libgcc routines for PRU. + Copyright (C) 2025 Free Software Foundation, Inc. + Based on rl78/rl78-mul.h. + + 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/>. */ + +UINT_TYPE C2(__pruabi_softmpy,NAME_MODE) (UINT_TYPE, UINT_TYPE); +UINT_TYPE +C2(__pruabi_softmpy,NAME_MODE) (UINT_TYPE a, UINT_TYPE b) +{ + UINT_TYPE rv = 0; + + unsigned char bit; + + for (bit=0; b && bit<sizeof(UINT_TYPE)*8; bit++) + { + if (b & 1) + rv += a; + a <<= 1; + b >>= 1; + } + return rv; +} diff --git a/libgcc/config/pru/softmpyi.c b/libgcc/config/pru/softmpyi.c new file mode 100644 index 00000000000..fa9f0dbabdc --- /dev/null +++ b/libgcc/config/pru/softmpyi.c @@ -0,0 +1,37 @@ +/* libgcc routines for PRU + Copyright (C) 2025 Free Software Foundation, Inc. + Based on rl78/lib2mul.c + + 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/>. */ + +typedef unsigned int uint32_type __attribute__ ((mode (SI))); + +#define C2B(a,b) a##b +#define C2(a,b) C2B(a,b) + +#undef UINT_TYPE +#undef NAME_MODE + +#define UINT_TYPE uint32_type +#define NAME_MODE i + +#include "pru-softmpy.h" diff --git a/libgcc/config/pru/softmpyll.c b/libgcc/config/pru/softmpyll.c new file mode 100644 index 00000000000..8eedc253641 --- /dev/null +++ b/libgcc/config/pru/softmpyll.c @@ -0,0 +1,37 @@ +/* libgcc routines for PRU + Copyright (C) 2025 Free Software Foundation, Inc. + Based on rl78/lib2mul.c + + 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/>. */ + +typedef unsigned int uint64_type __attribute__ ((mode (DI))); + +#define C2B(a,b) a##b +#define C2(a,b) C2B(a,b) + +#undef UINT_TYPE +#undef NAME_MODE + +#define UINT_TYPE uint64_type +#define NAME_MODE ll + +#include "pru-softmpy.h" diff --git a/libgcc/config/pru/t-pru b/libgcc/config/pru/t-pru index e844e793a6a..75544110153 100644 --- a/libgcc/config/pru/t-pru +++ b/libgcc/config/pru/t-pru @@ -28,6 +28,8 @@ LIB2ADD += \ $(srcdir)/config/pru/lib2divSI.c \ $(srcdir)/config/pru/lib2bitcountHI.c \ $(srcdir)/config/pru/mpyll.S \ + $(srcdir)/config/pru/softmpyll.c \ + $(srcdir)/config/pru/softmpyi.c \ $(srcdir)/config/pru/gef.c \ $(srcdir)/config/pru/gtf.c \ $(srcdir)/config/pru/lef.c \ -- 2.50.1