diff options
author | 2015-01-13 17:34:28 +0000 | |
---|---|---|
committer | 2015-01-14 10:13:08 +0000 | |
commit | ee5e273e4d0dd91b480c8d5dbcccad15c1b7353c (patch) | |
tree | bf29543304d3d678e4aefe1f9b1619adabd6aaed /compiler/dex/quick/gen_common.cc | |
parent | b95dff1a3ae456c0afec74b506f9b9c9cb12663a (diff) |
Fix wide volatile IGET/IPUT on ARM without atomic ldrd/strd.
If ldrd/strd isn't atomic, IPUT_WIDE uses ldrexd+strexd and
we need to record the safepoint for the ldrexd rather than
strexd. IGET_WIDE was simply missing the memory barrier.
Bug: 18993519
Change-Id: I4e9270b994f413c1a047c1c4bb9cce5f29e42cb4
Diffstat (limited to 'compiler/dex/quick/gen_common.cc')
-rw-r--r-- | compiler/dex/quick/gen_common.cc | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/compiler/dex/quick/gen_common.cc b/compiler/dex/quick/gen_common.cc index 3733507a50..d2b32b585b 100644 --- a/compiler/dex/quick/gen_common.cc +++ b/compiler/dex/quick/gen_common.cc @@ -939,15 +939,15 @@ void Mir2Lir::GenIPut(MIR* mir, int opt_flags, OpSize size, } GenNullCheck(rl_obj.reg, opt_flags); int field_offset = field_info.FieldOffset().Int32Value(); - LIR* store; + LIR* null_ck_insn; if (IsRef(size)) { - store = StoreRefDisp(rl_obj.reg, field_offset, rl_src.reg, field_info.IsVolatile() ? + null_ck_insn = StoreRefDisp(rl_obj.reg, field_offset, rl_src.reg, field_info.IsVolatile() ? kVolatile : kNotVolatile); } else { - store = StoreBaseDisp(rl_obj.reg, field_offset, rl_src.reg, size, - field_info.IsVolatile() ? kVolatile : kNotVolatile); + null_ck_insn = StoreBaseDisp(rl_obj.reg, field_offset, rl_src.reg, size, + field_info.IsVolatile() ? kVolatile : kNotVolatile); } - MarkPossibleNullPointerExceptionAfter(opt_flags, store); + MarkPossibleNullPointerExceptionAfter(opt_flags, null_ck_insn); if (IsRef(size) && !mir_graph_->IsConstantNullRef(rl_src)) { MarkGCCard(opt_flags, rl_src.reg, rl_obj.reg); } |