aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitar Dimitrov <dimitar@dinux.eu>2025-08-17 21:39:17 +0300
committerDimitar Dimitrov <dimitar@dinux.eu>2025-08-21 21:43:05 +0300
commit625af54662b4ff95c40d7b91fbb047ada6b06622 (patch)
tree0ad96c668aac627573ca384999b43559438bd107
parent352cc9b57b2cfd62e37c962b6d2a83ed6d4827d2 (diff)
downloadgcc-625af54662b4ff95c40d7b91fbb047ada6b06622.zip
gcc-625af54662b4ff95c40d7b91fbb047ada6b06622.tar.gz
gcc-625af54662b4ff95c40d7b91fbb047ada6b06622.tar.bz2
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 <dimitar@dinux.eu>
-rw-r--r--gcc/config/pru/pru.cc11
-rw-r--r--libgcc/config/pru/libgcc-eabi.ver6
-rw-r--r--libgcc/config/pru/pru-softmpy.h42
-rw-r--r--libgcc/config/pru/softmpyi.c37
-rw-r--r--libgcc/config/pru/softmpyll.c37
-rw-r--r--libgcc/config/pru/t-pru2
6 files changed, 134 insertions, 1 deletions
diff --git a/gcc/config/pru/pru.cc b/gcc/config/pru/pru.cc
index 322e319..3fdc56e 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 e8f7fe2..ded8e73 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 0000000..9f46e6c
--- /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 0000000..fa9f0db
--- /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 0000000..8eedc25
--- /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 e844e79..7554411 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 \