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 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 763 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
774 void InsertBefore(Instruction* next) { InsertAfter(next->previous()); } | 774 void InsertBefore(Instruction* next) { InsertAfter(next->previous()); } |
775 | 775 |
776 // Insert this instruction after 'prev' after use lists are computed. | 776 // Insert this instruction after 'prev' after use lists are computed. |
777 void InsertAfter(Instruction* prev); | 777 void InsertAfter(Instruction* prev); |
778 | 778 |
779 // Append an instruction to the current one and return the tail. | 779 // Append an instruction to the current one and return the tail. |
780 // This function updated def-use chains of the newly appended | 780 // This function updated def-use chains of the newly appended |
781 // instruction. | 781 // instruction. |
782 Instruction* AppendInstruction(Instruction* tail); | 782 Instruction* AppendInstruction(Instruction* tail); |
783 | 783 |
| 784 virtual bool AllowsDCE() const { |
| 785 return false; |
| 786 } |
| 787 |
784 // Returns true if CSE and LICM are allowed for this instruction. | 788 // Returns true if CSE and LICM are allowed for this instruction. |
785 virtual bool AllowsCSE() const { | 789 virtual bool AllowsCSE() const { |
786 return false; | 790 return false; |
787 } | 791 } |
788 | 792 |
789 // Returns set of effects created by this instruction. | 793 // Returns set of effects created by this instruction. |
790 virtual EffectSet Effects() const = 0; | 794 virtual EffectSet Effects() const = 0; |
791 | 795 |
792 // Returns set of effects that affect this instruction. | 796 // Returns set of effects that affect this instruction. |
793 virtual EffectSet Dependencies() const { | 797 virtual EffectSet Dependencies() const { |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
827 } | 831 } |
828 | 832 |
829 virtual bool CanBecomeDeoptimizationTarget() const { | 833 virtual bool CanBecomeDeoptimizationTarget() const { |
830 return false; | 834 return false; |
831 } | 835 } |
832 | 836 |
833 void InheritDeoptTargetAfter(Isolate* isolate, Instruction* other); | 837 void InheritDeoptTargetAfter(Isolate* isolate, Instruction* other); |
834 | 838 |
835 virtual bool MayThrow() const = 0; | 839 virtual bool MayThrow() const = 0; |
836 | 840 |
| 841 bool IsDominatedBy(Instruction* dom); |
| 842 |
837 protected: | 843 protected: |
838 // Fetch deopt id without checking if this computation can deoptimize. | 844 // Fetch deopt id without checking if this computation can deoptimize. |
839 intptr_t GetDeoptId() const { | 845 intptr_t GetDeoptId() const { |
840 return deopt_id_; | 846 return deopt_id_; |
841 } | 847 } |
842 | 848 |
843 private: | 849 private: |
844 friend class FlowGraphPrinter; | 850 friend class FlowGraphPrinter; |
845 friend class Definition; // Needed for InsertBefore, InsertAfter. | 851 friend class Definition; // Needed for InsertBefore, InsertAfter. |
846 friend class CallSiteInliner; | 852 friend class CallSiteInliner; |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
886 friend class UnaryDoubleOpInstr; | 892 friend class UnaryDoubleOpInstr; |
887 friend class MathUnaryInstr; | 893 friend class MathUnaryInstr; |
888 friend class MathMinMaxInstr; | 894 friend class MathMinMaxInstr; |
889 friend class CheckClassInstr; | 895 friend class CheckClassInstr; |
890 friend class CheckClassIdInstr; | 896 friend class CheckClassIdInstr; |
891 friend class GuardFieldInstr; | 897 friend class GuardFieldInstr; |
892 friend class CheckSmiInstr; | 898 friend class CheckSmiInstr; |
893 friend class CheckArrayBoundInstr; | 899 friend class CheckArrayBoundInstr; |
894 friend class CheckEitherNonSmiInstr; | 900 friend class CheckEitherNonSmiInstr; |
895 friend class LICM; | 901 friend class LICM; |
| 902 friend class Scheduler; |
896 friend class DoubleToSmiInstr; | 903 friend class DoubleToSmiInstr; |
897 friend class DoubleToDoubleInstr; | 904 friend class DoubleToDoubleInstr; |
898 friend class DoubleToFloatInstr; | 905 friend class DoubleToFloatInstr; |
899 friend class FloatToDoubleInstr; | 906 friend class FloatToDoubleInstr; |
900 friend class InvokeMathCFunctionInstr; | 907 friend class InvokeMathCFunctionInstr; |
901 friend class MergedMathInstr; | 908 friend class MergedMathInstr; |
902 friend class FlowGraphOptimizer; | 909 friend class FlowGraphOptimizer; |
903 friend class LoadIndexedInstr; | 910 friend class LoadIndexedInstr; |
904 friend class StoreIndexedInstr; | 911 friend class StoreIndexedInstr; |
905 friend class StoreInstanceFieldInstr; | 912 friend class StoreInstanceFieldInstr; |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1099 void set_postorder_number(intptr_t number) { postorder_number_ = number; } | 1106 void set_postorder_number(intptr_t number) { postorder_number_ = number; } |
1100 | 1107 |
1101 intptr_t block_id() const { return block_id_; } | 1108 intptr_t block_id() const { return block_id_; } |
1102 | 1109 |
1103 void set_start_pos(intptr_t pos) { start_pos_ = pos; } | 1110 void set_start_pos(intptr_t pos) { start_pos_ = pos; } |
1104 intptr_t start_pos() const { return start_pos_; } | 1111 intptr_t start_pos() const { return start_pos_; } |
1105 void set_end_pos(intptr_t pos) { end_pos_ = pos; } | 1112 void set_end_pos(intptr_t pos) { end_pos_ = pos; } |
1106 intptr_t end_pos() const { return end_pos_; } | 1113 intptr_t end_pos() const { return end_pos_; } |
1107 | 1114 |
1108 BlockEntryInstr* dominator() const { return dominator_; } | 1115 BlockEntryInstr* dominator() const { return dominator_; } |
| 1116 BlockEntryInstr* ImmediateDominator() const; |
1109 | 1117 |
1110 const GrowableArray<BlockEntryInstr*>& dominated_blocks() { | 1118 const GrowableArray<BlockEntryInstr*>& dominated_blocks() { |
1111 return dominated_blocks_; | 1119 return dominated_blocks_; |
1112 } | 1120 } |
1113 | 1121 |
1114 void AddDominatedBlock(BlockEntryInstr* block) { | 1122 void AddDominatedBlock(BlockEntryInstr* block) { |
1115 block->set_dominator(this); | 1123 block->set_dominator(this); |
1116 dominated_blocks_.Add(block); | 1124 dominated_blocks_.Add(block); |
1117 } | 1125 } |
1118 void ClearDominatedBlocks() { dominated_blocks_.Clear(); } | 1126 void ClearDominatedBlocks() { dominated_blocks_.Clear(); } |
(...skipping 724 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1843 }; | 1851 }; |
1844 | 1852 |
1845 | 1853 |
1846 struct BranchLabels { | 1854 struct BranchLabels { |
1847 Label* true_label; | 1855 Label* true_label; |
1848 Label* false_label; | 1856 Label* false_label; |
1849 Label* fall_through; | 1857 Label* fall_through; |
1850 }; | 1858 }; |
1851 | 1859 |
1852 | 1860 |
| 1861 struct InductionVariableInfo; |
| 1862 |
| 1863 |
1853 class PhiInstr : public Definition { | 1864 class PhiInstr : public Definition { |
1854 public: | 1865 public: |
1855 PhiInstr(JoinEntryInstr* block, intptr_t num_inputs) | 1866 PhiInstr(JoinEntryInstr* block, intptr_t num_inputs) |
1856 : block_(block), | 1867 : block_(block), |
1857 inputs_(num_inputs), | 1868 inputs_(num_inputs), |
1858 is_alive_(false), | 1869 is_alive_(false), |
1859 representation_(kTagged), | 1870 representation_(kTagged), |
1860 reaching_defs_(NULL) { | 1871 reaching_defs_(NULL), |
| 1872 loop_variable_info_(NULL) { |
1861 for (intptr_t i = 0; i < num_inputs; ++i) { | 1873 for (intptr_t i = 0; i < num_inputs; ++i) { |
1862 inputs_.Add(NULL); | 1874 inputs_.Add(NULL); |
1863 } | 1875 } |
1864 } | 1876 } |
1865 | 1877 |
1866 // Get the block entry for that instruction. | 1878 // Get the block entry for that instruction. |
1867 virtual BlockEntryInstr* GetBlock() const { return block(); } | 1879 virtual BlockEntryInstr* GetBlock() const { return block(); } |
1868 JoinEntryInstr* block() const { return block_; } | 1880 JoinEntryInstr* block() const { return block_; } |
1869 | 1881 |
1870 virtual CompileType ComputeType() const; | 1882 virtual CompileType ComputeType() const; |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1914 | 1926 |
1915 void set_reaching_defs(BitVector* reaching_defs) { | 1927 void set_reaching_defs(BitVector* reaching_defs) { |
1916 reaching_defs_ = reaching_defs; | 1928 reaching_defs_ = reaching_defs; |
1917 } | 1929 } |
1918 | 1930 |
1919 virtual bool MayThrow() const { return false; } | 1931 virtual bool MayThrow() const { return false; } |
1920 | 1932 |
1921 // A phi is redundant if all input operands are the same. | 1933 // A phi is redundant if all input operands are the same. |
1922 bool IsRedundant() const; | 1934 bool IsRedundant() const; |
1923 | 1935 |
| 1936 void set_induction_variable_info(InductionVariableInfo* info) { |
| 1937 loop_variable_info_ = info; |
| 1938 } |
| 1939 |
| 1940 InductionVariableInfo* induction_variable_info() { |
| 1941 return loop_variable_info_; |
| 1942 } |
| 1943 |
1924 private: | 1944 private: |
1925 // Direct access to inputs_ in order to resize it due to unreachable | 1945 // Direct access to inputs_ in order to resize it due to unreachable |
1926 // predecessors. | 1946 // predecessors. |
1927 friend class ConstantPropagator; | 1947 friend class ConstantPropagator; |
1928 | 1948 |
1929 void RawSetInputAt(intptr_t i, Value* value) { inputs_[i] = value; } | 1949 void RawSetInputAt(intptr_t i, Value* value) { inputs_[i] = value; } |
1930 | 1950 |
1931 JoinEntryInstr* block_; | 1951 JoinEntryInstr* block_; |
1932 GrowableArray<Value*> inputs_; | 1952 GrowableArray<Value*> inputs_; |
1933 bool is_alive_; | 1953 bool is_alive_; |
1934 Representation representation_; | 1954 Representation representation_; |
1935 | 1955 |
1936 BitVector* reaching_defs_; | 1956 BitVector* reaching_defs_; |
| 1957 InductionVariableInfo* loop_variable_info_; |
1937 | 1958 |
1938 DISALLOW_COPY_AND_ASSIGN(PhiInstr); | 1959 DISALLOW_COPY_AND_ASSIGN(PhiInstr); |
1939 }; | 1960 }; |
1940 | 1961 |
1941 | 1962 |
1942 class ParameterInstr : public Definition { | 1963 class ParameterInstr : public Definition { |
1943 public: | 1964 public: |
1944 ParameterInstr(intptr_t index, | 1965 ParameterInstr(intptr_t index, |
1945 BlockEntryInstr* block, | 1966 BlockEntryInstr* block, |
1946 Register base_reg = FPREG) | 1967 Register base_reg = FPREG) |
(...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2404 virtual EffectSet Dependencies() const { return EffectSet::None(); } | 2425 virtual EffectSet Dependencies() const { return EffectSet::None(); } |
2405 virtual EffectSet Effects() const { return EffectSet::None(); } | 2426 virtual EffectSet Effects() const { return EffectSet::None(); } |
2406 | 2427 |
2407 virtual bool MayThrow() const { return false; } | 2428 virtual bool MayThrow() const { return false; } |
2408 | 2429 |
2409 private: | 2430 private: |
2410 DISALLOW_COPY_AND_ASSIGN(RedefinitionInstr); | 2431 DISALLOW_COPY_AND_ASSIGN(RedefinitionInstr); |
2411 }; | 2432 }; |
2412 | 2433 |
2413 | 2434 |
2414 class ConstraintInstr : public TemplateDefinition<2> { | 2435 class ConstraintInstr : public TemplateDefinition<1> { |
2415 public: | 2436 public: |
2416 ConstraintInstr(Value* value, Range* constraint) | 2437 ConstraintInstr(Value* value, Range* constraint) |
2417 : constraint_(constraint), | 2438 : constraint_(constraint), |
2418 target_(NULL) { | 2439 target_(NULL) { |
2419 SetInputAt(0, value); | 2440 SetInputAt(0, value); |
2420 } | 2441 } |
2421 | 2442 |
2422 DECLARE_INSTRUCTION(Constraint) | 2443 DECLARE_INSTRUCTION(Constraint) |
2423 | 2444 |
2424 virtual intptr_t InputCount() const { | |
2425 return (inputs_[1] == NULL) ? 1 : 2; | |
2426 } | |
2427 | |
2428 virtual CompileType ComputeType() const; | 2445 virtual CompileType ComputeType() const; |
2429 | 2446 |
2430 virtual bool CanDeoptimize() const { return false; } | 2447 virtual bool CanDeoptimize() const { return false; } |
2431 | 2448 |
2432 virtual EffectSet Effects() const { return EffectSet::None(); } | 2449 virtual EffectSet Effects() const { return EffectSet::None(); } |
2433 | 2450 |
2434 virtual bool AttributesEqual(Instruction* other) const { | 2451 virtual bool AttributesEqual(Instruction* other) const { |
2435 UNREACHABLE(); | 2452 UNREACHABLE(); |
2436 return false; | 2453 return false; |
2437 } | 2454 } |
2438 | 2455 |
2439 virtual bool MayThrow() const { return false; } | 2456 virtual bool MayThrow() const { return false; } |
2440 | 2457 |
2441 virtual void PrintOperandsTo(BufferFormatter* f) const; | 2458 virtual void PrintOperandsTo(BufferFormatter* f) const; |
2442 | 2459 |
2443 Value* value() const { return inputs_[0]; } | 2460 Value* value() const { return inputs_[0]; } |
2444 Range* constraint() const { return constraint_; } | 2461 Range* constraint() const { return constraint_; } |
2445 | 2462 |
2446 virtual void InferRange(RangeAnalysis* analysis, Range* range); | 2463 virtual void InferRange(RangeAnalysis* analysis, Range* range); |
2447 | 2464 |
2448 void AddDependency(Definition* defn) { | |
2449 Value* val = new Value(defn); | |
2450 defn->AddInputUse(val); | |
2451 SetInputAt(1, val); | |
2452 } | |
2453 | |
2454 // Constraints for branches have their target block stored in order | 2465 // Constraints for branches have their target block stored in order |
2455 // to find the the comparsion that generated the constraint: | 2466 // to find the the comparsion that generated the constraint: |
2456 // target->predecessor->last_instruction->comparison. | 2467 // target->predecessor->last_instruction->comparison. |
2457 void set_target(TargetEntryInstr* target) { | 2468 void set_target(TargetEntryInstr* target) { |
2458 target_ = target; | 2469 target_ = target; |
2459 } | 2470 } |
2460 TargetEntryInstr* target() const { | 2471 TargetEntryInstr* target() const { |
2461 return target_; | 2472 return target_; |
2462 } | 2473 } |
2463 | 2474 |
2464 private: | 2475 private: |
2465 Value* dependency() { | |
2466 return inputs_[1]; | |
2467 } | |
2468 | |
2469 Range* constraint_; | 2476 Range* constraint_; |
2470 TargetEntryInstr* target_; | 2477 TargetEntryInstr* target_; |
2471 | 2478 |
2472 DISALLOW_COPY_AND_ASSIGN(ConstraintInstr); | 2479 DISALLOW_COPY_AND_ASSIGN(ConstraintInstr); |
2473 }; | 2480 }; |
2474 | 2481 |
2475 | 2482 |
2476 class ConstantInstr : public TemplateDefinition<0> { | 2483 class ConstantInstr : public TemplateDefinition<0> { |
2477 public: | 2484 public: |
2478 explicit ConstantInstr(const Object& value); | 2485 explicit ConstantInstr(const Object& value); |
(...skipping 4451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6930 } | 6937 } |
6931 | 6938 |
6932 // Returns true if right is a non-zero Smi constant which absolute value is | 6939 // Returns true if right is a non-zero Smi constant which absolute value is |
6933 // a power of two. | 6940 // a power of two. |
6934 bool RightIsPowerOfTwoConstant() const; | 6941 bool RightIsPowerOfTwoConstant() const; |
6935 | 6942 |
6936 RawInteger* Evaluate(const Integer& left, const Integer& right) const; | 6943 RawInteger* Evaluate(const Integer& left, const Integer& right) const; |
6937 | 6944 |
6938 virtual Definition* Canonicalize(FlowGraph* flow_graph); | 6945 virtual Definition* Canonicalize(FlowGraph* flow_graph); |
6939 | 6946 |
| 6947 virtual bool AllowsDCE() const { |
| 6948 switch (op_kind()) { |
| 6949 case Token::kADD: |
| 6950 case Token::kSUB: |
| 6951 case Token::kMUL: |
| 6952 case Token::kBIT_AND: |
| 6953 case Token::kBIT_OR: |
| 6954 case Token::kBIT_XOR: |
| 6955 return true; |
| 6956 |
| 6957 case Token::kSHR: |
| 6958 case Token::kSHL: |
| 6959 // These instructions throw on negative shifts. |
| 6960 return !CanDeoptimize(); |
| 6961 |
| 6962 default: |
| 6963 return false; |
| 6964 } |
| 6965 } |
6940 virtual bool AllowsCSE() const { return true; } | 6966 virtual bool AllowsCSE() const { return true; } |
6941 virtual EffectSet Effects() const { return EffectSet::None(); } | 6967 virtual EffectSet Effects() const { return EffectSet::None(); } |
6942 virtual EffectSet Dependencies() const { return EffectSet::None(); } | 6968 virtual EffectSet Dependencies() const { return EffectSet::None(); } |
6943 virtual bool AttributesEqual(Instruction* other) const; | 6969 virtual bool AttributesEqual(Instruction* other) const; |
6944 | 6970 |
6945 virtual intptr_t DeoptimizationTarget() const { return deopt_id_; } | 6971 virtual intptr_t DeoptimizationTarget() const { return deopt_id_; } |
6946 | 6972 |
6947 virtual bool MayThrow() const { return false; } | 6973 virtual bool MayThrow() const { return false; } |
6948 | 6974 |
6949 virtual void PrintOperandsTo(BufferFormatter* f) const; | 6975 virtual void PrintOperandsTo(BufferFormatter* f) const; |
(...skipping 950 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7900 | 7926 |
7901 private: | 7927 private: |
7902 intptr_t cid_; | 7928 intptr_t cid_; |
7903 | 7929 |
7904 DISALLOW_COPY_AND_ASSIGN(CheckClassIdInstr); | 7930 DISALLOW_COPY_AND_ASSIGN(CheckClassIdInstr); |
7905 }; | 7931 }; |
7906 | 7932 |
7907 | 7933 |
7908 class CheckArrayBoundInstr : public TemplateInstruction<2> { | 7934 class CheckArrayBoundInstr : public TemplateInstruction<2> { |
7909 public: | 7935 public: |
7910 CheckArrayBoundInstr(Value* length, Value* index, intptr_t deopt_id) { | 7936 CheckArrayBoundInstr(Value* length, Value* index, intptr_t deopt_id) |
| 7937 : generalized_(false) { |
7911 SetInputAt(kLengthPos, length); | 7938 SetInputAt(kLengthPos, length); |
7912 SetInputAt(kIndexPos, index); | 7939 SetInputAt(kIndexPos, index); |
7913 // Override generated deopt-id. | 7940 // Override generated deopt-id. |
7914 deopt_id_ = deopt_id; | 7941 deopt_id_ = deopt_id; |
7915 } | 7942 } |
7916 | 7943 |
7917 Value* length() const { return inputs_[kLengthPos]; } | 7944 Value* length() const { return inputs_[kLengthPos]; } |
7918 Value* index() const { return inputs_[kIndexPos]; } | 7945 Value* index() const { return inputs_[kIndexPos]; } |
7919 | 7946 |
7920 DECLARE_INSTRUCTION(CheckArrayBound) | 7947 DECLARE_INSTRUCTION(CheckArrayBound) |
7921 | 7948 |
7922 virtual intptr_t ArgumentCount() const { return 0; } | 7949 virtual intptr_t ArgumentCount() const { return 0; } |
7923 | 7950 |
7924 virtual bool CanDeoptimize() const { return true; } | 7951 virtual bool CanDeoptimize() const { return true; } |
7925 | 7952 |
7926 bool IsRedundant(const RangeBoundary& length); | 7953 bool IsRedundant(const RangeBoundary& length); |
7927 | 7954 |
| 7955 void mark_generalized() { |
| 7956 generalized_ = true; |
| 7957 } |
| 7958 |
7928 virtual Instruction* Canonicalize(FlowGraph* flow_graph); | 7959 virtual Instruction* Canonicalize(FlowGraph* flow_graph); |
7929 | 7960 |
7930 // Returns the length offset for array and string types. | 7961 // Returns the length offset for array and string types. |
7931 static intptr_t LengthOffsetFor(intptr_t class_id); | 7962 static intptr_t LengthOffsetFor(intptr_t class_id); |
7932 | 7963 |
7933 static bool IsFixedLengthArrayType(intptr_t class_id); | 7964 static bool IsFixedLengthArrayType(intptr_t class_id); |
7934 | 7965 |
7935 virtual bool AllowsCSE() const { return true; } | 7966 virtual bool AllowsCSE() const { return true; } |
7936 virtual EffectSet Effects() const { return EffectSet::None(); } | 7967 virtual EffectSet Effects() const { return EffectSet::None(); } |
7937 virtual EffectSet Dependencies() const { return EffectSet::None(); } | 7968 virtual EffectSet Dependencies() const { return EffectSet::None(); } |
7938 virtual bool AttributesEqual(Instruction* other) const { return true; } | 7969 virtual bool AttributesEqual(Instruction* other) const { return true; } |
7939 | 7970 |
7940 virtual bool MayThrow() const { return false; } | 7971 virtual bool MayThrow() const { return false; } |
7941 | 7972 |
7942 // Give a name to the location/input indices. | 7973 // Give a name to the location/input indices. |
7943 enum { | 7974 enum { |
7944 kLengthPos = 0, | 7975 kLengthPos = 0, |
7945 kIndexPos = 1 | 7976 kIndexPos = 1 |
7946 }; | 7977 }; |
7947 | 7978 |
7948 private: | 7979 private: |
| 7980 bool generalized_; |
| 7981 |
7949 DISALLOW_COPY_AND_ASSIGN(CheckArrayBoundInstr); | 7982 DISALLOW_COPY_AND_ASSIGN(CheckArrayBoundInstr); |
7950 }; | 7983 }; |
7951 | 7984 |
7952 | 7985 |
7953 class BoxIntNInstr : public TemplateDefinition<1> { | 7986 class BoxIntNInstr : public TemplateDefinition<1> { |
7954 public: | 7987 public: |
7955 BoxIntNInstr(Representation representation, Value* value) | 7988 BoxIntNInstr(Representation representation, Value* value) |
7956 : from_representation_(representation) { | 7989 : from_representation_(representation) { |
7957 SetInputAt(0, value); | 7990 SetInputAt(0, value); |
7958 } | 7991 } |
(...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8411 Isolate* isolate, bool opt) const { \ | 8444 Isolate* isolate, bool opt) const { \ |
8412 UNIMPLEMENTED(); \ | 8445 UNIMPLEMENTED(); \ |
8413 return NULL; \ | 8446 return NULL; \ |
8414 } \ | 8447 } \ |
8415 void Name::EmitNativeCode(FlowGraphCompiler* compiler) { UNIMPLEMENTED(); } | 8448 void Name::EmitNativeCode(FlowGraphCompiler* compiler) { UNIMPLEMENTED(); } |
8416 | 8449 |
8417 | 8450 |
8418 } // namespace dart | 8451 } // namespace dart |
8419 | 8452 |
8420 #endif // VM_INTERMEDIATE_LANGUAGE_H_ | 8453 #endif // VM_INTERMEDIATE_LANGUAGE_H_ |
OLD | NEW |