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]

[patch] m68k: Move predicates to predicates.md.


Hi,

Attached is a patch to move predicates to predicates.md.

The only caveat is that I've made predicate valid_dbcc_comparison_p a
wrapper for function valid_dbcc_comparison_p_2.  This is because
valid_dbcc_comparison_p_2 references a CC_NO_OVERFLOW, and whatever
files that insn-preds.c includes do not define it.  I'll try to
address this issue in a subsequent patch.

Built m68k-elf.  OK to apply?

Kazu Hirata

2005-04-04  Kazu Hirata  <kazu@cs.umass.edu>

	* config/m68k/m68k-protos.h: Add a prototype for
	valid_dbcc_comparison_p_2.
	* config/m68k/m68k.c (not_sp_operand, symbolic_operand,
	extend_operator, const_uint32_operand, const_sint32_operand,
	general_src_operand, nonimmediate_src_operand,
	memory_src_operand, post_inc_operand, pre_dec_operand,
	pcrel_address): Move to predicates to predicates.md.
	* config/m68k/m68k.h (PREDICATE_CODES): Remove.
	* config/m68k/m68k.md: Include predicates.md.
	* config/m68k/predicates.md: New.

Index: m68k-protos.h
===================================================================
RCS file: /home/kazu/nobackup/gcc-cvs/gcc/gcc/config/m68k/m68k-protos.h,v
retrieving revision 1.17
diff -u -d -p -r1.17 m68k-protos.h
--- m68k-protos.h	22 Oct 2004 12:47:24 -0000	1.17
+++ m68k-protos.h	4 Apr 2005 04:14:47 -0000
@@ -50,6 +50,7 @@ extern void print_operand_address (FILE 
 extern void print_operand (FILE *, rtx, int);
 extern void notice_update_cc (rtx, rtx);
 extern rtx legitimize_pic_address (rtx, enum machine_mode, rtx);
+extern int valid_dbcc_comparison_p_2 (rtx, enum machine_mode);
 
 #endif /* RTX_CODE */
 
Index: m68k.c
===================================================================
RCS file: /home/kazu/nobackup/gcc-cvs/gcc/gcc/config/m68k/m68k.c,v
retrieving revision 1.145
diff -u -d -p -r1.145 m68k.c
--- m68k.c	2 Mar 2005 14:03:39 -0000	1.145
+++ m68k.c	4 Apr 2005 04:20:49 -0000
@@ -912,14 +912,6 @@ m68k_output_function_epilogue (FILE *str
     fprintf (stream, "\trts\n");
 }
 
-/* Similar to general_operand, but exclude stack_pointer_rtx.  */
-
-int
-not_sp_operand (rtx op, enum machine_mode mode)
-{
-  return op != stack_pointer_rtx && nonimmediate_operand (op, mode);
-}
-
 /* Return true if X is a valid comparison operator for the dbcc 
    instruction.  
 
@@ -929,7 +921,7 @@ not_sp_operand (rtx op, enum machine_mod
    It also rejects some comparisons when CC_NO_OVERFLOW is set.  */
    
 int
-valid_dbcc_comparison_p (rtx x, enum machine_mode mode ATTRIBUTE_UNUSED)
+valid_dbcc_comparison_p_2 (rtx x, enum machine_mode mode ATTRIBUTE_UNUSED)
 {
   switch (GET_CODE (x))
     {
@@ -1284,53 +1276,6 @@ output_btst (rtx *operands, rtx countop,
   return "btst %0,%1";
 }
 
-/* Returns true if OP is either a symbol reference or a sum of a symbol
-   reference and a constant.  */
-
-int
-symbolic_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
-{
-  switch (GET_CODE (op))
-    {
-    case SYMBOL_REF:
-    case LABEL_REF:
-      return true;
-
-    case CONST:
-      op = XEXP (op, 0);
-      return ((GET_CODE (XEXP (op, 0)) == SYMBOL_REF
-	       || GET_CODE (XEXP (op, 0)) == LABEL_REF)
-	      && GET_CODE (XEXP (op, 1)) == CONST_INT);
-
-#if 0 /* Deleted, with corresponding change in m68k.h,
-	 so as to fit the specs.  No CONST_DOUBLE is ever symbolic.  */
-    case CONST_DOUBLE:
-      return GET_MODE (op) == mode;
-#endif
-
-    default:
-      return false;
-    }
-}
-
-/* Check for sign_extend or zero_extend.  Used for bit-count operands.  */
-
-int
-extend_operator(rtx x, enum machine_mode mode)
-{
-    if (mode != VOIDmode && GET_MODE(x) != mode)
-	return 0;
-    switch (GET_CODE(x))
-	{
-	case SIGN_EXTEND :
-	case ZERO_EXTEND :
-	    return 1;
-	default :
-	    return 0;
-	}
-}
-
-
 /* Legitimize PIC addresses.  If the address is already
    position-independent, we return ORIG.  Newly generated
    position-independent addresses go to REG.  If we need more
@@ -3047,45 +2992,6 @@ strict_low_part_peephole_ok (enum machin
   return false;
 }
 
-/* Accept integer operands in the range 0..0xffffffff.  We have to check the
-   range carefully since this predicate is used in DImode contexts.  Also, we
-   need some extra crud to make it work when hosted on 64-bit machines.  */
-
-int
-const_uint32_operand (rtx op, enum machine_mode mode)
-{
-  /* It doesn't make sense to ask this question with a mode that is
-     not larger than 32 bits.  */
-  if (GET_MODE_BITSIZE (mode) <= 32)
-    abort ();
-
-#if HOST_BITS_PER_WIDE_INT > 32
-  /* All allowed constants will fit a CONST_INT.  */
-  return (GET_CODE (op) == CONST_INT
-	  && (INTVAL (op) >= 0 && INTVAL (op) <= 0xffffffffL));
-#else
-  return (GET_CODE (op) == CONST_INT
-	  || (GET_CODE (op) == CONST_DOUBLE && CONST_DOUBLE_HIGH (op) == 0));
-#endif
-}
-
-/* Accept integer operands in the range -0x80000000..0x7fffffff.  We have
-   to check the range carefully since this predicate is used in DImode
-   contexts.  */
-
-int
-const_sint32_operand (rtx op, enum machine_mode mode)
-{
-  /* It doesn't make sense to ask this question with a mode that is
-     not larger than 32 bits.  */
-  if (GET_MODE_BITSIZE (mode) <= 32)
-    abort ();
-
-  /* All allowed constants will fit a CONST_INT.  */
-  return (GET_CODE (op) == CONST_INT
-	  && (INTVAL (op) >= (-0x7fffffff - 1) && INTVAL (op) <= 0x7fffffff));
-}
-
 /* Operand predicates for implementing asymmetric pc-relative addressing
    on m68k.  The m68k supports pc-relative addressing (mode 7, register 2)
    when used as a source operand, but not as a destination operand.
@@ -3143,75 +3049,6 @@ const_sint32_operand (rtx op, enum machi
    ***************************************************************************/
 
 
-/* Special case of a general operand that's used as a source operand.
-   Use this to permit reads from PC-relative memory when -mpcrel
-   is specified.  */
-
-int
-general_src_operand (rtx op, enum machine_mode mode)
-{
-  if (TARGET_PCREL
-      && GET_CODE (op) == MEM
-      && (GET_CODE (XEXP (op, 0)) == SYMBOL_REF
-	  || GET_CODE (XEXP (op, 0)) == LABEL_REF
-	  || GET_CODE (XEXP (op, 0)) == CONST))
-    return 1;
-  return general_operand (op, mode);
-}
-
-/* Special case of a nonimmediate operand that's used as a source.
-   Use this to permit reads from PC-relative memory when -mpcrel
-   is specified.  */
-
-int
-nonimmediate_src_operand (rtx op, enum machine_mode mode)
-{
-  if (TARGET_PCREL && GET_CODE (op) == MEM
-      && (GET_CODE (XEXP (op, 0)) == SYMBOL_REF
-	  || GET_CODE (XEXP (op, 0)) == LABEL_REF
-	  || GET_CODE (XEXP (op, 0)) == CONST))
-    return 1;
-  return nonimmediate_operand (op, mode);
-}
-
-/* Special case of a memory operand that's used as a source.
-   Use this to permit reads from PC-relative memory when -mpcrel
-   is specified.  */
-
-int
-memory_src_operand (rtx op, enum machine_mode mode)
-{
-  if (TARGET_PCREL && GET_CODE (op) == MEM
-      && (GET_CODE (XEXP (op, 0)) == SYMBOL_REF
-	  || GET_CODE (XEXP (op, 0)) == LABEL_REF
-	  || GET_CODE (XEXP (op, 0)) == CONST))
-    return 1;
-  return memory_operand (op, mode);
-}
-
-int
-post_inc_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
-{
-  return MEM_P (op) && GET_CODE (XEXP (op, 0)) == POST_INC;
-}
-
-int
-pre_dec_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
-{
-  return MEM_P (op) && GET_CODE (XEXP (op, 0)) == PRE_DEC;
-}
-
-/* Predicate that accepts only a pc-relative address.  This is needed
-   because pc-relative addresses don't satisfy the predicate
-   "general_src_operand".  */
-
-int
-pcrel_address (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
-{
-  return (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == LABEL_REF
-	  || GET_CODE (op) == CONST);
-}
-
 const char *
 output_andsi3 (rtx *operands)
 {
Index: m68k.h
===================================================================
RCS file: /home/kazu/nobackup/gcc-cvs/gcc/gcc/config/m68k/m68k.h,v
retrieving revision 1.123
diff -u -d -p -r1.123 m68k.h
--- m68k.h	30 Dec 2004 03:07:52 -0000	1.123
+++ m68k.h	4 Apr 2005 04:05:33 -0000
@@ -1260,22 +1260,3 @@ do { if (cc_prev_status.flags & CC_IN_68
 /* Variables in m68k.c */
 extern const char *m68k_library_id_string;
 extern int m68k_last_compare_had_fp_operands;
-
-
-/* Define the codes that are matched by predicates in m68k.c.  */
-
-#define PREDICATE_CODES							\
-  {"general_src_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,	\
-			   LABEL_REF, SUBREG, REG, MEM}},		\
-  {"nonimmediate_src_operand", {SUBREG, REG, MEM}},			\
-  {"memory_src_operand", {SUBREG, MEM}},				\
-  {"not_sp_operand", {SUBREG, REG, MEM}},				\
-  {"pcrel_address", {SYMBOL_REF, LABEL_REF, CONST}},			\
-  {"const_uint32_operand", {CONST_INT, CONST_DOUBLE}},			\
-  {"const_sint32_operand", {CONST_INT}},				\
-  {"valid_dbcc_comparison_p", {EQ, NE, GTU, LTU, GEU, LEU,		\
-			       GT, LT, GE, LE}},			\
-  {"extend_operator", {SIGN_EXTEND, ZERO_EXTEND}},			\
-  {"symbolic_operand", {SYMBOL_REF, LABEL_REF, CONST}},			\
-  {"post_inc_operand", {MEM}},						\
-  {"pre_dec_operand", {MEM}},
Index: m68k.md
===================================================================
RCS file: /home/kazu/nobackup/gcc-cvs/gcc/gcc/config/m68k/m68k.md,v
retrieving revision 1.80
diff -u -d -p -r1.80 m68k.md
--- m68k.md	6 Aug 2004 07:14:56 -0000	1.80
+++ m68k.md	4 Apr 2005 04:04:50 -0000
@@ -128,6 +128,8 @@
   [(A0_REG		8)
    (SP_REG		15)
   ])
+
+(include "predicates.md")
 
 (define_insn ""
   [(set (match_operand:DF 0 "push_operand" "=m")
--- /dev/null	2005-03-29 05:55:50.256877624 -0500
+++ predicates.md	2005-04-04 00:19:13.631937488 -0400
@@ -0,0 +1,196 @@
+;; Predicate definitions for Motorola 68000.
+;; Copyright (C) 2005 Free Software Foundation, Inc.
+;;
+;; This file is part of GCC.
+;;
+;; GCC is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+;;
+;; GCC is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GCC; see the file COPYING.  If not, write to
+;; the Free Software Foundation, 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;; Special case of a general operand that's used as a source
+;; operand. Use this to permit reads from PC-relative memory when
+;; -mpcrel is specified.
+
+(define_predicate "general_src_operand"
+  (match_code "const_int,const_double,const,symbol_ref,label_ref,subreg,reg,mem")
+{
+  if (TARGET_PCREL
+      && GET_CODE (op) == MEM
+      && (GET_CODE (XEXP (op, 0)) == SYMBOL_REF
+	  || GET_CODE (XEXP (op, 0)) == LABEL_REF
+	  || GET_CODE (XEXP (op, 0)) == CONST))
+    return 1;
+  return general_operand (op, mode);
+})
+
+;; Special case of a nonimmediate operand that's used as a source. Use
+;; this to permit reads from PC-relative memory when -mpcrel is
+;; specified.
+
+(define_predicate "nonimmediate_src_operand"
+  (match_code "subreg,reg,mem")
+{
+  if (TARGET_PCREL && GET_CODE (op) == MEM
+      && (GET_CODE (XEXP (op, 0)) == SYMBOL_REF
+	  || GET_CODE (XEXP (op, 0)) == LABEL_REF
+	  || GET_CODE (XEXP (op, 0)) == CONST))
+    return 1;
+  return nonimmediate_operand (op, mode);
+})
+
+;; Special case of a memory operand that's used as a source. Use this
+;; to permit reads from PC-relative memory when -mpcrel is specified.
+
+(define_predicate "memory_src_operand"
+  (match_code "subreg,mem")
+{
+  if (TARGET_PCREL && GET_CODE (op) == MEM
+      && (GET_CODE (XEXP (op, 0)) == SYMBOL_REF
+	  || GET_CODE (XEXP (op, 0)) == LABEL_REF
+	  || GET_CODE (XEXP (op, 0)) == CONST))
+    return 1;
+  return memory_operand (op, mode);
+})
+
+;; Similar to general_operand, but exclude stack_pointer_rtx.
+
+(define_predicate "not_sp_operand"
+  (match_code "subreg,reg,mem")
+{
+  return op != stack_pointer_rtx && nonimmediate_operand (op, mode);
+})
+
+;; Predicate that accepts only a pc-relative address.  This is needed
+;; because pc-relative addresses don't satisfy the predicate
+;; "general_src_operand".
+
+(define_predicate "pcrel_address"
+  (match_code "symbol_ref,label_ref,const")
+{
+  return (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == LABEL_REF
+	  || GET_CODE (op) == CONST);
+})
+
+;; Accept integer operands in the range 0..0xffffffff.  We have to
+;; check the range carefully since this predicate is used in DImode
+;; contexts.  Also, we need some extra crud to make it work when
+;; hosted on 64-bit machines.
+
+(define_predicate "const_uint32_operand"
+  (match_code "const_int,const_double")
+{
+  /* It doesn't make sense to ask this question with a mode that is
+     not larger than 32 bits.  */
+  if (GET_MODE_BITSIZE (mode) <= 32)
+    abort ();
+
+#if HOST_BITS_PER_WIDE_INT > 32
+  /* All allowed constants will fit a CONST_INT.  */
+  return (GET_CODE (op) == CONST_INT
+	  && (INTVAL (op) >= 0 && INTVAL (op) <= 0xffffffffL));
+#else
+  return (GET_CODE (op) == CONST_INT
+	  || (GET_CODE (op) == CONST_DOUBLE && CONST_DOUBLE_HIGH (op) == 0));
+#endif
+})
+
+;; Accept integer operands in the range -0x80000000..0x7fffffff.  We
+;; have to check the range carefully since this predicate is used in
+;; DImode contexts.
+
+(define_predicate "const_sint32_operand"
+  (match_code "const_int")
+{
+  /* It doesn't make sense to ask this question with a mode that is
+     not larger than 32 bits.  */
+  if (GET_MODE_BITSIZE (mode) <= 32)
+    abort ();
+
+  /* All allowed constants will fit a CONST_INT.  */
+  return (GET_CODE (op) == CONST_INT
+	  && (INTVAL (op) >= (-0x7fffffff - 1) && INTVAL (op) <= 0x7fffffff));
+})
+
+;; Return true if X is a valid comparison operator for the dbcc
+;; instruction.  Note it rejects floating point comparison
+;; operators. (In the future we could use Fdbcc).  It also rejects
+;; some comparisons when CC_NO_OVERFLOW is set.
+
+(define_predicate "valid_dbcc_comparison_p"
+  (match_code "eq,ne,gtu,ltu,geu,leu,gt,lt,ge,le")
+{
+  return valid_dbcc_comparison_p_2 (op, mode);
+})
+
+;; Check for sign_extend or zero_extend.  Used for bit-count operands.
+
+(define_predicate "extend_operator"
+  (match_code "sign_extend,zero_extend")
+{
+  if (mode != VOIDmode && GET_MODE (op) != mode)
+    return 0;
+  switch (GET_CODE (op))
+    {
+    case SIGN_EXTEND:
+    case ZERO_EXTEND:
+      return 1;
+    default:
+      return 0;
+    }
+})
+
+;; Returns true if OP is either a symbol reference or a sum of a
+;; symbol reference and a constant.
+
+(define_predicate "symbolic_operand"
+  (match_code "symbol_ref,label_ref,const")
+{
+  switch (GET_CODE (op))
+    {
+    case SYMBOL_REF:
+    case LABEL_REF:
+      return true;
+
+    case CONST:
+      op = XEXP (op, 0);
+      return ((GET_CODE (XEXP (op, 0)) == SYMBOL_REF
+	       || GET_CODE (XEXP (op, 0)) == LABEL_REF)
+	      && GET_CODE (XEXP (op, 1)) == CONST_INT);
+
+#if 0 /* Deleted, with corresponding change in m68k.h,
+	 so as to fit the specs.  No CONST_DOUBLE is ever symbolic.  */
+    case CONST_DOUBLE:
+      return GET_MODE (op) == mode;
+#endif
+
+    default:
+      return false;
+    }
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "post_inc_operand"
+  (match_code "mem")
+{
+  return MEM_P (op) && GET_CODE (XEXP (op, 0)) == POST_INC;
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "pre_dec_operand"
+  (match_code "mem")
+{
+  return MEM_P (op) && GET_CODE (XEXP (op, 0)) == PRE_DEC;
+})


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