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