diff mbox

[rl78] add RL78/G10 support

Message ID 201309162115.r8GLFnM0023030@greed.delorie.com
State New
Headers show

Commit Message

DJ Delorie Sept. 16, 2013, 9:15 p.m. UTC
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.
diff mbox

Patch

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