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
This commit is contained in:
Nick Clifton 2009-04-01 12:22:14 +00:00 committed by Nick Clifton
parent d6868399fb
commit 235e1fe81e
4 changed files with 53 additions and 35 deletions

View File

@ -1,3 +1,16 @@
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>
* varasm.c (default_function_rodata_section): Declare DOT as const char*.

View File

@ -1,5 +1,5 @@
/* libgcc routines for R8C/M16C/M32C
Copyright (C) 2005
Copyright (C) 2005, 2009
Free Software Foundation, Inc.
Contributed by Red Hat.
@ -29,24 +29,19 @@
Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA. */
typedef int HItype __attribute__ ((mode (HI)));
typedef unsigned int UHItype __attribute__ ((mode (HI)));
typedef int SItype __attribute__ ((mode (SI)));
typedef unsigned int USItype __attribute__ ((mode (SI)));
typedef int sint32_type __attribute__ ((mode (SI)));
typedef unsigned int uint32_type __attribute__ ((mode (SI)));
typedef int word_type __attribute__ ((mode (__word__)));
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);
USItype udivmodsi4 (USItype num, USItype den, word_type modwanted);
SItype __divsi3 (SItype a, SItype b);
SItype __modsi3 (SItype a, SItype b);
SItype __udivsi3 (SItype a, SItype b);
SItype __umodsi3 (SItype a, SItype b);
USItype
udivmodsi4 (USItype num, USItype den, word_type modwanted)
uint32_type
udivmodsi4 (uint32_type num, uint32_type den, word_type modwanted)
{
USItype bit = 1;
USItype res = 0;
uint32_type bit = 1;
uint32_type res = 0;
while (den < num && bit && !(den & (1L << 31)))
{
@ -68,13 +63,11 @@ udivmodsi4 (USItype num, USItype den, word_type modwanted)
return res;
}
SItype
__divsi3 (SItype a, SItype b)
sint32_type
__divsi3 (sint32_type a, sint32_type b)
{
word_type neg = 0;
SItype res;
sint32_type res;
if (a < 0)
{
@ -96,13 +89,11 @@ __divsi3 (SItype a, SItype b)
return res;
}
SItype
__modsi3 (SItype a, SItype b)
sint32_type
__modsi3 (sint32_type a, sint32_type b)
{
word_type neg = 0;
SItype res;
sint32_type res;
if (a < 0)
{
@ -121,19 +112,28 @@ __modsi3 (SItype a, SItype b)
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
SItype
__udivsi3 (SItype a, SItype b)
#include "libgcc2.c"
uint32_type
__udivsi3 (uint32_type a, uint32_type b)
{
return udivmodsi4 (a, b, 0);
}
SItype
__umodsi3 (SItype a, SItype b)
uint32_type
__umoddi3 (uint32_type a, uint32_type b)
{
return udivmodsi4 (a, b, 1);
}

View File

@ -2701,8 +2701,13 @@ m32c_print_operand_punct_valid_p (int c)
void
m32c_print_operand_address (FILE * stream, rtx address)
{
gcc_assert (GET_CODE (address) == MEM);
m32c_print_operand (stream, XEXP (address, 0), 0);
if (GET_CODE (address) == MEM)
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

View File

@ -29,7 +29,7 @@ LIB1ASMFUNCS = \
__m32c_ucmpsi2 \
__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