On Thu, Feb 16, 2012 at 11:26:53AM -0500, Patrick Marlier wrote:
> On 02/16/2012 11:06 AM, Kirill Yukhin wrote:
> > +(define_insn "xbegin_1"
> > +  [(set (match_operand:SI 0 "register_operand" "=a")
> > +    (unspec_volatile:SI [(match_dup 0)] UNSPECV_XBEGIN))
> > +   (set (match_operand:BLK 1 "" "")
> > +    (unspec_volatile:BLK [(match_dup 1)] UNSPECV_XBEGIN))]
> > +  "TARGET_RTM"
> > +  "xbegin\t.+6"
> > +  [(set_attr "type" "other")
> > +   (set_attr "length" "3")])
> > +
> 
> Here you cannot specify your fallback instruction address. Since
> those primitives provide high performance speculative code, I would
> prefer to move my fallback code far away from the speculative code
> path to improve the code locality.

The intrinsic/builtin just returns a value, so I think you need to
write
if (_xbegin () == ~0)
  {
    transaction;
    _xend ();
  }
else
  {
    fallback;
  }
if you want to use different fallback code from the transaction code.
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
sequence into
movl $-1, %eax
xbegin 1f
if flags register is dead at that point, and perhaps also remove the
movl $-1, %eax if %eax is not live when not jumping.

This is about the intrinsics anyway, the TM code is free to use something
else internally.

        Jakub

Reply via email to