| 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_ARM. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_ARM. |
| 6 #if defined(TARGET_ARCH_ARM) | 6 #if defined(TARGET_ARCH_ARM) |
| 7 | 7 |
| 8 #include "vm/intermediate_language.h" | 8 #include "vm/intermediate_language.h" |
| 9 | 9 |
| 10 #include "vm/cpu.h" | 10 #include "vm/cpu.h" |
| (...skipping 5809 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5820 // Sign extend result_lo into result_hi. | 5820 // Sign extend result_lo into result_hi. |
| 5821 __ SignFill(result_hi, result_lo); | 5821 __ SignFill(result_hi, result_lo); |
| 5822 __ Bind(&done); | 5822 __ Bind(&done); |
| 5823 } | 5823 } |
| 5824 } | 5824 } |
| 5825 | 5825 |
| 5826 | 5826 |
| 5827 LocationSummary* BoxIntegerInstr::MakeLocationSummary(Isolate* isolate, | 5827 LocationSummary* BoxIntegerInstr::MakeLocationSummary(Isolate* isolate, |
| 5828 bool opt) const { | 5828 bool opt) const { |
| 5829 const intptr_t kNumInputs = 1; | 5829 const intptr_t kNumInputs = 1; |
| 5830 const intptr_t kNumTemps = 1; | 5830 const intptr_t kNumTemps = is_smi() ? 0 : 1; |
| 5831 LocationSummary* summary = new(isolate) LocationSummary( | 5831 LocationSummary* summary = new(isolate) LocationSummary( |
| 5832 isolate, kNumInputs, | 5832 isolate, kNumInputs, |
| 5833 kNumTemps, | 5833 kNumTemps, |
| 5834 LocationSummary::kCallOnSlowPath); | 5834 is_smi() |
| 5835 ? LocationSummary::kNoCall |
| 5836 : LocationSummary::kCallOnSlowPath); |
| 5835 summary->set_in(0, Location::Pair(Location::RequiresRegister(), | 5837 summary->set_in(0, Location::Pair(Location::RequiresRegister(), |
| 5836 Location::RequiresRegister())); | 5838 Location::RequiresRegister())); |
| 5837 summary->set_temp(0, Location::RequiresRegister()); | 5839 if (!is_smi()) { |
| 5840 summary->set_temp(0, Location::RequiresRegister()); |
| 5841 } |
| 5838 summary->set_out(0, Location::RequiresRegister()); | 5842 summary->set_out(0, Location::RequiresRegister()); |
| 5839 return summary; | 5843 return summary; |
| 5840 } | 5844 } |
| 5841 | 5845 |
| 5842 | 5846 |
| 5843 class BoxIntegerSlowPath : public SlowPathCode { | 5847 class BoxIntegerSlowPath : public SlowPathCode { |
| 5844 public: | 5848 public: |
| 5845 explicit BoxIntegerSlowPath(BoxIntegerInstr* instruction) | 5849 explicit BoxIntegerSlowPath(BoxIntegerInstr* instruction) |
| 5846 : instruction_(instruction) { } | 5850 : instruction_(instruction) { } |
| 5847 | 5851 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 5867 | 5871 |
| 5868 __ b(exit_label()); | 5872 __ b(exit_label()); |
| 5869 } | 5873 } |
| 5870 | 5874 |
| 5871 private: | 5875 private: |
| 5872 BoxIntegerInstr* instruction_; | 5876 BoxIntegerInstr* instruction_; |
| 5873 }; | 5877 }; |
| 5874 | 5878 |
| 5875 | 5879 |
| 5876 void BoxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 5880 void BoxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 5881 if (is_smi()) { |
| 5882 PairLocation* value_pair = locs()->in(0).AsPairLocation(); |
| 5883 Register value_lo = value_pair->At(0).reg(); |
| 5884 Register out_reg = locs()->out(0).reg(); |
| 5885 __ mov(out_reg, Operand(value_lo)); |
| 5886 __ SmiTag(out_reg); |
| 5887 return; |
| 5888 } |
| 5889 |
| 5877 BoxIntegerSlowPath* slow_path = new BoxIntegerSlowPath(this); | 5890 BoxIntegerSlowPath* slow_path = new BoxIntegerSlowPath(this); |
| 5878 compiler->AddSlowPathCode(slow_path); | 5891 compiler->AddSlowPathCode(slow_path); |
| 5879 PairLocation* value_pair = locs()->in(0).AsPairLocation(); | 5892 PairLocation* value_pair = locs()->in(0).AsPairLocation(); |
| 5880 Register value_lo = value_pair->At(0).reg(); | 5893 Register value_lo = value_pair->At(0).reg(); |
| 5881 Register value_hi = value_pair->At(1).reg(); | 5894 Register value_hi = value_pair->At(1).reg(); |
| 5882 Register tmp = locs()->temp(0).reg(); | 5895 Register tmp = locs()->temp(0).reg(); |
| 5883 Register out_reg = locs()->out(0).reg(); | 5896 Register out_reg = locs()->out(0).reg(); |
| 5884 | 5897 |
| 5885 // Unboxed operations produce smis or mint-sized values. | 5898 // Unboxed operations produce smis or mint-sized values. |
| 5886 // Check if value fits into a smi. | 5899 // Check if value fits into a smi. |
| (...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6358 compiler->GenerateCall(token_pos(), &label, stub_kind_, locs()); | 6371 compiler->GenerateCall(token_pos(), &label, stub_kind_, locs()); |
| 6359 #if defined(DEBUG) | 6372 #if defined(DEBUG) |
| 6360 __ LoadImmediate(R4, kInvalidObjectPointer); | 6373 __ LoadImmediate(R4, kInvalidObjectPointer); |
| 6361 __ LoadImmediate(R5, kInvalidObjectPointer); | 6374 __ LoadImmediate(R5, kInvalidObjectPointer); |
| 6362 #endif | 6375 #endif |
| 6363 } | 6376 } |
| 6364 | 6377 |
| 6365 } // namespace dart | 6378 } // namespace dart |
| 6366 | 6379 |
| 6367 #endif // defined TARGET_ARCH_ARM | 6380 #endif // defined TARGET_ARCH_ARM |
| OLD | NEW |