OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_IA32. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_IA32. |
6 #if defined(TARGET_ARCH_IA32) | 6 #if defined(TARGET_ARCH_IA32) |
7 | 7 |
8 #include "vm/intermediate_language.h" | 8 #include "vm/intermediate_language.h" |
9 | 9 |
10 #include "vm/dart_entry.h" | 10 #include "vm/dart_entry.h" |
(...skipping 782 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
793 | 793 |
794 | 794 |
795 void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 795 void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
796 ASSERT(locs()->temp(0).reg() == EAX); | 796 ASSERT(locs()->temp(0).reg() == EAX); |
797 ASSERT(locs()->temp(1).reg() == ECX); | 797 ASSERT(locs()->temp(1).reg() == ECX); |
798 ASSERT(locs()->temp(2).reg() == EDX); | 798 ASSERT(locs()->temp(2).reg() == EDX); |
799 Register result = locs()->out(0).reg(); | 799 Register result = locs()->out(0).reg(); |
800 const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function()); | 800 const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function()); |
801 const bool is_leaf_call = | 801 const bool is_leaf_call = |
802 (argc_tag & NativeArguments::AutoSetupScopeMask()) == 0; | 802 (argc_tag & NativeArguments::AutoSetupScopeMask()) == 0; |
| 803 StubCode* stub_code = compiler->isolate()->stub_code(); |
803 | 804 |
804 // Push the result place holder initialized to NULL. | 805 // Push the result place holder initialized to NULL. |
805 __ PushObject(Object::ZoneHandle()); | 806 __ PushObject(Object::ZoneHandle()); |
806 // Pass a pointer to the first argument in EAX. | 807 // Pass a pointer to the first argument in EAX. |
807 if (!function().HasOptionalParameters()) { | 808 if (!function().HasOptionalParameters()) { |
808 __ leal(EAX, Address(EBP, (kParamEndSlotFromFp + | 809 __ leal(EAX, Address(EBP, (kParamEndSlotFromFp + |
809 function().NumParameters()) * kWordSize)); | 810 function().NumParameters()) * kWordSize)); |
810 } else { | 811 } else { |
811 __ leal(EAX, Address(EBP, kFirstLocalSlotFromFp * kWordSize)); | 812 __ leal(EAX, Address(EBP, kFirstLocalSlotFromFp * kWordSize)); |
812 } | 813 } |
813 __ movl(ECX, Immediate(reinterpret_cast<uword>(native_c_function()))); | 814 __ movl(ECX, Immediate(reinterpret_cast<uword>(native_c_function()))); |
814 __ movl(EDX, Immediate(argc_tag)); | 815 __ movl(EDX, Immediate(argc_tag)); |
815 const ExternalLabel* stub_entry = (is_bootstrap_native() || is_leaf_call) ? | 816 const ExternalLabel* stub_entry = (is_bootstrap_native() || is_leaf_call) ? |
816 &StubCode::CallBootstrapCFunctionLabel() : | 817 &stub_code->CallBootstrapCFunctionLabel() : |
817 &StubCode::CallNativeCFunctionLabel(); | 818 &stub_code->CallNativeCFunctionLabel(); |
818 compiler->GenerateCall(token_pos(), | 819 compiler->GenerateCall(token_pos(), |
819 stub_entry, | 820 stub_entry, |
820 PcDescriptors::kOther, | 821 PcDescriptors::kOther, |
821 locs()); | 822 locs()); |
822 __ popl(result); | 823 __ popl(result); |
823 } | 824 } |
824 | 825 |
825 | 826 |
826 static bool CanBeImmediateIndex(Value* value, intptr_t cid) { | 827 static bool CanBeImmediateIndex(Value* value, intptr_t cid) { |
827 ConstantInstr* constant = value->definition()->AsConstant(); | 828 ConstantInstr* constant = value->definition()->AsConstant(); |
(...skipping 874 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1702 | 1703 |
1703 class StoreInstanceFieldSlowPath : public SlowPathCode { | 1704 class StoreInstanceFieldSlowPath : public SlowPathCode { |
1704 public: | 1705 public: |
1705 StoreInstanceFieldSlowPath(StoreInstanceFieldInstr* instruction, | 1706 StoreInstanceFieldSlowPath(StoreInstanceFieldInstr* instruction, |
1706 const Class& cls) | 1707 const Class& cls) |
1707 : instruction_(instruction), cls_(cls) { } | 1708 : instruction_(instruction), cls_(cls) { } |
1708 | 1709 |
1709 virtual void EmitNativeCode(FlowGraphCompiler* compiler) { | 1710 virtual void EmitNativeCode(FlowGraphCompiler* compiler) { |
1710 __ Comment("StoreInstanceFieldSlowPath"); | 1711 __ Comment("StoreInstanceFieldSlowPath"); |
1711 __ Bind(entry_label()); | 1712 __ Bind(entry_label()); |
| 1713 Isolate* isolate = compiler->isolate(); |
1712 const Code& stub = | 1714 const Code& stub = |
1713 Code::Handle(StubCode::GetAllocationStubForClass(cls_)); | 1715 Code::Handle(isolate, |
| 1716 isolate->stub_code()->GetAllocationStubForClass(cls_)); |
1714 const ExternalLabel label(stub.EntryPoint()); | 1717 const ExternalLabel label(stub.EntryPoint()); |
1715 | 1718 |
1716 LocationSummary* locs = instruction_->locs(); | 1719 LocationSummary* locs = instruction_->locs(); |
1717 locs->live_registers()->Remove(locs->out(0)); | 1720 locs->live_registers()->Remove(locs->out(0)); |
1718 compiler->SaveLiveRegisters(locs); | 1721 compiler->SaveLiveRegisters(locs); |
1719 compiler->GenerateCall(Scanner::kNoSourcePos, // No token position. | 1722 compiler->GenerateCall(Scanner::kNoSourcePos, // No token position. |
1720 &label, | 1723 &label, |
1721 PcDescriptors::kOther, | 1724 PcDescriptors::kOther, |
1722 locs); | 1725 locs); |
1723 __ MoveRegister(locs->temp(0).reg(), EAX); | 1726 __ MoveRegister(locs->temp(0).reg(), EAX); |
(...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2176 2, | 2179 2, |
2177 locs()); | 2180 locs()); |
2178 __ Drop(2); | 2181 __ Drop(2); |
2179 __ popl(kResultReg); | 2182 __ popl(kResultReg); |
2180 __ Bind(&done); | 2183 __ Bind(&done); |
2181 return; | 2184 return; |
2182 } | 2185 } |
2183 } | 2186 } |
2184 | 2187 |
2185 __ Bind(&slow_path); | 2188 __ Bind(&slow_path); |
| 2189 StubCode* stub_code = compiler->isolate()->stub_code(); |
2186 compiler->GenerateCall(token_pos(), | 2190 compiler->GenerateCall(token_pos(), |
2187 &StubCode::AllocateArrayLabel(), | 2191 &stub_code->AllocateArrayLabel(), |
2188 PcDescriptors::kOther, | 2192 PcDescriptors::kOther, |
2189 locs()); | 2193 locs()); |
2190 __ Bind(&done); | 2194 __ Bind(&done); |
2191 ASSERT(locs()->out(0).reg() == kResultReg); | 2195 ASSERT(locs()->out(0).reg() == kResultReg); |
2192 } | 2196 } |
2193 | 2197 |
2194 | 2198 |
2195 class BoxDoubleSlowPath : public SlowPathCode { | 2199 class BoxDoubleSlowPath : public SlowPathCode { |
2196 public: | 2200 public: |
2197 explicit BoxDoubleSlowPath(Instruction* instruction) | 2201 explicit BoxDoubleSlowPath(Instruction* instruction) |
2198 : instruction_(instruction) { } | 2202 : instruction_(instruction) { } |
2199 | 2203 |
2200 virtual void EmitNativeCode(FlowGraphCompiler* compiler) { | 2204 virtual void EmitNativeCode(FlowGraphCompiler* compiler) { |
2201 __ Comment("BoxDoubleSlowPath"); | 2205 __ Comment("BoxDoubleSlowPath"); |
2202 __ Bind(entry_label()); | 2206 __ Bind(entry_label()); |
| 2207 Isolate* isolate = compiler->isolate(); |
| 2208 StubCode* stub_code = isolate->stub_code(); |
2203 const Class& double_class = compiler->double_class(); | 2209 const Class& double_class = compiler->double_class(); |
2204 const Code& stub = | 2210 const Code& stub = |
2205 Code::Handle(StubCode::GetAllocationStubForClass(double_class)); | 2211 Code::Handle(isolate, |
| 2212 stub_code->GetAllocationStubForClass(double_class)); |
2206 const ExternalLabel label(stub.EntryPoint()); | 2213 const ExternalLabel label(stub.EntryPoint()); |
2207 | 2214 |
2208 LocationSummary* locs = instruction_->locs(); | 2215 LocationSummary* locs = instruction_->locs(); |
2209 locs->live_registers()->Remove(locs->out(0)); | 2216 locs->live_registers()->Remove(locs->out(0)); |
2210 | 2217 |
2211 compiler->SaveLiveRegisters(locs); | 2218 compiler->SaveLiveRegisters(locs); |
2212 compiler->GenerateCall(Scanner::kNoSourcePos, // No token position. | 2219 compiler->GenerateCall(Scanner::kNoSourcePos, // No token position. |
2213 &label, | 2220 &label, |
2214 PcDescriptors::kOther, | 2221 PcDescriptors::kOther, |
2215 locs); | 2222 locs); |
2216 __ MoveRegister(locs->out(0).reg(), EAX); | 2223 __ MoveRegister(locs->out(0).reg(), EAX); |
2217 compiler->RestoreLiveRegisters(locs); | 2224 compiler->RestoreLiveRegisters(locs); |
2218 | 2225 |
2219 __ jmp(exit_label()); | 2226 __ jmp(exit_label()); |
2220 } | 2227 } |
2221 | 2228 |
2222 private: | 2229 private: |
2223 Instruction* instruction_; | 2230 Instruction* instruction_; |
2224 }; | 2231 }; |
2225 | 2232 |
2226 | 2233 |
2227 class BoxFloat32x4SlowPath : public SlowPathCode { | 2234 class BoxFloat32x4SlowPath : public SlowPathCode { |
2228 public: | 2235 public: |
2229 explicit BoxFloat32x4SlowPath(Instruction* instruction) | 2236 explicit BoxFloat32x4SlowPath(Instruction* instruction) |
2230 : instruction_(instruction) { } | 2237 : instruction_(instruction) { } |
2231 | 2238 |
2232 virtual void EmitNativeCode(FlowGraphCompiler* compiler) { | 2239 virtual void EmitNativeCode(FlowGraphCompiler* compiler) { |
2233 __ Comment("BoxFloat32x4SlowPath"); | 2240 __ Comment("BoxFloat32x4SlowPath"); |
2234 __ Bind(entry_label()); | 2241 __ Bind(entry_label()); |
| 2242 Isolate* isolate = compiler->isolate(); |
| 2243 StubCode* stub_code = isolate->stub_code(); |
2235 const Class& float32x4_class = compiler->float32x4_class(); | 2244 const Class& float32x4_class = compiler->float32x4_class(); |
2236 const Code& stub = | 2245 const Code& stub = |
2237 Code::Handle(StubCode::GetAllocationStubForClass(float32x4_class)); | 2246 Code::Handle(isolate, |
| 2247 stub_code->GetAllocationStubForClass(float32x4_class)); |
2238 const ExternalLabel label(stub.EntryPoint()); | 2248 const ExternalLabel label(stub.EntryPoint()); |
2239 | 2249 |
2240 LocationSummary* locs = instruction_->locs(); | 2250 LocationSummary* locs = instruction_->locs(); |
2241 locs->live_registers()->Remove(locs->out(0)); | 2251 locs->live_registers()->Remove(locs->out(0)); |
2242 | 2252 |
2243 compiler->SaveLiveRegisters(locs); | 2253 compiler->SaveLiveRegisters(locs); |
2244 compiler->GenerateCall(Scanner::kNoSourcePos, // No token position. | 2254 compiler->GenerateCall(Scanner::kNoSourcePos, // No token position. |
2245 &label, | 2255 &label, |
2246 PcDescriptors::kOther, | 2256 PcDescriptors::kOther, |
2247 locs); | 2257 locs); |
2248 __ MoveRegister(locs->out(0).reg(), EAX); | 2258 __ MoveRegister(locs->out(0).reg(), EAX); |
2249 compiler->RestoreLiveRegisters(locs); | 2259 compiler->RestoreLiveRegisters(locs); |
2250 | 2260 |
2251 __ jmp(exit_label()); | 2261 __ jmp(exit_label()); |
2252 } | 2262 } |
2253 | 2263 |
2254 private: | 2264 private: |
2255 Instruction* instruction_; | 2265 Instruction* instruction_; |
2256 }; | 2266 }; |
2257 | 2267 |
2258 | 2268 |
2259 class BoxFloat64x2SlowPath : public SlowPathCode { | 2269 class BoxFloat64x2SlowPath : public SlowPathCode { |
2260 public: | 2270 public: |
2261 explicit BoxFloat64x2SlowPath(Instruction* instruction) | 2271 explicit BoxFloat64x2SlowPath(Instruction* instruction) |
2262 : instruction_(instruction) { } | 2272 : instruction_(instruction) { } |
2263 | 2273 |
2264 virtual void EmitNativeCode(FlowGraphCompiler* compiler) { | 2274 virtual void EmitNativeCode(FlowGraphCompiler* compiler) { |
2265 __ Comment("BoxFloat64x2SlowPath"); | 2275 __ Comment("BoxFloat64x2SlowPath"); |
2266 __ Bind(entry_label()); | 2276 __ Bind(entry_label()); |
| 2277 Isolate* isolate = compiler->isolate(); |
| 2278 StubCode* stub_code = isolate->stub_code(); |
2267 const Class& float64x2_class = compiler->float64x2_class(); | 2279 const Class& float64x2_class = compiler->float64x2_class(); |
2268 const Code& stub = | 2280 const Code& stub = |
2269 Code::Handle(StubCode::GetAllocationStubForClass(float64x2_class)); | 2281 Code::Handle(isolate, |
| 2282 stub_code->GetAllocationStubForClass(float64x2_class)); |
2270 const ExternalLabel label(stub.EntryPoint()); | 2283 const ExternalLabel label(stub.EntryPoint()); |
2271 | 2284 |
2272 LocationSummary* locs = instruction_->locs(); | 2285 LocationSummary* locs = instruction_->locs(); |
2273 locs->live_registers()->Remove(locs->out(0)); | 2286 locs->live_registers()->Remove(locs->out(0)); |
2274 | 2287 |
2275 compiler->SaveLiveRegisters(locs); | 2288 compiler->SaveLiveRegisters(locs); |
2276 compiler->GenerateCall(Scanner::kNoSourcePos, // No token position. | 2289 compiler->GenerateCall(Scanner::kNoSourcePos, // No token position. |
2277 &label, | 2290 &label, |
2278 PcDescriptors::kOther, | 2291 PcDescriptors::kOther, |
2279 locs); | 2292 locs); |
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2571 virtual void EmitNativeCode(FlowGraphCompiler* compiler) { | 2584 virtual void EmitNativeCode(FlowGraphCompiler* compiler) { |
2572 __ Comment("AllocateContextSlowPath"); | 2585 __ Comment("AllocateContextSlowPath"); |
2573 __ Bind(entry_label()); | 2586 __ Bind(entry_label()); |
2574 | 2587 |
2575 LocationSummary* locs = instruction_->locs(); | 2588 LocationSummary* locs = instruction_->locs(); |
2576 locs->live_registers()->Remove(locs->out(0)); | 2589 locs->live_registers()->Remove(locs->out(0)); |
2577 | 2590 |
2578 compiler->SaveLiveRegisters(locs); | 2591 compiler->SaveLiveRegisters(locs); |
2579 | 2592 |
2580 __ movl(EDX, Immediate(instruction_->num_context_variables())); | 2593 __ movl(EDX, Immediate(instruction_->num_context_variables())); |
2581 const ExternalLabel label(StubCode::AllocateContextEntryPoint()); | 2594 StubCode* stub_code = compiler->isolate()->stub_code(); |
| 2595 const ExternalLabel label(stub_code->AllocateContextEntryPoint()); |
2582 compiler->GenerateCall(instruction_->token_pos(), | 2596 compiler->GenerateCall(instruction_->token_pos(), |
2583 &label, | 2597 &label, |
2584 PcDescriptors::kOther, | 2598 PcDescriptors::kOther, |
2585 locs); | 2599 locs); |
2586 ASSERT(instruction_->locs()->out(0).reg() == EAX); | 2600 ASSERT(instruction_->locs()->out(0).reg() == EAX); |
2587 compiler->RestoreLiveRegisters(instruction_->locs()); | 2601 compiler->RestoreLiveRegisters(instruction_->locs()); |
2588 __ jmp(exit_label()); | 2602 __ jmp(exit_label()); |
2589 } | 2603 } |
2590 | 2604 |
2591 private: | 2605 private: |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2661 } | 2675 } |
2662 // EAX: new object. | 2676 // EAX: new object. |
2663 __ Bind(slow_path->exit_label()); | 2677 __ Bind(slow_path->exit_label()); |
2664 return; | 2678 return; |
2665 } | 2679 } |
2666 | 2680 |
2667 ASSERT(locs()->temp(0).reg() == EDX); | 2681 ASSERT(locs()->temp(0).reg() == EDX); |
2668 ASSERT(locs()->out(0).reg() == EAX); | 2682 ASSERT(locs()->out(0).reg() == EAX); |
2669 | 2683 |
2670 __ movl(EDX, Immediate(num_context_variables())); | 2684 __ movl(EDX, Immediate(num_context_variables())); |
2671 const ExternalLabel label(StubCode::AllocateContextEntryPoint()); | 2685 StubCode* stub_code = compiler->isolate()->stub_code(); |
| 2686 const ExternalLabel label(stub_code->AllocateContextEntryPoint()); |
2672 compiler->GenerateCall(token_pos(), | 2687 compiler->GenerateCall(token_pos(), |
2673 &label, | 2688 &label, |
2674 PcDescriptors::kOther, | 2689 PcDescriptors::kOther, |
2675 locs()); | 2690 locs()); |
2676 } | 2691 } |
2677 | 2692 |
2678 | 2693 |
2679 LocationSummary* CloneContextInstr::MakeLocationSummary(Isolate* isolate, | 2694 LocationSummary* CloneContextInstr::MakeLocationSummary(Isolate* isolate, |
2680 bool opt) const { | 2695 bool opt) const { |
2681 const intptr_t kNumInputs = 1; | 2696 const intptr_t kNumInputs = 1; |
(...skipping 918 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3600 | 3615 |
3601 | 3616 |
3602 class BoxInt32x4SlowPath : public SlowPathCode { | 3617 class BoxInt32x4SlowPath : public SlowPathCode { |
3603 public: | 3618 public: |
3604 explicit BoxInt32x4SlowPath(BoxInt32x4Instr* instruction) | 3619 explicit BoxInt32x4SlowPath(BoxInt32x4Instr* instruction) |
3605 : instruction_(instruction) { } | 3620 : instruction_(instruction) { } |
3606 | 3621 |
3607 virtual void EmitNativeCode(FlowGraphCompiler* compiler) { | 3622 virtual void EmitNativeCode(FlowGraphCompiler* compiler) { |
3608 __ Comment("BoxInt32x4SlowPath"); | 3623 __ Comment("BoxInt32x4SlowPath"); |
3609 __ Bind(entry_label()); | 3624 __ Bind(entry_label()); |
| 3625 Isolate* isolate = compiler->isolate(); |
| 3626 StubCode* stub_code = isolate->stub_code(); |
3610 const Class& int32x4_class = compiler->int32x4_class(); | 3627 const Class& int32x4_class = compiler->int32x4_class(); |
3611 const Code& stub = | 3628 const Code& stub = |
3612 Code::Handle(StubCode::GetAllocationStubForClass(int32x4_class)); | 3629 Code::Handle(isolate, |
| 3630 stub_code->GetAllocationStubForClass(int32x4_class)); |
3613 const ExternalLabel label(stub.EntryPoint()); | 3631 const ExternalLabel label(stub.EntryPoint()); |
3614 | 3632 |
3615 LocationSummary* locs = instruction_->locs(); | 3633 LocationSummary* locs = instruction_->locs(); |
3616 locs->live_registers()->Remove(locs->out(0)); | 3634 locs->live_registers()->Remove(locs->out(0)); |
3617 | 3635 |
3618 compiler->SaveLiveRegisters(locs); | 3636 compiler->SaveLiveRegisters(locs); |
3619 compiler->GenerateCall(Scanner::kNoSourcePos, // No token position. | 3637 compiler->GenerateCall(Scanner::kNoSourcePos, // No token position. |
3620 &label, | 3638 &label, |
3621 PcDescriptors::kOther, | 3639 PcDescriptors::kOther, |
3622 locs); | 3640 locs); |
(...skipping 2058 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5681 | 5699 |
5682 | 5700 |
5683 class BoxIntegerSlowPath : public SlowPathCode { | 5701 class BoxIntegerSlowPath : public SlowPathCode { |
5684 public: | 5702 public: |
5685 explicit BoxIntegerSlowPath(BoxIntegerInstr* instruction) | 5703 explicit BoxIntegerSlowPath(BoxIntegerInstr* instruction) |
5686 : instruction_(instruction) { } | 5704 : instruction_(instruction) { } |
5687 | 5705 |
5688 virtual void EmitNativeCode(FlowGraphCompiler* compiler) { | 5706 virtual void EmitNativeCode(FlowGraphCompiler* compiler) { |
5689 __ Comment("BoxIntegerSlowPath"); | 5707 __ Comment("BoxIntegerSlowPath"); |
5690 __ Bind(entry_label()); | 5708 __ Bind(entry_label()); |
| 5709 Isolate* isolate = compiler->isolate(); |
| 5710 StubCode* stub_code = isolate->stub_code(); |
5691 const Class& mint_class = | 5711 const Class& mint_class = |
5692 Class::ZoneHandle(Isolate::Current()->object_store()->mint_class()); | 5712 Class::ZoneHandle(isolate, isolate->object_store()->mint_class()); |
5693 const Code& stub = | 5713 const Code& stub = |
5694 Code::Handle(StubCode::GetAllocationStubForClass(mint_class)); | 5714 Code::Handle(isolate, stub_code->GetAllocationStubForClass(mint_class)); |
5695 const ExternalLabel label(stub.EntryPoint()); | 5715 const ExternalLabel label(stub.EntryPoint()); |
5696 | 5716 |
5697 LocationSummary* locs = instruction_->locs(); | 5717 LocationSummary* locs = instruction_->locs(); |
5698 locs->live_registers()->Remove(locs->out(0)); | 5718 locs->live_registers()->Remove(locs->out(0)); |
5699 | 5719 |
5700 compiler->SaveLiveRegisters(locs); | 5720 compiler->SaveLiveRegisters(locs); |
5701 compiler->GenerateCall(Scanner::kNoSourcePos, // No token position. | 5721 compiler->GenerateCall(Scanner::kNoSourcePos, // No token position. |
5702 &label, | 5722 &label, |
5703 PcDescriptors::kOther, | 5723 PcDescriptors::kOther, |
5704 locs); | 5724 locs); |
(...skipping 603 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6308 } | 6328 } |
6309 | 6329 |
6310 | 6330 |
6311 LocationSummary* AllocateObjectInstr::MakeLocationSummary(Isolate* isolate, | 6331 LocationSummary* AllocateObjectInstr::MakeLocationSummary(Isolate* isolate, |
6312 bool opt) const { | 6332 bool opt) const { |
6313 return MakeCallSummary(); | 6333 return MakeCallSummary(); |
6314 } | 6334 } |
6315 | 6335 |
6316 | 6336 |
6317 void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 6337 void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
6318 const Code& stub = Code::Handle(StubCode::GetAllocationStubForClass(cls())); | 6338 Isolate* isolate = compiler->isolate(); |
| 6339 StubCode* stub_code = isolate->stub_code(); |
| 6340 const Code& stub = Code::Handle(isolate, |
| 6341 stub_code->GetAllocationStubForClass(cls())); |
6319 const ExternalLabel label(stub.EntryPoint()); | 6342 const ExternalLabel label(stub.EntryPoint()); |
6320 compiler->GenerateCall(token_pos(), | 6343 compiler->GenerateCall(token_pos(), |
6321 &label, | 6344 &label, |
6322 PcDescriptors::kOther, | 6345 PcDescriptors::kOther, |
6323 locs()); | 6346 locs()); |
6324 __ Drop(ArgumentCount()); // Discard arguments. | 6347 __ Drop(ArgumentCount()); // Discard arguments. |
6325 } | 6348 } |
6326 | 6349 |
6327 | 6350 |
6328 void DebugStepCheckInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 6351 void DebugStepCheckInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
6329 ASSERT(!compiler->is_optimizing()); | 6352 ASSERT(!compiler->is_optimizing()); |
6330 const ExternalLabel label(StubCode::DebugStepCheckEntryPoint()); | 6353 StubCode* stub_code = compiler->isolate()->stub_code(); |
| 6354 const ExternalLabel label(stub_code->DebugStepCheckEntryPoint()); |
6331 __ movl(EDX, Immediate(0)); | 6355 __ movl(EDX, Immediate(0)); |
6332 __ movl(ECX, Immediate(0)); | 6356 __ movl(ECX, Immediate(0)); |
6333 compiler->GenerateCall(token_pos(), &label, stub_kind_, locs()); | 6357 compiler->GenerateCall(token_pos(), &label, stub_kind_, locs()); |
6334 #if defined(DEBUG) | 6358 #if defined(DEBUG) |
6335 __ movl(EDX, Immediate(kInvalidObjectPointer)); | 6359 __ movl(EDX, Immediate(kInvalidObjectPointer)); |
6336 __ movl(EDX, Immediate(kInvalidObjectPointer)); | 6360 __ movl(EDX, Immediate(kInvalidObjectPointer)); |
6337 #endif | 6361 #endif |
6338 } | 6362 } |
6339 | 6363 |
6340 } // namespace dart | 6364 } // namespace dart |
6341 | 6365 |
6342 #undef __ | 6366 #undef __ |
6343 | 6367 |
6344 #endif // defined TARGET_ARCH_IA32 | 6368 #endif // defined TARGET_ARCH_IA32 |
OLD | NEW |