summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Mathieu Chartier <mathieuc@google.com> 2014-04-03 02:45:19 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2014-04-03 02:45:19 +0000
commit8549cf9d83688f7decbbea2a8de761ce29e95f3c (patch)
treebcf136b958e0f8172cef38dfa2a760635c677c74
parent744924b701febe88bd67a9080999c08c76745807 (diff)
parent7c95cefc168ba81b17a9ed2d987ac5bcf0b05781 (diff)
Merge "Use temp register in Unsafe Get/Put intrisics for displaced offset."
-rw-r--r--compiler/dex/quick/gen_invoke.cc22
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);