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 #ifndef RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_ | 5 #ifndef RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_ |
6 #define RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_ | 6 #define RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_ |
7 | 7 |
8 #include "vm/allocation.h" | 8 #include "vm/allocation.h" |
9 #include "vm/ast.h" | 9 #include "vm/ast.h" |
10 #include "vm/growable_array.h" | 10 #include "vm/growable_array.h" |
(...skipping 1606 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1617 | 1617 |
1618 intptr_t ssa_temp_index() const { return ssa_temp_index_; } | 1618 intptr_t ssa_temp_index() const { return ssa_temp_index_; } |
1619 void set_ssa_temp_index(intptr_t index) { | 1619 void set_ssa_temp_index(intptr_t index) { |
1620 ASSERT(index >= 0); | 1620 ASSERT(index >= 0); |
1621 ssa_temp_index_ = index; | 1621 ssa_temp_index_ = index; |
1622 } | 1622 } |
1623 bool HasSSATemp() const { return ssa_temp_index_ >= 0; } | 1623 bool HasSSATemp() const { return ssa_temp_index_ >= 0; } |
1624 void ClearSSATempIndex() { ssa_temp_index_ = -1; } | 1624 void ClearSSATempIndex() { ssa_temp_index_ = -1; } |
1625 bool HasPairRepresentation() const { | 1625 bool HasPairRepresentation() const { |
1626 #if defined(TARGET_ARCH_X64) | 1626 #if defined(TARGET_ARCH_X64) |
1627 return (representation() == kPairOfTagged) || | 1627 return representation() == kPairOfTagged; |
1628 (representation() == kPairOfUnboxedDouble); | |
1629 #else | 1628 #else |
1630 return (representation() == kPairOfTagged) || | 1629 return (representation() == kPairOfTagged) || |
1631 (representation() == kPairOfUnboxedDouble) || | |
1632 (representation() == kUnboxedMint); | 1630 (representation() == kUnboxedMint); |
1633 #endif | 1631 #endif |
1634 } | 1632 } |
1635 | 1633 |
1636 // Compile time type of the definition, which may be requested before type | 1634 // Compile time type of the definition, which may be requested before type |
1637 // propagation during graph building. | 1635 // propagation during graph building. |
1638 CompileType* Type() { | 1636 CompileType* Type() { |
1639 if (type_ == NULL) { | 1637 if (type_ == NULL) { |
1640 type_ = ZoneCompileType::Wrap(ComputeType()); | 1638 type_ = ZoneCompileType::Wrap(ComputeType()); |
1641 } | 1639 } |
(...skipping 5743 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7385 virtual bool CanDeoptimize() const { return false; } | 7383 virtual bool CanDeoptimize() const { return false; } |
7386 | 7384 |
7387 intptr_t index() const { return index_; } | 7385 intptr_t index() const { return index_; } |
7388 | 7386 |
7389 virtual Representation representation() const { return definition_rep_; } | 7387 virtual Representation representation() const { return definition_rep_; } |
7390 | 7388 |
7391 virtual Representation RequiredInputRepresentation(intptr_t idx) const { | 7389 virtual Representation RequiredInputRepresentation(intptr_t idx) const { |
7392 ASSERT(idx == 0); | 7390 ASSERT(idx == 0); |
7393 if (representation() == kTagged) { | 7391 if (representation() == kTagged) { |
7394 return kPairOfTagged; | 7392 return kPairOfTagged; |
7395 } else if (representation() == kUnboxedDouble) { | |
7396 return kPairOfUnboxedDouble; | |
7397 } | 7393 } |
7398 UNREACHABLE(); | 7394 UNREACHABLE(); |
7399 return definition_rep_; | 7395 return definition_rep_; |
7400 } | 7396 } |
7401 | 7397 |
7402 virtual bool AttributesEqual(Instruction* other) const { | 7398 virtual bool AttributesEqual(Instruction* other) const { |
7403 ExtractNthOutputInstr* other_extract = other->AsExtractNthOutput(); | 7399 ExtractNthOutputInstr* other_extract = other->AsExtractNthOutput(); |
7404 return (other_extract->representation() == representation()) && | 7400 return (other_extract->representation() == representation()) && |
7405 (other_extract->index() == index()); | 7401 (other_extract->index() == index()); |
7406 } | 7402 } |
7407 | 7403 |
7408 PRINT_OPERANDS_TO_SUPPORT | 7404 PRINT_OPERANDS_TO_SUPPORT |
7409 | 7405 |
7410 private: | 7406 private: |
7411 const intptr_t index_; | 7407 const intptr_t index_; |
7412 const Representation definition_rep_; | 7408 const Representation definition_rep_; |
7413 const intptr_t definition_cid_; | 7409 const intptr_t definition_cid_; |
7414 DISALLOW_COPY_AND_ASSIGN(ExtractNthOutputInstr); | 7410 DISALLOW_COPY_AND_ASSIGN(ExtractNthOutputInstr); |
7415 }; | 7411 }; |
7416 | 7412 |
7417 | 7413 |
7418 class MergedMathInstr : public PureDefinition { | 7414 class MergedMathInstr : public PureDefinition { |
7419 public: | 7415 public: |
7420 enum Kind { | 7416 enum Kind { |
7421 kTruncDivMod, | 7417 kTruncDivMod, |
7422 kSinCos, | |
7423 }; | 7418 }; |
7424 | 7419 |
7425 MergedMathInstr(ZoneGrowableArray<Value*>* inputs, | 7420 MergedMathInstr(ZoneGrowableArray<Value*>* inputs, |
7426 intptr_t original_deopt_id, | 7421 intptr_t original_deopt_id, |
7427 MergedMathInstr::Kind kind); | 7422 MergedMathInstr::Kind kind); |
7428 | 7423 |
7429 static intptr_t InputCountFor(MergedMathInstr::Kind kind) { | 7424 static intptr_t InputCountFor(MergedMathInstr::Kind kind) { |
7430 if (kind == kTruncDivMod) { | 7425 if (kind == kTruncDivMod) { |
7431 return 2; | 7426 return 2; |
7432 } else if (kind == kSinCos) { | |
7433 return 1; | |
7434 } else { | 7427 } else { |
7435 UNIMPLEMENTED(); | 7428 UNIMPLEMENTED(); |
7436 return -1; | 7429 return -1; |
7437 } | 7430 } |
7438 } | 7431 } |
7439 | 7432 |
7440 MergedMathInstr::Kind kind() const { return kind_; } | 7433 MergedMathInstr::Kind kind() const { return kind_; } |
7441 | 7434 |
7442 virtual intptr_t InputCount() const { return inputs_->length(); } | 7435 virtual intptr_t InputCount() const { return inputs_->length(); } |
7443 | 7436 |
7444 virtual Value* InputAt(intptr_t i) const { return (*inputs_)[i]; } | 7437 virtual Value* InputAt(intptr_t i) const { return (*inputs_)[i]; } |
7445 | 7438 |
7446 static intptr_t OutputIndexOf(MethodRecognizer::Kind kind); | 7439 static intptr_t OutputIndexOf(MethodRecognizer::Kind kind); |
7447 static intptr_t OutputIndexOf(Token::Kind token); | 7440 static intptr_t OutputIndexOf(Token::Kind token); |
7448 | 7441 |
7449 virtual CompileType ComputeType() const; | 7442 virtual CompileType ComputeType() const; |
7450 | 7443 |
7451 virtual bool CanDeoptimize() const { | 7444 virtual bool CanDeoptimize() const { |
7452 if (kind_ == kTruncDivMod) { | 7445 if (kind_ == kTruncDivMod) { |
7453 return true; | 7446 return true; |
7454 } else if (kind_ == kSinCos) { | |
7455 return false; | |
7456 } else { | 7447 } else { |
7457 UNIMPLEMENTED(); | 7448 UNIMPLEMENTED(); |
7458 return false; | 7449 return false; |
7459 } | 7450 } |
7460 } | 7451 } |
7461 | 7452 |
7462 virtual Representation representation() const { | 7453 virtual Representation representation() const { |
7463 if (kind_ == kTruncDivMod) { | 7454 if (kind_ == kTruncDivMod) { |
7464 return kPairOfTagged; | 7455 return kPairOfTagged; |
7465 } else if (kind_ == kSinCos) { | |
7466 return kPairOfUnboxedDouble; | |
7467 } else { | 7456 } else { |
7468 UNIMPLEMENTED(); | 7457 UNIMPLEMENTED(); |
7469 return kTagged; | 7458 return kTagged; |
7470 } | 7459 } |
7471 } | 7460 } |
7472 | 7461 |
7473 virtual Representation RequiredInputRepresentation(intptr_t idx) const { | 7462 virtual Representation RequiredInputRepresentation(intptr_t idx) const { |
7474 ASSERT((0 <= idx) && (idx < InputCount())); | 7463 ASSERT((0 <= idx) && (idx < InputCount())); |
7475 if (kind_ == kTruncDivMod) { | 7464 if (kind_ == kTruncDivMod) { |
7476 return kTagged; | 7465 return kTagged; |
7477 } else if (kind_ == kSinCos) { | |
7478 return kUnboxedDouble; | |
7479 } else { | 7466 } else { |
7480 UNIMPLEMENTED(); | 7467 UNIMPLEMENTED(); |
7481 return kTagged; | 7468 return kTagged; |
7482 } | 7469 } |
7483 } | 7470 } |
7484 | 7471 |
7485 virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); } | 7472 virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); } |
7486 | 7473 |
7487 DECLARE_INSTRUCTION(MergedMath) | 7474 DECLARE_INSTRUCTION(MergedMath) |
7488 | 7475 |
7489 virtual bool AttributesEqual(Instruction* other) const { | 7476 virtual bool AttributesEqual(Instruction* other) const { |
7490 MergedMathInstr* other_invoke = other->AsMergedMath(); | 7477 MergedMathInstr* other_invoke = other->AsMergedMath(); |
7491 return other_invoke->kind() == kind(); | 7478 return other_invoke->kind() == kind(); |
7492 } | 7479 } |
7493 | 7480 |
7494 virtual bool MayThrow() const { return false; } | 7481 virtual bool MayThrow() const { return false; } |
7495 | 7482 |
7496 static const char* KindToCString(MergedMathInstr::Kind kind) { | 7483 static const char* KindToCString(MergedMathInstr::Kind kind) { |
7497 if (kind == kTruncDivMod) return "TruncDivMod"; | 7484 if (kind == kTruncDivMod) return "TruncDivMod"; |
7498 if (kind == kSinCos) return "SinCos"; | |
7499 UNIMPLEMENTED(); | 7485 UNIMPLEMENTED(); |
7500 return ""; | 7486 return ""; |
7501 } | 7487 } |
7502 | 7488 |
7503 PRINT_OPERANDS_TO_SUPPORT | 7489 PRINT_OPERANDS_TO_SUPPORT |
7504 | 7490 |
7505 private: | 7491 private: |
7506 virtual void RawSetInputAt(intptr_t i, Value* value) { | 7492 virtual void RawSetInputAt(intptr_t i, Value* value) { |
7507 (*inputs_)[i] = value; | 7493 (*inputs_)[i] = value; |
7508 } | 7494 } |
(...skipping 529 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8038 LocationSummary* Name::MakeLocationSummary(Zone* zone, bool opt) const { \ | 8024 LocationSummary* Name::MakeLocationSummary(Zone* zone, bool opt) const { \ |
8039 UNIMPLEMENTED(); \ | 8025 UNIMPLEMENTED(); \ |
8040 return NULL; \ | 8026 return NULL; \ |
8041 } \ | 8027 } \ |
8042 void Name::EmitNativeCode(FlowGraphCompiler* compiler) { UNIMPLEMENTED(); } | 8028 void Name::EmitNativeCode(FlowGraphCompiler* compiler) { UNIMPLEMENTED(); } |
8043 | 8029 |
8044 | 8030 |
8045 } // namespace dart | 8031 } // namespace dart |
8046 | 8032 |
8047 #endif // RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_ | 8033 #endif // RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_ |
OLD | NEW |