Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(758)

Side by Side Diff: runtime/vm/intermediate_language.h

Issue 215363004: Support for multiple register values (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 VM_INTERMEDIATE_LANGUAGE_H_ 5 #ifndef VM_INTERMEDIATE_LANGUAGE_H_
6 #define VM_INTERMEDIATE_LANGUAGE_H_ 6 #define 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 761 matching lines...) Expand 10 before | Expand all | Expand 10 after
772 M(UnboxFloat64x2) \ 772 M(UnboxFloat64x2) \
773 M(BinaryFloat64x2Op) \ 773 M(BinaryFloat64x2Op) \
774 M(Float64x2Zero) \ 774 M(Float64x2Zero) \
775 M(Float64x2Constructor) \ 775 M(Float64x2Constructor) \
776 M(Float64x2Splat) \ 776 M(Float64x2Splat) \
777 M(Float32x4ToFloat64x2) \ 777 M(Float32x4ToFloat64x2) \
778 M(Float64x2ToFloat32x4) \ 778 M(Float64x2ToFloat32x4) \
779 M(Simd64x2Shuffle) \ 779 M(Simd64x2Shuffle) \
780 M(Float64x2ZeroArg) \ 780 M(Float64x2ZeroArg) \
781 M(Float64x2OneArg) \ 781 M(Float64x2OneArg) \
782 M(MergedMath2) \
783 M(ExtractNthOutput) \
782 784
783 785
784 #define FORWARD_DECLARATION(type) class type##Instr; 786 #define FORWARD_DECLARATION(type) class type##Instr;
785 FOR_EACH_INSTRUCTION(FORWARD_DECLARATION) 787 FOR_EACH_INSTRUCTION(FORWARD_DECLARATION)
786 #undef FORWARD_DECLARATION 788 #undef FORWARD_DECLARATION
787 789
788 790
789 // Functions required in all concrete instruction classes. 791 // Functions required in all concrete instruction classes.
790 #define DECLARE_INSTRUCTION(type) \ 792 #define DECLARE_INSTRUCTION(type) \
791 virtual Tag tag() const { return k##type; } \ 793 virtual Tag tag() const { return k##type; } \
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after
1092 friend class CheckSmiInstr; 1094 friend class CheckSmiInstr;
1093 friend class CheckArrayBoundInstr; 1095 friend class CheckArrayBoundInstr;
1094 friend class CheckEitherNonSmiInstr; 1096 friend class CheckEitherNonSmiInstr;
1095 friend class LICM; 1097 friend class LICM;
1096 friend class DoubleToSmiInstr; 1098 friend class DoubleToSmiInstr;
1097 friend class DoubleToDoubleInstr; 1099 friend class DoubleToDoubleInstr;
1098 friend class DoubleToFloatInstr; 1100 friend class DoubleToFloatInstr;
1099 friend class FloatToDoubleInstr; 1101 friend class FloatToDoubleInstr;
1100 friend class InvokeMathCFunctionInstr; 1102 friend class InvokeMathCFunctionInstr;
1101 friend class MergedMathInstr; 1103 friend class MergedMathInstr;
1104 friend class MergedMath2Instr;
1102 friend class FlowGraphOptimizer; 1105 friend class FlowGraphOptimizer;
1103 friend class LoadIndexedInstr; 1106 friend class LoadIndexedInstr;
1104 friend class StoreIndexedInstr; 1107 friend class StoreIndexedInstr;
1105 friend class StoreInstanceFieldInstr; 1108 friend class StoreInstanceFieldInstr;
1106 friend class ComparisonInstr; 1109 friend class ComparisonInstr;
1107 friend class TargetEntryInstr; 1110 friend class TargetEntryInstr;
1108 friend class JoinEntryInstr; 1111 friend class JoinEntryInstr;
1109 friend class InstanceOfInstr; 1112 friend class InstanceOfInstr;
1110 friend class PolymorphicInstanceCallInstr; 1113 friend class PolymorphicInstanceCallInstr;
1111 friend class SmiToDoubleInstr; 1114 friend class SmiToDoubleInstr;
(...skipping 646 matching lines...) Expand 10 before | Expand all | Expand 10 after
1758 1761
1759 intptr_t ssa_temp_index() const { return ssa_temp_index_; } 1762 intptr_t ssa_temp_index() const { return ssa_temp_index_; }
1760 void set_ssa_temp_index(intptr_t index) { 1763 void set_ssa_temp_index(intptr_t index) {
1761 ASSERT(index >= 0); 1764 ASSERT(index >= 0);
1762 ASSERT(is_used()); 1765 ASSERT(is_used());
1763 ssa_temp_index_ = index; 1766 ssa_temp_index_ = index;
1764 } 1767 }
1765 bool HasSSATemp() const { return ssa_temp_index_ >= 0; } 1768 bool HasSSATemp() const { return ssa_temp_index_ >= 0; }
1766 void ClearSSATempIndex() { ssa_temp_index_ = -1; } 1769 void ClearSSATempIndex() { ssa_temp_index_ = -1; }
1767 1770
1771
1772 virtual bool RequiresTwoSSATempIndexes() const {
1773 return false;
1774 }
1775
1776 intptr_t ssa_temp_index2() const { return ssa_temp_index2_; }
1777 void set_ssa_temp_index2(intptr_t index) {
1778 ASSERT(index >= 0);
1779 ASSERT(is_used());
1780 ASSERT(RequiresTwoSSATempIndexes());
1781 ssa_temp_index2_ = index;
1782 }
1783 void ClearSSATempIndex2() { ssa_temp_index2_ = -1; }
1784
1785
1768 bool is_used() const { return (use_kind_ != kEffect); } 1786 bool is_used() const { return (use_kind_ != kEffect); }
1769 void set_use_kind(UseKind kind) { use_kind_ = kind; } 1787 void set_use_kind(UseKind kind) { use_kind_ = kind; }
1770 1788
1771 // Compile time type of the definition, which may be requested before type 1789 // Compile time type of the definition, which may be requested before type
1772 // propagation during graph building. 1790 // propagation during graph building.
1773 CompileType* Type() { 1791 CompileType* Type() {
1774 if (type_ == NULL) { 1792 if (type_ == NULL) {
1775 type_ = ComputeInitialType(); 1793 type_ = ComputeInitialType();
1776 } 1794 }
1777 return type_; 1795 return type_;
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
1881 protected: 1899 protected:
1882 friend class RangeAnalysis; 1900 friend class RangeAnalysis;
1883 friend class Value; 1901 friend class Value;
1884 1902
1885 Range* range_; 1903 Range* range_;
1886 CompileType* type_; 1904 CompileType* type_;
1887 1905
1888 private: 1906 private:
1889 intptr_t temp_index_; 1907 intptr_t temp_index_;
1890 intptr_t ssa_temp_index_; 1908 intptr_t ssa_temp_index_;
1909 intptr_t ssa_temp_index2_;
Vyacheslav Egorov (Google) 2014/04/03 18:10:09 Can we sink it down into instructions that actuall
Cutch 2014/04/03 18:35:07 Done.
1891 Value* input_use_list_; 1910 Value* input_use_list_;
1892 Value* env_use_list_; 1911 Value* env_use_list_;
1893 UseKind use_kind_; 1912 UseKind use_kind_;
1894 1913
1895 Object& constant_value_; 1914 Object& constant_value_;
1896 1915
1897 DISALLOW_COPY_AND_ASSIGN(Definition); 1916 DISALLOW_COPY_AND_ASSIGN(Definition);
1898 }; 1917 };
1899 1918
1900 1919
(...skipping 5378 matching lines...) Expand 10 before | Expand all | Expand 10 after
7279 } 7298 }
7280 7299
7281 ZoneGrowableArray<Value*>* inputs_; 7300 ZoneGrowableArray<Value*>* inputs_;
7282 7301
7283 const MethodRecognizer::Kind recognized_kind_; 7302 const MethodRecognizer::Kind recognized_kind_;
7284 7303
7285 DISALLOW_COPY_AND_ASSIGN(InvokeMathCFunctionInstr); 7304 DISALLOW_COPY_AND_ASSIGN(InvokeMathCFunctionInstr);
7286 }; 7305 };
7287 7306
7288 7307
7308 class ExtractNthOutputInstr : public TemplateDefinition<1> {
7309 public:
7310 // Extract the Nth output register from value.
7311 ExtractNthOutputInstr(Value* value, intptr_t n, Representation rep)
7312 : index_(n),
7313 rep_(rep) {
7314 SetInputAt(0, value);
7315 }
7316
7317 Value* value() const { return inputs_[0]; }
7318
7319 DECLARE_INSTRUCTION(ExtractNthOutput)
7320
7321 virtual CompileType ComputeType() const;
7322 virtual void PrintOperandsTo(BufferFormatter* f) const;
7323 virtual bool CanDeoptimize() const { return false; }
7324
7325 intptr_t index() const { return index_; }
7326
7327 virtual Representation representation() const {
7328 return rep_;
7329 }
7330
7331 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
7332 ASSERT(idx == 0);
7333 if (representation() == kTagged) {
7334 return kPairOfTagged;
7335 } else if (representation() == kUnboxedDouble) {
7336 return kPairOfUnboxedDouble;
7337 }
7338 UNREACHABLE();
7339 return rep_;
7340 }
7341
7342 virtual bool AllowsCSE() const { return true; }
7343 virtual EffectSet Effects() const { return EffectSet::None(); }
7344 virtual EffectSet Dependencies() const { return EffectSet::None(); }
7345 virtual bool AttributesEqual(Instruction* other) const {
7346 ExtractNthOutputInstr* other_extract = other->AsExtractNthOutput();
7347 return (other_extract->representation() == representation()) &&
7348 (other_extract->index() == index());
7349 }
7350
7351 virtual bool MayThrow() const { return false; }
7352
7353 private:
7354 const intptr_t index_;
7355 const Representation rep_;
7356
7357 DISALLOW_COPY_AND_ASSIGN(ExtractNthOutputInstr);
7358 };
7359
7360
7361 class MergedMath2Instr : public Definition {
7362 public:
7363 enum Kind {
7364 kTruncDivMod,
7365 kSinCos,
7366 };
7367
7368 MergedMath2Instr(ZoneGrowableArray<Value*>* inputs,
7369 intptr_t original_deopt_id,
7370 MergedMath2Instr::Kind kind);
7371
7372 static intptr_t InputCountFor(MergedMath2Instr::Kind kind) {
7373 if (kind == kTruncDivMod) {
7374 return 2;
7375 } else if (kind == kSinCos) {
7376 return 1;
7377 } else {
7378 UNIMPLEMENTED();
7379 return -1;
7380 }
7381 }
7382
7383 virtual bool RequiresTwoSSATempIndexes() const {
7384 return true;
7385 }
7386
7387 MergedMath2Instr::Kind kind() const { return kind_; }
7388
7389 virtual intptr_t InputCount() const { return inputs_->length(); }
7390
7391 virtual Value* InputAt(intptr_t i) const {
7392 return (*inputs_)[i];
7393 }
7394
7395 static intptr_t OutputIndexOf(intptr_t kind);
7396 static intptr_t OutputIndexOf(Token::Kind token);
7397
7398 virtual CompileType ComputeType() const;
7399 virtual void PrintOperandsTo(BufferFormatter* f) const;
7400
7401 virtual bool CanDeoptimize() const {
7402 if (kind_ == kTruncDivMod) {
7403 return true;
7404 } else if (kind_ == kSinCos) {
7405 return false;
7406 } else {
7407 UNIMPLEMENTED();
7408 return false;
7409 }
7410 }
7411
7412 virtual Representation representation() const {
7413 if (kind_ == kTruncDivMod) {
7414 return kPairOfTagged;
7415 } else if (kind_ == kSinCos) {
7416 return kPairOfUnboxedDouble;
7417 } else {
7418 UNIMPLEMENTED();
7419 return kTagged;
7420 }
7421 }
7422
7423 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
7424 ASSERT((0 <= idx) && (idx < InputCount()));
7425 if (kind_ == kTruncDivMod) {
7426 return kTagged;
7427 } else if (kind_ == kSinCos) {
7428 return kUnboxedDouble;
7429 } else {
7430 UNIMPLEMENTED();
7431 return kTagged;
7432 }
7433 }
7434
7435 virtual intptr_t DeoptimizationTarget() const { return deopt_id_; }
7436
7437 DECLARE_INSTRUCTION(MergedMath2)
7438
7439 virtual bool AllowsCSE() const { return true; }
7440 virtual EffectSet Effects() const { return EffectSet::None(); }
7441 virtual EffectSet Dependencies() const { return EffectSet::None(); }
7442 virtual bool AttributesEqual(Instruction* other) const {
7443 MergedMath2Instr* other_invoke = other->AsMergedMath2();
7444 return other_invoke->kind() == kind();
7445 }
7446
7447 virtual bool MayThrow() const { return false; }
7448
7449 static const char* KindToCString(MergedMath2Instr::Kind kind) {
7450 if (kind == kTruncDivMod) return "TruncDivMod";
7451 if (kind == kSinCos) return "SinCos";
7452 UNIMPLEMENTED();
7453 return "";
7454 }
7455
7456 private:
7457 virtual void RawSetInputAt(intptr_t i, Value* value) {
7458 (*inputs_)[i] = value;
7459 }
7460
7461 ZoneGrowableArray<Value*>* inputs_;
7462 MergedMath2Instr::Kind kind_;
7463 DISALLOW_COPY_AND_ASSIGN(MergedMath2Instr);
7464 };
7465
7466
7289 class MergedMathInstr : public Definition { 7467 class MergedMathInstr : public Definition {
7290 public: 7468 public:
7291 enum Kind { 7469 enum Kind {
7292 kTruncDivMod, 7470 kTruncDivMod,
7293 kTruncDivRem, 7471 kTruncDivRem,
7294 kSinCos, 7472 kSinCos,
7295 }; 7473 };
7296 7474
7297 MergedMathInstr(ZoneGrowableArray<Value*>* inputs, 7475 MergedMathInstr(ZoneGrowableArray<Value*>* inputs,
7298 intptr_t original_deopt_id, 7476 intptr_t original_deopt_id,
(...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after
7723 ForwardInstructionIterator* current_iterator_; 7901 ForwardInstructionIterator* current_iterator_;
7724 7902
7725 private: 7903 private:
7726 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor); 7904 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor);
7727 }; 7905 };
7728 7906
7729 7907
7730 } // namespace dart 7908 } // namespace dart
7731 7909
7732 #endif // VM_INTERMEDIATE_LANGUAGE_H_ 7910 #endif // VM_INTERMEDIATE_LANGUAGE_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698