This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [Patch, AVR]: QI builtins for parity, popcount, 1<< n
On Fri, 17 Jun 2011, Georg-Johann Lay wrote:
> I don't see what's bat with the patch, it's straight forward.
C is a high-level language, defined in terms of high-level semantics
rather than machine instructions. C code should be written where possible
using machine-independent functionality, falling into machine-dependent
operations only where the semantics cannot readily be represented in a
machine-independent way; the compiler should generally be responsible for
picking optimal instructions for the source code.
C code should write "1 << n" (or "1 << (n & 7)" if that's what it wants)
for shifts rather than __builtin_avr_pow2. That way it's more portable
and more readable to general C programmers who aren't familiar with all
the machine-specific interfaces. Similarly, code wanting to add values
should use the "+" operator rather than each target having its own
__builtin_<arch>_add. And since parity and population-count operations
are widely present and generically useful, GNU C has generic built-in
functions for those, so code should use __builtin_parity and
__builtin_popcount on all machines rather than machine-specific variants;
such machine-specific variants should not exist.
The machine-independent parts of the compiler should know about the
equivalence of (popcount X) and (popcount (zero_extend X)), (parity X) and
(parity (zero_extend X)) and (parity X) and (parity (sign_extend X)) if
the sign-extension is by an even number of bits - in fact, there is
already code in simplify_unary_operation_1 that does know this (the
assumption that all sign-extensions are by an even number of bits is
hardcoded). The target should just need to describe how to code these
operations on various modes. If the existing code doesn't suffice to
cause popcountqi etc. patterns to be used for the generic built-in
functions, the appropriate fix is generic rather than adding new
target-specific built-in functions - just as if the compiler didn't
generate your target's addition instruction from the '+' operator, the
right fix is not to add __builtin_<arch>_add to generate that instruction
but rather to make '+' generate it.
--
Joseph S. Myers
joseph@codesourcery.com