Index: runtime/vm/intermediate_language_arm.cc |
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc |
index 1c24cd05a4c7e898304b979b85273d7995afebdb..45ec0271a6238b4586599f4380890875895891d0 100644 |
--- a/runtime/vm/intermediate_language_arm.cc |
+++ b/runtime/vm/intermediate_language_arm.cc |
@@ -24,6 +24,7 @@ |
namespace dart { |
+DECLARE_FLAG(bool, allow_absolute_addresses); |
DECLARE_FLAG(bool, emit_edge_counters); |
DECLARE_FLAG(int, optimization_counter_threshold); |
DECLARE_FLAG(bool, use_osr); |
@@ -1703,8 +1704,7 @@ void GuardFieldClassInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
if (field_cid != kSmiCid) { |
__ CompareImmediate(value_cid_reg, kNullCid); |
} else { |
- __ CompareImmediate(value_reg, |
- reinterpret_cast<intptr_t>(Object::null())); |
+ __ CompareObject(value_reg, Object::null_object()); |
} |
} |
__ b(fail, NE); |
@@ -2034,8 +2034,7 @@ static void EnsureMutableBox(FlowGraphCompiler* compiler, |
Register temp) { |
Label done; |
__ ldr(box_reg, FieldAddress(instance_reg, offset)); |
- __ CompareImmediate(box_reg, |
- reinterpret_cast<intptr_t>(Object::null())); |
+ __ CompareObject(box_reg, Object::null_object()); |
__ b(&done, NE); |
BoxAllocationSlowPath::Allocate( |
@@ -2352,7 +2351,7 @@ static void InlineArrayAllocation(FlowGraphCompiler* compiler, |
// R6: null |
if (num_elements > 0) { |
const intptr_t array_size = instance_size - sizeof(RawArray); |
- __ LoadImmediate(R6, reinterpret_cast<intptr_t>(Object::null())); |
+ __ LoadObject(R6, Object::null_object()); |
if (num_elements >= 2) { |
__ mov(R7, Operand(R6)); |
} else { |
@@ -2621,7 +2620,7 @@ void InstantiateTypeArgumentsInstr::EmitNativeCode( |
Label type_arguments_instantiated; |
const intptr_t len = type_arguments().Length(); |
if (type_arguments().IsRawInstantiatedRaw(len)) { |
- __ LoadImmediate(IP, reinterpret_cast<intptr_t>(Object::null())); |
+ __ LoadObject(IP, Object::null_object()); |
__ cmp(instantiator_reg, Operand(IP)); |
__ b(&type_arguments_instantiated, EQ); |
} |
@@ -2886,6 +2885,7 @@ class CheckStackOverflowSlowPath : public SlowPathCode { |
const Register value = instruction_->locs()->temp(0).reg(); |
__ Comment("CheckStackOverflowSlowPathOsr"); |
__ Bind(osr_entry_label()); |
+ ASSERT(FLAG_allow_absolute_addresses); |
__ LoadImmediate(IP, flags_address); |
__ LoadImmediate(value, Isolate::kOsrRequest); |
__ str(value, Address(IP)); |
@@ -2930,7 +2930,7 @@ void CheckStackOverflowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
CheckStackOverflowSlowPath* slow_path = new CheckStackOverflowSlowPath(this); |
compiler->AddSlowPathCode(slow_path); |
- if (compiler->is_optimizing()) { |
+ if (compiler->is_optimizing() && FLAG_allow_absolute_addresses) { |
__ LoadImmediate(IP, Isolate::Current()->stack_limit_address()); |
__ ldr(IP, Address(IP)); |
} else { |
@@ -3757,7 +3757,7 @@ void UnboxInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
if ((value()->Type()->ToNullableCid() == box_cid) && |
value()->Type()->is_nullable()) { |
- __ CompareImmediate(box, reinterpret_cast<intptr_t>(Object::null())); |
+ __ CompareObject(box, Object::null_object()); |
__ b(deopt, EQ); |
} else { |
__ tst(box, Operand(kSmiTagMask)); |
@@ -5916,8 +5916,7 @@ void CheckClassInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
ICData::kDeoptCheckClass, |
licm_hoisted_ ? ICData::kHoisted : 0); |
if (IsNullCheck()) { |
- __ CompareImmediate(locs()->in(0).reg(), |
- reinterpret_cast<intptr_t>(Object::null())); |
+ __ CompareObject(locs()->in(0).reg(), Object::null_object()); |
ASSERT(DeoptIfNull() || DeoptIfNotNull()); |
Condition cond = DeoptIfNull() ? EQ : NE; |
__ b(deopt, cond); |