[Patch,AVR]: Add %T/%t to print_operand. Add built-in to permute bits.

Georg-Johann Lay avr@gjlay.de
Mon Nov 28 05:15:00 GMT 2011


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.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: map-bits-basic.diff
Type: text/x-patch
Size: 19615 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20111128/9f896b26/attachment.bin>


More information about the Gcc-patches mailing list