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_MIPS. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_MIPS. |
6 #if defined(TARGET_ARCH_MIPS) | 6 #if defined(TARGET_ARCH_MIPS) |
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 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
319 const intptr_t kNumTemps = 1; | 319 const intptr_t kNumTemps = 1; |
320 LocationSummary* locs = new(isolate) LocationSummary( | 320 LocationSummary* locs = new(isolate) LocationSummary( |
321 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 321 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
322 locs->set_out(0, Location::RequiresFpuRegister()); | 322 locs->set_out(0, Location::RequiresFpuRegister()); |
323 locs->set_temp(0, Location::RequiresRegister()); | 323 locs->set_temp(0, Location::RequiresRegister()); |
324 return locs; | 324 return locs; |
325 } | 325 } |
326 | 326 |
327 | 327 |
328 void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 328 void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 329 ASSERT(representation_ == kUnboxedDouble); |
329 // The register allocator drops constant definitions that have no uses. | 330 // The register allocator drops constant definitions that have no uses. |
330 if (!locs()->out(0).IsInvalid()) { | 331 if (!locs()->out(0).IsInvalid()) { |
331 ASSERT(value().IsDouble()); | 332 ASSERT(value().IsDouble()); |
332 const Register const_value = locs()->temp(0).reg(); | 333 const Register const_value = locs()->temp(0).reg(); |
333 const DRegister result = locs()->out(0).fpu_reg(); | 334 const DRegister result = locs()->out(0).fpu_reg(); |
334 __ LoadObject(const_value, value()); | 335 __ LoadObject(const_value, value()); |
335 __ LoadDFromOffset(result, const_value, | 336 __ LoadDFromOffset(result, const_value, |
336 Double::value_offset() - kHeapObjectTag); | 337 Double::value_offset() - kHeapObjectTag); |
337 } | 338 } |
338 } | 339 } |
(...skipping 776 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1115 | 1116 |
1116 | 1117 |
1117 LocationSummary* LoadIndexedInstr::MakeLocationSummary(Isolate* isolate, | 1118 LocationSummary* LoadIndexedInstr::MakeLocationSummary(Isolate* isolate, |
1118 bool opt) const { | 1119 bool opt) const { |
1119 const intptr_t kNumInputs = 2; | 1120 const intptr_t kNumInputs = 2; |
1120 const intptr_t kNumTemps = 0; | 1121 const intptr_t kNumTemps = 0; |
1121 LocationSummary* locs = new(isolate) LocationSummary( | 1122 LocationSummary* locs = new(isolate) LocationSummary( |
1122 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 1123 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
1123 locs->set_in(0, Location::RequiresRegister()); | 1124 locs->set_in(0, Location::RequiresRegister()); |
1124 if (CanBeImmediateIndex(index(), class_id(), IsExternal())) { | 1125 if (CanBeImmediateIndex(index(), class_id(), IsExternal())) { |
1125 locs->set_in(1, Location::Constant(index()->BoundConstant())); | 1126 locs->set_in(1, Location::Constant(index()->definition()->AsConstant())); |
1126 } else { | 1127 } else { |
1127 locs->set_in(1, Location::RequiresRegister()); | 1128 locs->set_in(1, Location::RequiresRegister()); |
1128 } | 1129 } |
1129 if ((representation() == kUnboxedDouble) || | 1130 if ((representation() == kUnboxedDouble) || |
1130 (representation() == kUnboxedFloat32x4) || | 1131 (representation() == kUnboxedFloat32x4) || |
1131 (representation() == kUnboxedInt32x4)) { | 1132 (representation() == kUnboxedInt32x4)) { |
1132 locs->set_out(0, Location::RequiresFpuRegister()); | 1133 locs->set_out(0, Location::RequiresFpuRegister()); |
1133 } else { | 1134 } else { |
1134 locs->set_out(0, Location::RequiresRegister()); | 1135 locs->set_out(0, Location::RequiresRegister()); |
1135 } | 1136 } |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1268 | 1269 |
1269 | 1270 |
1270 LocationSummary* StoreIndexedInstr::MakeLocationSummary(Isolate* isolate, | 1271 LocationSummary* StoreIndexedInstr::MakeLocationSummary(Isolate* isolate, |
1271 bool opt) const { | 1272 bool opt) const { |
1272 const intptr_t kNumInputs = 3; | 1273 const intptr_t kNumInputs = 3; |
1273 const intptr_t kNumTemps = 0; | 1274 const intptr_t kNumTemps = 0; |
1274 LocationSummary* locs = new(isolate) LocationSummary( | 1275 LocationSummary* locs = new(isolate) LocationSummary( |
1275 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 1276 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
1276 locs->set_in(0, Location::RequiresRegister()); | 1277 locs->set_in(0, Location::RequiresRegister()); |
1277 if (CanBeImmediateIndex(index(), class_id(), IsExternal())) { | 1278 if (CanBeImmediateIndex(index(), class_id(), IsExternal())) { |
1278 locs->set_in(1, Location::Constant(index()->BoundConstant())); | 1279 locs->set_in(1, Location::Constant(index()->definition()->AsConstant())); |
1279 } else { | 1280 } else { |
1280 locs->set_in(1, Location::WritableRegister()); | 1281 locs->set_in(1, Location::WritableRegister()); |
1281 } | 1282 } |
1282 switch (class_id()) { | 1283 switch (class_id()) { |
1283 case kArrayCid: | 1284 case kArrayCid: |
1284 locs->set_in(2, ShouldEmitStoreBarrier() | 1285 locs->set_in(2, ShouldEmitStoreBarrier() |
1285 ? Location::WritableRegister() | 1286 ? Location::WritableRegister() |
1286 : Location::RegisterOrConstant(value())); | 1287 : Location::RegisterOrConstant(value())); |
1287 break; | 1288 break; |
1288 case kExternalTypedDataUint8ArrayCid: | 1289 case kExternalTypedDataUint8ArrayCid: |
(...skipping 1428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2717 (op_kind() == Token::kMOD) || | 2718 (op_kind() == Token::kMOD) || |
2718 (op_kind() == Token::kTRUNCDIV) || | 2719 (op_kind() == Token::kTRUNCDIV) || |
2719 (((op_kind() == Token::kSHL) && !IsTruncating()) || | 2720 (((op_kind() == Token::kSHL) && !IsTruncating()) || |
2720 (op_kind() == Token::kSHR))) ? 1 : 0; | 2721 (op_kind() == Token::kSHR))) ? 1 : 0; |
2721 LocationSummary* summary = new(isolate) LocationSummary( | 2722 LocationSummary* summary = new(isolate) LocationSummary( |
2722 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 2723 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
2723 if (op_kind() == Token::kTRUNCDIV) { | 2724 if (op_kind() == Token::kTRUNCDIV) { |
2724 summary->set_in(0, Location::RequiresRegister()); | 2725 summary->set_in(0, Location::RequiresRegister()); |
2725 if (RightIsPowerOfTwoConstant()) { | 2726 if (RightIsPowerOfTwoConstant()) { |
2726 ConstantInstr* right_constant = right()->definition()->AsConstant(); | 2727 ConstantInstr* right_constant = right()->definition()->AsConstant(); |
2727 summary->set_in(1, Location::Constant(right_constant->value())); | 2728 summary->set_in(1, Location::Constant(right_constant)); |
2728 } else { | 2729 } else { |
2729 summary->set_in(1, Location::RequiresRegister()); | 2730 summary->set_in(1, Location::RequiresRegister()); |
2730 } | 2731 } |
2731 summary->set_temp(0, Location::RequiresRegister()); | 2732 summary->set_temp(0, Location::RequiresRegister()); |
2732 summary->set_out(0, Location::RequiresRegister()); | 2733 summary->set_out(0, Location::RequiresRegister()); |
2733 return summary; | 2734 return summary; |
2734 } | 2735 } |
2735 if (op_kind() == Token::kMOD) { | 2736 if (op_kind() == Token::kMOD) { |
2736 summary->set_in(0, Location::RequiresRegister()); | 2737 summary->set_in(0, Location::RequiresRegister()); |
2737 summary->set_in(1, Location::RequiresRegister()); | 2738 summary->set_in(1, Location::RequiresRegister()); |
(...skipping 1090 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3828 const Double& minus_one = Double::ZoneHandle(Double::NewCanonical(-1)); | 3829 const Double& minus_one = Double::ZoneHandle(Double::NewCanonical(-1)); |
3829 __ LoadObject(TMP, minus_one); | 3830 __ LoadObject(TMP, minus_one); |
3830 FpuRegister result = locs()->out(0).fpu_reg(); | 3831 FpuRegister result = locs()->out(0).fpu_reg(); |
3831 FpuRegister value = locs()->in(0).fpu_reg(); | 3832 FpuRegister value = locs()->in(0).fpu_reg(); |
3832 FpuRegister temp_fp = locs()->temp(0).fpu_reg(); | 3833 FpuRegister temp_fp = locs()->temp(0).fpu_reg(); |
3833 __ LoadDFromOffset(temp_fp, TMP, Double::value_offset() - kHeapObjectTag); | 3834 __ LoadDFromOffset(temp_fp, TMP, Double::value_offset() - kHeapObjectTag); |
3834 __ muld(result, value, temp_fp); | 3835 __ muld(result, value, temp_fp); |
3835 } | 3836 } |
3836 | 3837 |
3837 | 3838 |
| 3839 DEFINE_UNIMPLEMENTED_INSTRUCTION(Int32ToDoubleInstr) |
| 3840 |
3838 | 3841 |
3839 LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Isolate* isolate, | 3842 LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Isolate* isolate, |
3840 bool opt) const { | 3843 bool opt) const { |
3841 const intptr_t kNumInputs = 1; | 3844 const intptr_t kNumInputs = 1; |
3842 const intptr_t kNumTemps = 0; | 3845 const intptr_t kNumTemps = 0; |
3843 LocationSummary* result = new(isolate) LocationSummary( | 3846 LocationSummary* result = new(isolate) LocationSummary( |
3844 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3847 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3845 result->set_in(0, Location::RequiresRegister()); | 3848 result->set_in(0, Location::RequiresRegister()); |
3846 result->set_out(0, Location::RequiresFpuRegister()); | 3849 result->set_out(0, Location::RequiresFpuRegister()); |
3847 return result; | 3850 return result; |
(...skipping 703 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4551 CompileType ShiftUint32OpInstr::ComputeType() const { | 4554 CompileType ShiftUint32OpInstr::ComputeType() const { |
4552 return CompileType::Int(); | 4555 return CompileType::Int(); |
4553 } | 4556 } |
4554 | 4557 |
4555 | 4558 |
4556 CompileType UnaryUint32OpInstr::ComputeType() const { | 4559 CompileType UnaryUint32OpInstr::ComputeType() const { |
4557 return CompileType::Int(); | 4560 return CompileType::Int(); |
4558 } | 4561 } |
4559 | 4562 |
4560 | 4563 |
4561 CompileType BoxUint32Instr::ComputeType() const { | 4564 DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryUint32OpInstr) |
4562 return CompileType::Int(); | 4565 DEFINE_UNIMPLEMENTED_INSTRUCTION(ShiftUint32OpInstr) |
4563 } | 4566 DEFINE_UNIMPLEMENTED_INSTRUCTION(UnaryUint32OpInstr) |
4564 | 4567 DEFINE_UNIMPLEMENTED_INSTRUCTION(BoxInt32Instr) |
4565 | 4568 DEFINE_UNIMPLEMENTED_INSTRUCTION(UnboxInt32Instr) |
4566 CompileType UnboxUint32Instr::ComputeType() const { | 4569 DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryInt32OpInstr) |
4567 return CompileType::Int(); | 4570 DEFINE_UNIMPLEMENTED_INSTRUCTION(BoxUint32Instr) |
4568 } | 4571 DEFINE_UNIMPLEMENTED_INSTRUCTION(UnboxUint32Instr) |
4569 | 4572 DEFINE_UNIMPLEMENTED_INSTRUCTION(UnboxedIntConverterInstr) |
4570 | |
4571 LocationSummary* BinaryUint32OpInstr::MakeLocationSummary(Isolate* isolate, | |
4572 bool opt) const { | |
4573 UNIMPLEMENTED(); | |
4574 return NULL; | |
4575 } | |
4576 | |
4577 | |
4578 void BinaryUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | |
4579 UNIMPLEMENTED(); | |
4580 } | |
4581 | |
4582 | |
4583 LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Isolate* isolate, | |
4584 bool opt) const { | |
4585 UNIMPLEMENTED(); | |
4586 return NULL; | |
4587 } | |
4588 | |
4589 | |
4590 void ShiftUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | |
4591 UNIMPLEMENTED(); | |
4592 } | |
4593 | |
4594 | |
4595 LocationSummary* UnaryUint32OpInstr::MakeLocationSummary(Isolate* isolate, | |
4596 bool opt) const { | |
4597 UNIMPLEMENTED(); | |
4598 return NULL; | |
4599 } | |
4600 | |
4601 | |
4602 void UnaryUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | |
4603 UNIMPLEMENTED(); | |
4604 } | |
4605 | |
4606 | |
4607 LocationSummary* UnboxUint32Instr::MakeLocationSummary(Isolate* isolate, | |
4608 bool opt) const { | |
4609 UNIMPLEMENTED(); | |
4610 return NULL; | |
4611 } | |
4612 | |
4613 | |
4614 void UnboxUint32Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | |
4615 UNIMPLEMENTED(); | |
4616 } | |
4617 | |
4618 | |
4619 LocationSummary* BoxUint32Instr::MakeLocationSummary(Isolate* isolate, | |
4620 bool opt) const { | |
4621 UNIMPLEMENTED(); | |
4622 return NULL; | |
4623 } | |
4624 | |
4625 | |
4626 void BoxUint32Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | |
4627 UNIMPLEMENTED(); | |
4628 } | |
4629 | |
4630 | |
4631 LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Isolate* isolate, | |
4632 bool opt) const { | |
4633 UNIMPLEMENTED(); | |
4634 return NULL; | |
4635 } | |
4636 | |
4637 | |
4638 void UnboxedIntConverterInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | |
4639 UNIMPLEMENTED(); | |
4640 } | |
4641 | 4573 |
4642 | 4574 |
4643 LocationSummary* ThrowInstr::MakeLocationSummary(Isolate* isolate, | 4575 LocationSummary* ThrowInstr::MakeLocationSummary(Isolate* isolate, |
4644 bool opt) const { | 4576 bool opt) const { |
4645 return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall); | 4577 return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall); |
4646 } | 4578 } |
4647 | 4579 |
4648 | 4580 |
4649 | 4581 |
4650 void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4582 void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4879 compiler->GenerateCall(token_pos(), &label, stub_kind_, locs()); | 4811 compiler->GenerateCall(token_pos(), &label, stub_kind_, locs()); |
4880 #if defined(DEBUG) | 4812 #if defined(DEBUG) |
4881 __ LoadImmediate(S4, kInvalidObjectPointer); | 4813 __ LoadImmediate(S4, kInvalidObjectPointer); |
4882 __ LoadImmediate(S5, kInvalidObjectPointer); | 4814 __ LoadImmediate(S5, kInvalidObjectPointer); |
4883 #endif | 4815 #endif |
4884 } | 4816 } |
4885 | 4817 |
4886 } // namespace dart | 4818 } // namespace dart |
4887 | 4819 |
4888 #endif // defined TARGET_ARCH_MIPS | 4820 #endif // defined TARGET_ARCH_MIPS |
OLD | NEW |