From bc8db8a122ca4449832e7bed6d3f49be60f4c75e Mon Sep 17 00:00:00 2001 From: Kazu Hirata Date: Fri, 1 Mar 2002 08:57:14 +0000 Subject: h8300.c (print_operand): Support 16-bit constant addresses. * config/h8300/h8300.c (print_operand): Support 16-bit constant addresses. * config/h8300/h8300.h (TINY_CONSTANT_ADDRESS_P): New. From-SVN: r50191 --- gcc/ChangeLog | 6 ++++++ gcc/config/h8300/h8300.c | 45 ++++++++++++++++++++++++++++++++------------- gcc/config/h8300/h8300.h | 8 ++++++++ 3 files changed, 46 insertions(+), 13 deletions(-) (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index df3eded..d8e0b1f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2002-03-01 Kazu Hirata + + * config/h8300/h8300.c (print_operand): Support 16-bit + constant addresses. + * config/h8300/h8300.h (TINY_CONSTANT_ADDRESS_P): New. + 2002-02-28 Richard Henderson * expmed.c (store_bit_field): Prevent generation of CONCATs; diff --git a/gcc/config/h8300/h8300.c b/gcc/config/h8300/h8300.c index 7d98454..b8e7d98 100644 --- a/gcc/config/h8300/h8300.c +++ b/gcc/config/h8300/h8300.c @@ -1206,23 +1206,42 @@ print_operand (file, x, code) case MEM: { rtx addr = XEXP (x, 0); + int eightbit_ok = ((GET_CODE (addr) == SYMBOL_REF + && SYMBOL_REF_FLAG (addr)) + || EIGHTBIT_CONSTANT_ADDRESS_P (addr)); + int tiny_ok = ((GET_CODE (addr) == SYMBOL_REF + && TINY_DATA_NAME_P (XSTR (addr, 0))) + || TINY_CONSTANT_ADDRESS_P (addr)); fprintf (file, "@"); output_address (addr); - /* If this is an 'R' operand (reference into the 8-bit - area), then specify a symbolic address as "foo:8", - otherwise if operand is still in eight bit section, use - "foo:16". */ - if (GET_CODE (addr) == SYMBOL_REF - && SYMBOL_REF_FLAG (addr)) - fprintf (file, (code == 'R' ? ":8" : ":16")); - else if (GET_CODE (addr) == SYMBOL_REF - && TINY_DATA_NAME_P (XSTR (addr, 0))) - fprintf (file, ":16"); - else if ((code == 'R') - && EIGHTBIT_CONSTANT_ADDRESS_P (addr)) - fprintf (file, ":8"); + /* We fall back from smaller addressing to larger + addressing in various ways depending on CODE. */ + switch (code) + { + case 'R': + /* Used for mov.b and bit operations. */ + if (eightbit_ok) + { + fprintf (file, ":8"); + break; + } + + /* Fall through. We should not get here if we are + processing bit operations on H8/300 or H8/300H + because 'U' constraint does not allow bit + operations on the tiny area on these machines. */ + + case 'T': + case 'S': + /* Used for mov.w and mov.l. */ + if (tiny_ok) + fprintf (file, ":16"); + break; + default: + break; + } } break; diff --git a/gcc/config/h8300/h8300.h b/gcc/config/h8300/h8300.h index cec359c..6175d31 100644 --- a/gcc/config/h8300/h8300.h +++ b/gcc/config/h8300/h8300.h @@ -860,6 +860,14 @@ struct cum_arg (GET_CODE (X) == CONST_INT && TARGET_H8300H \ && 0xffff00 <= INTVAL (X) && INTVAL (X) <= 0xffffff) +/* Nonzero if X is a constant address suitable as an 16-bit absolute + on the H8/300H. */ + +#define TINY_CONSTANT_ADDRESS_P(X) \ + (GET_CODE (X) == CONST_INT && TARGET_H8300H \ + && ((0xff8000 <= INTVAL (X) && INTVAL (X) <= 0xffffff) \ + || (0x000000 <= INTVAL (X) && INTVAL (X) <= 0x007fff))) + /* 'U' if valid for a bset destination; i.e. a register, register indirect, or the eightbit memory region (a SYMBOL_REF with an SYMBOL_REF_FLAG set). -- cgit v1.1