This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[AVR][committed] Add 'io_address_operand' predicate.
- From: Anatoly Sokolov <aesok at post dot ru>
- To: gcc-patches at gcc dot gnu dot org
- Cc: aesok at post dot ru, eweddington at cso dot atmel dot com
- Date: Wed, 2 Apr 2008 23:01:01 +0400
- Subject: [AVR][committed] Add 'io_address_operand' predicate.
Hello.
This patch add "io_address_operand" predicate, and use it instead of
"avr_io_address_p" function.
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.).
Index: gcc/config/avr/avr-protos.h
===================================================================
--- gcc/config/avr/avr-protos.h (revision 133817)
+++ gcc/config/avr/avr-protos.h (working copy)
@@ -122,7 +122,6 @@
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: gcc/config/avr/predicates.md
===================================================================
--- gcc/config/avr/predicates.md (revision 133817)
+++ gcc/config/avr/predicates.md (working copy)
@@ -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")
Index: gcc/config/avr/avr.c
===================================================================
--- gcc/config/avr/avr.c (revision 133817)
+++ gcc/config/avr/avr.c (working copy)
@@ -1846,7 +1846,7 @@
*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 @@
}
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 @@
*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 @@
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 @@
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 @@
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)
{
Anatoly.