OSDN Git Service

* config/m32c/m32c.h (LIBGCC2_UNITS_PER_WORD): Define if not
authornickc <nickc@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 1 Apr 2009 12:22:14 +0000 (12:22 +0000)
committernickc <nickc@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 1 Apr 2009 12:22:14 +0000 (12:22 +0000)
        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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@145397 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/m32c/m32c-lib2.c
gcc/config/m32c/m32c.c
gcc/config/m32c/t-m32c

index f088788..327d33d 100644 (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*.
index 492e6c8..ff341e8 100644 (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.
 
    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
 
+#include "libgcc2.c"
 
-SItype
-__udivsi3 (SItype a, SItype b)
+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);
 }
index 1e0cda6..5021831 100644 (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
index de2a54f..33454fe 100644 (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