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 800 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
811 bool opt) const { | 811 bool opt) const { |
812 return MakeCallSummary(zone); | 812 return MakeCallSummary(zone); |
813 } | 813 } |
814 | 814 |
815 | 815 |
816 void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 816 void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
817 Register result = locs()->out(0).reg(); | 817 Register result = locs()->out(0).reg(); |
818 const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function()); | 818 const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function()); |
819 const bool is_leaf_call = | 819 const bool is_leaf_call = |
820 (argc_tag & NativeArguments::AutoSetupScopeMask()) == 0; | 820 (argc_tag & NativeArguments::AutoSetupScopeMask()) == 0; |
821 StubCode* stub_code = compiler->isolate()->stub_code(); | |
822 | 821 |
823 // Push the result place holder initialized to NULL. | 822 // Push the result place holder initialized to NULL. |
824 __ PushObject(Object::null_object()); | 823 __ PushObject(Object::null_object()); |
825 // Pass a pointer to the first argument in EAX. | 824 // Pass a pointer to the first argument in EAX. |
826 if (!function().HasOptionalParameters()) { | 825 if (!function().HasOptionalParameters()) { |
827 __ leal(EAX, Address(EBP, (kParamEndSlotFromFp + | 826 __ leal(EAX, Address(EBP, (kParamEndSlotFromFp + |
828 function().NumParameters()) * kWordSize)); | 827 function().NumParameters()) * kWordSize)); |
829 } else { | 828 } else { |
830 __ leal(EAX, Address(EBP, kFirstLocalSlotFromFp * kWordSize)); | 829 __ leal(EAX, Address(EBP, kFirstLocalSlotFromFp * kWordSize)); |
831 } | 830 } |
832 __ movl(ECX, Immediate(reinterpret_cast<uword>(native_c_function()))); | 831 __ movl(ECX, Immediate(reinterpret_cast<uword>(native_c_function()))); |
833 __ movl(EDX, Immediate(argc_tag)); | 832 __ movl(EDX, Immediate(argc_tag)); |
834 const ExternalLabel* stub_entry = (is_bootstrap_native() || is_leaf_call) ? | 833 const ExternalLabel* stub_entry = (is_bootstrap_native() || is_leaf_call) ? |
835 &stub_code->CallBootstrapCFunctionLabel() : | 834 &StubCode::CallBootstrapCFunctionLabel() : |
836 &stub_code->CallNativeCFunctionLabel(); | 835 &StubCode::CallNativeCFunctionLabel(); |
837 compiler->GenerateCall(token_pos(), | 836 compiler->GenerateCall(token_pos(), |
838 stub_entry, | 837 stub_entry, |
839 RawPcDescriptors::kOther, | 838 RawPcDescriptors::kOther, |
840 locs()); | 839 locs()); |
841 __ popl(result); | 840 __ popl(result); |
842 } | 841 } |
843 | 842 |
844 | 843 |
845 static bool CanBeImmediateIndex(Value* value, intptr_t cid) { | 844 static bool CanBeImmediateIndex(Value* value, intptr_t cid) { |
846 ConstantInstr* constant = value->definition()->AsConstant(); | 845 ConstantInstr* constant = value->definition()->AsConstant(); |
(...skipping 796 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1643 public: | 1642 public: |
1644 BoxAllocationSlowPath(Instruction* instruction, | 1643 BoxAllocationSlowPath(Instruction* instruction, |
1645 const Class& cls, | 1644 const Class& cls, |
1646 Register result) | 1645 Register result) |
1647 : instruction_(instruction), | 1646 : instruction_(instruction), |
1648 cls_(cls), | 1647 cls_(cls), |
1649 result_(result) { } | 1648 result_(result) { } |
1650 | 1649 |
1651 virtual void EmitNativeCode(FlowGraphCompiler* compiler) { | 1650 virtual void EmitNativeCode(FlowGraphCompiler* compiler) { |
1652 Isolate* isolate = compiler->isolate(); | 1651 Isolate* isolate = compiler->isolate(); |
1653 StubCode* stub_code = isolate->stub_code(); | |
1654 | 1652 |
1655 if (Assembler::EmittingComments()) { | 1653 if (Assembler::EmittingComments()) { |
1656 __ Comment("%s slow path allocation of %s", | 1654 __ Comment("%s slow path allocation of %s", |
1657 instruction_->DebugName(), | 1655 instruction_->DebugName(), |
1658 String::Handle(cls_.PrettyName()).ToCString()); | 1656 String::Handle(cls_.PrettyName()).ToCString()); |
1659 } | 1657 } |
1660 __ Bind(entry_label()); | 1658 __ Bind(entry_label()); |
1661 const Code& stub = | 1659 const Code& stub = |
1662 Code::Handle(isolate, stub_code->GetAllocationStubForClass(cls_)); | 1660 Code::Handle(isolate, StubCode::GetAllocationStubForClass(cls_)); |
1663 const ExternalLabel label(stub.EntryPoint()); | 1661 const ExternalLabel label(stub.EntryPoint()); |
1664 | 1662 |
1665 LocationSummary* locs = instruction_->locs(); | 1663 LocationSummary* locs = instruction_->locs(); |
1666 | 1664 |
1667 locs->live_registers()->Remove(Location::RegisterLocation(result_)); | 1665 locs->live_registers()->Remove(Location::RegisterLocation(result_)); |
1668 | 1666 |
1669 compiler->SaveLiveRegisters(locs); | 1667 compiler->SaveLiveRegisters(locs); |
1670 compiler->GenerateCall(Scanner::kNoSourcePos, // No token position. | 1668 compiler->GenerateCall(Scanner::kNoSourcePos, // No token position. |
1671 &label, | 1669 &label, |
1672 RawPcDescriptors::kOther, | 1670 RawPcDescriptors::kOther, |
(...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2121 2, | 2119 2, |
2122 locs()); | 2120 locs()); |
2123 __ Drop(2); | 2121 __ Drop(2); |
2124 __ popl(kResultReg); | 2122 __ popl(kResultReg); |
2125 __ Bind(&done); | 2123 __ Bind(&done); |
2126 return; | 2124 return; |
2127 } | 2125 } |
2128 } | 2126 } |
2129 | 2127 |
2130 __ Bind(&slow_path); | 2128 __ Bind(&slow_path); |
2131 Isolate* isolate = compiler->isolate(); | 2129 const ExternalLabel label(StubCode::AllocateArrayEntryPoint()); |
2132 const Code& stub = Code::Handle( | |
2133 isolate, isolate->stub_code()->GetAllocateArrayStub()); | |
2134 const ExternalLabel label(stub.EntryPoint()); | |
2135 compiler->GenerateCall(token_pos(), | 2130 compiler->GenerateCall(token_pos(), |
2136 &label, | 2131 &label, |
2137 RawPcDescriptors::kOther, | 2132 RawPcDescriptors::kOther, |
2138 locs()); | 2133 locs()); |
2139 compiler->AddStubCallTarget(stub); | |
2140 __ Bind(&done); | 2134 __ Bind(&done); |
2141 ASSERT(locs()->out(0).reg() == kResultReg); | 2135 ASSERT(locs()->out(0).reg() == kResultReg); |
2142 } | 2136 } |
2143 | 2137 |
2144 | 2138 |
2145 LocationSummary* LoadFieldInstr::MakeLocationSummary(Zone* zone, | 2139 LocationSummary* LoadFieldInstr::MakeLocationSummary(Zone* zone, |
2146 bool opt) const { | 2140 bool opt) const { |
2147 const intptr_t kNumInputs = 1; | 2141 const intptr_t kNumInputs = 1; |
2148 const intptr_t kNumTemps = | 2142 const intptr_t kNumTemps = |
2149 (IsUnboxedLoad() && opt) ? 1 : | 2143 (IsUnboxedLoad() && opt) ? 1 : |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2397 virtual void EmitNativeCode(FlowGraphCompiler* compiler) { | 2391 virtual void EmitNativeCode(FlowGraphCompiler* compiler) { |
2398 __ Comment("AllocateContextSlowPath"); | 2392 __ Comment("AllocateContextSlowPath"); |
2399 __ Bind(entry_label()); | 2393 __ Bind(entry_label()); |
2400 | 2394 |
2401 LocationSummary* locs = instruction_->locs(); | 2395 LocationSummary* locs = instruction_->locs(); |
2402 ASSERT(!locs->live_registers()->Contains(locs->out(0))); | 2396 ASSERT(!locs->live_registers()->Contains(locs->out(0))); |
2403 | 2397 |
2404 compiler->SaveLiveRegisters(locs); | 2398 compiler->SaveLiveRegisters(locs); |
2405 | 2399 |
2406 __ movl(EDX, Immediate(instruction_->num_context_variables())); | 2400 __ movl(EDX, Immediate(instruction_->num_context_variables())); |
2407 StubCode* stub_code = compiler->isolate()->stub_code(); | 2401 const ExternalLabel label(StubCode::AllocateContextEntryPoint()); |
2408 const ExternalLabel label(stub_code->AllocateContextEntryPoint()); | |
2409 compiler->GenerateCall(instruction_->token_pos(), | 2402 compiler->GenerateCall(instruction_->token_pos(), |
2410 &label, | 2403 &label, |
2411 RawPcDescriptors::kOther, | 2404 RawPcDescriptors::kOther, |
2412 locs); | 2405 locs); |
2413 ASSERT(instruction_->locs()->out(0).reg() == EAX); | 2406 ASSERT(instruction_->locs()->out(0).reg() == EAX); |
2414 compiler->RestoreLiveRegisters(instruction_->locs()); | 2407 compiler->RestoreLiveRegisters(instruction_->locs()); |
2415 __ jmp(exit_label()); | 2408 __ jmp(exit_label()); |
2416 } | 2409 } |
2417 | 2410 |
2418 private: | 2411 private: |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2453 locs->set_out(0, Location::RegisterLocation(EAX)); | 2446 locs->set_out(0, Location::RegisterLocation(EAX)); |
2454 return locs; | 2447 return locs; |
2455 } | 2448 } |
2456 | 2449 |
2457 | 2450 |
2458 void AllocateContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2451 void AllocateContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2459 ASSERT(locs()->temp(0).reg() == EDX); | 2452 ASSERT(locs()->temp(0).reg() == EDX); |
2460 ASSERT(locs()->out(0).reg() == EAX); | 2453 ASSERT(locs()->out(0).reg() == EAX); |
2461 | 2454 |
2462 __ movl(EDX, Immediate(num_context_variables())); | 2455 __ movl(EDX, Immediate(num_context_variables())); |
2463 StubCode* stub_code = compiler->isolate()->stub_code(); | 2456 const ExternalLabel label(StubCode::AllocateContextEntryPoint()); |
2464 const ExternalLabel label(stub_code->AllocateContextEntryPoint()); | |
2465 compiler->GenerateCall(token_pos(), | 2457 compiler->GenerateCall(token_pos(), |
2466 &label, | 2458 &label, |
2467 RawPcDescriptors::kOther, | 2459 RawPcDescriptors::kOther, |
2468 locs()); | 2460 locs()); |
2469 } | 2461 } |
2470 | 2462 |
2471 | 2463 |
2472 LocationSummary* InitStaticFieldInstr::MakeLocationSummary(Zone* zone, | 2464 LocationSummary* InitStaticFieldInstr::MakeLocationSummary(Zone* zone, |
2473 bool opt) const { | 2465 bool opt) const { |
2474 const intptr_t kNumInputs = 1; | 2466 const intptr_t kNumInputs = 1; |
(...skipping 4320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6795 | 6787 |
6796 | 6788 |
6797 LocationSummary* AllocateObjectInstr::MakeLocationSummary(Zone* zone, | 6789 LocationSummary* AllocateObjectInstr::MakeLocationSummary(Zone* zone, |
6798 bool opt) const { | 6790 bool opt) const { |
6799 return MakeCallSummary(zone); | 6791 return MakeCallSummary(zone); |
6800 } | 6792 } |
6801 | 6793 |
6802 | 6794 |
6803 void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 6795 void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
6804 Isolate* isolate = compiler->isolate(); | 6796 Isolate* isolate = compiler->isolate(); |
6805 StubCode* stub_code = isolate->stub_code(); | |
6806 const Code& stub = Code::Handle(isolate, | 6797 const Code& stub = Code::Handle(isolate, |
6807 stub_code->GetAllocationStubForClass(cls())); | 6798 StubCode::GetAllocationStubForClass(cls())); |
6808 const ExternalLabel label(stub.EntryPoint()); | 6799 const ExternalLabel label(stub.EntryPoint()); |
6809 compiler->GenerateCall(token_pos(), | 6800 compiler->GenerateCall(token_pos(), |
6810 &label, | 6801 &label, |
6811 RawPcDescriptors::kOther, | 6802 RawPcDescriptors::kOther, |
6812 locs()); | 6803 locs()); |
6813 compiler->AddStubCallTarget(stub); | 6804 compiler->AddStubCallTarget(stub); |
6814 __ Drop(ArgumentCount()); // Discard arguments. | 6805 __ Drop(ArgumentCount()); // Discard arguments. |
6815 } | 6806 } |
6816 | 6807 |
6817 | 6808 |
6818 void DebugStepCheckInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 6809 void DebugStepCheckInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
6819 ASSERT(!compiler->is_optimizing()); | 6810 ASSERT(!compiler->is_optimizing()); |
6820 StubCode* stub_code = compiler->isolate()->stub_code(); | 6811 const ExternalLabel label(StubCode::DebugStepCheckEntryPoint()); |
6821 const ExternalLabel label(stub_code->DebugStepCheckEntryPoint()); | |
6822 compiler->GenerateCall(token_pos(), &label, stub_kind_, locs()); | 6812 compiler->GenerateCall(token_pos(), &label, stub_kind_, locs()); |
6823 } | 6813 } |
6824 | 6814 |
6825 | 6815 |
6826 LocationSummary* GrowRegExpStackInstr::MakeLocationSummary( | 6816 LocationSummary* GrowRegExpStackInstr::MakeLocationSummary( |
6827 Zone* zone, bool opt) const { | 6817 Zone* zone, bool opt) const { |
6828 const intptr_t kNumInputs = 1; | 6818 const intptr_t kNumInputs = 1; |
6829 const intptr_t kNumTemps = 0; | 6819 const intptr_t kNumTemps = 0; |
6830 LocationSummary* locs = new(zone) LocationSummary( | 6820 LocationSummary* locs = new(zone) LocationSummary( |
6831 zone, kNumInputs, kNumTemps, LocationSummary::kCall); | 6821 zone, kNumInputs, kNumTemps, LocationSummary::kCall); |
(...skipping 16 matching lines...) Expand all Loading... |
6848 __ Drop(1); | 6838 __ Drop(1); |
6849 __ popl(result); | 6839 __ popl(result); |
6850 } | 6840 } |
6851 | 6841 |
6852 | 6842 |
6853 } // namespace dart | 6843 } // namespace dart |
6854 | 6844 |
6855 #undef __ | 6845 #undef __ |
6856 | 6846 |
6857 #endif // defined TARGET_ARCH_IA32 | 6847 #endif // defined TARGET_ARCH_IA32 |
OLD | NEW |