2011/11/28 Georg-Johann Lay <a...@gjlay.de>: > This adds two built-in functions that facilitate moving bits. > > The two built-ins work the same way; there is a 16-bit version and a 8-bit > version. > > The first operand specifies a mapping to apply to the second operand: > The n-th nibble of the mapping specifies the image of the n-th bit. > > Typical use case for these built-ins is adjusting input and output values to > non-contiguous port layouts. > > The patch also introduces new %-codes to help printing operands for BLD and > BST > which is useful in other places, too. > > For example > > char reverse (char x) > { > return __builtin_avr_map8 (0x01234567, x); > } > > leads to > > reverse: > mov __tmp_reg__,r24 > inc __zero_reg__ > 0: ror r0 > rol r24 > lsl __zero_reg__ > brne 0b > ret > > > Ok for trunk? > > Johann > > * doc/extend.texi (AVR Built-in Functions): Add documentation for > __builtin_avr_map8 and __builtin_avr_map16. > > * config/avr/avr.md: Document new %t and %T asm output codes. > (define_c_enum "unspec"): Add UNSPEC_MAP_BITS. > (adjust_len): Add map_bits. > (map_bitsqi, map_bitshi): New insns. > * config/avr/avr-protos.h (avr_out_map_bits): New. > * config/avr/avr.c (print_operand): Implement %t and %T. > (adjust_insn_length): Handle ADJUST_LEN_MAP_BITS. > (avr_double_int_push_digit): New function. > (avr_map, avr_revert_map, avr_swap_map, avr_id_map): New functions. > (avr_sig_map, avr_map_hamming_byte): New functions. > (avr_out_swap_bits, avr_out_revert_bits, avr_move_bits, > avr_out_map_bits): New functions. > (enum avr_builtin_id): Add AVR_BUILTIN_MAP8, AVR_BUILTIN_MAP16. > (avr_init_builtins): Populate __builtin_avr_map8, __builtin_avr_map16. > (bdesc_2arg): Add __builtin_avr_map8, __builtin_avr_map16 ... > (avr_expand_builtin): ...and expand them. > * config/avr/avr-c.c (avr_cpu_cpp_builtins): New built-in defines: > __BUILTIN_AVR_MAP8, __BUILTIN_AVR_MAP16. > >
Approved. Denis.