OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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_ARM64. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_ARM64. |
6 #if defined(TARGET_ARCH_ARM64) | 6 #if defined(TARGET_ARCH_ARM64) |
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 755 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
766 } else { | 766 } else { |
767 __ AddImmediate(R2, FP, kFirstLocalSlotFromFp * kWordSize, PP); | 767 __ AddImmediate(R2, FP, kFirstLocalSlotFromFp * kWordSize, PP); |
768 } | 768 } |
769 // Compute the effective address. When running under the simulator, | 769 // Compute the effective address. When running under the simulator, |
770 // this is a redirection address that forces the simulator to call | 770 // this is a redirection address that forces the simulator to call |
771 // into the runtime system. | 771 // into the runtime system. |
772 uword entry = reinterpret_cast<uword>(native_c_function()); | 772 uword entry = reinterpret_cast<uword>(native_c_function()); |
773 const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function()); | 773 const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function()); |
774 const bool is_leaf_call = | 774 const bool is_leaf_call = |
775 (argc_tag & NativeArguments::AutoSetupScopeMask()) == 0; | 775 (argc_tag & NativeArguments::AutoSetupScopeMask()) == 0; |
| 776 StubCode* stub_code = compiler->isolate()->stub_code(); |
776 const ExternalLabel* stub_entry; | 777 const ExternalLabel* stub_entry; |
777 if (is_bootstrap_native() || is_leaf_call) { | 778 if (is_bootstrap_native() || is_leaf_call) { |
778 stub_entry = &StubCode::CallBootstrapCFunctionLabel(); | 779 stub_entry = &stub_code->CallBootstrapCFunctionLabel(); |
779 #if defined(USING_SIMULATOR) | 780 #if defined(USING_SIMULATOR) |
780 entry = Simulator::RedirectExternalReference( | 781 entry = Simulator::RedirectExternalReference( |
781 entry, Simulator::kBootstrapNativeCall, function().NumParameters()); | 782 entry, Simulator::kBootstrapNativeCall, function().NumParameters()); |
782 #endif | 783 #endif |
783 } else { | 784 } else { |
784 // In the case of non bootstrap native methods the CallNativeCFunction | 785 // In the case of non bootstrap native methods the CallNativeCFunction |
785 // stub generates the redirection address when running under the simulator | 786 // stub generates the redirection address when running under the simulator |
786 // and hence we do not change 'entry' here. | 787 // and hence we do not change 'entry' here. |
787 stub_entry = &StubCode::CallNativeCFunctionLabel(); | 788 stub_entry = &stub_code->CallNativeCFunctionLabel(); |
788 #if defined(USING_SIMULATOR) | 789 #if defined(USING_SIMULATOR) |
789 if (!function().IsNativeAutoSetupScope()) { | 790 if (!function().IsNativeAutoSetupScope()) { |
790 entry = Simulator::RedirectExternalReference( | 791 entry = Simulator::RedirectExternalReference( |
791 entry, Simulator::kBootstrapNativeCall, function().NumParameters()); | 792 entry, Simulator::kBootstrapNativeCall, function().NumParameters()); |
792 } | 793 } |
793 #endif | 794 #endif |
794 } | 795 } |
795 __ LoadImmediate(R5, entry, PP); | 796 __ LoadImmediate(R5, entry, PP); |
796 __ LoadImmediate(R1, argc_tag, PP); | 797 __ LoadImmediate(R1, argc_tag, PP); |
797 compiler->GenerateCall(token_pos(), | 798 compiler->GenerateCall(token_pos(), |
(...skipping 801 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1599 } | 1600 } |
1600 | 1601 |
1601 | 1602 |
1602 class StoreInstanceFieldSlowPath : public SlowPathCode { | 1603 class StoreInstanceFieldSlowPath : public SlowPathCode { |
1603 public: | 1604 public: |
1604 StoreInstanceFieldSlowPath(StoreInstanceFieldInstr* instruction, | 1605 StoreInstanceFieldSlowPath(StoreInstanceFieldInstr* instruction, |
1605 const Class& cls) | 1606 const Class& cls) |
1606 : instruction_(instruction), cls_(cls) { } | 1607 : instruction_(instruction), cls_(cls) { } |
1607 | 1608 |
1608 virtual void EmitNativeCode(FlowGraphCompiler* compiler) { | 1609 virtual void EmitNativeCode(FlowGraphCompiler* compiler) { |
| 1610 Isolate* isolate = compiler->isolate(); |
| 1611 StubCode* stub_code = isolate->stub_code(); |
| 1612 |
1609 __ Comment("StoreInstanceFieldSlowPath"); | 1613 __ Comment("StoreInstanceFieldSlowPath"); |
1610 __ Bind(entry_label()); | 1614 __ Bind(entry_label()); |
1611 | 1615 |
1612 const Code& stub = | 1616 const Code& stub = |
1613 Code::Handle(StubCode::GetAllocationStubForClass(cls_)); | 1617 Code::Handle(isolate, stub_code->GetAllocationStubForClass(cls_)); |
1614 const ExternalLabel label(stub.EntryPoint()); | 1618 const ExternalLabel label(stub.EntryPoint()); |
1615 | 1619 |
1616 LocationSummary* locs = instruction_->locs(); | 1620 LocationSummary* locs = instruction_->locs(); |
1617 locs->live_registers()->Remove(locs->out(0)); | 1621 locs->live_registers()->Remove(locs->out(0)); |
1618 | 1622 |
1619 compiler->SaveLiveRegisters(locs); | 1623 compiler->SaveLiveRegisters(locs); |
1620 compiler->GenerateCall(Scanner::kNoSourcePos, // No token position. | 1624 compiler->GenerateCall(Scanner::kNoSourcePos, // No token position. |
1621 &label, | 1625 &label, |
1622 PcDescriptors::kOther, | 1626 PcDescriptors::kOther, |
1623 locs); | 1627 locs); |
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1955 locs->set_in(kLengthPos, Location::RegisterLocation(R2)); | 1959 locs->set_in(kLengthPos, Location::RegisterLocation(R2)); |
1956 locs->set_out(0, Location::RegisterLocation(R0)); | 1960 locs->set_out(0, Location::RegisterLocation(R0)); |
1957 return locs; | 1961 return locs; |
1958 } | 1962 } |
1959 | 1963 |
1960 | 1964 |
1961 void CreateArrayInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 1965 void CreateArrayInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
1962 // Allocate the array. R2 = length, R1 = element type. | 1966 // Allocate the array. R2 = length, R1 = element type. |
1963 ASSERT(locs()->in(kElementTypePos).reg() == R1); | 1967 ASSERT(locs()->in(kElementTypePos).reg() == R1); |
1964 ASSERT(locs()->in(kLengthPos).reg() == R2); | 1968 ASSERT(locs()->in(kLengthPos).reg() == R2); |
| 1969 StubCode* stub_code = compiler->isolate()->stub_code(); |
1965 compiler->GenerateCall(token_pos(), | 1970 compiler->GenerateCall(token_pos(), |
1966 &StubCode::AllocateArrayLabel(), | 1971 &stub_code->AllocateArrayLabel(), |
1967 PcDescriptors::kOther, | 1972 PcDescriptors::kOther, |
1968 locs()); | 1973 locs()); |
1969 ASSERT(locs()->out(0).reg() == R0); | 1974 ASSERT(locs()->out(0).reg() == R0); |
1970 } | 1975 } |
1971 | 1976 |
1972 | 1977 |
1973 class BoxDoubleSlowPath : public SlowPathCode { | 1978 class BoxDoubleSlowPath : public SlowPathCode { |
1974 public: | 1979 public: |
1975 explicit BoxDoubleSlowPath(Instruction* instruction) | 1980 explicit BoxDoubleSlowPath(Instruction* instruction) |
1976 : instruction_(instruction) { } | 1981 : instruction_(instruction) { } |
1977 | 1982 |
1978 virtual void EmitNativeCode(FlowGraphCompiler* compiler) { | 1983 virtual void EmitNativeCode(FlowGraphCompiler* compiler) { |
1979 __ Comment("BoxDoubleSlowPath"); | 1984 __ Comment("BoxDoubleSlowPath"); |
1980 __ Bind(entry_label()); | 1985 __ Bind(entry_label()); |
| 1986 Isolate* isolate = compiler->isolate(); |
| 1987 StubCode* stub_code = isolate->stub_code(); |
1981 const Class& double_class = compiler->double_class(); | 1988 const Class& double_class = compiler->double_class(); |
1982 const Code& stub = | 1989 const Code& stub = |
1983 Code::Handle(StubCode::GetAllocationStubForClass(double_class)); | 1990 Code::Handle(isolate, |
| 1991 stub_code->GetAllocationStubForClass(double_class)); |
1984 const ExternalLabel label(stub.EntryPoint()); | 1992 const ExternalLabel label(stub.EntryPoint()); |
1985 | 1993 |
1986 LocationSummary* locs = instruction_->locs(); | 1994 LocationSummary* locs = instruction_->locs(); |
1987 locs->live_registers()->Remove(locs->out(0)); | 1995 locs->live_registers()->Remove(locs->out(0)); |
1988 | 1996 |
1989 compiler->SaveLiveRegisters(locs); | 1997 compiler->SaveLiveRegisters(locs); |
1990 compiler->GenerateCall(Scanner::kNoSourcePos, // No token position. | 1998 compiler->GenerateCall(Scanner::kNoSourcePos, // No token position. |
1991 &label, | 1999 &label, |
1992 PcDescriptors::kOther, | 2000 PcDescriptors::kOther, |
1993 locs); | 2001 locs); |
1994 __ mov(locs->out(0).reg(), R0); | 2002 __ mov(locs->out(0).reg(), R0); |
1995 compiler->RestoreLiveRegisters(locs); | 2003 compiler->RestoreLiveRegisters(locs); |
1996 | 2004 |
1997 __ b(exit_label()); | 2005 __ b(exit_label()); |
1998 } | 2006 } |
1999 | 2007 |
2000 private: | 2008 private: |
2001 Instruction* instruction_; | 2009 Instruction* instruction_; |
2002 }; | 2010 }; |
2003 | 2011 |
2004 | 2012 |
2005 class BoxFloat32x4SlowPath : public SlowPathCode { | 2013 class BoxFloat32x4SlowPath : public SlowPathCode { |
2006 public: | 2014 public: |
2007 explicit BoxFloat32x4SlowPath(Instruction* instruction) | 2015 explicit BoxFloat32x4SlowPath(Instruction* instruction) |
2008 : instruction_(instruction) { } | 2016 : instruction_(instruction) { } |
2009 | 2017 |
2010 virtual void EmitNativeCode(FlowGraphCompiler* compiler) { | 2018 virtual void EmitNativeCode(FlowGraphCompiler* compiler) { |
2011 __ Comment("BoxFloat32x4SlowPath"); | 2019 __ Comment("BoxFloat32x4SlowPath"); |
2012 __ Bind(entry_label()); | 2020 __ Bind(entry_label()); |
| 2021 Isolate* isolate = compiler->isolate(); |
| 2022 StubCode* stub_code = isolate->stub_code(); |
2013 const Class& float32x4_class = compiler->float32x4_class(); | 2023 const Class& float32x4_class = compiler->float32x4_class(); |
2014 const Code& stub = | 2024 const Code& stub = |
2015 Code::Handle(StubCode::GetAllocationStubForClass(float32x4_class)); | 2025 Code::Handle(isolate, |
| 2026 stub_code->GetAllocationStubForClass(float32x4_class)); |
2016 const ExternalLabel label(stub.EntryPoint()); | 2027 const ExternalLabel label(stub.EntryPoint()); |
2017 | 2028 |
2018 LocationSummary* locs = instruction_->locs(); | 2029 LocationSummary* locs = instruction_->locs(); |
2019 locs->live_registers()->Remove(locs->out(0)); | 2030 locs->live_registers()->Remove(locs->out(0)); |
2020 | 2031 |
2021 compiler->SaveLiveRegisters(locs); | 2032 compiler->SaveLiveRegisters(locs); |
2022 compiler->GenerateCall(Scanner::kNoSourcePos, // No token position. | 2033 compiler->GenerateCall(Scanner::kNoSourcePos, // No token position. |
2023 &label, | 2034 &label, |
2024 PcDescriptors::kOther, | 2035 PcDescriptors::kOther, |
2025 locs); | 2036 locs); |
2026 __ mov(locs->out(0).reg(), R0); | 2037 __ mov(locs->out(0).reg(), R0); |
2027 compiler->RestoreLiveRegisters(locs); | 2038 compiler->RestoreLiveRegisters(locs); |
2028 | 2039 |
2029 __ b(exit_label()); | 2040 __ b(exit_label()); |
2030 } | 2041 } |
2031 | 2042 |
2032 private: | 2043 private: |
2033 Instruction* instruction_; | 2044 Instruction* instruction_; |
2034 }; | 2045 }; |
2035 | 2046 |
2036 | 2047 |
2037 class BoxFloat64x2SlowPath : public SlowPathCode { | 2048 class BoxFloat64x2SlowPath : public SlowPathCode { |
2038 public: | 2049 public: |
2039 explicit BoxFloat64x2SlowPath(Instruction* instruction) | 2050 explicit BoxFloat64x2SlowPath(Instruction* instruction) |
2040 : instruction_(instruction) { } | 2051 : instruction_(instruction) { } |
2041 | 2052 |
2042 virtual void EmitNativeCode(FlowGraphCompiler* compiler) { | 2053 virtual void EmitNativeCode(FlowGraphCompiler* compiler) { |
2043 __ Comment("BoxFloat64x2SlowPath"); | 2054 __ Comment("BoxFloat64x2SlowPath"); |
2044 __ Bind(entry_label()); | 2055 __ Bind(entry_label()); |
| 2056 Isolate* isolate = compiler->isolate(); |
| 2057 StubCode* stub_code = isolate->stub_code(); |
2045 const Class& float64x2_class = compiler->float64x2_class(); | 2058 const Class& float64x2_class = compiler->float64x2_class(); |
2046 const Code& stub = | 2059 const Code& stub = |
2047 Code::Handle(StubCode::GetAllocationStubForClass(float64x2_class)); | 2060 Code::Handle(isolate, |
| 2061 stub_code->GetAllocationStubForClass(float64x2_class)); |
2048 const ExternalLabel label(stub.EntryPoint()); | 2062 const ExternalLabel label(stub.EntryPoint()); |
2049 | 2063 |
2050 LocationSummary* locs = instruction_->locs(); | 2064 LocationSummary* locs = instruction_->locs(); |
2051 locs->live_registers()->Remove(locs->out(0)); | 2065 locs->live_registers()->Remove(locs->out(0)); |
2052 | 2066 |
2053 compiler->SaveLiveRegisters(locs); | 2067 compiler->SaveLiveRegisters(locs); |
2054 compiler->GenerateCall(Scanner::kNoSourcePos, // No token position. | 2068 compiler->GenerateCall(Scanner::kNoSourcePos, // No token position. |
2055 &label, | 2069 &label, |
2056 PcDescriptors::kOther, | 2070 PcDescriptors::kOther, |
2057 locs); | 2071 locs); |
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2319 locs->set_out(0, Location::RegisterLocation(R0)); | 2333 locs->set_out(0, Location::RegisterLocation(R0)); |
2320 return locs; | 2334 return locs; |
2321 } | 2335 } |
2322 | 2336 |
2323 | 2337 |
2324 void AllocateContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2338 void AllocateContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2325 ASSERT(locs()->temp(0).reg() == R1); | 2339 ASSERT(locs()->temp(0).reg() == R1); |
2326 ASSERT(locs()->out(0).reg() == R0); | 2340 ASSERT(locs()->out(0).reg() == R0); |
2327 | 2341 |
2328 __ LoadImmediate(R1, num_context_variables(), PP); | 2342 __ LoadImmediate(R1, num_context_variables(), PP); |
2329 const ExternalLabel label(StubCode::AllocateContextEntryPoint()); | 2343 StubCode* stub_code = compiler->isolate()->stub_code(); |
| 2344 const ExternalLabel label(stub_code->AllocateContextEntryPoint()); |
2330 compiler->GenerateCall(token_pos(), | 2345 compiler->GenerateCall(token_pos(), |
2331 &label, | 2346 &label, |
2332 PcDescriptors::kOther, | 2347 PcDescriptors::kOther, |
2333 locs()); | 2348 locs()); |
2334 } | 2349 } |
2335 | 2350 |
2336 | 2351 |
2337 LocationSummary* CloneContextInstr::MakeLocationSummary(Isolate* isolate, | 2352 LocationSummary* CloneContextInstr::MakeLocationSummary(Isolate* isolate, |
2338 bool opt) const { | 2353 bool opt) const { |
2339 const intptr_t kNumInputs = 1; | 2354 const intptr_t kNumInputs = 1; |
(...skipping 850 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3190 | 3205 |
3191 | 3206 |
3192 class BoxInt32x4SlowPath : public SlowPathCode { | 3207 class BoxInt32x4SlowPath : public SlowPathCode { |
3193 public: | 3208 public: |
3194 explicit BoxInt32x4SlowPath(BoxInt32x4Instr* instruction) | 3209 explicit BoxInt32x4SlowPath(BoxInt32x4Instr* instruction) |
3195 : instruction_(instruction) { } | 3210 : instruction_(instruction) { } |
3196 | 3211 |
3197 virtual void EmitNativeCode(FlowGraphCompiler* compiler) { | 3212 virtual void EmitNativeCode(FlowGraphCompiler* compiler) { |
3198 __ Comment("BoxInt32x4SlowPath"); | 3213 __ Comment("BoxInt32x4SlowPath"); |
3199 __ Bind(entry_label()); | 3214 __ Bind(entry_label()); |
| 3215 Isolate* isolate = compiler->isolate(); |
| 3216 StubCode* stub_code = isolate->stub_code(); |
3200 const Class& int32x4_class = compiler->int32x4_class(); | 3217 const Class& int32x4_class = compiler->int32x4_class(); |
3201 const Code& stub = | 3218 const Code& stub = |
3202 Code::Handle(StubCode::GetAllocationStubForClass(int32x4_class)); | 3219 Code::Handle(isolate, |
| 3220 stub_code->GetAllocationStubForClass(int32x4_class)); |
3203 const ExternalLabel label(stub.EntryPoint()); | 3221 const ExternalLabel label(stub.EntryPoint()); |
3204 | 3222 |
3205 LocationSummary* locs = instruction_->locs(); | 3223 LocationSummary* locs = instruction_->locs(); |
3206 locs->live_registers()->Remove(locs->out(0)); | 3224 locs->live_registers()->Remove(locs->out(0)); |
3207 | 3225 |
3208 compiler->SaveLiveRegisters(locs); | 3226 compiler->SaveLiveRegisters(locs); |
3209 compiler->GenerateCall(Scanner::kNoSourcePos, // No token position. | 3227 compiler->GenerateCall(Scanner::kNoSourcePos, // No token position. |
3210 &label, | 3228 &label, |
3211 PcDescriptors::kOther, | 3229 PcDescriptors::kOther, |
3212 locs); | 3230 locs); |
(...skipping 2112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5325 } | 5343 } |
5326 | 5344 |
5327 | 5345 |
5328 LocationSummary* AllocateObjectInstr::MakeLocationSummary(Isolate* isolate, | 5346 LocationSummary* AllocateObjectInstr::MakeLocationSummary(Isolate* isolate, |
5329 bool opt) const { | 5347 bool opt) const { |
5330 return MakeCallSummary(); | 5348 return MakeCallSummary(); |
5331 } | 5349 } |
5332 | 5350 |
5333 | 5351 |
5334 void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 5352 void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
5335 const Code& stub = Code::Handle(StubCode::GetAllocationStubForClass(cls())); | 5353 Isolate* isolate = compiler->isolate(); |
| 5354 StubCode* stub_code = isolate->stub_code(); |
| 5355 const Code& stub = Code::Handle(isolate, |
| 5356 stub_code->GetAllocationStubForClass(cls())); |
5336 const ExternalLabel label(stub.EntryPoint()); | 5357 const ExternalLabel label(stub.EntryPoint()); |
5337 compiler->GenerateCall(token_pos(), | 5358 compiler->GenerateCall(token_pos(), |
5338 &label, | 5359 &label, |
5339 PcDescriptors::kOther, | 5360 PcDescriptors::kOther, |
5340 locs()); | 5361 locs()); |
5341 __ Drop(ArgumentCount()); // Discard arguments. | 5362 __ Drop(ArgumentCount()); // Discard arguments. |
5342 } | 5363 } |
5343 | 5364 |
5344 | 5365 |
5345 void DebugStepCheckInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 5366 void DebugStepCheckInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
5346 ASSERT(!compiler->is_optimizing()); | 5367 ASSERT(!compiler->is_optimizing()); |
5347 const ExternalLabel label(StubCode::DebugStepCheckEntryPoint()); | 5368 StubCode* stub_code = compiler->isolate()->stub_code(); |
| 5369 const ExternalLabel label(stub_code->DebugStepCheckEntryPoint()); |
5348 __ LoadImmediate(R4, 0, kNoPP); | 5370 __ LoadImmediate(R4, 0, kNoPP); |
5349 __ LoadImmediate(R5, 0, kNoPP); | 5371 __ LoadImmediate(R5, 0, kNoPP); |
5350 compiler->GenerateCall(token_pos(), &label, stub_kind_, locs()); | 5372 compiler->GenerateCall(token_pos(), &label, stub_kind_, locs()); |
5351 #if defined(DEBUG) | 5373 #if defined(DEBUG) |
5352 __ LoadImmediate(R4, kInvalidObjectPointer, kNoPP); | 5374 __ LoadImmediate(R4, kInvalidObjectPointer, kNoPP); |
5353 __ LoadImmediate(R5, kInvalidObjectPointer, kNoPP); | 5375 __ LoadImmediate(R5, kInvalidObjectPointer, kNoPP); |
5354 #endif | 5376 #endif |
5355 } | 5377 } |
5356 | 5378 |
5357 } // namespace dart | 5379 } // namespace dart |
5358 | 5380 |
5359 #endif // defined TARGET_ARCH_ARM64 | 5381 #endif // defined TARGET_ARCH_ARM64 |
OLD | NEW |