summaryrefslogtreecommitdiff
path: root/gcc/config/tilegx/sync.md
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/config/tilegx/sync.md')
-rw-r--r--gcc/config/tilegx/sync.md28
1 files changed, 19 insertions, 9 deletions
diff --git a/gcc/config/tilegx/sync.md b/gcc/config/tilegx/sync.md
index 3d9349301ca..b32b662e676 100644
--- a/gcc/config/tilegx/sync.md
+++ b/gcc/config/tilegx/sync.md
@@ -177,8 +177,7 @@
(match_operand:SI 2 "const_int_operand" "")] ;; model
""
{
- rtx addr, aligned_addr, aligned_mem, offset, word, shmt;
- rtx tmp0, tmp1;
+ rtx addr, aligned_addr, aligned_mem, offset, word, shmt, tmp;
rtx result = operands[0];
rtx mem = operands[1];
enum memmodel model = (enum memmodel) INTVAL (operands[2]);
@@ -191,27 +190,38 @@
aligned_mem = change_address (mem, DImode, aligned_addr);
set_mem_alias_set (aligned_mem, 0);
+ tmp = gen_reg_rtx (Pmode);
+ if (BYTES_BIG_ENDIAN)
+ {
+ emit_move_insn (gen_lowpart (DImode, tmp),
+ gen_rtx_NOT (DImode, gen_lowpart (DImode, addr)));
+ }
+ else
+ {
+ tmp = addr;
+ }
+
offset = gen_reg_rtx (DImode);
- emit_move_insn (offset, gen_rtx_AND (DImode, gen_lowpart (DImode, addr),
+ emit_move_insn (offset, gen_rtx_AND (DImode, gen_lowpart (DImode, tmp),
GEN_INT (7)));
- tmp0 = gen_reg_rtx (DImode);
- emit_move_insn (tmp0, GEN_INT (1));
+ tmp = gen_reg_rtx (DImode);
+ emit_move_insn (tmp, GEN_INT (1));
shmt = gen_reg_rtx (DImode);
emit_move_insn (shmt, gen_rtx_ASHIFT (DImode, offset, GEN_INT (3)));
word = gen_reg_rtx (DImode);
- emit_move_insn (word, gen_rtx_ASHIFT (DImode, tmp0,
+ emit_move_insn (word, gen_rtx_ASHIFT (DImode, tmp,
gen_lowpart (SImode, shmt)));
- tmp1 = gen_reg_rtx (DImode);
+ tmp = gen_reg_rtx (DImode);
tilegx_pre_atomic_barrier (model);
- emit_insn (gen_atomic_fetch_or_baredi (tmp1, aligned_mem, word));
+ emit_insn (gen_atomic_fetch_or_baredi (tmp, aligned_mem, word));
tilegx_post_atomic_barrier (model);
emit_move_insn (gen_lowpart (DImode, result),
- gen_rtx_LSHIFTRT (DImode, tmp1,
+ gen_rtx_LSHIFTRT (DImode, tmp,
gen_lowpart (SImode, shmt)));
DONE;
})