On Mon, Nov 28, 2011 at 04:33:58PM -0800, Richard Henderson wrote: > On 11/28/2011 04:26 PM, Richard Henderson wrote: > > On 11/28/2011 03:05 PM, Richard Henderson wrote: > >> On 11/28/2011 02:16 PM, Alan Modra wrote: > >>> Hmm, I suppose you could argue that powerpc and others ought to not > >>> generate those three extra instructions when using the return value. > >>> I'll see about fixing powerpc. > >> > >> However, we can do better by considering the value to be stored in CR0... > > > > Try this and see if it generates the sort of code you want. Untested. > > ... actually, this one. There's no reason to differentiate between strong > and weak compare-and-swap when computing boolval.
Looks very similar to what I wrote, except > + else if (reg_overlap_mentioned_p (retval, oldval)) > + oldval = copy_to_reg (oldval); I missed this bit > - x = gen_rtx_NE (VOIDmode, x, oldval); > - x = rs6000_generate_compare (x, mode); > + cond = gen_reg_rtx (CCmode); > + x = gen_rtx_COMPARE (CCmode, x, oldval); > + emit_insn (gen_rtx_SET (VOIDmode, cond, x)); > + > + x = gen_rtx_NE (VOIDmode, cond, const0_rtx); and instead pulled cond out of the return from rs6000_generate_compare. Results look good. -- Alan Modra Australia Development Lab, IBM