On Mon, Feb 20, 2012 at 7:18 PM, Jakub Jelinek <ja...@redhat.com> wrote:
> On Mon, Feb 20, 2012 at 07:10:26PM +0100, Uros Bizjak wrote:
>> > So the above is right and needed, though perhaps we might want
>> > a combine pattern or peephole to turn the
>> > movl $-1, %eax
>> > xbegin .+6
>> > cmpl %eax, $-1
>> > jne 1f
>>
>> The compiler can reverse the condition and exchange arms of if
>> expression. This will void the assumption that false arm (and abort
>> sequence) is at pc+6.
>
> The xbegin .+6 instruction doesn't (from the compiler's POV) as any
> JUMP_INSN, it just returns either -1 or some other value in %eax
> (when coupled with setting %eax to -1 before it).
> That is the semantics of the _xbegin () intrinsic.
> We can (and at least in the combiner should) model it as
> a JUMP_INSN with UNSPEC_VOLATILE in it, which will work similarly
> to asm goto.  The question is how happy cfgrtl.c etc. will be on
> a conditional JUMP_INSN with UNSPEC_VOLATILE in it.

IIUC the documentation, the fallback label is a parameter to xbegin
insn, but the insn itself doesn't jump anywhere - it just records the
parameter as a fallback address. However, there is no guarantee that
the fallback code is exactly at (pc)+6, so we have to use asm labels
here.

As written in your example in this thread, the label is at the top of
the false branch. Instead of ".+6", we have to pass this label to
xbegin insn somehow.

Uros.

Reply via email to