Commit 235e1fe8 by Nick Clifton Committed by Nick Clifton

m32c.h (LIBGCC2_UNITS_PER_WORD): Define if not already defined.

        * config/m32c/m32c.h (LIBGCC2_UNITS_PER_WORD): Define if not
        already defined.
        * config/m32c/t-m32c (LIB2FUNCS_EXTRA): Add m32c-lib2-trapv.c.
        * config/m32c/m32c-lib2.c: Remove unused typedefs.  Rename the
        other typedefs to avoid conflicts with libgcc2.c.  Define labels
        to gain 16-bit bit-manipulation functions from libgcc2.c and then
        include it.
        * config/m32c/m32c-lib2-trapv.c: New file.  Define labels
        to gain 16-bit trapping arithmetic functions from libgcc2.c and
        then include it.

From-SVN: r145397
parent d6868399
2009-04-01 Nick Clifton <nickc@redhat.com>
* config/m32c/m32c.h (LIBGCC2_UNITS_PER_WORD): Define if not
already defined.
* config/m32c/t-m32c (LIB2FUNCS_EXTRA): Add m32c-lib2-trapv.c.
* config/m32c/m32c-lib2.c: Remove unused typedefs. Rename the
other typedefs to avoid conflicts with libgcc2.c. Define labels
to gain 16-bit bit-manipulation functions from libgcc2.c and then
include it.
* config/m32c/m32c-lib2-trapv.c: New file. Define labels
to gain 16-bit trapping arithmetic functions from libgcc2.c and
then include it.
2009-04-01 Rafael Avila de Espindola <espindola@google.com> 2009-04-01 Rafael Avila de Espindola <espindola@google.com>
* varasm.c (default_function_rodata_section): Declare DOT as const char*. * varasm.c (default_function_rodata_section): Declare DOT as const char*.
......
/* libgcc routines for R8C/M16C/M32C /* libgcc routines for R8C/M16C/M32C
Copyright (C) 2005 Copyright (C) 2005, 2009
Free Software Foundation, Inc. Free Software Foundation, Inc.
Contributed by Red Hat. Contributed by Red Hat.
...@@ -29,24 +29,19 @@ ...@@ -29,24 +29,19 @@
Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA. */ 02110-1301, USA. */
typedef int HItype __attribute__ ((mode (HI))); typedef int sint32_type __attribute__ ((mode (SI)));
typedef unsigned int UHItype __attribute__ ((mode (HI))); typedef unsigned int uint32_type __attribute__ ((mode (SI)));
typedef int SItype __attribute__ ((mode (SI)));
typedef unsigned int USItype __attribute__ ((mode (SI)));
typedef int word_type __attribute__ ((mode (__word__))); typedef int word_type __attribute__ ((mode (__word__)));
USItype udivmodsi4 (USItype num, USItype den, word_type modwanted); uint32_type udivmodsi4 (uint32_type, uint32_type, word_type);
SItype __divsi3 (SItype a, SItype b); sint32_type __divsi3 (sint32_type, sint32_type);
SItype __modsi3 (SItype a, SItype b); sint32_type __modsi3 (sint32_type, sint32_type);
SItype __udivsi3 (SItype a, SItype b);
SItype __umodsi3 (SItype a, SItype b);
USItype uint32_type
udivmodsi4 (USItype num, USItype den, word_type modwanted) udivmodsi4 (uint32_type num, uint32_type den, word_type modwanted)
{ {
USItype bit = 1; uint32_type bit = 1;
USItype res = 0; uint32_type res = 0;
while (den < num && bit && !(den & (1L << 31))) while (den < num && bit && !(den & (1L << 31)))
{ {
...@@ -68,13 +63,11 @@ udivmodsi4 (USItype num, USItype den, word_type modwanted) ...@@ -68,13 +63,11 @@ udivmodsi4 (USItype num, USItype den, word_type modwanted)
return res; return res;
} }
sint32_type
__divsi3 (sint32_type a, sint32_type b)
SItype
__divsi3 (SItype a, SItype b)
{ {
word_type neg = 0; word_type neg = 0;
SItype res; sint32_type res;
if (a < 0) if (a < 0)
{ {
...@@ -96,13 +89,11 @@ __divsi3 (SItype a, SItype b) ...@@ -96,13 +89,11 @@ __divsi3 (SItype a, SItype b)
return res; return res;
} }
sint32_type
__modsi3 (sint32_type a, sint32_type b)
SItype
__modsi3 (SItype a, SItype b)
{ {
word_type neg = 0; word_type neg = 0;
SItype res; sint32_type res;
if (a < 0) if (a < 0)
{ {
...@@ -121,19 +112,28 @@ __modsi3 (SItype a, SItype b) ...@@ -121,19 +112,28 @@ __modsi3 (SItype a, SItype b)
return 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"
SItype uint32_type
__udivsi3 (SItype a, SItype b) __udivsi3 (uint32_type a, uint32_type b)
{ {
return udivmodsi4 (a, b, 0); return udivmodsi4 (a, b, 0);
} }
uint32_type
__umoddi3 (uint32_type a, uint32_type b)
SItype
__umodsi3 (SItype a, SItype b)
{ {
return udivmodsi4 (a, b, 1); return udivmodsi4 (a, b, 1);
} }
...@@ -2701,8 +2701,13 @@ m32c_print_operand_punct_valid_p (int c) ...@@ -2701,8 +2701,13 @@ m32c_print_operand_punct_valid_p (int c)
void void
m32c_print_operand_address (FILE * stream, rtx address) m32c_print_operand_address (FILE * stream, rtx address)
{ {
gcc_assert (GET_CODE (address) == MEM); if (GET_CODE (address) == MEM)
m32c_print_operand (stream, XEXP (address, 0), 0); address = XEXP (address, 0);
else
/* cf: gcc.dg/asm-4.c. */
gcc_assert (GET_CODE (address) == REG);
m32c_print_operand (stream, address, 0);
} }
/* Implements ASM_OUTPUT_REG_PUSH. Control registers are pushed /* Implements ASM_OUTPUT_REG_PUSH. Control registers are pushed
......
...@@ -29,7 +29,7 @@ LIB1ASMFUNCS = \ ...@@ -29,7 +29,7 @@ LIB1ASMFUNCS = \
__m32c_ucmpsi2 \ __m32c_ucmpsi2 \
__m32c_jsri16 __m32c_jsri16
LIB2FUNCS_EXTRA = $(srcdir)/config/m32c/m32c-lib2.c LIB2FUNCS_EXTRA = $(srcdir)/config/m32c/m32c-lib2.c $(srcdir)/config/m32c/m32c-lib2-trapv.c
# floating point emulation libraries # floating point emulation libraries
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment