----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....

Reply via email to