diff options
Diffstat (limited to 'gcc/config/m32c')
-rw-r--r-- | gcc/config/m32c/m32c-lib1.S | 231 | ||||
-rw-r--r-- | gcc/config/m32c/m32c-lib2-trapv.c | 43 | ||||
-rw-r--r-- | gcc/config/m32c/m32c-lib2.c | 134 | ||||
-rw-r--r-- | gcc/config/m32c/m32c.c | 2 | ||||
-rw-r--r-- | gcc/config/m32c/t-m32c | 14 |
5 files changed, 1 insertions, 423 deletions
diff --git a/gcc/config/m32c/m32c-lib1.S b/gcc/config/m32c/m32c-lib1.S deleted file mode 100644 index 9b657787187..00000000000 --- a/gcc/config/m32c/m32c-lib1.S +++ /dev/null @@ -1,231 +0,0 @@ -/* libgcc routines for R8C/M16C/M32C - Copyright (C) 2005, 2009, 2010 - Free Software Foundation, Inc. - Contributed by Red Hat. - - 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/>. */ - -#if defined(__r8c_cpu__) || defined(__m16c_cpu__) -#define A16 -#define A(n,w) n -#define W w -#else -#define A24 -#define A(n,w) w -#define W l -#endif - - -#ifdef L__m32c_memregs - -/* Warning: these memory locations are used as a register bank. They - *must* end up consecutive in any final executable, so you may *not* - use the otherwise obvious ".comm" directive to allocate space for - them. */ - - .bss - .global mem0 -mem0: .space 1 - .global mem1 -mem1: .space 1 - .global mem2 -mem2: .space 1 - .global mem3 -mem3: .space 1 - .global mem4 -mem4: .space 1 - .global mem5 -mem5: .space 1 - .global mem6 -mem6: .space 1 - .global mem7 -mem7: .space 1 - .global mem8 -mem8: .space 1 - .global mem9 -mem9: .space 1 - .global mem10 -mem10: .space 1 - .global mem11 -mem11: .space 1 - .global mem12 -mem12: .space 1 - .global mem13 -mem13: .space 1 - .global mem14 -mem14: .space 1 - .global mem15 -mem15: .space 1 - -#endif - -#ifdef L__m32c_eh_return - .text - .global __m32c_eh_return -__m32c_eh_return: - - /* At this point, r0 has the stack adjustment, r1r3 has the - address to return to. The stack looks like this: - - old_ra - old_fp - <- unwound sp - ... - fb - through - r0 - <- sp - - What we need to do is restore all the registers, update the - stack, and return to the right place. - */ - - stc sp,a0 - - add.W A(#16,#24),a0 - /* a0 points to the current stack, just above the register - save areas */ - - mov.w a0,a1 - exts.w r0 - sub.W A(r0,r2r0),a1 - sub.W A(#3,#4),a1 - /* a1 points to the new stack. */ - - /* This is for the "rts" below. */ - mov.w r1,[a1] -#ifdef A16 - mov.w r2,r1 - mov.b r1l,2[a1] -#else - mov.w r2,2[a1] -#endif - - /* This is for the "popc sp" below. */ - mov.W a1,[a0] - - popm r0,r1,r2,r3,a0,a1,sb,fb - popc sp - rts -#endif - -/* SImode arguments for SI foo(SI,SI) functions. */ -#ifdef A16 -#define SAL 5[fb] -#define SAH 7[fb] -#define SBL 9[fb] -#define SBH 11[fb] -#else -#define SAL 8[fb] -#define SAH 10[fb] -#define SBL 12[fb] -#define SBH 14[fb] -#endif - -#ifdef L__m32c_mulsi3 - .text - .global ___mulsi3 -___mulsi3: - enter #0 - push.w r2 - mov.w SAL,r0 - mulu.w SBL,r0 /* writes to r2r0 */ - mov.w r0,mem0 - mov.w r2,mem2 - mov.w SAL,r0 - mulu.w SBH,r0 /* writes to r2r0 */ - add.w r0,mem2 - mov.w SAH,r0 - mulu.w SBL,r0 /* writes to r2r0 */ - add.w r0,mem2 - pop.w r2 - exitd -#endif - -#ifdef L__m32c_cmpsi2 - .text - .global ___cmpsi2 -___cmpsi2: - enter #0 - cmp.w SBH,SAH - jgt cmpsi_gt - jlt cmpsi_lt - cmp.w SBL,SAL - jgt cmpsi_gt - jlt cmpsi_lt - mov.w #1,r0 - exitd -cmpsi_gt: - mov.w #2,r0 - exitd -cmpsi_lt: - mov.w #0,r0 - exitd -#endif - -#ifdef L__m32c_ucmpsi2 - .text - .global ___ucmpsi2 -___ucmpsi2: - enter #0 - cmp.w SBH,SAH - jgtu cmpsi_gt - jltu cmpsi_lt - cmp.w SBL,SAL - jgtu cmpsi_gt - jltu cmpsi_lt - mov.w #1,r0 - exitd -cmpsi_gt: - mov.w #2,r0 - exitd -cmpsi_lt: - mov.w #0,r0 - exitd -#endif - -#ifdef L__m32c_jsri16 - .text -#ifdef A16 - .global m32c_jsri16 -m32c_jsri16: - add.w #-1, sp - - /* Read the address (16 bits) and return address (24 bits) off - the stack. */ - mov.w 4[sp], r0 - mov.w 1[sp], r3 - mov.b 3[sp], a0 /* This zero-extends, so the high byte has - zero in it. */ - - /* Write the return address, then new address, to the stack. */ - mov.w a0, 1[sp] /* Just to get the zero in 2[sp]. */ - mov.w r0, 0[sp] - mov.w r3, 3[sp] - mov.b a0, 5[sp] - - /* This "returns" to the target address, leaving the pending - return address on the stack. */ - rts -#endif - -#endif diff --git a/gcc/config/m32c/m32c-lib2-trapv.c b/gcc/config/m32c/m32c-lib2-trapv.c deleted file mode 100644 index bb61ceaf0f4..00000000000 --- a/gcc/config/m32c/m32c-lib2-trapv.c +++ /dev/null @@ -1,43 +0,0 @@ -/* 16-bit trapping arithmetic routines for R8C/M16C/M32C - Copyright (C) 2009 - Free Software Foundation, Inc. - Contributed by Red Hat. - - 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/>. */ - -/* See the comment by the definition of LIBGCC2_UNITS_PER_WORD in - m32c.h for why we are creating extra versions of some of the - functions defined in libgcc2.c. - - Note - this file is separate from m32c-lib2.c so that the following - functions will appear in the their object file. This is necessary - because they call abort() which is defined in the C library whereas - the functions in m32c-lib2.c are completely self sufficieent. */ - -#define LIBGCC2_UNITS_PER_WORD 2 - -#define L_mulvsi3 -#define L_negvsi2 -#define L_addvsi3 -#define L_subvsi3 - -#include "libgcc2.c" diff --git a/gcc/config/m32c/m32c-lib2.c b/gcc/config/m32c/m32c-lib2.c deleted file mode 100644 index 274affc4ab0..00000000000 --- a/gcc/config/m32c/m32c-lib2.c +++ /dev/null @@ -1,134 +0,0 @@ -/* libgcc routines for R8C/M16C/M32C - Copyright (C) 2005, 2009 - Free Software Foundation, Inc. - Contributed by Red Hat. - - 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 sint32_type __attribute__ ((mode (SI))); -typedef unsigned int uint32_type __attribute__ ((mode (SI))); -typedef int word_type __attribute__ ((mode (__word__))); - -uint32_type udivmodsi4 (uint32_type, uint32_type, word_type); -sint32_type __divsi3 (sint32_type, sint32_type); -sint32_type __modsi3 (sint32_type, sint32_type); - -uint32_type -udivmodsi4 (uint32_type num, uint32_type den, word_type modwanted) -{ - uint32_type bit = 1; - uint32_type res = 0; - - while (den < num && bit && !(den & (1L << 31))) - { - den <<= 1; - bit <<= 1; - } - while (bit) - { - if (num >= den) - { - num -= den; - res |= bit; - } - bit >>= 1; - den >>= 1; - } - if (modwanted) - return num; - return res; -} - -sint32_type -__divsi3 (sint32_type a, sint32_type b) -{ - word_type neg = 0; - sint32_type res; - - if (a < 0) - { - a = -a; - neg = !neg; - } - - if (b < 0) - { - b = -b; - neg = !neg; - } - - res = udivmodsi4 (a, b, 0); - - if (neg) - res = -res; - - return res; -} - -sint32_type -__modsi3 (sint32_type a, sint32_type b) -{ - word_type neg = 0; - sint32_type res; - - if (a < 0) - { - a = -a; - neg = 1; - } - - if (b < 0) - b = -b; - - res = udivmodsi4 (a, b, 1); - - if (neg) - res = -res; - - return res; -} - -/* See the comment by the definition of LIBGCC2_UNITS_PER_WORD in - m32c.h for why we are creating extra versions of some of the - functions defined in libgcc2.c. */ - -#define LIBGCC2_UNITS_PER_WORD 2 - -#define L_clzsi2 -#define L_ctzsi2 -#define L_ffssi2 -#define L_paritysi2 -#define L_popcountsi2 - -#include "libgcc2.c" - -uint32_type -__udivsi3 (uint32_type a, uint32_type b) -{ - return udivmodsi4 (a, b, 0); -} - -uint32_type -__umoddi3 (uint32_type a, uint32_type b) -{ - return udivmodsi4 (a, b, 1); -} diff --git a/gcc/config/m32c/m32c.c b/gcc/config/m32c/m32c.c index 7040df69fcf..04f69050609 100644 --- a/gcc/config/m32c/m32c.c +++ b/gcc/config/m32c/m32c.c @@ -391,7 +391,7 @@ class_can_hold_mode (reg_class_t rclass, enum machine_mode mode) we allow the user to limit the number of memregs available, in order to try to persuade gcc to try harder to use real registers. - Memregs are provided by m32c-lib1.S. + Memregs are provided by lib1funcs.S. */ int ok_to_change_target_memregs = TRUE; diff --git a/gcc/config/m32c/t-m32c b/gcc/config/m32c/t-m32c index e39fdf3a0aa..1e4ed6b7113 100644 --- a/gcc/config/m32c/t-m32c +++ b/gcc/config/m32c/t-m32c @@ -19,18 +19,6 @@ # along with GCC; see the file COPYING3. If not see # <http://www.gnu.org/licenses/>. -LIB1ASMSRC = m32c/m32c-lib1.S - -LIB1ASMFUNCS = \ - __m32c_memregs \ - __m32c_eh_return \ - __m32c_mulsi3 \ - __m32c_cmpsi2 \ - __m32c_ucmpsi2 \ - __m32c_jsri16 - -LIB2FUNCS_EXTRA = $(srcdir)/config/m32c/m32c-lib2.c $(srcdir)/config/m32c/m32c-lib2-trapv.c - # target-specific files md_file = md @@ -53,5 +41,3 @@ m32c-pragma.o: $(srcdir)/config/m32c/m32c-pragma.c $(RTL_H) $(TREE_H) $(CONFIG_H MULTILIB_OPTIONS = mcpu=m32cm MULTILIB_DIRNAMES = m32cm MULTILIB_MATCHES = mcpu?m32cm=mcpu?m32c mcpu?r8c=mcpu?m16c - -EXTRA_MULTILIB_PARTS = crtbegin.o crtend.o |