----Original Message----
>From: gcc-owner On Behalf Of Kazu Hirata
>Sent: 28 February 2005 14:41
> So I would change each macro to an
> architecture-specific function in each architecture first. For
> example, GO_IF_LEGITIMATE_ADDRESS should look like this (taken from
> i386.h):
>
> #ifdef REG_OK_STRICT
> #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR)
\
> do { \
> if (legitimate_address_p ((MODE), (X), 1)) \
> goto ADDR;
\
> } while (0)
>
> #else
> #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR)
\
> do { \
> if (legitimate_address_p ((MODE), (X), 0)) \
> goto ADDR;
\
> } while (0)
>
> #endif
>
> Note that REG_OK_STRICT is essentially used as an argument to
> legitimate_address_p and that the use of the function argument
> decouples legitimate_address_p and REG_OK_STRICT.
I'm basically in agreement with you here, and just want to suggest you can
avoid an awful lot of code duplication by doing something like
#ifdef REG_OK_STRICT
#define ${CPU}_IS_STRICT 1
#else
#define ${CPU}_IS_STRICT 0
#endif
at the top of the ${CPU}.h file, and then all the various macros can use it
directly as a boolean flag, rather than having two near-identical duplicate
definitions:
#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \
do {
\
if (legitimate_address_p ((MODE), (X), ${CPU}_IS_STRICT)) \
goto ADDR; \
} while (0)
This seems to me a reasonable way to prevent excessive code duplication in
the case where there may be many sub-macros that also depend on
REG_OK_STRICT.
cheers,
DaveK
--
Can't think of a witty .sigline today....