[PATCH: PR target/46631] Change operands order so we can use 16bit AND instead of 32bit in thumb2
Richard Earnshaw
richard.earnshaw@buzzard.freeserve.co.uk
Thu Dec 2 00:30:00 GMT 2010
Absolutely not! That pattern does not clobber the condition codes. Look for the existing pattern that generates a two register and operation for thumb2 and update that.
R.
On 1 Dec 2010, at 19:12, "Carrot Wei" <carrot@google.com> wrote:
> On Wed, Dec 1, 2010 at 4:04 AM, Richard Earnshaw <rearnsha@arm.com> wrote:
>>
>> On Tue, 2010-11-30 at 15:21 -0800, Carrot Wei wrote:
>>> Hi
>>>
>>> An instruction of the following style is 32 bit in thumb2.
>>> and r2, r3, r2
>>>
>>> If we change the source operands order, it will be 16 bit.
>>> ands r2, r2, r3
>>>
>>> This patch contains a new peephole2 to detect the situation that the all 3
>>> operands of AND are low registers, and the target is the same as the second
>>> source, then replace it with another AND with its source operands exchanged.
>>>
>>> This patch passed the regression test on arm qemu.
>>>
>>
>> So gas will already generate a 16-bit instruction from
>> ands r2, r3, r2
>>
>> So it should be possible to just extend the existing peephole/split to
>> handle this case (and for all other commutative operations).
>>
>
> Do you mean I should do the following modification to pattern
> "*arm_andsi3_insn" ?
>
> Index: arm.md
> ===================================================================
> --- arm.md (revision 167257)
> +++ arm.md (working copy)
> @@ -2094,15 +2094,26 @@
> and%?\\t%0, %1, %2
> bic%?\\t%0, %1, #%B2
> #"
> - "TARGET_32BIT
> - && GET_CODE (operands[2]) == CONST_INT
> - && !(const_ok_for_arm (INTVAL (operands[2]))
> - || const_ok_for_arm (~INTVAL (operands[2])))"
> - [(clobber (const_int 0))]
> + "TARGET_32BIT"
> + [(parallel
> + [(set (match_dup 0)
> + (and:SI (match_dup 0)
> + (match_dup 1)))
> + (clobber (reg:CC CC_REGNUM))])]
> "
> - arm_split_constant (AND, SImode, curr_insn,
> - INTVAL (operands[2]), operands[0], operands[1], 0);
> - DONE;
> + if (GET_CODE (operands[2]) == CONST_INT
> + && !(const_ok_for_arm (INTVAL (operands[2]))
> + || const_ok_for_arm (~INTVAL (operands[2])))"
> + {
> + arm_split_constant (AND, SImode, curr_insn,
> + INTVAL (operands[2]), operands[0], operands[1], 0);
> + DONE;
> + }
> + else if (TARGET_THUMB2 && rtx_equal_p (operands[0], operands[2])
> + && peep2_regno_dead_p(0, CC_REGNUM)
> + {
> + }
> + FAIL;
> "
> [(set_attr "length" "4,4,16")
> (set_attr "predicable" "yes")]
>
> And do the similar to patterns "*iorsi3_insn" and "*arm_xorsi3"?
>
> thanks
> Guozhi
More information about the Gcc-patches
mailing list