aboutsummaryrefslogtreecommitdiff
path: root/libgcc
diff options
context:
space:
mode:
authorClaudiu Zissulescu <claziss@gmail.com>2020-01-27 14:51:03 +0200
committerClaudiu Zissulescu <claziss@gmail.com>2020-01-27 14:51:03 +0200
commit2744b8b286cbdeecbb6ab03e015dc847a2fb42a2 (patch)
tree335fcaca6bb884a3cce69496e038e4edd2f88313 /libgcc
parent389cd88ce797e2a4345eab8db478a3b8eba798e8 (diff)
downloadgcc-2744b8b286cbdeecbb6ab03e015dc847a2fb42a2.zip
gcc-2744b8b286cbdeecbb6ab03e015dc847a2fb42a2.tar.gz
gcc-2744b8b286cbdeecbb6ab03e015dc847a2fb42a2.tar.bz2
[ARC] Make libgcc compatible with ARC's reduced register set config.
ARC processors can work with a reduced register set (i.e. registers r4-r9 and r16-r25 are not available). This option can be enabled passing -mrf16 option to the compiler, or by using -mcpu=em_mini CPU configuration. Using RF16 config requires all the hand-made assembly files used in libgcc to have the corresponding RF16 object attribute set. This patch qualifies the relevant hand-made assembly files to RF16 config, and also adds generic c-functions for the one which are not. libgcc/ xxxx-xx-xx Claudiu Zissulescu <claziss@synopsys.com> * config/arc/crti.S: Add RF16 object attribute. * config/arc/crtn.S: Likewise. * config/arc/crttls.S: Likewise. * config/arc/lib1funcs.S: Likewise. * config/arc/fp-hack.h (ARC_OPTFPE): Define. * config/arc/lib2funcs.c: New file. * config/arc/t-arc: Add lib2funcs to LIB2ADD.
Diffstat (limited to 'libgcc')
-rw-r--r--libgcc/ChangeLog10
-rw-r--r--libgcc/config/arc/crti.S5
-rw-r--r--libgcc/config/arc/crtn.S5
-rw-r--r--libgcc/config/arc/crttls.S6
-rw-r--r--libgcc/config/arc/fp-hack.h5
-rw-r--r--libgcc/config/arc/lib1funcs.S27
-rw-r--r--libgcc/config/arc/lib2funcs.c88
-rw-r--r--libgcc/config/arc/t-arc1
8 files changed, 130 insertions, 17 deletions
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog
index 0920265..22bef22 100644
--- a/libgcc/ChangeLog
+++ b/libgcc/ChangeLog
@@ -1,3 +1,13 @@
+2020-01-27 Claudiu Zissulescu <claziss@synopsys.com>
+
+ * config/arc/crti.S: Add RF16 object attribute.
+ * config/arc/crtn.S: Likewise.
+ * config/arc/crttls.S: Likewise.
+ * config/arc/lib1funcs.S: Likewise.
+ * config/arc/fp-hack.h (ARC_OPTFPE): Define.
+ * config/arc/lib2funcs.c: New file.
+ * config/arc/t-arc: Add lib2funcs to LIB2ADD.
+
2020-01-24 Maciej W. Rozycki <macro@wdc.com>
* Makefile.in (configure_deps): Add `toolexeclibdir.m4'.
diff --git a/libgcc/config/arc/crti.S b/libgcc/config/arc/crti.S
index 297ddc7..e05a789 100644
--- a/libgcc/config/arc/crti.S
+++ b/libgcc/config/arc/crti.S
@@ -28,6 +28,11 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
# This file contains the stack frame setup for contents of the .fini and
# .init sections.
+#ifdef __ARC_RF16__
+ /* Use object attributes to inform other tools this file is
+ safe for RF16 configuration. */
+ .arc_attribute Tag_ARC_ABI_rf16, 1
+#endif
.section .init
.global _init
.word 0
diff --git a/libgcc/config/arc/crtn.S b/libgcc/config/arc/crtn.S
index fc6197f..37eac5e 100644
--- a/libgcc/config/arc/crtn.S
+++ b/libgcc/config/arc/crtn.S
@@ -28,6 +28,11 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
# This file just makes sure that the .fini and .init sections do in
# fact return. This file is the last thing linked into any executable.
+#ifdef __ARC_RF16__
+ /* Use object attributes to inform other tools this file is
+ safe for RF16 configuration. */
+ .arc_attribute Tag_ARC_ABI_rf16, 1
+#endif
.section .init
pop_s blink
j_s [blink]
diff --git a/libgcc/config/arc/crttls.S b/libgcc/config/arc/crttls.S
index 4c8faf9..b5aebf1 100644
--- a/libgcc/config/arc/crttls.S
+++ b/libgcc/config/arc/crttls.S
@@ -33,6 +33,12 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
the executable file might be covered by the GNU General Public License. */
+#ifdef __ARC_RF16__
+ /* Use object attributes to inform other tools this file is
+ safe for RF16 configuration. */
+ .arc_attribute Tag_ARC_ABI_rf16, 1
+#endif
+
#if (__ARC_TLS_REGNO__ != -1)
/* ANSI concatenation macros. */
diff --git a/libgcc/config/arc/fp-hack.h b/libgcc/config/arc/fp-hack.h
index 86b63d9..65cdcdd 100644
--- a/libgcc/config/arc/fp-hack.h
+++ b/libgcc/config/arc/fp-hack.h
@@ -30,7 +30,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#define ARC_FP_DEBUG 1
#define FINE_GRAINED_LIBRARIES
-#define ARC_OPTFPE (defined (__ARC700__) || defined (__ARC_FPX_QUARK__))
+
+#if defined (__ARC700__) || defined (__ARC_FPX_QUARK__)
+#define ARC_OPTFPE 1
+#endif
#if !ARC_OPTFPE || ARC_FP_DEBUG
#define L_pack_sf
diff --git a/libgcc/config/arc/lib1funcs.S b/libgcc/config/arc/lib1funcs.S
index 1ada0fe..cc54b40 100644
--- a/libgcc/config/arc/lib1funcs.S
+++ b/libgcc/config/arc/lib1funcs.S
@@ -53,7 +53,11 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#define ENDFUNC0(X) .Lfe_##X: .size X,.Lfe_##X-X
#define ENDFUNC(X) ENDFUNC0(X)
-
+#ifdef __ARC_RF16__
+ /* Use object attributes to inform other tools this file is
+ safe for RF16 configuration. */
+ .arc_attribute Tag_ARC_ABI_rf16, 1
+#endif
#ifdef L_mulsi3
.section .text
@@ -232,6 +236,7 @@ SYM(__umulsi3_highpart):
#endif
#endif /* L_umulsidi3 */
+#ifndef __ARC_RF16__
#ifdef L_muldi3
.section .text
.align 4
@@ -285,6 +290,7 @@ SYM(__muldi3):
#endif /* __LITTLE_ENDIAN__ */
ENDFUNC(__muldi3)
#endif /* L_muldi3 */
+#endif /* !__ARC_RF16__ */
#ifdef L_umulsi3_highpart
#include "ieee-754/arc-ieee-754.h"
@@ -544,12 +550,6 @@ SYM(__udivmodsi4):
SYM(__udivsi3):
b @SYM(__udivmodsi4)
ENDFUNC(__udivsi3)
-#if 0 /* interferes with linux loader */
- .section .__arc_profile_forward, "a"
- .long SYM(__udivsi3)
- .long SYM(__udivmodsi4)
- .long 65536
-#endif
#endif /* L_udivsi3 */
@@ -948,12 +948,6 @@ SYM(__umodsi3):
j.d [r7]
mov r0,r1
ENDFUNC(__umodsi3)
-#if 0 /* interferes with linux loader */
- .section .__arc_profile_forward, "a"
- .long SYM(__umodsi3)
- .long SYM(__udivmodsi4)
- .long 65536
-#endif
#endif /* L_umodsi3 */
@@ -1106,6 +1100,7 @@ SYM(__clzsi2):
;;
;#endif
+#ifndef __ARC_RF16__
#ifdef L_millicodethunk_st
.section .text
.align 4
@@ -1315,9 +1310,7 @@ SYM(__ld_r13_to_r14_ret):
#endif /* L_millicodethunk_ret */
-#define ARC_OPTFPE (defined (__ARC700__) || defined (__ARC_FPX_QUARK__))
-
-#if ARC_OPTFPE
+#if defined (__ARC700__) || defined (__ARC_FPX_QUARK__)
#ifdef L_adddf3
#ifdef __ARC_NORM__
#include "ieee-754/adddf3.S"
@@ -1482,3 +1475,5 @@ SYM(__ld_r13_to_r14_ret):
#endif
#endif
#endif /* ARC_OPTFPE */
+
+#endif /* !__ARC_RF16__ */
diff --git a/libgcc/config/arc/lib2funcs.c b/libgcc/config/arc/lib2funcs.c
new file mode 100644
index 0000000..f9de7b2
--- /dev/null
+++ b/libgcc/config/arc/lib2funcs.c
@@ -0,0 +1,88 @@
+/* libgcc routines for ARC
+ Copyright (C) 2019 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/>. */
+
+
+typedef int sint64_t __attribute__ ((mode (DI)));
+typedef unsigned int uint64_t __attribute__ ((mode (DI)));
+typedef unsigned int nint32_t __attribute__ ((mode (SI)));
+typedef int word_t __attribute__ ((mode (__word__)));
+
+sint64_t __muldi3 (sint64_t, sint64_t);
+nint32_t __umodsi3 (nint32_t, nint32_t);
+
+#ifdef __ARC_RF16__
+
+/* Generic multiplication procedure. No mpy operation involved. */
+sint64_t
+__muldi3 (sint64_t a, sint64_t b)
+{
+ sint64_t res = 0;
+ uint64_t cnt = a;
+
+ while (cnt)
+ {
+ if (cnt & 1)
+ res += b;
+ b <<= 1;
+ cnt >>= 1;
+ }
+ return res;
+}
+
+/* Unsigned 32bit integer division/modulus. */
+
+static inline __attribute__ ((__always_inline__))
+nint32_t
+udivmodsi4 (nint32_t num, nint32_t den, word_t modwanted)
+{
+ nint32_t bit = 1;
+ nint32_t res = 0;
+
+ while (den < num && bit && !(den & (1LL << 63)))
+ {
+ den <<= 1;
+ bit <<= 1;
+ }
+ while (bit)
+ {
+ if (num >= den)
+ {
+ num -= den;
+ res |= bit;
+ }
+ bit >>= 1;
+ den >>= 1;
+ }
+ if (modwanted)
+ return num;
+ return res;
+}
+
+nint32_t
+__umodsi3 (nint32_t a, nint32_t b)
+{
+ return udivmodsi4 (a, b, 1);
+}
+
+#endif
diff --git a/libgcc/config/arc/t-arc b/libgcc/config/arc/t-arc
index 3844fef..34aa444 100644
--- a/libgcc/config/arc/t-arc
+++ b/libgcc/config/arc/t-arc
@@ -43,6 +43,7 @@ LIB1ASMFUNCS = _mulsi3 _umulsidi3 _umulsi3_highpart _muldi3 \
# used in an asm wrapper.
LIB2ADD = fp-bit.c dp-bit.c
+LIB2ADD += $(srcdir)/config/arc/lib2funcs.c
dp-bit.c: $(srcdir)/fp-bit.c
echo '#ifndef __big_endian__' > dp-bit.c