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 | |
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')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 21 |
2 files changed, 22 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f5c1609..550518c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-06-22 Alan Modra <amodra@gmail.com> + + * 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. + 2012-06-22 Richard Guenther <rguenther@suse.de> * gcov-iov.c: Include bconfig.h and system.h. 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); |