[Patch, AVR]: Fix PR33049 (implement extzv)

Georg-Johann Lay avr@gjlay.de
Tue Jun 21 10:05:00 GMT 2011


Denis Chertykov schrieb:
> 2011/6/20 Georg-Johann Lay <avr@gjlay.de>:
>> This is an optimization patch that implements extzv for 1-bit extracts.
> 
> 
>> +(define_insn_and_split "*extzv"
>> +  [(set (match_operand:QI 0 "register_operand"                    "=*d,*d,*d,r")
>> +        (zero_extract:QI (match_operand:QI 1 "register_operand"     "0,r,0,r")
>> +                         (const_int 1)
>> +                         (match_operand:QI 2 "const_0_to_7_operand" "L,L,P,n")))]
>> +  ""
>> +  "@
>> +	andi %0,1
>> +	mov %0,%1\;andi %0,1
>> +	lsr %0\;andi %0,1
>> +	bst %1,%2\;clr %0\;bld %0,0"
> 
> Why you have a second constraint alternative (*d,r,L) ?
> IMHO it's unnecessary.

The second alternative takes 2 instructions/ticks whereas the last
alternative -- which would be taken without alternative 2 -- takes 3
instructions/ticks.  As because of '*' there is no preference on
register class, allocator just sees "r,r,n" and if the output register
happens to end up in 'd' shorter sequences are possible in some cases.
But there is no pressure being put to get such an alternative; in
particular, allocator does not see "d,0,L" and does not emit a move to
reload input.

>> +   && REGNO (operands[0]) >= 16"
> 
> It's not a good practice to refer to register as number.
> 
> Denis.

Ok.  d_register_operand or satisfies_constraint_d would do.  But I
preferred to introduce a new constraint for 4 and avoid splitting
*extzv altogether to keep it simple.  Complexity of splitting is not a
real advantage over writing things down directly.

As avr is running out of constraint letters, I started 3-letter
constraints 'Y**' in the style of bfin.  Would be nice if 'K' was not
already occupied or could be deprecated (is'n not really useful in
inline asm)...

The split patterns just need one alternative, so there is just this
one 'r,r,n' alternative now.

Again, tested without regression.

Johann

	PR target/33049
	* config/avr/avr.md (extzv): New expander.
	(*extzv): New insn.
	(*extzv.qihi1, *extzv.qihi2): New insn-and-split.
	* config/avr/constraints.md (Y04): New constraint.
	* doc/md.texi (Machine Constraints): Document it.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: pr33049.diff
Type: text/x-patch
Size: 3496 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20110621/896eb9a3/attachment.bin>


More information about the Gcc-patches mailing list