diff options
author | Alan Modra <amodra@gmail.com> | 2012-06-22 21:44:12 +0930 |
---|---|---|
committer | Alan Modra <amodra@gcc.gnu.org> | 2012-06-22 21:44:12 +0930 |
commit | d25df8825432c8589b42f2b12e078c7eb596e947 (patch) | |
tree | 5e0c68a2952dfe92e169a166fc6f4e90ae1c0425 /gcc/config | |
parent | de703cd7d41e3be0fe997df99d11c6ca6dd0df8d (diff) | |
download | gcc-d25df8825432c8589b42f2b12e078c7eb596e947.zip gcc-d25df8825432c8589b42f2b12e078c7eb596e947.tar.gz gcc-d25df8825432c8589b42f2b12e078c7eb596e947.tar.bz2 |
rs6000.c (rs6000_pre_atomic_barrier): Pass in and return mem.
* config/rs6000/rs6000.c (rs6000_pre_atomic_barrier): Pass in and
return mem. Convert to indirect addressing if not indirect or
indexed. Adjust all callers.
From-SVN: r188884
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 0f23cd0..6bd5909 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -16527,9 +16527,19 @@ emit_store_conditional (enum machine_mode mode, rtx res, rtx mem, rtx val) /* Expand barriers before and after a load_locked/store_cond sequence. */ -static void -rs6000_pre_atomic_barrier (enum memmodel model) +static rtx +rs6000_pre_atomic_barrier (rtx mem, enum memmodel model) { + rtx addr = XEXP (mem, 0); + int strict_p = (reload_in_progress || reload_completed); + + if (!legitimate_indirect_address_p (addr, strict_p) + && !legitimate_indexed_address_p (addr, strict_p)) + { + addr = force_reg (Pmode, addr); + mem = replace_equiv_address_nv (mem, addr); + } + switch (model) { case MEMMODEL_RELAXED: @@ -16546,6 +16556,7 @@ rs6000_pre_atomic_barrier (enum memmodel model) default: gcc_unreachable (); } + return mem; } static void @@ -16684,7 +16695,7 @@ rs6000_expand_atomic_compare_and_swap (rtx operands[]) else if (reg_overlap_mentioned_p (retval, oldval)) oldval = copy_to_reg (oldval); - rs6000_pre_atomic_barrier (mod_s); + mem = rs6000_pre_atomic_barrier (mem, mod_s); label1 = NULL_RTX; if (!is_weak) @@ -16769,7 +16780,7 @@ rs6000_expand_atomic_exchange (rtx operands[]) mode = SImode; } - rs6000_pre_atomic_barrier (model); + mem = rs6000_pre_atomic_barrier (mem, model); label = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ()); emit_label (XEXP (label, 0)); @@ -16853,7 +16864,7 @@ rs6000_expand_atomic_op (enum rtx_code code, rtx mem, rtx val, mode = SImode; } - rs6000_pre_atomic_barrier (model); + mem = rs6000_pre_atomic_barrier (mem, model); label = gen_label_rtx (); emit_label (label); |