https://gcc.gnu.org/g:625af54662b4ff95c40d7b91fbb047ada6b06622

commit r16-3337-g625af54662b4ff95c40d7b91fbb047ada6b06622
Author: Dimitar Dimitrov <dimi...@dinux.eu>
Date:   Sun Aug 17 21:39:17 2025 +0300

    pru: libgcc: Add software implementation for multiplication
    
    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>

Diff:
---
 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(-)

diff --git a/gcc/config/pru/pru.cc b/gcc/config/pru/pru.cc
index 322e3196a6e4..3fdc56e373b7 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 e8f7fe250d51..ded8e7305cbb 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 000000000000..9f46e6c7466f
--- /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 000000000000..fa9f0dbabdc4
--- /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 000000000000..8eedc2536419
--- /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 e844e793a6ad..75544110153d 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 \

Reply via email to