predicates.md (io_address_operand): New predicate.
authorAnatoly Sokolov <aesok@post.ru>
Wed, 2 Apr 2008 19:21:01 +0000 (23:21 +0400)
committerAnatoly Sokolov <aesok@gcc.gnu.org>
Wed, 2 Apr 2008 19:21:01 +0000 (23:21 +0400)
* config/avr/predicates.md (io_address_operand): New predicate.
* config/avr/avr-protos.h (avr_io_address_p): Remove declaration.
* config/avr/avr.c (avr_io_address_p): Remove function.
(out_movqi_r_mr): Use 'io_address_operand' predicate instead of
'avr_io_address_p' function.
(out_movhi_r_mr): (Ditto.).
(out_movqi_mr_r): (Ditto.).
(out_movhi_mr_r): (Ditto.).
(avr_address_cost): (Ditto.).

From-SVN: r133846

gcc/ChangeLog
gcc/config/avr/avr-protos.h
gcc/config/avr/avr.c
gcc/config/avr/predicates.md

index 984ff05559c762335cbce2ddcb10d99d79b5b720..279b66312f27cdcded6e67e832bdd2d4aa635f6c 100644 (file)
@@ -1,3 +1,15 @@
+2008-04-02  Anatoly Sokolov <aesok@post.ru>
+
+       * config/avr/predicates.md (io_address_operand): New predicate. 
+       * config/avr/avr-protos.h (avr_io_address_p): Remove declaration.
+       * config/avr/avr.c (avr_io_address_p): Remove function.
+       (out_movqi_r_mr): Use 'io_address_operand' predicate instead of 
+       'avr_io_address_p' function.
+       (out_movhi_r_mr): (Ditto.).
+       (out_movqi_mr_r): (Ditto.).
+       (out_movhi_mr_r): (Ditto.).
+       (avr_address_cost): (Ditto.).
+
 2008-04-02  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/i386/i386.md (*float<SSEMODEI24:mode><X87MODEF:mode>2_1):
index 7d04b7aaa91d7a3d8d5b2c18f891d357b4bd1451..3fa3ea8e69c701376b96db197c29d27e13d1a680 100644 (file)
@@ -1,6 +1,6 @@
 /* Prototypes for exported functions defined in avr.c
    
-   Copyright (C) 2000, 2001, 2002, 2003, 2004, 2006, 2007
+   Copyright (C) 2000, 2001, 2002, 2003, 2004, 2006, 2007, 2008
    Free Software Foundation, Inc.
    Contributed by Denis Chertykov (denisc@overta.ru)
 
@@ -122,7 +122,6 @@ extern RTX_CODE avr_normalize_condition (RTX_CODE condition);
 extern int compare_eq_p (rtx insn);
 extern void out_shift_with_cnt (const char *template, rtx insn,
                                rtx operands[], int *len, int t_len);
-extern int avr_io_address_p (rtx x, int size);
 extern int avr_peep2_scratch_safe (rtx reg_rtx);
 #endif /* RTX_CODE */
 
index 8d9b00dde24406bf12b1e312d3f45798f760975a..a68a065dab96153c1b5db2f2c1b1d698b665142e 100644 (file)
@@ -1846,7 +1846,7 @@ out_movqi_r_mr (rtx insn, rtx op[], int *l)
          *l = 1;
          return AS2 (in,%0,__SREG__);
        }
-      if (avr_io_address_p (x, 1))
+      if (optimize > 0 && io_address_operand (x, QImode))
        {
          *l = 1;
          return AS2 (in,%0,%1-0x20);
@@ -2034,7 +2034,7 @@ out_movhi_r_mr (rtx insn, rtx op[], int *l)
     }
   else if (CONSTANT_ADDRESS_P (base))
     {
-      if (avr_io_address_p (base, 2))
+      if (optimize > 0 && io_address_operand (base, HImode))
        {
          *l = 2;
          return (AS2 (in,%A0,%A1-0x20) CR_TAB
@@ -2534,7 +2534,7 @@ out_movqi_mr_r (rtx insn, rtx op[], int *l)
          *l = 1;
          return AS2 (out,__SREG__,%1);
        }
-      if (avr_io_address_p (x, 1))
+      if (optimize > 0 && io_address_operand (x, QImode))
        {
          *l = 1;
          return AS2 (out,%0-0x20,%1);
@@ -2613,7 +2613,7 @@ out_movhi_mr_r (rtx insn, rtx op[], int *l)
     l = &tmp;
   if (CONSTANT_ADDRESS_P (base))
     {
-      if (avr_io_address_p (base, 2))
+      if (optimize > 0 && io_address_operand (base, HImode))
        {
          *l = 2;
          return (AS2 (out,%B0-0x20,%B1) CR_TAB
@@ -5465,7 +5465,7 @@ avr_address_cost (rtx x)
     return 18;
   if (CONSTANT_ADDRESS_P (x))
     {
-      if (avr_io_address_p (x, 1))
+      if (optimize > 0 && io_address_operand (x, QImode))
        return 2;
       return 4;
     }
@@ -5711,17 +5711,6 @@ avr_hard_regno_mode_ok (int regno, enum machine_mode mode)
   return !(regno & 1);
 }
 
-/* Returns 1 if X is a valid address for an I/O register of size SIZE
-   (1 or 2).  Used for lds/sts -> in/out optimization.  Add 0x20 to SIZE
-   to check for the lower half of I/O space (for cbi/sbi/sbic/sbis).  */
-
-int
-avr_io_address_p (rtx x, int size)
-{
-  return (optimize > 0 && GET_CODE (x) == CONST_INT
-         && INTVAL (x) >= 0x20 && INTVAL (x) <= 0x60 - size);
-}
-
 const char *
 output_reload_inhi (rtx insn ATTRIBUTE_UNUSED, rtx *operands, int *len)
 {
index 3bafa2ae167224c71d5b2f709ea7cd4fcd5ed3fa..020fb5f33525e7d317783bd411d8875d50482b01 100755 (executable)
@@ -1,5 +1,5 @@
 ;; Predicate definitions for ATMEL AVR micro controllers.
-;; Copyright (C) 2006, 2007 Free Software Foundation, Inc.
+;; Copyright (C) 2006, 2007, 2008 Free Software Foundation, Inc.
 ;;
 ;; This file is part of GCC.
 ;;
   (and (match_code "const_int")
        (match_test "IN_RANGE((INTVAL (op)), 0x40, 0x5F)")))
 
+;; Return true if OP is a valid address of I/O space.
+(define_predicate "io_address_operand"
+  (and (match_code "const_int")
+       (match_test "IN_RANGE((INTVAL (op)), 0x20, (0x60 - GET_MODE_SIZE(mode)))")))
+
 ;; Return 1 if OP is the zero constant for MODE.
 (define_predicate "const0_operand"
   (and (match_code "const_int,const_double")