Index: runtime/vm/intermediate_language_arm.cc |
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc |
index 4391ca6daf617b25971ccb69336645cd635badcb..41ebe81c75c6d1c5462507f4de492244c5a35ca9 100644 |
--- a/runtime/vm/intermediate_language_arm.cc |
+++ b/runtime/vm/intermediate_language_arm.cc |
@@ -1053,9 +1053,14 @@ LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Isolate* isolate, |
void LoadUntaggedInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
- const Register object = locs()->in(0).reg(); |
+ const Register obj = locs()->in(0).reg(); |
const Register result = locs()->out(0).reg(); |
- __ LoadFromOffset(kWord, result, object, offset() - kHeapObjectTag); |
+ if (object()->definition()->representation() == kUntagged) { |
+ __ LoadFromOffset(kWord, result, obj, offset()); |
+ } else { |
+ ASSERT(object()->definition()->representation() == kTagged); |
+ __ LoadFieldFromOffset(kWord, result, obj, offset()); |
+ } |
} |
@@ -1893,11 +1898,12 @@ LocationSummary* LoadCodeUnitsInstr::MakeLocationSummary(Isolate* isolate, |
void LoadCodeUnitsInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
- const Register array = locs()->in(0).reg(); |
+ // The string register points to the backing store for external strings. |
+ const Register str = locs()->in(0).reg(); |
const Location index = locs()->in(1); |
Address element_address = __ ElementAddressForRegIndex( |
- true, IsExternal(), class_id(), index_scale(), array, index.reg()); |
+ true, IsExternal(), class_id(), index_scale(), str, index.reg()); |
// Warning: element_address may use register IP as base. |
if (representation() == kUnboxedMint) { |
@@ -2218,8 +2224,7 @@ LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(Isolate* isolate, |
void LoadStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
const Register field = locs()->in(0).reg(); |
const Register result = locs()->out(0).reg(); |
- __ LoadFromOffset(kWord, result, |
- field, Field::value_offset() - kHeapObjectTag); |
+ __ LoadFieldFromOffset(kWord, result, field, Field::value_offset()); |
} |
@@ -2520,8 +2525,7 @@ void LoadFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
__ Bind(&load_pointer); |
} |
- __ LoadFromOffset(kWord, result_reg, |
- instance_reg, offset_in_bytes() - kHeapObjectTag); |
+ __ LoadFieldFromOffset(kWord, result_reg, instance_reg, offset_in_bytes()); |
__ Bind(&done); |
} |
@@ -3718,14 +3722,14 @@ void UnboxInstr::EmitLoadFromBox(FlowGraphCompiler* compiler) { |
switch (representation()) { |
case kUnboxedMint: { |
PairLocation* result = locs()->out(0).AsPairLocation(); |
- __ LoadFromOffset(kWord, |
- result->At(0).reg(), |
- box, |
- ValueOffset() - kHeapObjectTag); |
- __ LoadFromOffset(kWord, |
- result->At(1).reg(), |
- box, |
- ValueOffset() - kHeapObjectTag + kWordSize); |
+ __ LoadFieldFromOffset(kWord, |
+ result->At(0).reg(), |
+ box, |
+ ValueOffset()); |
+ __ LoadFieldFromOffset(kWord, |
+ result->At(1).reg(), |
+ box, |
+ ValueOffset() + kWordSize); |
break; |
} |
@@ -3945,15 +3949,12 @@ static void LoadInt32FromMint(FlowGraphCompiler* compiler, |
Register result, |
Register temp, |
Label* deopt) { |
- __ LoadFromOffset(kWord, |
- result, |
- mint, |
- Mint::value_offset() - kHeapObjectTag); |
+ __ LoadFieldFromOffset(kWord, result, mint, Mint::value_offset()); |
if (deopt != NULL) { |
- __ LoadFromOffset(kWord, |
- temp, |
- mint, |
- Mint::value_offset() - kHeapObjectTag + kWordSize); |
+ __ LoadFieldFromOffset(kWord, |
+ temp, |
+ mint, |
+ Mint::value_offset() + kWordSize); |
__ cmp(temp, Operand(result, ASR, kBitsPerWord - 1)); |
__ b(deopt, NE); |
} |