[1/4,ARC] Make libgcc compatible with ARC's reduced register set config.
diff mbox series

Message ID 20200122081452.4710-1-claziss@gmail.com
State New
Headers show
Series
  • [1/4,ARC] Make libgcc compatible with ARC's reduced register set config.
Related show

Commit Message

Claudiu Zissulescu Jan. 22, 2020, 8:14 a.m. UTC
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.
---
 libgcc/config/arc/crti.S      |  5 ++
 libgcc/config/arc/crtn.S      |  5 ++
 libgcc/config/arc/crttls.S    |  6 +++
 libgcc/config/arc/fp-hack.h   |  5 +-
 libgcc/config/arc/lib1funcs.S | 27 +++++------
 libgcc/config/arc/lib2funcs.c | 88 +++++++++++++++++++++++++++++++++++
 libgcc/config/arc/t-arc       |  1 +
 7 files changed, 120 insertions(+), 17 deletions(-)
 create mode 100644 libgcc/config/arc/lib2funcs.c

Comments

Jeff Law Jan. 22, 2020, 8:53 p.m. UTC | #1
On Wed, 2020-01-22 at 10:14 +0200, Claudiu Zissulescu wrote:
> 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.
OK
jeff
>

Patch
diff mbox series

diff --git a/libgcc/config/arc/crti.S b/libgcc/config/arc/crti.S
index 297ddc75ad5..e05a78903a0 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 fc6197fb2fc..37eac5e6ada 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 4c8faf9454f..b5aebf19ffb 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 86b63d9cfa5..65cdcdd4cc6 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 1ada0fed74d..cc54b4022ec 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 00000000000..f9de7b21d74
--- /dev/null
+++ b/libgcc/config/arc/lib2funcs.c
@@ -0,0 +1,88 @@ 
+/* libgcc routines for ARC
+   Copyright (C) 2020 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 3844fef6841..34aa4443a82 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