OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_HYDROGEN_INSTRUCTIONS_H_ | 5 #ifndef V8_HYDROGEN_INSTRUCTIONS_H_ |
6 #define V8_HYDROGEN_INSTRUCTIONS_H_ | 6 #define V8_HYDROGEN_INSTRUCTIONS_H_ |
7 | 7 |
8 #include <cstring> | 8 #include <cstring> |
9 #include <iosfwd> | 9 #include <iosfwd> |
10 | 10 |
(...skipping 4895 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4906 HAdd(HValue* context, HValue* left, HValue* right, Strength strength, | 4906 HAdd(HValue* context, HValue* left, HValue* right, Strength strength, |
4907 ExternalAddType external_add_type = NoExternalAdd) | 4907 ExternalAddType external_add_type = NoExternalAdd) |
4908 : HArithmeticBinaryOperation(context, left, right, strength), | 4908 : HArithmeticBinaryOperation(context, left, right, strength), |
4909 external_add_type_(external_add_type) { | 4909 external_add_type_(external_add_type) { |
4910 SetFlag(kCanOverflow); | 4910 SetFlag(kCanOverflow); |
4911 switch (external_add_type_) { | 4911 switch (external_add_type_) { |
4912 case AddOfExternalAndTagged: | 4912 case AddOfExternalAndTagged: |
4913 DCHECK(left->representation().IsExternal()); | 4913 DCHECK(left->representation().IsExternal()); |
4914 DCHECK(right->representation().IsTagged()); | 4914 DCHECK(right->representation().IsTagged()); |
4915 SetDependsOnFlag(kNewSpacePromotion); | 4915 SetDependsOnFlag(kNewSpacePromotion); |
| 4916 ClearFlag(HValue::kCanOverflow); |
| 4917 SetFlag(kHasNoObservableSideEffects); |
4916 break; | 4918 break; |
4917 | 4919 |
4918 case NoExternalAdd: | 4920 case NoExternalAdd: |
4919 // This is a bit of a hack: The call to this constructor is generated | 4921 // This is a bit of a hack: The call to this constructor is generated |
4920 // by a macro that also supports sub and mul, so it doesn't pass in | 4922 // by a macro that also supports sub and mul, so it doesn't pass in |
4921 // a value for external_add_type but uses the default. | 4923 // a value for external_add_type but uses the default. |
4922 if (left->representation().IsExternal()) { | 4924 if (left->representation().IsExternal()) { |
4923 external_add_type_ = AddOfExternalAndInt32; | 4925 external_add_type_ = AddOfExternalAndInt32; |
4924 } | 4926 } |
4925 break; | 4927 break; |
(...skipping 1095 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6021 kArrayLengths, | 6023 kArrayLengths, |
6022 FixedArray::kLengthOffset, | 6024 FixedArray::kLengthOffset, |
6023 Representation::Smi()); | 6025 Representation::Smi()); |
6024 } | 6026 } |
6025 | 6027 |
6026 static HObjectAccess ForFixedTypedArrayBaseBasePointer() { | 6028 static HObjectAccess ForFixedTypedArrayBaseBasePointer() { |
6027 return HObjectAccess(kInobject, FixedTypedArrayBase::kBasePointerOffset, | 6029 return HObjectAccess(kInobject, FixedTypedArrayBase::kBasePointerOffset, |
6028 Representation::Tagged()); | 6030 Representation::Tagged()); |
6029 } | 6031 } |
6030 | 6032 |
| 6033 static HObjectAccess ForFixedTypedArrayBaseExternalPointer() { |
| 6034 return HObjectAccess::ForObservableJSObjectOffset( |
| 6035 FixedTypedArrayBase::kExternalPointerOffset, |
| 6036 Representation::External()); |
| 6037 } |
| 6038 |
6031 static HObjectAccess ForStringHashField() { | 6039 static HObjectAccess ForStringHashField() { |
6032 return HObjectAccess(kInobject, | 6040 return HObjectAccess(kInobject, |
6033 String::kHashFieldOffset, | 6041 String::kHashFieldOffset, |
6034 Representation::Integer32()); | 6042 Representation::Integer32()); |
6035 } | 6043 } |
6036 | 6044 |
6037 static HObjectAccess ForStringLength() { | 6045 static HObjectAccess ForStringLength() { |
6038 STATIC_ASSERT(String::kMaxLength <= Smi::kMaxValue); | 6046 STATIC_ASSERT(String::kMaxLength <= Smi::kMaxValue); |
6039 return HObjectAccess( | 6047 return HObjectAccess( |
6040 kStringLengths, | 6048 kStringLengths, |
(...skipping 600 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6641 ElementsKind elements_kind() const override { | 6649 ElementsKind elements_kind() const override { |
6642 return ElementsKindField::decode(bit_field_); | 6650 return ElementsKindField::decode(bit_field_); |
6643 } | 6651 } |
6644 LoadKeyedHoleMode hole_mode() const { | 6652 LoadKeyedHoleMode hole_mode() const { |
6645 return HoleModeField::decode(bit_field_); | 6653 return HoleModeField::decode(bit_field_); |
6646 } | 6654 } |
6647 | 6655 |
6648 Representation RequiredInputRepresentation(int index) override { | 6656 Representation RequiredInputRepresentation(int index) override { |
6649 // kind_fast: tagged[int32] (none) | 6657 // kind_fast: tagged[int32] (none) |
6650 // kind_double: tagged[int32] (none) | 6658 // kind_double: tagged[int32] (none) |
6651 // kind_fixed_typed_array: tagged[int32] (none) | 6659 // kind_fixed_typed_array: external[int32] (none) |
6652 // kind_external: external[int32] (none) | 6660 // kind_external: external[int32] (none) |
6653 if (index == 0) { | 6661 if (index == 0) { |
6654 return is_external() ? Representation::External() | 6662 return is_typed_elements() ? Representation::External() |
6655 : Representation::Tagged(); | 6663 : Representation::Tagged(); |
6656 } | 6664 } |
6657 if (index == 1) { | 6665 if (index == 1) { |
6658 return ArrayInstructionInterface::KeyedAccessIndexRequirement( | 6666 return ArrayInstructionInterface::KeyedAccessIndexRequirement( |
6659 OperandAt(1)->representation()); | 6667 OperandAt(1)->representation()); |
6660 } | 6668 } |
6661 return Representation::None(); | 6669 return Representation::None(); |
6662 } | 6670 } |
6663 | 6671 |
6664 Representation observed_input_representation(int index) override { | 6672 Representation observed_input_representation(int index) override { |
6665 return RequiredInputRepresentation(index); | 6673 return RequiredInputRepresentation(index); |
(...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7106 DECLARE_INSTRUCTION_FACTORY_P6(HStoreKeyed, HValue*, HValue*, HValue*, | 7114 DECLARE_INSTRUCTION_FACTORY_P6(HStoreKeyed, HValue*, HValue*, HValue*, |
7107 ElementsKind, StoreFieldOrKeyedMode, int); | 7115 ElementsKind, StoreFieldOrKeyedMode, int); |
7108 | 7116 |
7109 Representation RequiredInputRepresentation(int index) override { | 7117 Representation RequiredInputRepresentation(int index) override { |
7110 // kind_fast: tagged[int32] = tagged | 7118 // kind_fast: tagged[int32] = tagged |
7111 // kind_double: tagged[int32] = double | 7119 // kind_double: tagged[int32] = double |
7112 // kind_smi : tagged[int32] = smi | 7120 // kind_smi : tagged[int32] = smi |
7113 // kind_fixed_typed_array: tagged[int32] = (double | int32) | 7121 // kind_fixed_typed_array: tagged[int32] = (double | int32) |
7114 // kind_external: external[int32] = (double | int32) | 7122 // kind_external: external[int32] = (double | int32) |
7115 if (index == 0) { | 7123 if (index == 0) { |
7116 return is_external() ? Representation::External() | 7124 return is_typed_elements() ? Representation::External() |
7117 : Representation::Tagged(); | 7125 : Representation::Tagged(); |
7118 } else if (index == 1) { | 7126 } else if (index == 1) { |
7119 return ArrayInstructionInterface::KeyedAccessIndexRequirement( | 7127 return ArrayInstructionInterface::KeyedAccessIndexRequirement( |
7120 OperandAt(1)->representation()); | 7128 OperandAt(1)->representation()); |
7121 } | 7129 } |
7122 | 7130 |
7123 DCHECK_EQ(index, 2); | 7131 DCHECK_EQ(index, 2); |
7124 return RequiredValueRepresentation(elements_kind(), store_mode()); | 7132 return RequiredValueRepresentation(elements_kind(), store_mode()); |
7125 } | 7133 } |
7126 | 7134 |
7127 static Representation RequiredValueRepresentation( | 7135 static Representation RequiredValueRepresentation( |
(...skipping 957 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8085 }; | 8093 }; |
8086 | 8094 |
8087 | 8095 |
8088 | 8096 |
8089 #undef DECLARE_INSTRUCTION | 8097 #undef DECLARE_INSTRUCTION |
8090 #undef DECLARE_CONCRETE_INSTRUCTION | 8098 #undef DECLARE_CONCRETE_INSTRUCTION |
8091 | 8099 |
8092 } } // namespace v8::internal | 8100 } } // namespace v8::internal |
8093 | 8101 |
8094 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 8102 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
OLD | NEW |