OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
86 V(CallNewArray) \ | 86 V(CallNewArray) \ |
87 V(CallRuntime) \ | 87 V(CallRuntime) \ |
88 V(CallStub) \ | 88 V(CallStub) \ |
89 V(Change) \ | 89 V(Change) \ |
90 V(CheckFunction) \ | 90 V(CheckFunction) \ |
91 V(CheckInstanceType) \ | 91 V(CheckInstanceType) \ |
92 V(CheckMaps) \ | 92 V(CheckMaps) \ |
93 V(CheckNonSmi) \ | 93 V(CheckNonSmi) \ |
94 V(CheckPrototypeMaps) \ | 94 V(CheckPrototypeMaps) \ |
95 V(CheckSmi) \ | 95 V(CheckSmi) \ |
96 V(CheckSmiOrInt32) \ | |
97 V(ClampToUint8) \ | 96 V(ClampToUint8) \ |
98 V(ClassOfTestAndBranch) \ | 97 V(ClassOfTestAndBranch) \ |
99 V(CompareIDAndBranch) \ | 98 V(CompareIDAndBranch) \ |
100 V(CompareGeneric) \ | 99 V(CompareGeneric) \ |
101 V(CompareObjectEqAndBranch) \ | 100 V(CompareObjectEqAndBranch) \ |
102 V(CompareMap) \ | 101 V(CompareMap) \ |
103 V(CompareConstantEqAndBranch) \ | 102 V(CompareConstantEqAndBranch) \ |
104 V(Constant) \ | 103 V(Constant) \ |
105 V(Context) \ | 104 V(Context) \ |
106 V(DebugBreak) \ | 105 V(DebugBreak) \ |
(...skipping 1607 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1714 Representation to, | 1713 Representation to, |
1715 bool is_truncating, | 1714 bool is_truncating, |
1716 bool deoptimize_on_undefined) | 1715 bool deoptimize_on_undefined) |
1717 : HUnaryOperation(value) { | 1716 : HUnaryOperation(value) { |
1718 ASSERT(!value->representation().IsNone() && !to.IsNone()); | 1717 ASSERT(!value->representation().IsNone() && !to.IsNone()); |
1719 ASSERT(!value->representation().Equals(to)); | 1718 ASSERT(!value->representation().Equals(to)); |
1720 set_representation(to); | 1719 set_representation(to); |
1721 SetFlag(kUseGVN); | 1720 SetFlag(kUseGVN); |
1722 if (deoptimize_on_undefined) SetFlag(kDeoptimizeOnUndefined); | 1721 if (deoptimize_on_undefined) SetFlag(kDeoptimizeOnUndefined); |
1723 if (is_truncating) SetFlag(kTruncatingToInt32); | 1722 if (is_truncating) SetFlag(kTruncatingToInt32); |
1724 if (value->type().IsSmi()) { | 1723 if (value->representation().IsSmi() || value->type().IsSmi()) { |
1725 set_type(HType::Smi()); | 1724 set_type(HType::Smi()); |
1726 } else { | 1725 } else { |
1727 set_type(HType::TaggedNumber()); | 1726 set_type(HType::TaggedNumber()); |
1728 if (to.IsTagged()) SetGVNFlag(kChangesNewSpacePromotion); | 1727 if (to.IsTagged()) SetGVNFlag(kChangesNewSpacePromotion); |
1729 } | 1728 } |
1730 } | 1729 } |
1731 | 1730 |
1732 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); | 1731 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); |
1733 virtual HType CalculateInferredType(); | 1732 virtual HType CalculateInferredType(); |
1734 virtual HValue* Canonicalize(); | 1733 virtual HValue* Canonicalize(); |
(...skipping 1210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2945 virtual void Verify(); | 2944 virtual void Verify(); |
2946 #endif | 2945 #endif |
2947 | 2946 |
2948 DECLARE_CONCRETE_INSTRUCTION(CheckSmi) | 2947 DECLARE_CONCRETE_INSTRUCTION(CheckSmi) |
2949 | 2948 |
2950 protected: | 2949 protected: |
2951 virtual bool DataEquals(HValue* other) { return true; } | 2950 virtual bool DataEquals(HValue* other) { return true; } |
2952 }; | 2951 }; |
2953 | 2952 |
2954 | 2953 |
2955 class HCheckSmiOrInt32: public HUnaryOperation { | |
2956 public: | |
2957 explicit HCheckSmiOrInt32(HValue* value) : HUnaryOperation(value) { | |
2958 SetFlag(kFlexibleRepresentation); | |
2959 SetFlag(kUseGVN); | |
2960 } | |
2961 | |
2962 virtual int RedefinedOperandIndex() { return 0; } | |
2963 virtual Representation RequiredInputRepresentation(int index) { | |
2964 return representation(); | |
2965 } | |
2966 virtual void InferRepresentation(HInferRepresentation* h_infer); | |
2967 | |
2968 virtual Representation observed_input_representation(int index) { | |
2969 return Representation::Integer32(); | |
2970 } | |
2971 | |
2972 virtual HValue* Canonicalize() { | |
2973 if (representation().IsTagged() && !value()->type().IsSmi()) { | |
2974 return this; | |
2975 } else { | |
2976 return value(); | |
2977 } | |
2978 } | |
2979 | |
2980 DECLARE_CONCRETE_INSTRUCTION(CheckSmiOrInt32) | |
2981 | |
2982 protected: | |
2983 virtual bool DataEquals(HValue* other) { return true; } | |
2984 }; | |
2985 | |
2986 | |
2987 class HPhi: public HValue { | 2954 class HPhi: public HValue { |
2988 public: | 2955 public: |
2989 HPhi(int merged_index, Zone* zone) | 2956 HPhi(int merged_index, Zone* zone) |
2990 : inputs_(2, zone), | 2957 : inputs_(2, zone), |
2991 merged_index_(merged_index), | 2958 merged_index_(merged_index), |
2992 phi_id_(-1), | 2959 phi_id_(-1), |
2993 is_convertible_to_integer_(true) { | 2960 is_convertible_to_integer_(true) { |
2994 for (int i = 0; i < Representation::kNumRepresentations; i++) { | 2961 for (int i = 0; i < Representation::kNumRepresentations; i++) { |
2995 non_phi_uses_[i] = 0; | 2962 non_phi_uses_[i] = 0; |
2996 indirect_uses_[i] = 0; | 2963 indirect_uses_[i] = 0; |
(...skipping 574 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3571 ALLOW_SMI_KEY | 3538 ALLOW_SMI_KEY |
3572 }; | 3539 }; |
3573 | 3540 |
3574 | 3541 |
3575 class HBoundsCheckBaseIndexInformation; | 3542 class HBoundsCheckBaseIndexInformation; |
3576 | 3543 |
3577 | 3544 |
3578 class HBoundsCheck: public HTemplateInstruction<2> { | 3545 class HBoundsCheck: public HTemplateInstruction<2> { |
3579 public: | 3546 public: |
3580 // Normally HBoundsCheck should be created using the | 3547 // Normally HBoundsCheck should be created using the |
3581 // HGraphBuilder::AddBoundsCheck() helper, which also guards the index with | 3548 // HGraphBuilder::AddBoundsCheck() helper. |
3582 // a HCheckSmiOrInt32 check. | |
3583 // However when building stubs, where we know that the arguments are Int32, | 3549 // However when building stubs, where we know that the arguments are Int32, |
3584 // it makes sense to invoke this constructor directly. | 3550 // it makes sense to invoke this constructor directly. |
3585 HBoundsCheck(HValue* index, | 3551 HBoundsCheck(HValue* index, |
3586 HValue* length, | 3552 HValue* length, |
3587 BoundsCheckKeyMode key_mode = DONT_ALLOW_SMI_KEY, | 3553 BoundsCheckKeyMode key_mode = DONT_ALLOW_SMI_KEY, |
3588 Representation r = Representation::None()) | 3554 Representation r = Representation::None()) |
3589 : key_mode_(key_mode), skip_check_(false), | 3555 : key_mode_(key_mode), skip_check_(false), |
3590 base_(NULL), offset_(0), scale_(0), | 3556 base_(NULL), offset_(0), scale_(0), |
3591 responsibility_direction_(DIRECTION_NONE) { | 3557 responsibility_direction_(DIRECTION_NONE) { |
3592 SetOperandAt(0, index); | 3558 SetOperandAt(0, index); |
(...skipping 1783 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5376 public: | 5342 public: |
5377 virtual HValue* GetKey() = 0; | 5343 virtual HValue* GetKey() = 0; |
5378 virtual void SetKey(HValue* key) = 0; | 5344 virtual void SetKey(HValue* key) = 0; |
5379 virtual void SetIndexOffset(uint32_t index_offset) = 0; | 5345 virtual void SetIndexOffset(uint32_t index_offset) = 0; |
5380 virtual bool IsDehoisted() = 0; | 5346 virtual bool IsDehoisted() = 0; |
5381 virtual void SetDehoisted(bool is_dehoisted) = 0; | 5347 virtual void SetDehoisted(bool is_dehoisted) = 0; |
5382 virtual ~ArrayInstructionInterface() { }; | 5348 virtual ~ArrayInstructionInterface() { }; |
5383 | 5349 |
5384 static Representation KeyedAccessIndexRequirement(Representation r) { | 5350 static Representation KeyedAccessIndexRequirement(Representation r) { |
5385 return r.IsInteger32() ? Representation::Integer32() | 5351 return r.IsInteger32() ? Representation::Integer32() |
5386 : Representation::Tagged(); | 5352 : Representation::Smi(); |
5387 } | 5353 } |
5388 }; | 5354 }; |
5389 | 5355 |
5390 | 5356 |
5391 enum LoadKeyedHoleMode { | 5357 enum LoadKeyedHoleMode { |
5392 NEVER_RETURN_HOLE, | 5358 NEVER_RETURN_HOLE, |
5393 ALLOW_RETURN_HOLE | 5359 ALLOW_RETURN_HOLE |
5394 }; | 5360 }; |
5395 | 5361 |
5396 | 5362 |
(...skipping 1082 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6479 virtual bool IsDeletable() const { return true; } | 6445 virtual bool IsDeletable() const { return true; } |
6480 }; | 6446 }; |
6481 | 6447 |
6482 | 6448 |
6483 #undef DECLARE_INSTRUCTION | 6449 #undef DECLARE_INSTRUCTION |
6484 #undef DECLARE_CONCRETE_INSTRUCTION | 6450 #undef DECLARE_CONCRETE_INSTRUCTION |
6485 | 6451 |
6486 } } // namespace v8::internal | 6452 } } // namespace v8::internal |
6487 | 6453 |
6488 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 6454 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
OLD | NEW |