| 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 |