https://gcc.gnu.org/g:69d8bd0b3f5c6a9e60a15187bbd3b1e34ee0488c
commit r17-1991-g69d8bd0b3f5c6a9e60a15187bbd3b1e34ee0488c Author: Avinash Jayakar <[email protected]> Date: Tue Jun 30 09:59:13 2026 +0530 Revert "rs6000: Add new builtin __builtin_ppc_atomic_cas_local" This reverts commit c14275e192efa75020b88d7b1bd5a6167f80a81d. Diff: --- gcc/config/rs6000/rs6000-builtin.cc | 106 ------------- gcc/config/rs6000/rs6000-builtins.def | 17 -- gcc/config/rs6000/rs6000-c.cc | 119 +------------- gcc/config/rs6000/rs6000-overload.def | 8 - gcc/config/rs6000/rs6000-protos.h | 2 +- gcc/config/rs6000/rs6000.cc | 17 +- gcc/config/rs6000/sync.md | 37 ++--- gcc/doc/extend.texi | 23 --- gcc/testsuite/gcc.target/powerpc/acmp-tst-32bit.c | 64 -------- .../gcc.target/powerpc/acmp-tst-indexed.c | 165 ------------------- gcc/testsuite/gcc.target/powerpc/acmp-tst.c | 176 --------------------- 11 files changed, 20 insertions(+), 714 deletions(-) diff --git a/gcc/config/rs6000/rs6000-builtin.cc b/gcc/config/rs6000/rs6000-builtin.cc index e3aab2b6ef16..541958d38c0d 100644 --- a/gcc/config/rs6000/rs6000-builtin.cc +++ b/gcc/config/rs6000/rs6000-builtin.cc @@ -3316,112 +3316,6 @@ rs6000_expand_builtin (tree exp, rtx target, rtx /* subtarget */, return expand_call (exp, target, ignore); } - if (fcode == RS6000_BIF_PPC_ATOMIC_CAS_QI - || fcode == RS6000_BIF_PPC_ATOMIC_CAS_HI - || fcode == RS6000_BIF_PPC_ATOMIC_CAS_SI - || fcode == RS6000_BIF_PPC_ATOMIC_CAS_DI - || fcode == RS6000_BIF_PPC_ATOMIC_CAS_TI) - { - machine_mode mode; // Get mode based on BIF ID (QImode, SImode, etc.) - - switch (fcode) - { - case RS6000_BIF_PPC_ATOMIC_CAS_QI: - mode = QImode; - icode = CODE_FOR_atomic_compare_and_swap_localqi; - break; - case RS6000_BIF_PPC_ATOMIC_CAS_HI: - mode = HImode; - icode = CODE_FOR_atomic_compare_and_swap_localhi; - break; - case RS6000_BIF_PPC_ATOMIC_CAS_SI: - mode = SImode; - icode = CODE_FOR_atomic_compare_and_swap_localsi; - break; - case RS6000_BIF_PPC_ATOMIC_CAS_DI: - mode = DImode; - icode = CODE_FOR_atomic_compare_and_swap_localdi; - break; - case RS6000_BIF_PPC_ATOMIC_CAS_TI: - mode = TImode; - icode = CODE_FOR_atomic_compare_and_swap_localti; - break; - default: - gcc_unreachable (); - } - - // For arg 0 (ptr to data) - rtx ptr = expand_expr (CALL_EXPR_ARG (exp, 0), NULL_RTX, Pmode, - EXPAND_SUM); - ptr = convert_memory_address (Pmode, ptr); - rtx mem = gen_rtx_MEM (mode, ptr); - - // For arg 1 (expected ptr) - rtx exp_ptr = expand_expr (CALL_EXPR_ARG (exp, 1), NULL_RTX, Pmode, - EXPAND_SUM); - exp_ptr = convert_memory_address (Pmode, exp_ptr); - rtx expected_val = gen_reg_rtx (mode); - emit_move_insn (expected_val, gen_rtx_MEM (mode, exp_ptr)); - - // For arg 2 (desired ptr) - rtx desired_ptr = expand_expr (CALL_EXPR_ARG (exp, 2), NULL_RTX, Pmode, - EXPAND_SUM); - desired_ptr = convert_memory_address (Pmode, desired_ptr); - rtx desired_val = gen_reg_rtx (mode); - emit_move_insn (desired_val, gen_rtx_MEM (mode, desired_ptr)); - - // Args 3, 4, 5: weak, succ, fail (constants) - rtx weak = expand_normal (CALL_EXPR_ARG (exp, 3)); - rtx succ = expand_normal (CALL_EXPR_ARG (exp, 4)); - rtx fail = expand_normal (CALL_EXPR_ARG (exp, 5)); - - // 0: Boolean return (Output) - struct expand_operand ops[8]; - create_output_operand (&ops[0], target, SImode); - - // 1: Old value return (Output) - rtx old_val = gen_reg_rtx (mode); - create_output_operand (&ops[1], old_val, mode); - - // 2: The Memory (Fixed/Input - it's a MEM rtx) - // We use create_fixed_operand because it's a specific MEM location - create_fixed_operand (&ops[2], mem); - - // 3: Expected Value (Input) - create_input_operand (&ops[3], expected_val, mode); - - // 4: Desired Value (Input) - create_input_operand (&ops[4], desired_val, mode); - - // 5, 6, 7: Weak, Success, Failure (Immediate/Constants) - create_input_operand (&ops[5], weak, SImode); - create_input_operand (&ops[6], succ, SImode); - create_input_operand (&ops[7], fail, SImode); - - // Now call expand_insn with the ops array - if (!maybe_expand_insn (icode, 8, ops)) - error ("invalid arguments to builtin"); - - // Create a label for the end of the function. - rtx done_label = gen_label_rtx (); - - /* Standard Semantics: Update 'expected' ONLY on failure. - If target (the boolean result) is NOT 0, the CAS succeeded. - In the case of success, we jump straight to the end. */ - - // If target != 0 (Success), skip the store. - emit_cmp_and_jump_insns (target, const0_rtx, NE, NULL_RTX, - SImode, 1, done_label); - - // FAILURE PATH: This code runs only if target == 0. - rtx expected_mem = gen_rtx_MEM (mode, copy_to_mode_reg (Pmode, exp_ptr)); - emit_move_insn (expected_mem, old_val); - - emit_label (done_label); - - return target; - } - if (bif_is_nosoft (*bifaddr) && rs6000_isa_flags & OPTION_MASK_SOFT_FLOAT) { diff --git a/gcc/config/rs6000/rs6000-builtins.def b/gcc/config/rs6000/rs6000-builtins.def index ebcbc500b8af..172a97adaa88 100644 --- a/gcc/config/rs6000/rs6000-builtins.def +++ b/gcc/config/rs6000/rs6000-builtins.def @@ -246,23 +246,6 @@ const double __builtin_unpack_longdouble (long double, const int<1>); UNPACK_TF unpacktf {ibmld} -; Builtins for ppc specific atomic compare exchange - bool __builtin_ppc_atomic_cas_local_qi (char *, char *, char *, const int, \ - const int, const int); - PPC_ATOMIC_CAS_QI nothing {} - bool __builtin_ppc_atomic_cas_local_hi (short *, short *, short *, \ - const int, const int, const int); - PPC_ATOMIC_CAS_HI nothing {} - bool __builtin_ppc_atomic_cas_local_si (int *, int *, int *, const int, \ - const int, const int); - PPC_ATOMIC_CAS_SI nothing {} - bool __builtin_ppc_atomic_cas_local_di (long long *, long long *, \ - long long *, const int, const int, \ - const int); - PPC_ATOMIC_CAS_DI nothing {} - bool __builtin_ppc_atomic_cas_local_ti (__int128 *, __int128 *, __int128 *, \ - const int, const int, const int); - PPC_ATOMIC_CAS_TI nothing {} ; Builtins that have been around just about forever, but not quite. [power5] diff --git a/gcc/config/rs6000/rs6000-c.cc b/gcc/config/rs6000/rs6000-c.cc index 3cbdb6fb2ba1..3fa7c04a7ce2 100644 --- a/gcc/config/rs6000/rs6000-c.cc +++ b/gcc/config/rs6000/rs6000-c.cc @@ -929,7 +929,7 @@ altivec_build_resolved_builtin (tree *args, int n, tree fntype, tree ret_type, /* If the number of arguments to an overloaded function increases, we must expand this switch. */ - gcc_assert (MAX_OVLD_ARGS <= 6); + gcc_assert (MAX_OVLD_ARGS <= 4); tree call; switch (n) @@ -949,10 +949,6 @@ altivec_build_resolved_builtin (tree *args, int n, tree fntype, tree ret_type, case 4: call = build_call_expr (fndecl, 4, args[0], args[1], args[2], args[3]); break; - case 6: - call = build_call_expr (fndecl, 6, args[0], args[1], args[2], args[3], - args[4], args[5]); - break; default: gcc_unreachable (); } @@ -1714,122 +1710,11 @@ find_instance (bool *unsupported_builtin, int *instance, tree altivec_resolve_overloaded_builtin (location_t loc, tree fndecl, - void *passed_arglist, bool complain) + void *passed_arglist, bool) { rs6000_gen_builtins fcode = (rs6000_gen_builtins) DECL_MD_FUNCTION_CODE (fndecl); - /* Handle __builtin_ppc_atomic_cas_local before standard overload - processing. */ - if (fcode == RS6000_OVLD_PPC_ATOMIC_CAS) - { - vec<tree, va_gc> *arglist - = static_cast<vec<tree, va_gc> *> (passed_arglist); - - /* Expected: (void *ptr, void *expected, void *desired, - bool weak, int success_order, int failure_order). */ - if (vec_safe_length (arglist) != 6) - { - if (complain) - error_at (loc, "%qE requires 6 arguments", fndecl); - return error_mark_node; - } - - /* Get the first argument to determine the actual type. */ - tree arg0 = (*arglist)[0]; - tree type0 = TREE_TYPE (arg0); - - /* Must be a pointer. */ - if (!POINTER_TYPE_P (type0)) - { - if (complain) - error_at (loc, "first argument to %qE must be a pointer", fndecl); - return error_mark_node; - } - - /* Get the pointee type. */ - tree pointee_type = TREE_TYPE (type0); - - /* Must be a complete type. */ - if (!COMPLETE_TYPE_P (pointee_type)) - { - if (complain) - error_at (loc, "first argument to %qE must point to a complete" - " type", fndecl); - return error_mark_node; - } - - /* Get size in bytes. */ - tree size_tree = TYPE_SIZE_UNIT (pointee_type); - if (!tree_fits_uhwi_p (size_tree)) - { - if (complain) - error_at (loc, "type size must be constant"); - return error_mark_node; - } - - unsigned HOST_WIDE_INT size = tree_to_uhwi (size_tree); - - /* Determine which size-specific builtin to use. */ - rs6000_gen_builtins target_fcode; - tree int_type; - - switch (size) - { - case 1: - target_fcode = RS6000_BIF_PPC_ATOMIC_CAS_QI; - int_type = unsigned_char_type_node; - break; - case 2: - target_fcode = RS6000_BIF_PPC_ATOMIC_CAS_HI; - int_type = short_unsigned_type_node; - break; - case 4: - target_fcode = RS6000_BIF_PPC_ATOMIC_CAS_SI; - int_type = unsigned_intSI_type_node; - break; - case 8: - target_fcode = RS6000_BIF_PPC_ATOMIC_CAS_DI; - int_type = long_long_unsigned_type_node; - break; - case 16: - target_fcode = RS6000_BIF_PPC_ATOMIC_CAS_TI; - int_type = unsigned_intTI_type_node; - break; - default: - if (complain) - error_at (loc, "size %wu not supported for %qE " - "(must be 1, 2, 4, 8, or 16 bytes)", size, fndecl); - return error_mark_node; - } - - /* Create pointer type to the appropriate integer type. */ - tree int_ptr_type = build_pointer_type (int_type); - - /* Cast the three pointer arguments to the appropriate integer - pointer type. */ - tree new_arg0 = build1 (VIEW_CONVERT_EXPR, int_ptr_type, (*arglist)[0]); - tree new_arg1 = build1 (VIEW_CONVERT_EXPR, int_ptr_type, (*arglist)[1]); - tree new_arg2 = build1 (VIEW_CONVERT_EXPR, int_ptr_type, (*arglist)[2]); - - /* Build new argument list with casted pointers. */ - vec<tree, va_gc> *new_arglist; - vec_alloc (new_arglist, 6); - new_arglist->quick_push (new_arg0); - new_arglist->quick_push (new_arg1); - new_arglist->quick_push (new_arg2); - new_arglist->quick_push ((*arglist)[3]); /* weak (bool). */ - new_arglist->quick_push ((*arglist)[4]); /* success_memorder. */ - new_arglist->quick_push ((*arglist)[5]); /* failure_memorder. */ - - /* Get the target builtin function. */ - tree new_fndecl = rs6000_builtin_decls[target_fcode]; - - /* Build and return the function call. */ - return build_function_call_vec (loc, vNULL, new_fndecl, new_arglist, - NULL, fndecl); - } - /* Return immediately if this isn't an overload. */ if (fcode <= RS6000_OVLD_NONE) return NULL_TREE; diff --git a/gcc/config/rs6000/rs6000-overload.def b/gcc/config/rs6000/rs6000-overload.def index 8755b04d5f0a..09be9e7de71c 100644 --- a/gcc/config/rs6000/rs6000-overload.def +++ b/gcc/config/rs6000/rs6000-overload.def @@ -79,14 +79,6 @@ ; a semicolon are also treated as blank lines. -; The following function is not overloaded, but is internally substituted by -; __builtin_ppc_atomic_cas_local_{qi,hi,si,di,ti} based on the first 3 -; arguments. -[PPC_ATOMIC_CAS, SKIP, __builtin_ppc_atomic_cas_local] - bool __builtin_ppc_atomic_cas_local (void *, void *, void *, const int, \ - const int, const int); - PPC_ATOMIC_CAS_QI PPC_ATOMIC_CAS_FAKERY - [BCDADD, __builtin_bcdadd, __builtin_vec_bcdadd] vsq __builtin_vec_bcdadd (vsq, vsq, const int); BCDADD_V1TI diff --git a/gcc/config/rs6000/rs6000-protos.h b/gcc/config/rs6000/rs6000-protos.h index 5efca2d58348..09424ebaf970 100644 --- a/gcc/config/rs6000/rs6000-protos.h +++ b/gcc/config/rs6000/rs6000-protos.h @@ -127,7 +127,7 @@ extern bool rs6000_emit_set_const (rtx, rtx); extern bool rs6000_emit_cmove (rtx, rtx, rtx, rtx); extern bool rs6000_emit_int_cmove (rtx, rtx, rtx, rtx); extern void rs6000_emit_minmax (rtx, enum rtx_code, rtx, rtx); -extern void rs6000_expand_atomic_compare_and_swap (rtx op[], bool local); +extern void rs6000_expand_atomic_compare_and_swap (rtx op[]); extern rtx swap_endian_selector_for_mode (machine_mode mode); extern void rs6000_expand_atomic_exchange (rtx op[]); diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc index d8669d9ffce4..86d06cfdaa67 100644 --- a/gcc/config/rs6000/rs6000.cc +++ b/gcc/config/rs6000/rs6000.cc @@ -16749,13 +16749,12 @@ emit_unlikely_jump (rtx cond, rtx label) /* A subroutine of the atomic operation splitters. Emit a load-locked instruction in MODE. For QI/HImode, possibly use a pattern than includes - the zero_extend operation. LOCAL indicates the EH bit value for the - load-locked instruction. */ + the zero_extend operation. */ static void -emit_load_locked (machine_mode mode, rtx reg, rtx mem, rtx local) +emit_load_locked (machine_mode mode, rtx reg, rtx mem) { - rtx (*fn) (rtx, rtx, rtx) = NULL; + rtx (*fn) (rtx, rtx) = NULL; switch (mode) { @@ -16782,7 +16781,7 @@ emit_load_locked (machine_mode mode, rtx reg, rtx mem, rtx local) default: gcc_unreachable (); } - emit_insn (fn (reg, mem, local)); + emit_insn (fn (reg, mem)); } /* A subroutine of the atomic operation splitters. Emit a store-conditional @@ -16952,7 +16951,7 @@ rs6000_finish_atomic_subword (rtx narrow, rtx wide, rtx shift) /* Expand an atomic compare and swap operation. */ void -rs6000_expand_atomic_compare_and_swap (rtx operands[], bool local) +rs6000_expand_atomic_compare_and_swap (rtx operands[]) { rtx boolval, retval, mem, oldval, newval, cond; rtx label1, label2, x, mask, shift; @@ -17015,7 +17014,7 @@ rs6000_expand_atomic_compare_and_swap (rtx operands[], bool local) } label2 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ()); - emit_load_locked (mode, retval, mem, local ? const1_rtx : const0_rtx); + emit_load_locked (mode, retval, mem); x = retval; if (mask) @@ -17113,7 +17112,7 @@ rs6000_expand_atomic_exchange (rtx operands[]) label = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ()); emit_label (XEXP (label, 0)); - emit_load_locked (mode, retval, mem, const0_rtx); + emit_load_locked (mode, retval, mem); x = val; if (mask) @@ -17218,7 +17217,7 @@ rs6000_expand_atomic_op (enum rtx_code code, rtx mem, rtx val, if (before == NULL_RTX) before = gen_reg_rtx (mode); - emit_load_locked (mode, before, mem, const0_rtx); + emit_load_locked (mode, before, mem); if (code == NOT) { diff --git a/gcc/config/rs6000/sync.md b/gcc/config/rs6000/sync.md index ad9c91765386..fb20cd1a586a 100644 --- a/gcc/config/rs6000/sync.md +++ b/gcc/config/rs6000/sync.md @@ -329,19 +329,17 @@ (define_insn "load_locked<mode>" [(set (match_operand:ATOMIC 0 "int_reg_operand" "=r") (unspec_volatile:ATOMIC - [(match_operand:ATOMIC 1 "memory_operand" "Z") - (match_operand:QI 2 "u1bit_cint_operand" "n")] UNSPECV_LL))] + [(match_operand:ATOMIC 1 "memory_operand" "Z")] UNSPECV_LL))] "" - "<larx> %0,%y1,%2" + "<larx> %0,%y1" [(set_attr "type" "load_l")]) (define_insn "load_locked<QHI:mode>_si" [(set (match_operand:SI 0 "int_reg_operand" "=r") (unspec_volatile:SI - [(match_operand:QHI 1 "memory_operand" "Z") - (match_operand:QI 2 "u1bit_cint_operand" "n")] UNSPECV_LL))] + [(match_operand:QHI 1 "memory_operand" "Z")] UNSPECV_LL))] "TARGET_SYNC_HI_QI" - "<QHI:larx> %0,%y1,%2" + "<QHI:larx> %0,%y1" [(set_attr "type" "load_l")]) ;; Use PTImode to get even/odd register pairs. @@ -355,8 +353,7 @@ (define_expand "load_lockedti" [(use (match_operand:TI 0 "quad_int_reg_operand")) - (use (match_operand:TI 1 "memory_operand")) - (use (match_operand:QI 2 "u1bit_cint_operand"))] + (use (match_operand:TI 1 "memory_operand"))] "TARGET_SYNC_TI" { rtx op0 = operands[0]; @@ -370,7 +367,7 @@ operands[1] = op1 = change_address (op1, TImode, new_addr); } - emit_insn (gen_load_lockedpti (pti, op1, operands[2])); + emit_insn (gen_load_lockedpti (pti, op1)); if (WORDS_BIG_ENDIAN) emit_move_insn (op0, gen_lowpart (TImode, pti)); else @@ -384,12 +381,11 @@ (define_insn "load_lockedpti" [(set (match_operand:PTI 0 "quad_int_reg_operand" "=&r") (unspec_volatile:PTI - [(match_operand:TI 1 "indexed_or_indirect_operand" "Z") - (match_operand:QI 2 "u1bit_cint_operand" "n")] UNSPECV_LL))] + [(match_operand:TI 1 "indexed_or_indirect_operand" "Z")] UNSPECV_LL))] "TARGET_SYNC_TI && !reg_mentioned_p (operands[0], operands[1]) && quad_int_reg_operand (operands[0], PTImode)" - "lqarx %0,%y1,%2" + "lqarx %0,%y1" [(set_attr "type" "load_l") (set_attr "size" "128")]) @@ -466,22 +462,7 @@ (match_operand:SI 7 "const_int_operand")] ;; model fail "" { - rs6000_expand_atomic_compare_and_swap (operands, false); - DONE; -}) - -(define_expand "atomic_compare_and_swap_local<mode>" - [(match_operand:SI 0 "int_reg_operand") ;; bool out - (match_operand:AINT 1 "int_reg_operand") ;; val out - (match_operand:AINT 2 "memory_operand") ;; memory - (match_operand:AINT 3 "reg_or_short_operand") ;; expected - (match_operand:AINT 4 "int_reg_operand") ;; desired - (match_operand:SI 5 "const_int_operand") ;; is_weak - (match_operand:SI 6 "const_int_operand") ;; model succ - (match_operand:SI 7 "const_int_operand")] ;; model fail - "" -{ - rs6000_expand_atomic_compare_and_swap (operands, true); + rs6000_expand_atomic_compare_and_swap (operands); DONE; }) diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index 45881280515f..7bd84e6d8cc3 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -24080,29 +24080,6 @@ defined, then the @code{__builtin_set_fpscr_rn} built-in returns the FPSCR fields. If not defined, the @code{__builtin_set_fpscr_rn} does not return a value. If the @option{-msoft-float} option is used, the @code{__builtin_set_fpscr_rn} built-in will not return a value. -@defbuiltin{bool __builtin_ppc_atomic_cas_local (@var{type} *@var{ptr}, @var{type} *@var{expected}, @var{type} *@var{desired}, bool @var{weak}, int @var{success_memorder}, int @var{failure_memorder})} -This built-in function implements a PowerPC-specific atomic compare and -exchange operation. It behaves identically to the generic -@code{__atomic_compare_exchange} built-in function, with one key difference: -it uses an EH (Extended Hint) value of 1 in the @code{lbarx}, @code{lharx}, -@code{lwarx}, or @code{ldarx} instruction (load-and-reserve indexed). - -The EH bit provides a hint to the processor that the program will perform a -subsequent store to the specified location. This hint helps optimize lock -contention on PowerPC systems by keeping the lock cacheline in the local -processor longer, reducing performance penalties from cache coherence protocol -traffic. - -For details on the behavior and semantics of the arguments, refer to the -@code{__atomic_compare_exchange} documentation. - -The first three pointer arguments (@var{ptr}, @var{expected}, and -@var{desired}) must point to complete types, and the size of the types they -point to must be the same and known at compile time. The types themselves may -differ. The supported type sizes are 1, 2, 4, 8, or 16 bytes. - -@enddefbuiltin - @node Basic PowerPC Built-in Functions Available on ISA 2.05 @subsubsection Basic PowerPC Built-in Functions Available on ISA 2.05 diff --git a/gcc/testsuite/gcc.target/powerpc/acmp-tst-32bit.c b/gcc/testsuite/gcc.target/powerpc/acmp-tst-32bit.c deleted file mode 100644 index d1d9953abf48..000000000000 --- a/gcc/testsuite/gcc.target/powerpc/acmp-tst-32bit.c +++ /dev/null @@ -1,64 +0,0 @@ -/* { dg-do compile } */ -/* { dg-require-effective-target ilp32 } */ - -// Need power7 for l<b,h>arx -/* { dg-options "-O2 -mdejagnu-cpu=power7" } */ - -bool -word_exchange_qi (signed char *ptr, signed char *expected, signed char *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_uqi (unsigned char *ptr, unsigned char *expected, - unsigned char *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_hi (short *ptr, short *expected, short *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_shi (signed short *ptr, signed short *expected, - signed short *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_uhi (unsigned short *ptr, unsigned short *expected, - unsigned short *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_si (int *ptr, int *expected, int *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_ssi (signed int *ptr, signed int *expected, signed int *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_usi (unsigned int *ptr, unsigned int *expected, - unsigned int *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} - -/* { dg-final { scan-assembler-times {\mlbarx +[0-9]+,[0-9]+,[0-9]+,1} 2 } } */ -/* { dg-final { scan-assembler-times {\mlharx +[0-9]+,[0-9]+,[0-9]+,1} 3 } } */ -/* { dg-final { scan-assembler-times {\mlwarx +[0-9]+,[0-9]+,[0-9]+,1} 3 } } */ -/* { dg-final { scan-assembler-times {\mldarx +[0-9]+,[0-9]+,[0-9]+,1} 3 } } */ -/* { dg-final { scan-assembler-times {\mlqarx +[0-9]+,[0-9]+,[0-9]+,1} 2 } } */ diff --git a/gcc/testsuite/gcc.target/powerpc/acmp-tst-indexed.c b/gcc/testsuite/gcc.target/powerpc/acmp-tst-indexed.c deleted file mode 100644 index c0d2bf3dcb30..000000000000 --- a/gcc/testsuite/gcc.target/powerpc/acmp-tst-indexed.c +++ /dev/null @@ -1,165 +0,0 @@ -/* { dg-do compile } */ -/* { dg-require-effective-target lp64 } */ - -// Need power8 for l<b,h,q>arx -/* { dg-options "-O2 -mdejagnu-cpu=power8" } */ - -typedef struct udt_1 -{ - char *a; -} udt_1t; -typedef struct udt_2 -{ - char a; - char b; -} udt_2t; -typedef struct udt_4 -{ - short a; - short b; -} udt_4t; -typedef struct udt_8 -{ - int a; - int b; -} udt_8t; -bool -word_exchange_nqi (char *ptr, char *expected, char *desired, - unsigned long long n) -{ - return __builtin_ppc_atomic_cas_local (ptr+n, expected+n, desired+n, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_qi (signed char *ptr, signed char *expected, signed char *desired, - unsigned long long n) -{ - return __builtin_ppc_atomic_cas_local (ptr+n, expected+n, desired+n, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_uqi (unsigned char *ptr, unsigned char *expected, - unsigned char *desired, unsigned long long n) -{ - return __builtin_ppc_atomic_cas_local (ptr+n, expected+n, desired+n, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_hi (short *ptr, short *expected, short *desired, - unsigned long long n) -{ - return __builtin_ppc_atomic_cas_local (ptr+n, expected+n, desired+n, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_shi (signed short *ptr, signed short *expected, - signed short *desired, unsigned long long n) -{ - return __builtin_ppc_atomic_cas_local (ptr+n, expected+n, desired+n, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_uhi (unsigned short *ptr, unsigned short *expected, - unsigned short *desired, unsigned long long n) -{ - return __builtin_ppc_atomic_cas_local (ptr+n, expected+n, desired+n, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_si (int *ptr, int *expected, int *desired, unsigned long long n) -{ - return __builtin_ppc_atomic_cas_local (ptr+n, expected+n, desired+n, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_ssi (signed int *ptr, signed int *expected, signed int *desired, - unsigned long long n) -{ - return __builtin_ppc_atomic_cas_local (ptr+n, expected+n, desired+n, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_usi (unsigned int *ptr, unsigned int *expected, - unsigned int *desired, unsigned long long n) -{ - return __builtin_ppc_atomic_cas_local (ptr+n, expected+n, desired+n, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_di (long long *ptr, long long *expected, long long *desired, - unsigned long long n) -{ - return __builtin_ppc_atomic_cas_local (ptr+n, expected+n, desired+n, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_sdi (signed long long *ptr, signed long long *expected, - signed long long *desired, unsigned long long n) -{ - return __builtin_ppc_atomic_cas_local (ptr+n, expected+n, desired+n, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_udi (unsigned long long *ptr, unsigned long long *expected, - unsigned long long *desired, unsigned long long n) -{ - return __builtin_ppc_atomic_cas_local (ptr+n, expected+n, desired+n, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_f32 (float *ptr, float *expected, float *desired, - unsigned long long n) -{ - return __builtin_ppc_atomic_cas_local (ptr+n, expected+n, desired+n, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_f64 (double *ptr, double *expected, double *desired, - unsigned long long n) -{ - return __builtin_ppc_atomic_cas_local (ptr+n, expected+n, desired+n, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_udt_1 (udt_1t *ptr, udt_1t *expected, udt_1t *desired, - unsigned long long n) -{ - return __builtin_ppc_atomic_cas_local (ptr+n, expected+n, desired+n, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_udt_2 (udt_2t *ptr, udt_2t *expected, udt_2t *desired, - unsigned long long n) -{ - return __builtin_ppc_atomic_cas_local (ptr+n, expected+n, desired+n, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_udt_4 (udt_4t *ptr, udt_4t *expected, udt_4t *desired, - unsigned long long n) -{ - return __builtin_ppc_atomic_cas_local (ptr+n, expected+n, desired+n, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_udt_8 (udt_8t *ptr, udt_8t *expected, udt_8t *desired, - unsigned long long n) -{ - return __builtin_ppc_atomic_cas_local (ptr+n, expected+n, desired+n, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} - -/* Test if indexed mode addresses are used, r6 must be used which corresponds - to the argument n in all functions. */ - -/* { dg-final { scan-assembler-times {\mlbarx +[0-9]+,[0-9]+,6,1} 3 } } */ -/* { dg-final { scan-assembler-times {\mstbcx. +[0-9]+,[0-9]+,6} 3 } } */ - -/* { dg-final { scan-assembler-times {\mlharx +[0-9]+,[0-9]+,6,1} 4 } } */ -/* { dg-final { scan-assembler-times {\msthcx. +[0-9]+,[0-9]+,6} 4 } } */ - -/* { dg-final { scan-assembler-times {\mlwarx +[0-9]+,[0-9]+,6,1} 5 } } */ -/* { dg-final { scan-assembler-times {\mstwcx. +[0-9]+,[0-9]+,6} 5 } } */ - -/* { dg-final { scan-assembler-times {\mldarx +[0-9]+,[0-9]+,6,1} 6 } } */ -/* { dg-final { scan-assembler-times {\mstdcx. +[0-9]+,[0-9]+,6} 6 } } */ diff --git a/gcc/testsuite/gcc.target/powerpc/acmp-tst.c b/gcc/testsuite/gcc.target/powerpc/acmp-tst.c deleted file mode 100644 index bb15805819f2..000000000000 --- a/gcc/testsuite/gcc.target/powerpc/acmp-tst.c +++ /dev/null @@ -1,176 +0,0 @@ -/* { dg-do compile } */ -/* { dg-require-effective-target lp64 } */ - -// Need power8 for l<b,h,q>arx -/* { dg-options "-O2 -mdejagnu-cpu=power8" } */ - -typedef struct udt_1 -{ - char *a; -} udt_1t; -typedef struct udt_2 -{ - char a; - char b; -} udt_2t; -typedef struct udt_4 -{ - short a; - short b; -} udt_4t; -typedef struct udt_8 -{ - int a; - int b; -} udt_8t; -typedef struct udt_16 -{ - long long a; - long long b; -} udt_16t; -bool -word_exchange_nqi (char *ptr, char *expected, char *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_qi (signed char *ptr, signed char *expected, signed char *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_uqi (unsigned char *ptr, unsigned char *expected, - unsigned char *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_hi (short *ptr, short *expected, short *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_shi (signed short *ptr, signed short *expected, - signed short *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_uhi (unsigned short *ptr, unsigned short *expected, - unsigned short *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_si (int *ptr, int *expected, int *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_ssi (signed int *ptr, signed int *expected, signed int *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_usi (unsigned int *ptr, unsigned int *expected, - unsigned int *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_di (long long *ptr, long long *expected, long long *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_sdi (signed long long *ptr, signed long long *expected, - signed long long *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_udi (unsigned long long *ptr, unsigned long long *expected, - unsigned long long *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_sti (signed __int128 *ptr, signed __int128 *expected, - signed __int128 *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_uti (unsigned __int128 *ptr, unsigned __int128 *expected, - unsigned __int128 *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_f32 (float *ptr, float *expected, float *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_f64 (double *ptr, double *expected, double *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_f128 (__ieee128 *ptr, __ieee128 *expected, __ieee128 *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_udt_1 (udt_1t *ptr, udt_1t *expected, udt_1t *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_udt_2 (udt_2t *ptr, udt_2t *expected, udt_2t *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_udt_4 (udt_4t *ptr, udt_4t *expected, udt_4t *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_udt_8 (udt_8t *ptr, udt_8t *expected, udt_8t *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} -bool -word_exchange_udt_16 (udt_16t *ptr, udt_16t *expected, udt_16t *desired) -{ - return __builtin_ppc_atomic_cas_local (ptr, expected, desired, 0, - __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE); -} - -/* { dg-final { scan-assembler-times {\mlbarx +[0-9]+,[0-9]+,[0-9]+,1} 3 } } */ -/* { dg-final { scan-assembler-times {\mlharx +[0-9]+,[0-9]+,[0-9]+,1} 4 } } */ -/* { dg-final { scan-assembler-times {\mlwarx +[0-9]+,[0-9]+,[0-9]+,1} 5 } } */ -/* { dg-final { scan-assembler-times {\mldarx +[0-9]+,[0-9]+,[0-9]+,1} 6 } } */ -/* { dg-final { scan-assembler-times {\mlqarx +[0-9]+,[0-9]+,[0-9]+,1} 4 } } */
