[ARC] Make libgcc compatible with ARC's reduced register set config.
authorClaudiu Zissulescu <claziss@gmail.com>
Mon, 27 Jan 2020 12:51:03 +0000 (14:51 +0200)
committerClaudiu Zissulescu <claziss@gmail.com>
Mon, 27 Jan 2020 12:51:03 +0000 (14:51 +0200)
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/ChangeLog
libgcc/config/arc/crti.S
libgcc/config/arc/crtn.S
libgcc/config/arc/crttls.S
libgcc/config/arc/fp-hack.h
libgcc/config/arc/lib1funcs.S
libgcc/config/arc/lib2funcs.c [new file with mode: 0644]
libgcc/config/arc/t-arc

index 0920265f60abceb9a1e3691b65b3f05ff320c7f7..22bef220665ead40a2d3616cfe587c53c22dcda6 100644 (file)
@@ -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'.
index 297ddc75ad591ca3fdbadec7ada057f43ce16a51..e05a78903a096b8c2fe476ba43b6415f206f03ff 100644 (file)
@@ -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
index fc6197fb2fc02191a1a210836fcdc59423ee8078..37eac5e6adaf0bb345d18222fc6fe1e4680fbb79 100644 (file)
@@ -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]
index 4c8faf9454f7ddd88eb9fea86a99d3a4bf4a92af..b5aebf19ffb70424289d0bd4036c34943d540c50 100644 (file)
@@ -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.  */
 
index 86b63d9cfa555e4e3030b3a3926240da7ca9f014..65cdcdd4cc63f3e15267a32ed8f35f2abf46b943 100644 (file)
@@ -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
index 1ada0fed74d5e91c33292bdeeaaf6e03b334c3a5..cc54b4022ecf8b30435f0ac2133e1be707f2958d 100644 (file)
@@ -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 (file)
index 0000000..f9de7b2
--- /dev/null
@@ -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
index 3844fef68414dc2b6ed063a2d25f5f3ece35d7fa..34aa4443a820420ca224a86170636cb3cfe4a4d0 100644 (file)
@@ -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