Index: runtime/vm/intermediate_language_ia32.cc |
=================================================================== |
--- runtime/vm/intermediate_language_ia32.cc (revision 31159) |
+++ runtime/vm/intermediate_language_ia32.cc (working copy) |
@@ -34,7 +34,7 @@ |
} |
-LocationSummary* PushArgumentInstr::MakeLocationSummary() const { |
+LocationSummary* PushArgumentInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps= 0; |
LocationSummary* locs = |
@@ -61,7 +61,7 @@ |
} |
-LocationSummary* ReturnInstr::MakeLocationSummary() const { |
+LocationSummary* ReturnInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
LocationSummary* locs = |
@@ -108,7 +108,7 @@ |
} |
-LocationSummary* LoadLocalInstr::MakeLocationSummary() const { |
+LocationSummary* LoadLocalInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 0; |
return LocationSummary::Make(kNumInputs, |
Location::RequiresRegister(), |
@@ -122,7 +122,7 @@ |
} |
-LocationSummary* StoreLocalInstr::MakeLocationSummary() const { |
+LocationSummary* StoreLocalInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
return LocationSummary::Make(kNumInputs, |
Location::SameAsFirstInput(), |
@@ -138,7 +138,7 @@ |
} |
-LocationSummary* ConstantInstr::MakeLocationSummary() const { |
+LocationSummary* ConstantInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 0; |
return LocationSummary::Make(kNumInputs, |
Location::RequiresRegister(), |
@@ -155,7 +155,7 @@ |
} |
-LocationSummary* AssertAssignableInstr::MakeLocationSummary() const { |
+LocationSummary* AssertAssignableInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 3; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -168,7 +168,7 @@ |
} |
-LocationSummary* AssertBooleanInstr::MakeLocationSummary() const { |
+LocationSummary* AssertBooleanInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
LocationSummary* locs = |
@@ -229,7 +229,7 @@ |
} |
-LocationSummary* EqualityCompareInstr::MakeLocationSummary() const { |
+LocationSummary* EqualityCompareInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 2; |
if (operation_cid() == kMintCid) { |
const intptr_t kNumTemps = 1; |
@@ -549,7 +549,7 @@ |
} |
-LocationSummary* TestSmiInstr::MakeLocationSummary() const { |
+LocationSummary* TestSmiInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 2; |
const intptr_t kNumTemps = 0; |
LocationSummary* locs = |
@@ -593,7 +593,7 @@ |
} |
-LocationSummary* RelationalOpInstr::MakeLocationSummary() const { |
+LocationSummary* RelationalOpInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 2; |
const intptr_t kNumTemps = 0; |
if (operation_cid() == kMintCid) { |
@@ -667,7 +667,7 @@ |
} |
-LocationSummary* NativeCallInstr::MakeLocationSummary() const { |
+LocationSummary* NativeCallInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 0; |
const intptr_t kNumTemps = 3; |
LocationSummary* locs = |
@@ -721,7 +721,7 @@ |
} |
-LocationSummary* StringFromCharCodeInstr::MakeLocationSummary() const { |
+LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
// TODO(fschneider): Allow immediate operands for the char code. |
return LocationSummary::Make(kNumInputs, |
@@ -742,7 +742,7 @@ |
} |
-LocationSummary* StringInterpolateInstr::MakeLocationSummary() const { |
+LocationSummary* StringInterpolateInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -768,7 +768,7 @@ |
} |
-LocationSummary* LoadUntaggedInstr::MakeLocationSummary() const { |
+LocationSummary* LoadUntaggedInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
return LocationSummary::Make(kNumInputs, |
Location::RequiresRegister(), |
@@ -783,7 +783,7 @@ |
} |
-LocationSummary* LoadClassIdInstr::MakeLocationSummary() const { |
+LocationSummary* LoadClassIdInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
return LocationSummary::Make(kNumInputs, |
Location::RequiresRegister(), |
@@ -879,7 +879,7 @@ |
} |
-LocationSummary* LoadIndexedInstr::MakeLocationSummary() const { |
+LocationSummary* LoadIndexedInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 2; |
const intptr_t kNumTemps = 0; |
LocationSummary* locs = |
@@ -1048,7 +1048,7 @@ |
} |
-LocationSummary* StoreIndexedInstr::MakeLocationSummary() const { |
+LocationSummary* StoreIndexedInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 3; |
const intptr_t kNumTemps = 0; |
LocationSummary* locs = |
@@ -1232,7 +1232,7 @@ |
} |
-LocationSummary* GuardFieldInstr::MakeLocationSummary() const { |
+LocationSummary* GuardFieldInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
LocationSummary* summary = |
new LocationSummary(kNumInputs, 0, LocationSummary::kNoCall); |
@@ -1581,21 +1581,147 @@ |
} |
-LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary() const { |
+class StoreInstanceFieldSlowPath : public SlowPathCode { |
+ public: |
+ explicit StoreInstanceFieldSlowPath(StoreInstanceFieldInstr* instruction) |
+ : instruction_(instruction) { } |
+ |
+ virtual void EmitNativeCode(FlowGraphCompiler* compiler) { |
+ __ Comment("StoreInstanceFieldSlowPath"); |
+ __ Bind(entry_label()); |
+ const Class& double_class = compiler->double_class(); |
+ const Code& stub = |
+ Code::Handle(StubCode::GetAllocationStubForClass(double_class)); |
+ const ExternalLabel label(double_class.ToCString(), stub.EntryPoint()); |
+ |
+ LocationSummary* locs = instruction_->locs(); |
+ locs->live_registers()->Remove(locs->out()); |
+ |
+ compiler->SaveLiveRegisters(locs); |
+ compiler->GenerateCall(Scanner::kDummyTokenIndex, // No token position. |
+ &label, |
+ PcDescriptors::kOther, |
+ locs); |
+ __ MoveRegister(locs->temp(0).reg(), EAX); |
+ compiler->RestoreLiveRegisters(locs); |
+ |
+ __ jmp(exit_label()); |
+ } |
+ |
+ private: |
+ StoreInstanceFieldInstr* instruction_; |
+}; |
+ |
+ |
+LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 2; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
- new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
+ new LocationSummary(kNumInputs, kNumTemps, |
+ (field().guarded_cid() == kIllegalCid) || (is_initialization_) |
+ ? LocationSummary::kCallOnSlowPath |
+ : LocationSummary::kNoCall); |
+ |
summary->set_in(0, Location::RequiresRegister()); |
- summary->set_in(1, ShouldEmitStoreBarrier() |
+ if (IsUnboxedStore() && opt) { |
+ summary->set_in(1, Location::RequiresFpuRegister()); |
+ summary->AddTemp(Location::RequiresRegister()); |
+ summary->AddTemp(Location::RequiresRegister()); |
+ } else if (IsPotentialUnboxedStore()) { |
+ summary->set_in(1, ShouldEmitStoreBarrier() |
+ ? Location::WritableRegister() |
+ : Location::RequiresRegister()); |
+ summary->AddTemp(Location::RequiresRegister()); |
+ summary->AddTemp(Location::RequiresRegister()); |
+ summary->AddTemp(opt ? Location::RequiresFpuRegister() |
+ : Location::FpuRegisterLocation(XMM1)); |
+ } else { |
+ summary->set_in(1, ShouldEmitStoreBarrier() |
? Location::WritableRegister() |
: Location::RegisterOrConstant(value())); |
+ } |
return summary; |
} |
void StoreInstanceFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
+ Label skip_store; |
+ |
Register instance_reg = locs()->in(0).reg(); |
+ |
+ if (IsUnboxedStore() && compiler->is_optimizing()) { |
+ XmmRegister value = locs()->in(1).fpu_reg(); |
+ Register temp = locs()->temp(0).reg(); |
+ Register temp2 = locs()->temp(1).reg(); |
+ |
+ if (is_initialization_) { |
+ StoreInstanceFieldSlowPath* slow_path = |
+ new StoreInstanceFieldSlowPath(this); |
+ compiler->AddSlowPathCode(slow_path); |
+ |
+ __ TryAllocate(compiler->double_class(), |
+ slow_path->entry_label(), |
+ Assembler::kFarJump, |
+ temp); |
+ __ Bind(slow_path->exit_label()); |
+ __ movl(temp2, temp); |
+ __ StoreIntoObject(instance_reg, |
+ FieldAddress(instance_reg, field().Offset()), |
+ temp2); |
+ } else { |
+ __ movl(temp, FieldAddress(instance_reg, field().Offset())); |
+ } |
+ __ movsd(FieldAddress(temp, Double::value_offset()), value); |
+ return; |
+ } |
+ |
+ if (IsPotentialUnboxedStore()) { |
+ Register value_reg = locs()->in(1).reg(); |
+ Register temp = locs()->temp(0).reg(); |
+ Register temp2 = locs()->temp(1).reg(); |
+ FpuRegister fpu_temp = locs()->temp(2).fpu_reg(); |
+ |
+ Label store_pointer, copy_payload; |
+ __ LoadObject(temp, Field::ZoneHandle(field().raw())); |
+ __ cmpl(FieldAddress(temp, Field::guarded_cid_offset()), |
+ Immediate(kDoubleCid)); |
+ __ j(NOT_EQUAL, &store_pointer); |
+ __ cmpl(FieldAddress(temp, Field::is_nullable_offset()), |
+ Immediate(kNullCid)); |
+ __ j(EQUAL, &store_pointer); |
+ |
+ const Immediate& raw_null = |
+ Immediate(reinterpret_cast<intptr_t>(Object::null())); |
+ __ movl(temp, FieldAddress(instance_reg, field().Offset())); |
+ __ cmpl(temp, raw_null); |
+ __ j(NOT_EQUAL, ©_payload); |
+ |
+ StoreInstanceFieldSlowPath* slow_path = |
+ new StoreInstanceFieldSlowPath(this); |
+ compiler->AddSlowPathCode(slow_path); |
+ |
+ if (!compiler->is_optimizing()) { |
+ locs()->live_registers()->Add(locs()->in(0)); |
+ locs()->live_registers()->Add(locs()->in(1)); |
+ } |
+ |
+ __ TryAllocate(compiler->double_class(), |
+ slow_path->entry_label(), |
+ Assembler::kFarJump, |
+ temp); |
+ __ Bind(slow_path->exit_label()); |
+ __ movl(temp2, temp); |
+ __ StoreIntoObject(instance_reg, |
+ FieldAddress(instance_reg, field().Offset()), |
+ temp2); |
+ |
+ __ Bind(©_payload); |
+ __ movsd(fpu_temp, FieldAddress(value_reg, Double::value_offset())); |
+ __ movsd(FieldAddress(temp, Double::value_offset()), fpu_temp); |
+ __ jmp(&skip_store); |
+ __ Bind(&store_pointer); |
+ } |
+ |
if (ShouldEmitStoreBarrier()) { |
Register value_reg = locs()->in(1).reg(); |
__ StoreIntoObject(instance_reg, |
@@ -1614,10 +1740,11 @@ |
FieldAddress(instance_reg, field().Offset()), value_reg); |
} |
} |
+ __ Bind(&skip_store); |
} |
-LocationSummary* LoadStaticFieldInstr::MakeLocationSummary() const { |
+LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -1642,7 +1769,7 @@ |
} |
-LocationSummary* StoreStaticFieldInstr::MakeLocationSummary() const { |
+LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(bool opt) const { |
LocationSummary* locs = new LocationSummary(1, 1, LocationSummary::kNoCall); |
locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister() |
: Location::RequiresRegister()); |
@@ -1666,7 +1793,7 @@ |
} |
-LocationSummary* InstanceOfInstr::MakeLocationSummary() const { |
+LocationSummary* InstanceOfInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 3; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -1693,7 +1820,7 @@ |
} |
-LocationSummary* CreateArrayInstr::MakeLocationSummary() const { |
+LocationSummary* CreateArrayInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
LocationSummary* locs = |
@@ -1717,7 +1844,7 @@ |
LocationSummary* |
-AllocateObjectWithBoundsCheckInstr::MakeLocationSummary() const { |
+AllocateObjectWithBoundsCheckInstr::MakeLocationSummary(bool opt) const { |
return MakeCallSummary(); |
} |
@@ -1735,22 +1862,114 @@ |
} |
-LocationSummary* LoadFieldInstr::MakeLocationSummary() const { |
- return LocationSummary::Make(1, |
- Location::RequiresRegister(), |
- LocationSummary::kNoCall); |
+class BoxDoubleSlowPath : public SlowPathCode { |
+ public: |
+ explicit BoxDoubleSlowPath(Instruction* instruction) |
+ : instruction_(instruction) { } |
+ |
+ virtual void EmitNativeCode(FlowGraphCompiler* compiler) { |
+ __ Comment("BoxDoubleSlowPath"); |
+ __ Bind(entry_label()); |
+ const Class& double_class = compiler->double_class(); |
+ const Code& stub = |
+ Code::Handle(StubCode::GetAllocationStubForClass(double_class)); |
+ const ExternalLabel label(double_class.ToCString(), stub.EntryPoint()); |
+ |
+ LocationSummary* locs = instruction_->locs(); |
+ locs->live_registers()->Remove(locs->out()); |
+ |
+ compiler->SaveLiveRegisters(locs); |
+ compiler->GenerateCall(Scanner::kDummyTokenIndex, // No token position. |
+ &label, |
+ PcDescriptors::kOther, |
+ locs); |
+ __ MoveRegister(locs->out().reg(), EAX); |
+ compiler->RestoreLiveRegisters(locs); |
+ |
+ __ jmp(exit_label()); |
+ } |
+ |
+ private: |
+ Instruction* instruction_; |
+}; |
+ |
+ |
+LocationSummary* LoadFieldInstr::MakeLocationSummary(bool opt) const { |
+ const intptr_t kNumInputs = 1; |
+ const intptr_t kNumTemps = 0; |
+ LocationSummary* locs = |
+ new LocationSummary( |
+ kNumInputs, kNumTemps, |
+ (opt && !IsPotentialUnboxedLoad()) |
+ ? LocationSummary::kNoCall |
+ : LocationSummary::kCallOnSlowPath); |
+ |
+ locs->set_in(0, Location::RequiresRegister()); |
+ |
+ if (IsUnboxedLoad() && opt) { |
+ locs->AddTemp(Location::RequiresRegister()); |
+ } else if (IsPotentialUnboxedLoad()) { |
+ locs->AddTemp(opt ? Location::RequiresFpuRegister() |
+ : Location::FpuRegisterLocation(XMM1)); |
+ locs->AddTemp(Location::RequiresRegister()); |
+ } |
+ locs->set_out(Location::RequiresRegister()); |
+ return locs; |
} |
void LoadFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
Register instance_reg = locs()->in(0).reg(); |
- Register result_reg = locs()->out().reg(); |
+ if (IsUnboxedLoad() && compiler->is_optimizing()) { |
+ XmmRegister result = locs()->out().fpu_reg(); |
+ Register temp = locs()->temp(0).reg(); |
+ __ movl(temp, FieldAddress(instance_reg, offset_in_bytes())); |
+ __ movsd(result, FieldAddress(temp, Double::value_offset())); |
+ return; |
+ } |
- __ movl(result_reg, FieldAddress(instance_reg, offset_in_bytes())); |
+ Label done; |
+ Register result = locs()->out().reg(); |
+ if (IsPotentialUnboxedLoad()) { |
+ Register temp = locs()->temp(1).reg(); |
+ XmmRegister value = locs()->temp(0).fpu_reg(); |
+ |
+ Label load_pointer; |
+ __ LoadObject(result, Field::ZoneHandle(field()->raw())); |
+ |
+ FieldAddress field_cid_operand(result, Field::guarded_cid_offset()); |
+ FieldAddress field_nullability_operand(result, Field::is_nullable_offset()); |
+ |
+ __ cmpl(field_cid_operand, Immediate(kDoubleCid)); |
+ __ j(NOT_EQUAL, &load_pointer); |
+ |
+ __ cmpl(field_nullability_operand, Immediate(kNullCid)); |
+ __ j(EQUAL, &load_pointer); |
+ |
+ BoxDoubleSlowPath* slow_path = new BoxDoubleSlowPath(this); |
+ compiler->AddSlowPathCode(slow_path); |
+ |
+ if (!compiler->is_optimizing()) { |
+ locs()->live_registers()->Add(locs()->in(0)); |
+ } |
+ |
+ __ TryAllocate(compiler->double_class(), |
+ slow_path->entry_label(), |
+ Assembler::kFarJump, |
+ result); |
+ __ Bind(slow_path->exit_label()); |
+ __ movl(temp, FieldAddress(instance_reg, offset_in_bytes())); |
+ __ movsd(value, FieldAddress(temp, Double::value_offset())); |
+ __ movsd(FieldAddress(result, Double::value_offset()), value); |
+ __ jmp(&done); |
+ __ Bind(&load_pointer); |
+ } |
+ __ movl(result, FieldAddress(instance_reg, offset_in_bytes())); |
+ __ Bind(&done); |
} |
-LocationSummary* InstantiateTypeInstr::MakeLocationSummary() const { |
+LocationSummary* InstantiateTypeInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
LocationSummary* locs = |
@@ -1782,7 +2001,8 @@ |
} |
-LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary() const { |
+LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary( |
+ bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
LocationSummary* locs = |
@@ -1832,7 +2052,7 @@ |
LocationSummary* |
-ExtractConstructorTypeArgumentsInstr::MakeLocationSummary() const { |
+ExtractConstructorTypeArgumentsInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
LocationSummary* locs = |
@@ -1875,7 +2095,7 @@ |
LocationSummary* |
-ExtractConstructorInstantiatorInstr::MakeLocationSummary() const { |
+ExtractConstructorInstantiatorInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
LocationSummary* locs = |
@@ -1915,7 +2135,7 @@ |
} |
-LocationSummary* AllocateContextInstr::MakeLocationSummary() const { |
+LocationSummary* AllocateContextInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 0; |
const intptr_t kNumTemps = 1; |
LocationSummary* locs = |
@@ -1940,7 +2160,7 @@ |
} |
-LocationSummary* CloneContextInstr::MakeLocationSummary() const { |
+LocationSummary* CloneContextInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
LocationSummary* locs = |
@@ -1967,7 +2187,7 @@ |
} |
-LocationSummary* CatchBlockEntryInstr::MakeLocationSummary() const { |
+LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(bool opt) const { |
UNREACHABLE(); |
return NULL; |
} |
@@ -2000,7 +2220,7 @@ |
} |
-LocationSummary* CheckStackOverflowInstr::MakeLocationSummary() const { |
+LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 0; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -2190,7 +2410,7 @@ |
} |
-LocationSummary* BinarySmiOpInstr::MakeLocationSummary() const { |
+LocationSummary* BinarySmiOpInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 2; |
if (op_kind() == Token::kTRUNCDIV) { |
const intptr_t kNumTemps = 1; |
@@ -2560,7 +2780,7 @@ |
} |
-LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary() const { |
+LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(bool opt) const { |
intptr_t left_cid = left()->Type()->ToCid(); |
intptr_t right_cid = right()->Type()->ToCid(); |
ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid)); |
@@ -2596,7 +2816,7 @@ |
} |
-LocationSummary* BoxDoubleInstr::MakeLocationSummary() const { |
+LocationSummary* BoxDoubleInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -2609,38 +2829,6 @@ |
} |
-class BoxDoubleSlowPath : public SlowPathCode { |
- public: |
- explicit BoxDoubleSlowPath(BoxDoubleInstr* instruction) |
- : instruction_(instruction) { } |
- |
- virtual void EmitNativeCode(FlowGraphCompiler* compiler) { |
- __ Comment("BoxDoubleSlowPath"); |
- __ Bind(entry_label()); |
- const Class& double_class = compiler->double_class(); |
- const Code& stub = |
- Code::Handle(StubCode::GetAllocationStubForClass(double_class)); |
- const ExternalLabel label(double_class.ToCString(), stub.EntryPoint()); |
- |
- LocationSummary* locs = instruction_->locs(); |
- locs->live_registers()->Remove(locs->out()); |
- |
- compiler->SaveLiveRegisters(locs); |
- compiler->GenerateCall(Scanner::kDummyTokenIndex, // No token position. |
- &label, |
- PcDescriptors::kOther, |
- locs); |
- __ MoveRegister(locs->out().reg(), EAX); |
- compiler->RestoreLiveRegisters(locs); |
- |
- __ jmp(exit_label()); |
- } |
- |
- private: |
- BoxDoubleInstr* instruction_; |
-}; |
- |
- |
void BoxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
BoxDoubleSlowPath* slow_path = new BoxDoubleSlowPath(this); |
compiler->AddSlowPathCode(slow_path); |
@@ -2657,7 +2845,7 @@ |
} |
-LocationSummary* UnboxDoubleInstr::MakeLocationSummary() const { |
+LocationSummary* UnboxDoubleInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t value_cid = value()->Type()->ToCid(); |
const bool needs_temp = ((value_cid != kSmiCid) && (value_cid != kDoubleCid)); |
@@ -2703,7 +2891,7 @@ |
} |
-LocationSummary* BoxFloat32x4Instr::MakeLocationSummary() const { |
+LocationSummary* BoxFloat32x4Instr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -2764,7 +2952,7 @@ |
} |
-LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary() const { |
+LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary(bool opt) const { |
const intptr_t value_cid = value()->Type()->ToCid(); |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = value_cid == kFloat32x4Cid ? 0 : 1; |
@@ -2797,7 +2985,7 @@ |
} |
-LocationSummary* BoxInt32x4Instr::MakeLocationSummary() const { |
+LocationSummary* BoxInt32x4Instr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -2858,7 +3046,7 @@ |
} |
-LocationSummary* UnboxInt32x4Instr::MakeLocationSummary() const { |
+LocationSummary* UnboxInt32x4Instr::MakeLocationSummary(bool opt) const { |
const intptr_t value_cid = value()->Type()->ToCid(); |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = value_cid == kInt32x4Cid ? 0 : 1; |
@@ -2892,7 +3080,7 @@ |
-LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary() const { |
+LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 2; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -2920,7 +3108,7 @@ |
} |
-LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary() const { |
+LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 2; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -2948,7 +3136,7 @@ |
} |
-LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary() const { |
+LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -2990,7 +3178,7 @@ |
} |
-LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary() const { |
+LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 2; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -3017,7 +3205,7 @@ |
} |
-LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary() const { |
+LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -3037,7 +3225,8 @@ |
} |
-LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary() const { |
+LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary( |
+ bool opt) const { |
const intptr_t kNumInputs = 4; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -3074,7 +3263,7 @@ |
} |
-LocationSummary* Float32x4ZeroInstr::MakeLocationSummary() const { |
+LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 0; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -3090,7 +3279,7 @@ |
} |
-LocationSummary* Float32x4SplatInstr::MakeLocationSummary() const { |
+LocationSummary* Float32x4SplatInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -3111,7 +3300,7 @@ |
} |
-LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary() const { |
+LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 2; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -3154,7 +3343,7 @@ |
} |
-LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary() const { |
+LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 2; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -3184,7 +3373,7 @@ |
} |
-LocationSummary* Float32x4ScaleInstr::MakeLocationSummary() const { |
+LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 2; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -3213,7 +3402,7 @@ |
} |
-LocationSummary* Float32x4SqrtInstr::MakeLocationSummary() const { |
+LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -3244,7 +3433,7 @@ |
} |
-LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary() const { |
+LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -3271,7 +3460,7 @@ |
} |
-LocationSummary* Float32x4ClampInstr::MakeLocationSummary() const { |
+LocationSummary* Float32x4ClampInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 3; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -3294,7 +3483,7 @@ |
} |
-LocationSummary* Float32x4WithInstr::MakeLocationSummary() const { |
+LocationSummary* Float32x4WithInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 2; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -3362,7 +3551,7 @@ |
} |
-LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary() const { |
+LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -3378,7 +3567,8 @@ |
} |
-LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary() const { |
+LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary( |
+ bool opt) const { |
const intptr_t kNumInputs = 4; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -3440,7 +3630,7 @@ |
} |
-LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary() const { |
+LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -3485,7 +3675,7 @@ |
} |
-LocationSummary* Int32x4SelectInstr::MakeLocationSummary() const { |
+LocationSummary* Int32x4SelectInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 3; |
const intptr_t kNumTemps = 1; |
LocationSummary* summary = |
@@ -3519,7 +3709,7 @@ |
} |
-LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary() const { |
+LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 2; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -3575,7 +3765,7 @@ |
} |
-LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary() const { |
+LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -3591,7 +3781,7 @@ |
} |
-LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary() const { |
+LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 2; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -3631,7 +3821,7 @@ |
} |
-LocationSummary* MathUnaryInstr::MakeLocationSummary() const { |
+LocationSummary* MathUnaryInstr::MakeLocationSummary(bool opt) const { |
if ((kind() == MethodRecognizer::kMathSin) || |
(kind() == MethodRecognizer::kMathCos)) { |
const intptr_t kNumInputs = 1; |
@@ -3667,7 +3857,7 @@ |
} |
-LocationSummary* MathMinMaxInstr::MakeLocationSummary() const { |
+LocationSummary* MathMinMaxInstr::MakeLocationSummary(bool opt) const { |
if (result_cid() == kDoubleCid) { |
const intptr_t kNumInputs = 2; |
const intptr_t kNumTemps = 1; |
@@ -3755,7 +3945,7 @@ |
} |
-LocationSummary* UnarySmiOpInstr::MakeLocationSummary() const { |
+LocationSummary* UnarySmiOpInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
return LocationSummary::Make(kNumInputs, |
Location::SameAsFirstInput(), |
@@ -3784,7 +3974,7 @@ |
} |
-LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary() const { |
+LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -3802,7 +3992,7 @@ |
} |
-LocationSummary* SmiToDoubleInstr::MakeLocationSummary() const { |
+LocationSummary* SmiToDoubleInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
LocationSummary* result = |
@@ -3821,7 +4011,7 @@ |
} |
-LocationSummary* DoubleToIntegerInstr::MakeLocationSummary() const { |
+LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
LocationSummary* result = |
@@ -3865,7 +4055,7 @@ |
} |
-LocationSummary* DoubleToSmiInstr::MakeLocationSummary() const { |
+LocationSummary* DoubleToSmiInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
LocationSummary* result = new LocationSummary( |
@@ -3888,7 +4078,7 @@ |
} |
-LocationSummary* DoubleToDoubleInstr::MakeLocationSummary() const { |
+LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
LocationSummary* result = |
@@ -3918,7 +4108,7 @@ |
} |
-LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary() const { |
+LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(bool opt) const { |
ASSERT((InputCount() == 1) || (InputCount() == 2)); |
const intptr_t kNumTemps = 0; |
LocationSummary* result = |
@@ -3989,7 +4179,7 @@ |
} |
-LocationSummary* MergedMathInstr::MakeLocationSummary() const { |
+LocationSummary* MergedMathInstr::MakeLocationSummary(bool opt) const { |
if (kind() == MergedMathInstr::kTruncDivMod) { |
const intptr_t kNumInputs = 2; |
const intptr_t kNumTemps = 1; |
@@ -4139,7 +4329,8 @@ |
} |
-LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary() const { |
+LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary( |
+ bool opt) const { |
return MakeCallSummary(); |
} |
@@ -4182,9 +4373,11 @@ |
} |
-LocationSummary* BranchInstr::MakeLocationSummary() const { |
- UNREACHABLE(); |
- return NULL; |
+LocationSummary* BranchInstr::MakeLocationSummary(bool opt) const { |
+ comparison()->InitializeLocationSummary(opt); |
+ // Branches don't produce a result. |
+ comparison()->locs()->set_out(Location::NoLocation()); |
+ return comparison()->locs(); |
} |
@@ -4193,7 +4386,7 @@ |
} |
-LocationSummary* CheckClassInstr::MakeLocationSummary() const { |
+LocationSummary* CheckClassInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -4253,7 +4446,7 @@ |
} |
-LocationSummary* CheckSmiInstr::MakeLocationSummary() const { |
+LocationSummary* CheckSmiInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -4272,7 +4465,7 @@ |
} |
-LocationSummary* CheckArrayBoundInstr::MakeLocationSummary() const { |
+LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 2; |
const intptr_t kNumTemps = 0; |
LocationSummary* locs = |
@@ -4325,7 +4518,7 @@ |
} |
-LocationSummary* UnboxIntegerInstr::MakeLocationSummary() const { |
+LocationSummary* UnboxIntegerInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t value_cid = value()->Type()->ToCid(); |
const bool needs_temp = ((value_cid != kSmiCid) && (value_cid != kMintCid)); |
@@ -4373,7 +4566,7 @@ |
} |
-LocationSummary* BoxIntegerInstr::MakeLocationSummary() const { |
+LocationSummary* BoxIntegerInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 2; |
LocationSummary* summary = |
@@ -4461,7 +4654,7 @@ |
} |
-LocationSummary* BinaryMintOpInstr::MakeLocationSummary() const { |
+LocationSummary* BinaryMintOpInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 2; |
switch (op_kind()) { |
case Token::kBIT_AND: |
@@ -4551,7 +4744,7 @@ |
} |
-LocationSummary* ShiftMintOpInstr::MakeLocationSummary() const { |
+LocationSummary* ShiftMintOpInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 2; |
const intptr_t kNumTemps = op_kind() == Token::kSHL ? 2 : 1; |
LocationSummary* summary = |
@@ -4625,7 +4818,7 @@ |
} |
-LocationSummary* UnaryMintOpInstr::MakeLocationSummary() const { |
+LocationSummary* UnaryMintOpInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = |
FLAG_throw_on_javascript_int_overflow ? 1 : 0; |
@@ -4658,7 +4851,7 @@ |
} |
-LocationSummary* ThrowInstr::MakeLocationSummary() const { |
+LocationSummary* ThrowInstr::MakeLocationSummary(bool opt) const { |
return new LocationSummary(0, 0, LocationSummary::kCall); |
} |
@@ -4674,7 +4867,7 @@ |
} |
-LocationSummary* ReThrowInstr::MakeLocationSummary() const { |
+LocationSummary* ReThrowInstr::MakeLocationSummary(bool opt) const { |
return new LocationSummary(0, 0, LocationSummary::kCall); |
} |
@@ -4714,7 +4907,7 @@ |
} |
-LocationSummary* GotoInstr::MakeLocationSummary() const { |
+LocationSummary* GotoInstr::MakeLocationSummary(bool opt) const { |
return new LocationSummary(0, 0, LocationSummary::kNoCall); |
} |
@@ -4743,7 +4936,7 @@ |
} |
-LocationSummary* CurrentContextInstr::MakeLocationSummary() const { |
+LocationSummary* CurrentContextInstr::MakeLocationSummary(bool opt) const { |
return LocationSummary::Make(0, |
Location::RequiresRegister(), |
LocationSummary::kNoCall); |
@@ -4755,7 +4948,7 @@ |
} |
-LocationSummary* StrictCompareInstr::MakeLocationSummary() const { |
+LocationSummary* StrictCompareInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 2; |
const intptr_t kNumTemps = 0; |
if (needs_number_check()) { |
@@ -4841,11 +5034,11 @@ |
} |
-LocationSummary* IfThenElseInstr::MakeLocationSummary() const { |
- LocationSummary* locs = comparison()->MakeLocationSummary(); |
+LocationSummary* IfThenElseInstr::MakeLocationSummary(bool opt) const { |
+ comparison()->InitializeLocationSummary(opt); |
// TODO(vegorov): support byte register constraints in the register allocator. |
- locs->set_out(Location::RegisterLocation(EDX)); |
- return locs; |
+ comparison()->locs()->set_out(Location::RegisterLocation(EDX)); |
+ return comparison()->locs(); |
} |
@@ -4898,7 +5091,7 @@ |
} |
-LocationSummary* ClosureCallInstr::MakeLocationSummary() const { |
+LocationSummary* ClosureCallInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 0; |
const intptr_t kNumTemps = 1; |
LocationSummary* result = |
@@ -4928,7 +5121,7 @@ |
} |
-LocationSummary* BooleanNegateInstr::MakeLocationSummary() const { |
+LocationSummary* BooleanNegateInstr::MakeLocationSummary(bool opt) const { |
return LocationSummary::Make(1, |
Location::RequiresRegister(), |
LocationSummary::kNoCall); |
@@ -4948,7 +5141,7 @@ |
} |
-LocationSummary* StoreVMFieldInstr::MakeLocationSummary() const { |
+LocationSummary* StoreVMFieldInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 2; |
const intptr_t kNumTemps = 0; |
LocationSummary* locs = |
@@ -4974,7 +5167,7 @@ |
} |
-LocationSummary* AllocateObjectInstr::MakeLocationSummary() const { |
+LocationSummary* AllocateObjectInstr::MakeLocationSummary(bool opt) const { |
return MakeCallSummary(); |
} |
@@ -4990,7 +5183,7 @@ |
} |
-LocationSummary* CreateClosureInstr::MakeLocationSummary() const { |
+LocationSummary* CreateClosureInstr::MakeLocationSummary(bool opt) const { |
return MakeCallSummary(); |
} |