Andrew Pinski <pins...@gmail.com> writes: > On Tue, Jul 28, 2015 at 1:36 PM, Richard Sandiford > <richard.sandif...@arm.com> wrote: >> Bootstrapped & regression-tested on x86_64-linux-gnu and aarch64-linux-gnu. >> Also tested via config-list.mk. Committed as preapproved. >> >> Thanks, >> Richard >> >> >> gcc/ >> * target-insns.def (atomic_test_and_set): New targetm instruction >> pattern. >> * optabs.c (maybe_emit_atomic_test_and_set): Use it instead of >> HAVE_*/gen_* interface. >> >> Index: gcc/target-insns.def >> =================================================================== >> --- gcc/target-insns.def 2015-07-28 21:00:09.815019853 +0100 >> +++ gcc/target-insns.def 2015-07-28 21:00:09.811019905 +0100 >> @@ -31,6 +31,7 @@ >> >> Instructions should be documented in md.texi rather than here. */ >> DEF_TARGET_INSN (allocate_stack, (rtx x0, rtx x1)) >> +DEF_TARGET_INSN (atomic_test_and_set, (rtx x0, rtx x1, rtx x2)) >> DEF_TARGET_INSN (builtin_longjmp, (rtx x0)) >> DEF_TARGET_INSN (builtin_setjmp_receiver, (rtx x0)) >> DEF_TARGET_INSN (builtin_setjmp_setup, (rtx x0)) >> Index: gcc/optabs.c >> =================================================================== >> --- gcc/optabs.c 2015-07-28 21:00:09.815019853 +0100 >> +++ gcc/optabs.c 2015-07-28 21:00:09.811019905 +0100 >> @@ -7258,35 +7258,30 @@ maybe_emit_compare_and_swap_exchange_loo >> using the atomic_test_and_set instruction pattern. A boolean value >> is returned from the operation, using TARGET if possible. */ >> >> -#ifndef HAVE_atomic_test_and_set >> -#define HAVE_atomic_test_and_set 0 >> -#define CODE_FOR_atomic_test_and_set CODE_FOR_nothing >> -#endif >> - >> static rtx >> maybe_emit_atomic_test_and_set (rtx target, rtx mem, enum memmodel model) >> { >> machine_mode pat_bool_mode; >> struct expand_operand ops[3]; >> >> - if (!HAVE_atomic_test_and_set) >> + if (!targetm.have_atomic_test_and_set ()) >> return NULL_RTX; > > I know this was not there before but this if should be marked as > unlikely as most targets where someone is using __atomic_*/__sync_* > will have those patterns.
I think that'd be premature optimisation. The path being guarded here generates new rtl instructions, which is a much more expensive operation than a mispredicated branch. Thanks, Richard