[llvm-commits] [PATCH] Fix decoding of shift-immediate #32
Jim Grosbach
grosbach at apple.com
Wed Mar 21 15:53:34 PDT 2012
Hi Richard,
The alias of a shift by zero to a mov should be handled entirely in either the assembler or instruction selection (for the assembler and the compiler, respectively). Anything that's actually creating a shift instruction w/ a shift value of zero is doing it wrong, and that's a bug that should be fixed.
-Jim
On Mar 20, 2012, at 5:41 AM, Richard Barton <richard.barton at arm.com> wrote:
> Hi Jim
>
> Wow, this is the patch that just does not want to work.
>
> I reinstated the assert and found that this causes a test suite failure in
> basic-arm-instructions.s.
>
> It seems that it is legal in UAL to use "asr r2,r4,#0" to mean "mov r2,r4". So
> using 0 in the MCInst seems to confuse the encoder into thinking that "asr
> r2,r4,#32" is a mov.
>
> I think that the easiest way forward is to revert to the original patch and
> store 32 in the MC Inst when we mean #32 (i.e. for asr and lsr) and 0 when we
> mean #0.
>
> This passes the llvm test suite and passes our internal tests for AND with
> shifted registers and ASR.
>
> I attached the new proposed patch.
>
> Thanks
> Rich
>
>
>> -----Original Message-----
>> From: Jim Grosbach [mailto:grosbach at apple.com]
>> Sent: 16 March 2012 18:14
>> To: Richard Barton
>> Cc: llvm-commits at cs.uiuc.edu
>> Subject: Re: [llvm-commits] [PATCH] Fix decoding of shift-immediate #32
>>
>> Hi Richard,
>>
>> This looks fine, with the exception that I'd prefer to keep an assert() in the
>> emitter, but just change it to check that the value is < 32. Ok to commit w/
>> that change.
>>
>> -Jim
>>
>> On Mar 14, 2012, at 9:03 AM, Richard Barton <richard.barton at arm.com> wrote:
>>
>>> Hi Jim
>>>
>>> Thanks for the review and the clarification on the MCInst contents, I will
>> bear this rule-of-thumb in mind in future.
>>>
>>> I have reversed my patch to correct the AsmParser behaviour to store #0 in
>> the MCInst rather than #32, and have removed the special case handling in the
>> CodeEmitter for #32.
>>>
>>> Please review.
>>>
>>> Thanks
>>> Rich
>>>
>>>> -----Original Message-----
>>>> From: Jim Grosbach [mailto:grosbach at apple.com]
>>>> Sent: 13 March 2012 23:18
>>>> To: Richard Barton
>>>> Cc: llvm-commits at cs.uiuc.edu
>>>> Subject: Re: [llvm-commits] [PATCH] Fix decoding of shift-immediate #32
>>>>
>>>> Hi Richard,
>>>>
>>>> MC tries to represent instruction operands with the values that will be
>>>> encoded into the instruction, not the semantic meaning. The arm backend
>> isnt
>>>> yet completely consistent about it, but that's the general idea. In this
>> case,
>>>> that means we should use an mcoperand value of zero, as that's what the
>>>> encoded value is.
>>>>
>>>> Anything creating an operand value of 32 for this is in error. It's getting
>>>> away with it because the encoder will just use the low 5 bits, but it's
>> still
>>>> undesirable to rely on that.
>>>>
>>>> Jim
>>>>
>>>> On Mar 13, 2012, at 11:16 AM, Richard Barton <richard.barton at arm.com>
>> wrote:
>>>>
>>>>> With the patch attached this time! Apologies.
>>>>>
>>>>>> Hello reviewers,
>>>>>>
>>>>>> An MCInst stores a register-shifted-immediate as 2 operands, a register
>> and
>>>> an
>>>>>> immediate operand describing the shift kind and the shift value. This
>>>>>> immediate operand value is encoded as 3 bits for the shift kind, which is
>>>> an
>>>>>> enum type ShiftOpc, and 5 bits for the shift value itself. The assembler
>>>>>> creates an MCInst immediate operand with the value #32 for ... lsr #32,
>>>> whilst
>>>>>> the decoder creates an MCInst immediate operand with the value 0 for the
>>>>>> equivalent encoding. On the face of it, neither is more right than the
>>>> other,
>>>>>> and crucially the two paths followed by llvm-mc (assemble, encode) and
>>>>>> (decode, disassemble) match up in their expectations.
>>>>>>
>>>>>> Although it probably does not matter either way, intuitively I think it
>>>> makes
>>>>>> more sense for the decoder to write an MCInst operand describing the
>> shift
>>>> as
>>>>>> [32][lsr] rather than [0][lsr] as the latter is not actually legal.
>>>>>>
>>>>>> The attached patch handles this case for the decoder. It also reverts
>> part
>>>> of
>>>>>> r137322, which added special case handling for the old decoder behaviour
>> in
>>>>>> the instruction printer.
>>>>>>
>>>>>> Please review.
>>>>>>
>>>>>> Thanks,
>>>>>>
>>>>>> Richard Barton
>>>>> <decode_lsr_asr_32.patch>
>>>>> _______________________________________________
>>>>> llvm-commits mailing list
>>>>> llvm-commits at cs.uiuc.edu
>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>>>
>>>
>>>
>>> -- IMPORTANT NOTICE: The contents of this email and any attachments are
>> confidential and may also be privileged. If you are not the intended
>> recipient, please notify the sender immediately and do not disclose the
>> contents to any other person, use it for any purpose, or store or copy the
>> information in any medium. Thank you.<incorrect_assert_in_shift_encode.patch>
>>
>>
> <register_shifted_by_32.patch>
More information about the llvm-commits
mailing list