This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RFA: RL78:


Hi DJ,

  I would like permission to apply this patch to the RL78 backend.  It
  tidies up a few minor bugs, specifically:

    * The prologue instruction to increment the stack pointer by a large
      amount was not being marked as frame related.

    * The %p operand operator was not using %code when applied to a
      function symbol.

    * Reload could in very rare circumstances fail to compute a suitable
      register class.

    * The expanders in rl78.md contain constraints that are not used.

    * The multiply insns in rl78.md mark operand 1 as both input and
      output when in fact it is only an input.

  Tested with no regressions on an rl78-elf toolchain.

  OK to apply ?

Cheers
  Nick

2015-04-14  Nick Clifton  <nickc@redhat.com>

	* config/rl78/rl78.c (rl78_expand_prologue): Mark large stack
	decrement instruction as being frame related.
        (rl78_print_operand_1): Handle 'p' modifier to add +0 to HL
	based addresses.
	If zero extending a function address enclose the operation in
	%code(...).
        (rl78_preferred_reload_class): New function.
        (TARGET_PREFERRED_RELOAD_CLASS): Define.
        * config/rl78/rl78.md: Remove useless constraints in expanders.
        (mulqi3_rl78): Remove + qualifier on input-only operand 1.
        (mulhi3_rl78): Likewise.
        (mulhi3_g13): Likewise.
        (mulsi3_rl78): Likewise.
        (es_addr): Move to before the multiply patterns.


Index: config/rl78/rl78.c
===================================================================
--- config/rl78/rl78.c	(revision 222096)
+++ config/rl78/rl78.c	(working copy)
@@ -1322,7 +1322,7 @@
 
 	  emit_move_insn (ax, sp);
 	  emit_insn (gen_subhi3 (ax, ax, GEN_INT (fs)));
-	  insn = emit_move_insn (sp, ax);
+	  insn = F (emit_move_insn (sp, ax));
 	  add_reg_note (insn, REG_FRAME_RELATED_EXPR,
 			gen_rtx_SET (SImode, sp,
 				     gen_rtx_PLUS (HImode, sp, GEN_INT (-fs))));
@@ -1570,6 +1570,7 @@
    e - third QI of an SI (i.e. where the ES register gets values from)
    E - fourth QI of an SI (i.e. MSB)
 
+   p - Add +0 to a zero-indexed HL based address.
 */
 
 /* Implements the bulk of rl78_print_operand, below.  We do it this
@@ -1644,13 +1645,16 @@
 	      rl78_print_operand_1 (file, XEXP (XEXP (op, 0), 1), 'u');
 	      fprintf (file, "[");
 	      rl78_print_operand_1 (file, XEXP (XEXP (op, 0), 0), 0);
+	      if (letter == 'p' && GET_CODE (XEXP (op, 0)) == REG)
+		fprintf (file, "+0");
 	      fprintf (file, "]");
 	    }
 	  else
 	    {
+	      op = XEXP (op, 0);
 	      fprintf (file, "[");
-	      rl78_print_operand_1 (file, XEXP (op, 0), letter);
-	      if (letter == 'p' && GET_CODE (XEXP (op, 0)) == REG)
+	      rl78_print_operand_1 (file, op, letter);
+	      if (letter == 'p' && REG_P (op) && REGNO (op) == 6)
 		fprintf (file, "+0");
 	      fprintf (file, "]");
 	    }
@@ -1772,15 +1776,41 @@
 
       if (GET_CODE (XEXP (op, 0)) == ZERO_EXTEND)
 	{
-	  rl78_print_operand_1 (file, XEXP (op, 1), letter);
-	  fprintf (file, "+");
-	  rl78_print_operand_1 (file, XEXP (op, 0), letter);
+	  if (GET_CODE (XEXP (op, 1)) == SYMBOL_REF
+	      && SYMBOL_REF_DECL (XEXP (op, 1))
+	      && TREE_CODE (SYMBOL_REF_DECL (XEXP (op, 1))) == FUNCTION_DECL)
+	    {
+	      fprintf (file, "%%code(");
+	      assemble_name (file, rl78_strip_nonasm_name_encoding (XSTR (XEXP (op, 1), 0)));
+	      fprintf (file, "+");
+	      rl78_print_operand_1 (file, XEXP (op, 0), letter);
+	      fprintf (file, ")");
+	    }
+	  else
+	    {
+	      rl78_print_operand_1 (file, XEXP (op, 1), letter);
+	      fprintf (file, "+");
+	      rl78_print_operand_1 (file, XEXP (op, 0), letter);
+	    }
 	}
       else
 	{
-	  rl78_print_operand_1 (file, XEXP (op, 0), letter);
-	  fprintf (file, "+");
-	  rl78_print_operand_1 (file, XEXP (op, 1), letter);
+	  if (GET_CODE (XEXP (op, 0)) == SYMBOL_REF
+	      && SYMBOL_REF_DECL (XEXP (op, 0))
+	      && TREE_CODE (SYMBOL_REF_DECL (XEXP (op, 0))) == FUNCTION_DECL)
+	    {
+	      fprintf (file, "%%code(");
+	      assemble_name (file, rl78_strip_nonasm_name_encoding (XSTR (XEXP (op, 0), 0)));
+	      fprintf (file, "+");
+	      rl78_print_operand_1 (file, XEXP (op, 1), letter);
+	      fprintf (file, ")");
+	    }
+	  else
+	    {
+	      rl78_print_operand_1 (file, XEXP (op, 0), letter);
+	      fprintf (file, "+");
+	      rl78_print_operand_1 (file, XEXP (op, 1), letter);
+	    }
 	}
       if (need_paren)
 	fprintf (file, ")");
@@ -4509,6 +4544,19 @@
   return res;
 }
 
+#undef  TARGET_PREFERRED_RELOAD_CLASS
+#define TARGET_PREFERRED_RELOAD_CLASS rl78_preferred_reload_class
+
+static reg_class_t
+rl78_preferred_reload_class (rtx x, reg_class_t rclass)
+{
+  if (rclass == NO_REGS)
+    rclass = V_REGS;
+
+  return rclass;
+}
+
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 #include "gt-rl78.h"
Index: config/rl78/rl78.md
===================================================================
--- config/rl78/rl78.md	(revision 222096)
+++ config/rl78/rl78.md	(working copy)
@@ -107,7 +107,7 @@
 )
 
 (define_expand "eh_return"
-  [(match_operand:HI 0 "" "")]
+  [(match_operand:HI 0 "")]
   ""
   "rl78_expand_eh_epilogue (operands[0]);
    emit_barrier ();
@@ -169,10 +169,10 @@
 ;; non-immediate as well.
 (define_expand "nonlocal_goto"
   [(set (pc)
-	(unspec_volatile [(match_operand 0 "" "") ;; fp (ignore)
-			  (match_operand 1 "" "vi") ;; target
-			  (match_operand 2 "" "vi") ;; sp
-			  (match_operand 3 "" "vi") ;; ?
+	(unspec_volatile [(match_operand 0 "") ;; fp (ignore)
+			  (match_operand 1 "") ;; target
+			  (match_operand 2 "") ;; sp
+			  (match_operand 3 "") ;; ?
 			  ] UNS_NONLOCAL_GOTO))
    ]
   ""
@@ -200,6 +200,14 @@
 "
   )
 
+(define_expand "es_addr"
+  [(unspec:SI [(reg:QI ES_REG)
+	       (match_operand:HI 0 "")
+	       ] UNS_ES_ADDR)]
+  ""
+  ""
+)
+
 ;;======================================================================
 ;;
 ;; "macro" insns - cases where inline chunks of code are more
@@ -243,9 +251,9 @@
 )
 
 (define_expand "subsi3"
-  [(set (match_operand:SI           0 "nonimmediate_operand" "=&vm")
-	(minus:SI (match_operand:SI 1 "general_operand"      "vim")
-		  (match_operand    2 "general_operand"    "vim")))
+  [(set (match_operand:SI           0 "nonimmediate_operand")
+	(minus:SI (match_operand:SI 1 "general_operand")
+		  (match_operand    2 "general_operand")))
    ]
   ""
   "emit_insn (gen_subsi3_internal_virt (operands[0], operands[1], operands[2]));
@@ -280,9 +288,9 @@
 )
 
 (define_expand "mulqi3"
-  [(set (match_operand:QI          0 "register_operand" "")
-	(mult:QI  (match_operand:QI 1 "general_operand" "")
-		  (match_operand:QI 2 "nonmemory_operand" "")))
+  [(set (match_operand:QI          0 "register_operand")
+	(mult:QI  (match_operand:QI 1 "general_operand")
+		  (match_operand:QI 2 "nonmemory_operand")))
    ]
   "" ; mulu supported by all targets
   ""
@@ -289,9 +297,9 @@
 )
 
 (define_expand "mulhi3"
-  [(set (match_operand:HI          0 "register_operand" "")
-	(mult:HI (match_operand:HI 1 "general_operand" "")
-		 (match_operand:HI 2 "nonmemory_operand" "")))
+  [(set (match_operand:HI          0 "register_operand")
+	(mult:HI (match_operand:HI 1 "general_operand")
+		 (match_operand:HI 2 "nonmemory_operand")))
    ]
   "! RL78_MUL_NONE"
   ""
@@ -298,8 +306,8 @@
 )
 
 (define_expand "mulsi3"
-  [(set (match_operand:SI          0 "register_operand" "=&v")
-	(mult:SI (match_operand:SI 1 "general_operand" "+vim")
+  [(set (match_operand:SI          0 "register_operand"  "=&v")
+	(mult:SI (match_operand:SI 1 "general_operand"   "vim")
 		 (match_operand:SI 2 "nonmemory_operand" "vi")))
    ]
   "! RL78_MUL_NONE"
@@ -308,7 +316,7 @@
 
 (define_insn "*mulqi3_rl78"
   [(set (match_operand:QI          0 "register_operand" "=&v")
-	(mult:QI (match_operand:QI 1 "general_operand" "+viU")
+	(mult:QI (match_operand:QI 1 "general_operand" "viU")
 		 (match_operand:QI 2 "general_operand" "vi")))
    ]
   "" ; mulu supported by all targets
@@ -325,7 +333,7 @@
 
 (define_insn "*mulhi3_rl78"
   [(set (match_operand:HI          0 "register_operand" "=&v")
-	(mult:HI (match_operand:HI 1 "general_operand" "+viU")
+	(mult:HI (match_operand:HI 1 "general_operand" "viU")
 		 (match_operand:HI 2 "general_operand" "vi")))
    ]
   "RL78_MUL_RL78"
@@ -340,7 +348,7 @@
 
 (define_insn "*mulhi3_g13"
   [(set (match_operand:HI          0 "register_operand" "=&v")
-	(mult:HI (match_operand:HI 1 "general_operand" "+viU")
+	(mult:HI (match_operand:HI 1 "general_operand" "viU")
 		 (match_operand:HI 2 "general_operand" "vi")))
    ]
   "RL78_MUL_G13"
@@ -363,7 +371,7 @@
 ;; bits of the result).
 (define_insn "mulsi3_rl78"
   [(set (match_operand:SI          0 "register_operand" "=&v")
-	(mult:SI (match_operand:SI 1 "general_operand" "+viU")
+	(mult:SI (match_operand:SI 1 "general_operand" "viU")
 		 (match_operand:SI 2 "general_operand" "vi")))
    ]
   "RL78_MUL_RL78"
@@ -432,12 +440,4 @@
 	movw	%H0, ax
 	; end of mulsi macro"
   [(set_attr "valloc" "macax")]
-  )
-
-(define_expand "es_addr"
-  [(unspec:SI [(reg:QI ES_REG)
-	       (match_operand:HI 0 "" "")
-	       ] UNS_ES_ADDR)]
-  ""
-  ""
 )


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]