On Wed, Feb 2, 2011 at 11:04 AM, David Gilbert <david.gilb...@linaro.org> wrote:
> On 2 February 2011 10:47, Dave Martin <dave.mar...@linaro.org> wrote:
>> On Tue, Feb 1, 2011 at 12:33 PM, David Gilbert <david.gilb...@linaro.org> 
>> wrote:
>>> Hi,
>>>  What do people understand to be the expected semantics of IT blocks
>>> in the cases below, of which there has been some confusion
>>> in relation to a recent Qt issue.
>>>
>>>  The code in question had a sequence something like:
>>>
>>>
>>>  comparison
>>>  IT... EQ
>>>  blahEQ
>>>  TEQ
>>>  BEQ
>>>
>>> The important bits here are that we have an IT EQ block and two special 
>>> cases:
>>>
>>>  1) There is a TEQ in the IT block - are all comparisons in the block
>>> allowed and do their effects immediately take
>>> effect?  As far as I can tell this is allowed and any flag changes are
>>> used straight away;
>>
>> Yes; yes; and: you're right.  This was a specific intention, since
>> there was always a common idiom on ARM of sequences like this:
>>
>> CMP r0, #1
>> CMPEQ r1, #2
>> CMPEQ r2, #3
>> BEQ ...
>>
>> with the effect of "if(r0==1 && r1==2 && r2==3) ..."
>>
>>>
>>>  2) There is a BEQ at the end of the IT block, as far as I can tell,
>>> as long as the destination of the BEQ is close it shouldn't
>>> make any difference if the BEQ is included in the IT block or not.
>>
>> Again, I believe you're right.  The assembler will generate different
>> code, because the explicit conditional branch encodings are not
>> allowed in IT blocks.  But the assembler takes care of this for you:
>>
>> 00000000 <f>:
>>   0:   d001            beq.n   6 <g>
>>
>> versus
>>
>>   2:   bf08            it      eq
>>   4:   e7ff            beq.n   6 <g>
>>
>> 00000006 <g>:
>>
>> Both snippets are equivalent, though as you say, with IT you can
>> insert more code between the branch and its destination before the
>> assembler will barf with a fixup overflow, because the unconditional
>> branch encoding (e000..e7fff) has more bits to express the branch
>> offset.
>
> Thanks for the confirmation Dave.

The key things I'm aware of that you need to what out for with IT are:

 * A few instructions (such as IT itself) are not allowed inside IT blocks.
 * branching into the middle of an IT block
 * only the last instruction in an IT block is allowed to be a branch
(B{L}, B{L}X, LDR pc, LDM/POP ... {pc} etc.)

These result in undefined behaviour.

The compiler should never make these mistakes, but it could happen in
hand-written assembler.

The assembler will often warn you about such cases, but be vigilant---
there are some it won't pick up at present.

Cheers
---Dave

_______________________________________________
linaro-toolchain mailing list
linaro-toolchain@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-toolchain

Reply via email to