]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
pru: libgcc: Add software implementation for multiplication master trunk
authorDimitar Dimitrov <dimitar@dinux.eu>
Sun, 17 Aug 2025 18:39:17 +0000 (21:39 +0300)
committerDimitar Dimitrov <dimitar@dinux.eu>
Thu, 21 Aug 2025 18:43:05 +0000 (21:43 +0300)
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 <dimitar@dinux.eu>
gcc/config/pru/pru.cc
libgcc/config/pru/libgcc-eabi.ver
libgcc/config/pru/pru-softmpy.h [new file with mode: 0644]
libgcc/config/pru/softmpyi.c [new file with mode: 0644]
libgcc/config/pru/softmpyll.c [new file with mode: 0644]
libgcc/config/pru/t-pru

index 322e3196a6e461a16dc6c045fd2197005905ff63..3fdc56e373b74272497fbddf4d7e003364d949db 100644 (file)
@@ -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");
index e8f7fe250d51be0c7dc999f0148e8e14a64469e7..ded8e7305cbbd9bb9ffdebd94e95c151c9feecb3 100644 (file)
@@ -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 (file)
index 0000000..9f46e6c
--- /dev/null
@@ -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 (file)
index 0000000..fa9f0db
--- /dev/null
@@ -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 (file)
index 0000000..8eedc25
--- /dev/null
@@ -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"
index e844e793a6ad8fc3943e1cafd7ea19c0460a8df1..75544110153d1a12263cd872590b868baaf13d19 100644 (file)
@@ -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 \