This patch adds support for the RL78/G10 variant, which doesn't have
register banks like the other RL78 chips.  Committed.

        * config/rl78/rl78.c (rl78_asm_file_start): Specify alternate
        vregs location for RL78/G10.
        (rl78_expand_prologue): Avoid SEL on G10.
        (rl78_expand_epilogue): Likewise.
        (rl78_peep_movhi_p): Can't move a constant to memory in HImode.
        * config/rl78/rl78.h (TARGET_CPU_CPP_BUILTINS): Define
        __RL78_G10__ when appropriate.
        (ASM_SPEC): Pass -mg10 along to the assembler.
        * config/rl78/rl78.md (sel_rb): Disable for G10.
        * config/rl78/rl78.opt: Add -mg10 option.
        * config/rl78/t-rl78: Add -mg10 multilib.

        * config/rl78/lib2mul.c: Enable for RL78/G10.
        * config/rl78/lib2div.c: Likewise.
        * config/rl78/lshrsi3.S: Use vregs.h.
        * config/rl78/cmpsi2.S: Likewise.
        * config/rl78/trampoline.S: Likewise.
        * config/rl78/mulsi2.S: Likewise.  Disable for RL78/G10.

Index: gcc/config/rl78/rl78.h
===================================================================
--- gcc/config/rl78/rl78.h      (revision 202636)
+++ gcc/config/rl78/rl78.h      (working copy)
@@ -29,24 +29,27 @@
       builtin_define ("__RL78__");             \
       builtin_assert ("cpu=RL78");             \
       if (RL78_MUL_RL78)                       \
        builtin_define ("__RL78_MUL_RL78__");   \
       if (RL78_MUL_G13)                                \
        builtin_define ("__RL78_MUL_G13__");    \
+      if (TARGET_G10)                          \
+       builtin_define ("__RL78_G10__");        \
     }                                           \
   while (0)
 
 #undef  STARTFILE_SPEC
 #define STARTFILE_SPEC "%{pg:gcrt0.o%s}%{!pg:crt0.o%s} crtbegin.o%s"
 
 #undef  ENDFILE_SPEC
 #define ENDFILE_SPEC "crtend.o%s crtn.o%s"
 
 #undef  ASM_SPEC
 #define ASM_SPEC "\
 %{mrelax:-relax} \
+%{mg10} \
 "
 
 #undef  LINK_SPEC
 #define LINK_SPEC "\
 %{mrelax:-relax} \
 "
Index: gcc/config/rl78/rl78.c
===================================================================
--- gcc/config/rl78/rl78.c      (revision 202636)
+++ gcc/config/rl78/rl78.c      (working copy)
@@ -256,16 +256,26 @@ make_pass_rl78_move_elim (gcc::context *
 
 static void
 rl78_asm_file_start (void)
 {
   int i;
 
-  for (i = 0; i < 8; i++)
+  if (TARGET_G10)
     {
-      fprintf (asm_out_file, "r%d\t=\t0x%x\n", 8 + i, 0xffef0 + i);
-      fprintf (asm_out_file, "r%d\t=\t0x%x\n", 16 + i, 0xffee8 + i);
+      /* The memory used is 0xffec8 to 0xffedf; real registers are in
+        0xffee0 to 0xffee7.  */
+      for (i = 8; i < 32; i++)
+       fprintf (asm_out_file, "r%d\t=\t0x%x\n", i, 0xffec0 + i);
+    }
+  else
+    {
+      for (i = 0; i < 8; i++)
+       {
+         fprintf (asm_out_file, "r%d\t=\t0x%x\n", 8 + i, 0xffef0 + i);
+         fprintf (asm_out_file, "r%d\t=\t0x%x\n", 16 + i, 0xffee8 + i);
+       }
     }
 
   opt_pass *rl78_devirt_pass = make_pass_rl78_devirt (g);
   static struct register_pass_info rl78_devirt_info =
     {
       rl78_devirt_pass,
@@ -1015,25 +1025,32 @@ rl78_expand_prologue (void)
   if (!cfun->machine->computed)
     rl78_compute_frame_info ();
 
   if (flag_stack_usage_info)
     current_function_static_stack_size = cfun->machine->framesize;
 
-  if (is_interrupt_func (cfun->decl))
+  if (is_interrupt_func (cfun->decl) && !TARGET_G10)
     emit_insn (gen_sel_rb (GEN_INT (0)));
 
   for (i = 0; i < 16; i++)
     if (cfun->machine->need_to_push [i])
       {
-       int need_bank = i/4;
-       if (need_bank != rb)
+       if (TARGET_G10)
          {
-           emit_insn (gen_sel_rb (GEN_INT (need_bank)));
-           rb = need_bank;
+           emit_move_insn (gen_rtx_REG (HImode, 0), gen_rtx_REG (HImode, i*2));
+           F (emit_insn (gen_push (gen_rtx_REG (HImode, 0))));
          }
-       F (emit_insn (gen_push (gen_rtx_REG (HImode, i*2))));
+       else {
+         int need_bank = i/4;
+         if (need_bank != rb)
+           {
+             emit_insn (gen_sel_rb (GEN_INT (need_bank)));
+             rb = need_bank;
+           }
+         F (emit_insn (gen_push (gen_rtx_REG (HImode, i*2))));
+       }
       }
   if (rb != 0)
     emit_insn (gen_sel_rb (GEN_INT (0)));
 
   if (frame_pointer_needed)
     {
@@ -1082,20 +1099,28 @@ rl78_expand_epilogue (void)
        }
     }
 
   for (i = 15; i >= 0; i--)
     if (cfun->machine->need_to_push [i])
       {
-       int need_bank = i / 4;
-
-       if (need_bank != rb)
+       if (TARGET_G10)
          {
-           emit_insn (gen_sel_rb (GEN_INT (need_bank)));
-           rb = need_bank;
+           emit_insn (gen_pop (gen_rtx_REG (HImode, 0)));
+           emit_move_insn (gen_rtx_REG (HImode, i*2), gen_rtx_REG (HImode, 0));
+         }
+       else
+         {
+           int need_bank = i / 4;
+
+           if (need_bank != rb)
+             {
+               emit_insn (gen_sel_rb (GEN_INT (need_bank)));
+               rb = need_bank;
+             }
+           emit_insn (gen_pop (gen_rtx_REG (HImode, i * 2)));
          }
-       emit_insn (gen_pop (gen_rtx_REG (HImode, i * 2)));
       }
 
   if (rb != 0)
     emit_insn (gen_sel_rb (GEN_INT (0)));
 
   if (cfun->machine->trampolines_used)
@@ -1627,12 +1652,22 @@ rl78_peep_movhi_p (rtx *operands)
   debug_rtx (operands[1]);
   debug_rtx (operands[2]);
   debug_rtx (operands[3]);
   fprintf (stderr, "\033[0m");
 #endif
 
+  /* You can move a constant to memory as QImode, but not HImode.  */
+  if (GET_CODE (operands[0]) == MEM
+      && GET_CODE (operands[1]) != REG)
+    {
+#if DEBUG_PEEP
+      fprintf (stderr, "no peep: move constant to memory\n");
+#endif
+      return false;
+    }
+
   if (rtx_equal_p (operands[0], operands[3]))
     {
 #if DEBUG_PEEP
       fprintf (stderr, "no peep: overlapping\n");
 #endif
       return false;
Index: gcc/config/rl78/rl78.opt
===================================================================
--- gcc/config/rl78/rl78.opt    (revision 202636)
+++ gcc/config/rl78/rl78.opt    (working copy)
@@ -42,6 +42,10 @@ Enum(rl78_mul_types) String(rl78) Value(
 EnumValue
 Enum(rl78_mul_types) String(g13) Value(MUL_G13)
 
 mrelax
 Target
 Enable assembler and linker relaxation.
+
+mg10
+Target Mask(G10)
+Target the RL78/G10 series
Index: gcc/config/rl78/t-rl78
===================================================================
--- gcc/config/rl78/t-rl78      (revision 202636)
+++ gcc/config/rl78/t-rl78      (working copy)
@@ -17,6 +17,11 @@
 # You should have received a copy of the  GNU General Public
 # License along with GCC; see the file COPYING3.  If not see
 # <http://www.gnu.org/licenses/>.
 
 rl78-c.o: $(srcdir)/config/rl78/rl78-c.c $(RTL_H) $(TREE_H) $(CONFIG_H) $(TM_H)
        $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<
+
+# Enable multilibs:
+
+MULTILIB_OPTIONS    = mg10
+MULTILIB_DIRNAMES   = g10
Index: libgcc/config/rl78/lib2mul.c
===================================================================
--- libgcc/config/rl78/lib2mul.c        (revision 202636)
+++ libgcc/config/rl78/lib2mul.c        (working copy)
@@ -27,18 +27,31 @@ typedef unsigned int  uint32_type   __at
 typedef unsigned int  uint16_type   __attribute__ ((mode (HI)));
 typedef unsigned int  uint08_type   __attribute__ ((mode (QI)));
 
 #define C3B(a,b,c) a##b##c
 #define C3(a,b,c) C3B(a,b,c)
 
+#ifdef __RL78_G10__
+
+#define UINT_TYPE      uint32_type
+#define BITS_MINUS_1   31
+#define NAME_MODE      si
+
+#include "rl78-mul.h"
+
+#undef UINT_TYPE
+#undef BITS_MINUS_1
+#undef NAME_MODE
 
 #define UINT_TYPE      uint16_type
 #define BITS_MINUS_1   15
 #define NAME_MODE      hi
 
-/*#include "rl78-mul.h"*/
+#include "rl78-mul.h"
+
+#endif
 
 #undef UINT_TYPE
 #undef BITS_MINUS_1
 #undef NAME_MODE
 
 #define UINT_TYPE      uint08_type
Index: libgcc/config/rl78/lshrsi3.S
===================================================================
--- libgcc/config/rl78/lshrsi3.S        (revision 202636)
+++ libgcc/config/rl78/lshrsi3.S        (working copy)
@@ -17,28 +17,13 @@
 ;
 ; 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/>.
 
-r8     =       0xffef0
-r16    =       0xffee8
-r9     =       0xffef1
-r17    =       0xffee9
-r10    =       0xffef2
-r18    =       0xffeea
-r11    =       0xffef3
-r19    =       0xffeeb
-r12    =       0xffef4
-r20    =       0xffeec
-r13    =       0xffef5
-r21    =       0xffeed
-r14    =       0xffef6
-r22    =       0xffeee
-r15    =       0xffef7
-r23    =       0xffeef
+#include "vregs.h"
        
        .text
        .global ___lshrsi3
        .type   ___lshrsi3, @function
 ___lshrsi3:
 
Index: libgcc/config/rl78/cmpsi2.S
===================================================================
--- libgcc/config/rl78/cmpsi2.S (revision 202636)
+++ libgcc/config/rl78/cmpsi2.S (working copy)
@@ -18,14 +18,13 @@
 ; 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/>.
 
 
-; clobberable
-r8     =       0xffef0
+#include "vregs.h"
 
        .text
 
        ;;   int __cmpsi2 (signed long A, signed long B)
        ;;
        ;; Performs a signed comparison of A and B.
Index: libgcc/config/rl78/trampoline.S
===================================================================
--- libgcc/config/rl78/trampoline.S     (revision 202636)
+++ libgcc/config/rl78/trampoline.S     (working copy)
@@ -29,15 +29,13 @@
   function pointer to point to a trampoline on the stack.  So, we
   create N fixed trampolines that read from an array, and allocate
   them as needed.
 
 */
 
-r8     =       0xffef0
-r10    =       0xffef2
-r14    =       0xffef6
+#include "vregs.h"
 
        .data
        .p2align        1
 trampoline_array:
 
        .macro stub n
Index: libgcc/config/rl78/lib2div.c
===================================================================
--- libgcc/config/rl78/lib2div.c        (revision 202636)
+++ libgcc/config/rl78/lib2div.c        (working copy)
@@ -31,13 +31,13 @@ typedef          int  sint08_type   __at
 typedef unsigned int  uint08_type   __attribute__ ((mode (QI)));
 typedef int           word_type     __attribute__ ((mode (__word__)));
 
 #define C3B(a,b,c) a##b##c
 #define C3(a,b,c) C3B(a,b,c)
 
-#if 0
+#ifdef __RL78_G10__
 
 #define UINT_TYPE      uint32_type
 #define SINT_TYPE      sint32_type
 #define BITS_MINUS_1   31
 #define NAME_MODE      si
 
Index: libgcc/config/rl78/mulsi3.S
===================================================================
--- libgcc/config/rl78/mulsi3.S (revision 202636)
+++ libgcc/config/rl78/mulsi3.S (working copy)
@@ -19,41 +19,18 @@
 ; 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/>.
 
 ;; 32x32=32 multiply
 
-; real
-; GAS defines r0..r7 as aliases for real registers; we want the saddr
-; forms here.
-r_0    =       0xffef8
-r_1    =       0xffef9
-r_2    =       0xffefa
-r_3    =       0xffefb
-r_4    =       0xffefc
-r_5    =       0xffefd
-r_6    =       0xffefe
-r_7    =       0xffeff
-; clobberable
-r8     =       0xffef0
-r9     =       0xffef1
-r10    =       0xffef2
-r11    =       0xffef3
-r12    =       0xffef4
-r13    =       0xffef5
-r14    =       0xffef6
-r15    =       0xffef7
-; preserved
-r16    =       0xffee8
-r17    =       0xffee9
-r18    =       0xffeea
-r19    =       0xffeeb
-r20    =       0xffeec
-r21    =       0xffeed
-r22    =       0xffeee
-r23    =       0xffeef
+#include "vregs.h"
+ 
+; the G10 only has one register bank, so cannot use these optimized
+; versions.  Use the C version instead.
+
+#ifndef __RL78_G10__
 
 
 ;----------------------------------------------------------------------
 
 ; Register use:
 ;      RB0     RB1     RB2
@@ -218,6 +195,8 @@ ___mulhi3:
        bc      $.Lmul_hi_top
        cmpw    ax, #0
        bnz     $.Lmul_hi_no_add
 
 .Lmul_hi_done:
        ret
+
+#endif

Reply via email to