Commit bc8db8a1 by Kazu Hirata Committed by Kazu Hirata

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
parent 2631798e
2002-03-01 Kazu Hirata <kazu@hxi.com>
* 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 <rth@redhat.com> 2002-02-28 Richard Henderson <rth@redhat.com>
* expmed.c (store_bit_field): Prevent generation of CONCATs; * expmed.c (store_bit_field): Prevent generation of CONCATs;
......
...@@ -1206,23 +1206,42 @@ print_operand (file, x, code) ...@@ -1206,23 +1206,42 @@ print_operand (file, x, code)
case MEM: case MEM:
{ {
rtx addr = XEXP (x, 0); 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, "@"); fprintf (file, "@");
output_address (addr); output_address (addr);
/* If this is an 'R' operand (reference into the 8-bit /* We fall back from smaller addressing to larger
area), then specify a symbolic address as "foo:8", addressing in various ways depending on CODE. */
otherwise if operand is still in eight bit section, use switch (code)
"foo:16". */ {
if (GET_CODE (addr) == SYMBOL_REF case 'R':
&& SYMBOL_REF_FLAG (addr)) /* Used for mov.b and bit operations. */
fprintf (file, (code == 'R' ? ":8" : ":16")); if (eightbit_ok)
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"); 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; break;
......
...@@ -860,6 +860,14 @@ struct cum_arg ...@@ -860,6 +860,14 @@ struct cum_arg
(GET_CODE (X) == CONST_INT && TARGET_H8300H \ (GET_CODE (X) == CONST_INT && TARGET_H8300H \
&& 0xffff00 <= INTVAL (X) && INTVAL (X) <= 0xffffff) && 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; /* 'U' if valid for a bset destination;
i.e. a register, register indirect, or the eightbit memory region i.e. a register, register indirect, or the eightbit memory region
(a SYMBOL_REF with an SYMBOL_REF_FLAG set). (a SYMBOL_REF with an SYMBOL_REF_FLAG set).
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment