diff options
author | gjl <gjl@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-09-30 15:15:23 +0000 |
---|---|---|
committer | gjl <gjl@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-09-30 15:15:23 +0000 |
commit | 8c3bcbe39e82ea074ff2f73cd7abcf992eeaa58b (patch) | |
tree | f652d079d4a1031fa67ff8dd0562452d9064b563 | |
parent | a02dcaf7a09051d7a8e2f11672de897707c94a46 (diff) |
PR target/50566
* config/avr/avr-protos.h (avr_log_t): New field address_cost.
* config/avr/avr.c (avr_address_cost): Use it.
* config/avr/avr-log.c (avr_log_set_avr_log): Initialize it.
(avr_log_vadump): Unknown %-codes finish printing.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@179391 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/config/avr/avr-log.c | 8 | ||||
-rw-r--r-- | gcc/config/avr/avr-protos.h | 1 | ||||
-rw-r--r-- | gcc/config/avr/avr.c | 30 |
4 files changed, 36 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c0159e80d1f..3201f3fdaed 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2011-09-30 Georg-Johann Lay <avr@gjlay.de> + + PR target/50566 + * config/avr/avr-protos.h (avr_log_t): New field address_cost. + * config/avr/avr.c (avr_address_cost): Use it. + * config/avr/avr-log.c (avr_log_set_avr_log): Initialize it. + (avr_log_vadump): Unknown %-codes finish printing. + 2011-09-30 Jakub Jelinek <jakub@redhat.com> PR inline-asm/50571 diff --git a/gcc/config/avr/avr-log.c b/gcc/config/avr/avr-log.c index 7381d1edd39..cdeb6690fde 100644 --- a/gcc/config/avr/avr-log.c +++ b/gcc/config/avr/avr-log.c @@ -283,7 +283,12 @@ avr_log_vadump (FILE *file, const char *fmt, va_list ap) abort(); default: - fputc (*(fmt-1), file); + /* Unknown %-code: Stop printing */ + + fprintf (file, "??? %%%c ???%s\n", *(fmt-1), fmt); + fmt = ""; + + break; } break; /* % */ } @@ -318,6 +323,7 @@ avr_log_set_avr_log (void) SET_DUMP_DETAIL (legitimize_address); SET_DUMP_DETAIL (legitimize_reload_address); SET_DUMP_DETAIL (constraints); + SET_DUMP_DETAIL (address_cost); #undef SET_DUMP_DETAIL } diff --git a/gcc/config/avr/avr-protos.h b/gcc/config/avr/avr-protos.h index e34666c6678..91e51088917 100644 --- a/gcc/config/avr/avr-protos.h +++ b/gcc/config/avr/avr-protos.h @@ -129,6 +129,7 @@ typedef struct unsigned legitimize_address :1; unsigned legitimize_reload_address :1; unsigned constraints :1; + unsigned address_cost :1; } avr_log_t; extern avr_log_t avr_log; diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c index 7e732b45c77..55fbae4649e 100644 --- a/gcc/config/avr/avr.c +++ b/gcc/config/avr/avr.c @@ -6573,23 +6573,33 @@ avr_rtx_costs (rtx x, int codearg, int outer_code, return done; } -/* Calculate the cost of a memory address. */ + +/* Implement `TARGET_ADDRESS_COST'. */ static int avr_address_cost (rtx x, bool speed ATTRIBUTE_UNUSED) { + int cost = 4; + if (GET_CODE (x) == PLUS - && GET_CODE (XEXP (x,1)) == CONST_INT - && (REG_P (XEXP (x,0)) || GET_CODE (XEXP (x,0)) == SUBREG) - && INTVAL (XEXP (x,1)) >= 61) - return 18; - if (CONSTANT_ADDRESS_P (x)) + && CONST_INT_P (XEXP (x, 1)) + && (REG_P (XEXP (x, 0)) + || GET_CODE (XEXP (x, 0)) == SUBREG)) { - if (optimize > 0 && io_address_operand (x, QImode)) - return 2; - return 4; + if (INTVAL (XEXP (x, 1)) >= 61) + cost = 18; } - return 4; + else if (CONSTANT_ADDRESS_P (x)) + { + if (optimize > 0 + && io_address_operand (x, QImode)) + cost = 2; + } + + if (avr_log.address_cost) + avr_edump ("\n%?: %d = %r\n", cost, x); + + return cost; } /* Test for extra memory constraint 'Q'. |