diff options
author | Anatoly Sokolov <aesok@post.ru> | 2008-04-02 23:21:01 +0400 |
---|---|---|
committer | Anatoly Sokolov <aesok@gcc.gnu.org> | 2008-04-02 23:21:01 +0400 |
commit | e6b69d0e5667a210ed70b677de4778f6f50396a4 (patch) | |
tree | 542284168d0729532e8eddfa60988c11b12c5114 | |
parent | 7b1980026cceb8cdd46dc796b8be79245366f1f7 (diff) | |
download | gcc-e6b69d0e5667a210ed70b677de4778f6f50396a4.zip gcc-e6b69d0e5667a210ed70b677de4778f6f50396a4.tar.gz gcc-e6b69d0e5667a210ed70b677de4778f6f50396a4.tar.bz2 |
predicates.md (io_address_operand): New predicate.
* 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
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/config/avr/avr-protos.h | 3 | ||||
-rw-r--r-- | gcc/config/avr/avr.c | 21 | ||||
-rwxr-xr-x | gcc/config/avr/predicates.md | 7 |
4 files changed, 24 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 984ff05..279b663 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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): diff --git a/gcc/config/avr/avr-protos.h b/gcc/config/avr/avr-protos.h index 7d04b7a..3fa3ea8 100644 --- a/gcc/config/avr/avr-protos.h +++ b/gcc/config/avr/avr-protos.h @@ -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 */ diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c index 8d9b00d..a68a065 100644 --- a/gcc/config/avr/avr.c +++ b/gcc/config/avr/avr.c @@ -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) { diff --git a/gcc/config/avr/predicates.md b/gcc/config/avr/predicates.md index 3bafa2a..020fb5f 100755 --- a/gcc/config/avr/predicates.md +++ b/gcc/config/avr/predicates.md @@ -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. ;; @@ -52,6 +52,11 @@ (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") |