diff options
author | 2014-04-03 02:45:19 +0000 | |
---|---|---|
committer | 2014-04-03 02:45:19 +0000 | |
commit | 8549cf9d83688f7decbbea2a8de761ce29e95f3c (patch) | |
tree | bcf136b958e0f8172cef38dfa2a760635c677c74 | |
parent | 744924b701febe88bd67a9080999c08c76745807 (diff) | |
parent | 7c95cefc168ba81b17a9ed2d987ac5bcf0b05781 (diff) |
Merge "Use temp register in Unsafe Get/Put intrisics for displaced offset."
-rw-r--r-- | compiler/dex/quick/gen_invoke.cc | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/compiler/dex/quick/gen_invoke.cc b/compiler/dex/quick/gen_invoke.cc index 07469133d4..352130d1da 100644 --- a/compiler/dex/quick/gen_invoke.cc +++ b/compiler/dex/quick/gen_invoke.cc @@ -1408,8 +1408,15 @@ bool Mir2Lir::GenInlinedUnsafeGet(CallInfo* info, RegLocation rl_offset = LoadValue(rl_src_offset, kCoreReg); RegLocation rl_result = EvalLoc(rl_dest, kCoreReg, true); if (is_long) { - OpRegReg(kOpAdd, rl_object.reg, rl_offset.reg); - LoadBaseDispWide(rl_object.reg, 0, rl_result.reg, INVALID_SREG); + if (cu_->instruction_set == kX86) { + LoadBaseIndexedDisp(rl_object.reg, rl_offset.reg, 1, 0, rl_result.reg.GetLow(), + rl_result.reg.GetHigh(), kLong, INVALID_SREG); + } else { + RegStorage rl_temp_offset = AllocTemp(); + OpRegRegReg(kOpAdd, rl_temp_offset, rl_object.reg, rl_offset.reg); + LoadBaseDispWide(rl_temp_offset, 0, rl_result.reg, INVALID_SREG); + FreeTemp(rl_temp_offset.GetReg()); + } } else { LoadBaseIndexed(rl_object.reg, rl_offset.reg, rl_result.reg, 0, kWord); } @@ -1449,8 +1456,15 @@ bool Mir2Lir::GenInlinedUnsafePut(CallInfo* info, bool is_long, RegLocation rl_value; if (is_long) { rl_value = LoadValueWide(rl_src_value, kCoreReg); - OpRegReg(kOpAdd, rl_object.reg, rl_offset.reg); - StoreBaseDispWide(rl_object.reg, 0, rl_value.reg); + if (cu_->instruction_set == kX86) { + StoreBaseIndexedDisp(rl_object.reg, rl_offset.reg, 1, 0, rl_value.reg.GetLow(), + rl_value.reg.GetHigh(), kLong, INVALID_SREG); + } else { + RegStorage rl_temp_offset = AllocTemp(); + OpRegRegReg(kOpAdd, rl_temp_offset, rl_object.reg, rl_offset.reg); + StoreBaseDispWide(rl_temp_offset, 0, rl_value.reg); + FreeTemp(rl_temp_offset.GetReg()); + } } else { rl_value = LoadValue(rl_src_value, kCoreReg); StoreBaseIndexed(rl_object.reg, rl_offset.reg, rl_value.reg, 0, kWord); |