rs6000: Add new builtin __builtin_ppc_atomic_cas_local

This patch adds a new powerpc specific atomic builtin which is similar
to the generic __atomic_compare_exchange builtin.

bool __builtin_ppc_atomic_cas_local (type *ptr, type *expected,
				     type *desired, bool weak,
				     int success_memorder,
				     int failure_memorder)

It behaves like __atomic_compare_exchange(), but it uses an EH value of
1 in the larx (load-and-reserve) instruction, which provides a hint
whether the program will perform a subsequent store to the specified
location. The new builtin helps optimize lock contention on PowerPC by
keeping the lock cacheline in the local processor longer, reducing
performance penalties from cache coherence protocol traffic.

2026-06-30  Avinash Jayakar  <avinashd@linux.ibm.com>
	    Surya Kumari Jangala  <jskumari@linux.ibm.com>

gcc/ChangeLog:
	* config/rs6000/rs6000-builtin.cc (rs6000_expand_builtin): Add logic to
	handle __builtin_ppc_atomic_cas_local.
	* config/rs6000/rs6000-builtins.def: New builtins for
	__builtin_ppc_atomic_cas_local with types.
	* config/rs6000/rs6000-c.cc (altivec_build_resolved_builtin): Handle
	builtins with up to 6 arguments.
	* config/rs6000/rs6000-overload.def: Overload builtin for signed/unsiged
	char, short, int, long, __int128.
	* config/rs6000/rs6000-protos.h (rs6000_expand_atomic_compare_and_swap): Add
	additional parameter 'local' to the prototype.
	* config/rs6000/rs6000.cc (emit_load_locked): Add new parameter. Pass new
	parameter to generate load-locked instruction.
	(rs6000_expand_atomic_compare_and_swap): Add new parameter. Call
	emit_load_locked() with additional parameter value of EH bit.
	(rs6000_expand_atomic_exchange): Pass EH value 0 to emit_load_locked().
	(rs6000_expand_atomic_op): Likewise.
	* config/rs6000/sync.md (load_locked<mode>): Add new operand in RTL template.
	Specify EH bit in the larx instruction.
	(load_locked<QHI:mode>_si): Likewise.
	(load_lockedpti): Likewise.
	(load_lockedti): Add new operand in RTL template. Pass EH bit to
	gen_load_lockedpti().
	(atomic_compare_and_swap<mode>): Pass new parameter 'false' to
	rs6000_expand_atomic_compare_and_swap.
	(atomic_compare_and_swap_local<mode>): New define_expand.
	* doc/extend.texi: Add documentation for new builtin.

gcc/testsuite/ChangeLog:
	* gcc.target/powerpc/acmp-tst-32bit.c: New test.
	* gcc.target/powerpc/acmp-tst.c: New test.
	* gcc.target/powerpc/acmp-tst-indexed.c: New test.
11 files changed