From 2744b8b286cbdeecbb6ab03e015dc847a2fb42a2 Mon Sep 17 00:00:00 2001 From: Claudiu Zissulescu Date: Mon, 27 Jan 2020 14:51:03 +0200 Subject: [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 * 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 | 10 +++++ 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 + 8 files changed, 130 insertions(+), 17 deletions(-) create mode 100644 libgcc/config/arc/lib2funcs.c (limited to 'libgcc') 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 + + * 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 * 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 + . */ + + +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 -- cgit v1.1