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 "v8.h" | 8 #include "v8.h" |
9 | 9 |
10 #include "allocation.h" | 10 #include "allocation.h" |
(...skipping 1061 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1072 static I* New(Zone* zone, \ | 1072 static I* New(Zone* zone, \ |
1073 HValue* context, \ | 1073 HValue* context, \ |
1074 P1 p1, \ | 1074 P1 p1, \ |
1075 P2 p2, \ | 1075 P2 p2, \ |
1076 P3 p3, \ | 1076 P3 p3, \ |
1077 P4 p4, \ | 1077 P4 p4, \ |
1078 P5 p5) { \ | 1078 P5 p5) { \ |
1079 return new(zone) I(p1, p2, p3, p4, p5); \ | 1079 return new(zone) I(p1, p2, p3, p4, p5); \ |
1080 } | 1080 } |
1081 | 1081 |
| 1082 #define DECLARE_INSTRUCTION_FACTORY_P6(I, P1, P2, P3, P4, P5, P6) \ |
| 1083 static I* New(Zone* zone, \ |
| 1084 HValue* context, \ |
| 1085 P1 p1, \ |
| 1086 P2 p2, \ |
| 1087 P3 p3, \ |
| 1088 P4 p4, \ |
| 1089 P5 p5, \ |
| 1090 P6 p6) { \ |
| 1091 return new(zone) I(p1, p2, p3, p4, p5, p6); \ |
| 1092 } |
| 1093 |
1082 #define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P0(I) \ | 1094 #define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P0(I) \ |
1083 static I* New(Zone* zone, HValue* context) { \ | 1095 static I* New(Zone* zone, HValue* context) { \ |
1084 return new(zone) I(context); \ | 1096 return new(zone) I(context); \ |
1085 } | 1097 } |
1086 | 1098 |
1087 #define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(I, P1) \ | 1099 #define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(I, P1) \ |
1088 static I* New(Zone* zone, HValue* context, P1 p1) { \ | 1100 static I* New(Zone* zone, HValue* context, P1 p1) { \ |
1089 return new(zone) I(context, p1); \ | 1101 return new(zone) I(context, p1); \ |
1090 } | 1102 } |
1091 | 1103 |
(...skipping 5314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6406 set_representation(Representation::Tagged()); | 6418 set_representation(Representation::Tagged()); |
6407 SetFlag(kUseGVN); | 6419 SetFlag(kUseGVN); |
6408 SetDependsOnFlag(kCalls); | 6420 SetDependsOnFlag(kCalls); |
6409 } | 6421 } |
6410 }; | 6422 }; |
6411 | 6423 |
6412 class ArrayInstructionInterface { | 6424 class ArrayInstructionInterface { |
6413 public: | 6425 public: |
6414 virtual HValue* GetKey() = 0; | 6426 virtual HValue* GetKey() = 0; |
6415 virtual void SetKey(HValue* key) = 0; | 6427 virtual void SetKey(HValue* key) = 0; |
6416 virtual void SetIndexOffset(uint32_t index_offset) = 0; | 6428 virtual ElementsKind elements_kind() const = 0; |
6417 virtual int MaxIndexOffsetBits() = 0; | 6429 virtual void IncreaseBaseOffset(uint32_t base_offset) = 0; |
| 6430 virtual int MaxBaseOffsetBits() = 0; |
6418 virtual bool IsDehoisted() = 0; | 6431 virtual bool IsDehoisted() = 0; |
6419 virtual void SetDehoisted(bool is_dehoisted) = 0; | 6432 virtual void SetDehoisted(bool is_dehoisted) = 0; |
6420 virtual ~ArrayInstructionInterface() { } | 6433 virtual ~ArrayInstructionInterface() { } |
6421 | 6434 |
6422 static Representation KeyedAccessIndexRequirement(Representation r) { | 6435 static Representation KeyedAccessIndexRequirement(Representation r) { |
6423 return r.IsInteger32() || SmiValuesAre32Bits() | 6436 return r.IsInteger32() || SmiValuesAre32Bits() |
6424 ? Representation::Integer32() : Representation::Smi(); | 6437 ? Representation::Integer32() : Representation::Smi(); |
6425 } | 6438 } |
6426 }; | 6439 }; |
6427 | 6440 |
6428 | 6441 |
| 6442 static const int kDefaultKeyedHeaderOffsetSentinel = -1; |
| 6443 |
6429 enum LoadKeyedHoleMode { | 6444 enum LoadKeyedHoleMode { |
6430 NEVER_RETURN_HOLE, | 6445 NEVER_RETURN_HOLE, |
6431 ALLOW_RETURN_HOLE | 6446 ALLOW_RETURN_HOLE |
6432 }; | 6447 }; |
6433 | 6448 |
6434 | 6449 |
6435 class HLoadKeyed V8_FINAL | 6450 class HLoadKeyed V8_FINAL |
6436 : public HTemplateInstruction<3>, public ArrayInstructionInterface { | 6451 : public HTemplateInstruction<3>, public ArrayInstructionInterface { |
6437 public: | 6452 public: |
6438 DECLARE_INSTRUCTION_FACTORY_P4(HLoadKeyed, HValue*, HValue*, HValue*, | 6453 DECLARE_INSTRUCTION_FACTORY_P4(HLoadKeyed, HValue*, HValue*, HValue*, |
6439 ElementsKind); | 6454 ElementsKind); |
6440 DECLARE_INSTRUCTION_FACTORY_P5(HLoadKeyed, HValue*, HValue*, HValue*, | 6455 DECLARE_INSTRUCTION_FACTORY_P5(HLoadKeyed, HValue*, HValue*, HValue*, |
6441 ElementsKind, LoadKeyedHoleMode); | 6456 ElementsKind, LoadKeyedHoleMode); |
| 6457 DECLARE_INSTRUCTION_FACTORY_P6(HLoadKeyed, HValue*, HValue*, HValue*, |
| 6458 ElementsKind, LoadKeyedHoleMode, int); |
6442 | 6459 |
6443 bool is_external() const { | 6460 bool is_external() const { |
6444 return IsExternalArrayElementsKind(elements_kind()); | 6461 return IsExternalArrayElementsKind(elements_kind()); |
6445 } | 6462 } |
6446 bool is_fixed_typed_array() const { | 6463 bool is_fixed_typed_array() const { |
6447 return IsFixedTypedArrayElementsKind(elements_kind()); | 6464 return IsFixedTypedArrayElementsKind(elements_kind()); |
6448 } | 6465 } |
6449 bool is_typed_elements() const { | 6466 bool is_typed_elements() const { |
6450 return is_external() || is_fixed_typed_array(); | 6467 return is_external() || is_fixed_typed_array(); |
6451 } | 6468 } |
6452 HValue* elements() { return OperandAt(0); } | 6469 HValue* elements() { return OperandAt(0); } |
6453 HValue* key() { return OperandAt(1); } | 6470 HValue* key() { return OperandAt(1); } |
6454 HValue* dependency() { | 6471 HValue* dependency() { |
6455 ASSERT(HasDependency()); | 6472 ASSERT(HasDependency()); |
6456 return OperandAt(2); | 6473 return OperandAt(2); |
6457 } | 6474 } |
6458 bool HasDependency() const { return OperandAt(0) != OperandAt(2); } | 6475 bool HasDependency() const { return OperandAt(0) != OperandAt(2); } |
6459 uint32_t index_offset() { return IndexOffsetField::decode(bit_field_); } | 6476 uint32_t base_offset() { return BaseOffsetField::decode(bit_field_); } |
6460 void SetIndexOffset(uint32_t index_offset) { | 6477 void IncreaseBaseOffset(uint32_t base_offset) { |
6461 bit_field_ = IndexOffsetField::update(bit_field_, index_offset); | 6478 base_offset += BaseOffsetField::decode(bit_field_); |
| 6479 bit_field_ = BaseOffsetField::update(bit_field_, base_offset); |
6462 } | 6480 } |
6463 virtual int MaxIndexOffsetBits() { | 6481 virtual int MaxBaseOffsetBits() { |
6464 return kBitsForIndexOffset; | 6482 return kBitsForBaseOffset; |
6465 } | 6483 } |
6466 HValue* GetKey() { return key(); } | 6484 HValue* GetKey() { return key(); } |
6467 void SetKey(HValue* key) { SetOperandAt(1, key); } | 6485 void SetKey(HValue* key) { SetOperandAt(1, key); } |
6468 bool IsDehoisted() { return IsDehoistedField::decode(bit_field_); } | 6486 bool IsDehoisted() { return IsDehoistedField::decode(bit_field_); } |
6469 void SetDehoisted(bool is_dehoisted) { | 6487 void SetDehoisted(bool is_dehoisted) { |
6470 bit_field_ = IsDehoistedField::update(bit_field_, is_dehoisted); | 6488 bit_field_ = IsDehoistedField::update(bit_field_, is_dehoisted); |
6471 } | 6489 } |
6472 ElementsKind elements_kind() const { | 6490 ElementsKind elements_kind() const { |
6473 return ElementsKindField::decode(bit_field_); | 6491 return ElementsKindField::decode(bit_field_); |
6474 } | 6492 } |
(...skipping 29 matching lines...) Expand all Loading... |
6504 | 6522 |
6505 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; | 6523 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; |
6506 | 6524 |
6507 DECLARE_CONCRETE_INSTRUCTION(LoadKeyed) | 6525 DECLARE_CONCRETE_INSTRUCTION(LoadKeyed) |
6508 | 6526 |
6509 protected: | 6527 protected: |
6510 virtual bool DataEquals(HValue* other) V8_OVERRIDE { | 6528 virtual bool DataEquals(HValue* other) V8_OVERRIDE { |
6511 if (!other->IsLoadKeyed()) return false; | 6529 if (!other->IsLoadKeyed()) return false; |
6512 HLoadKeyed* other_load = HLoadKeyed::cast(other); | 6530 HLoadKeyed* other_load = HLoadKeyed::cast(other); |
6513 | 6531 |
6514 if (IsDehoisted() && index_offset() != other_load->index_offset()) | 6532 if (IsDehoisted() && base_offset() != other_load->base_offset()) |
6515 return false; | 6533 return false; |
6516 return elements_kind() == other_load->elements_kind(); | 6534 return elements_kind() == other_load->elements_kind(); |
6517 } | 6535 } |
6518 | 6536 |
6519 private: | 6537 private: |
6520 HLoadKeyed(HValue* obj, | 6538 HLoadKeyed(HValue* obj, |
6521 HValue* key, | 6539 HValue* key, |
6522 HValue* dependency, | 6540 HValue* dependency, |
6523 ElementsKind elements_kind, | 6541 ElementsKind elements_kind, |
6524 LoadKeyedHoleMode mode = NEVER_RETURN_HOLE) | 6542 LoadKeyedHoleMode mode = NEVER_RETURN_HOLE, |
| 6543 int offset = kDefaultKeyedHeaderOffsetSentinel) |
6525 : bit_field_(0) { | 6544 : bit_field_(0) { |
| 6545 offset = offset == kDefaultKeyedHeaderOffsetSentinel |
| 6546 ? GetDefaultHeaderSizeForElementsKind(elements_kind) |
| 6547 : offset; |
6526 bit_field_ = ElementsKindField::encode(elements_kind) | | 6548 bit_field_ = ElementsKindField::encode(elements_kind) | |
6527 HoleModeField::encode(mode); | 6549 HoleModeField::encode(mode) | |
| 6550 BaseOffsetField::encode(offset); |
6528 | 6551 |
6529 SetOperandAt(0, obj); | 6552 SetOperandAt(0, obj); |
6530 SetOperandAt(1, key); | 6553 SetOperandAt(1, key); |
6531 SetOperandAt(2, dependency != NULL ? dependency : obj); | 6554 SetOperandAt(2, dependency != NULL ? dependency : obj); |
6532 | 6555 |
6533 if (!is_typed_elements()) { | 6556 if (!is_typed_elements()) { |
6534 // I can detect the case between storing double (holey and fast) and | 6557 // I can detect the case between storing double (holey and fast) and |
6535 // smi/object by looking at elements_kind_. | 6558 // smi/object by looking at elements_kind_. |
6536 ASSERT(IsFastSmiOrObjectElementsKind(elements_kind) || | 6559 ASSERT(IsFastSmiOrObjectElementsKind(elements_kind) || |
6537 IsFastDoubleElementsKind(elements_kind)); | 6560 IsFastDoubleElementsKind(elements_kind)); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6580 } | 6603 } |
6581 | 6604 |
6582 virtual bool IsDeletable() const V8_OVERRIDE { | 6605 virtual bool IsDeletable() const V8_OVERRIDE { |
6583 return !RequiresHoleCheck(); | 6606 return !RequiresHoleCheck(); |
6584 } | 6607 } |
6585 | 6608 |
6586 // Establish some checks around our packed fields | 6609 // Establish some checks around our packed fields |
6587 enum LoadKeyedBits { | 6610 enum LoadKeyedBits { |
6588 kBitsForElementsKind = 5, | 6611 kBitsForElementsKind = 5, |
6589 kBitsForHoleMode = 1, | 6612 kBitsForHoleMode = 1, |
6590 kBitsForIndexOffset = 25, | 6613 kBitsForBaseOffset = 25, |
6591 kBitsForIsDehoisted = 1, | 6614 kBitsForIsDehoisted = 1, |
6592 | 6615 |
6593 kStartElementsKind = 0, | 6616 kStartElementsKind = 0, |
6594 kStartHoleMode = kStartElementsKind + kBitsForElementsKind, | 6617 kStartHoleMode = kStartElementsKind + kBitsForElementsKind, |
6595 kStartIndexOffset = kStartHoleMode + kBitsForHoleMode, | 6618 kStartBaseOffset = kStartHoleMode + kBitsForHoleMode, |
6596 kStartIsDehoisted = kStartIndexOffset + kBitsForIndexOffset | 6619 kStartIsDehoisted = kStartBaseOffset + kBitsForBaseOffset |
6597 }; | 6620 }; |
6598 | 6621 |
6599 STATIC_ASSERT((kBitsForElementsKind + kBitsForIndexOffset + | 6622 STATIC_ASSERT((kBitsForElementsKind + kBitsForBaseOffset + |
6600 kBitsForIsDehoisted) <= sizeof(uint32_t)*8); | 6623 kBitsForIsDehoisted) <= sizeof(uint32_t)*8); |
6601 STATIC_ASSERT(kElementsKindCount <= (1 << kBitsForElementsKind)); | 6624 STATIC_ASSERT(kElementsKindCount <= (1 << kBitsForElementsKind)); |
6602 class ElementsKindField: | 6625 class ElementsKindField: |
6603 public BitField<ElementsKind, kStartElementsKind, kBitsForElementsKind> | 6626 public BitField<ElementsKind, kStartElementsKind, kBitsForElementsKind> |
6604 {}; // NOLINT | 6627 {}; // NOLINT |
6605 class HoleModeField: | 6628 class HoleModeField: |
6606 public BitField<LoadKeyedHoleMode, kStartHoleMode, kBitsForHoleMode> | 6629 public BitField<LoadKeyedHoleMode, kStartHoleMode, kBitsForHoleMode> |
6607 {}; // NOLINT | 6630 {}; // NOLINT |
6608 class IndexOffsetField: | 6631 class BaseOffsetField: |
6609 public BitField<uint32_t, kStartIndexOffset, kBitsForIndexOffset> | 6632 public BitField<uint32_t, kStartBaseOffset, kBitsForBaseOffset> |
6610 {}; // NOLINT | 6633 {}; // NOLINT |
6611 class IsDehoistedField: | 6634 class IsDehoistedField: |
6612 public BitField<bool, kStartIsDehoisted, kBitsForIsDehoisted> | 6635 public BitField<bool, kStartIsDehoisted, kBitsForIsDehoisted> |
6613 {}; // NOLINT | 6636 {}; // NOLINT |
6614 uint32_t bit_field_; | 6637 uint32_t bit_field_; |
6615 }; | 6638 }; |
6616 | 6639 |
6617 | 6640 |
6618 class HLoadKeyedGeneric V8_FINAL : public HTemplateInstruction<3> { | 6641 class HLoadKeyedGeneric V8_FINAL : public HTemplateInstruction<3> { |
6619 public: | 6642 public: |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6816 }; | 6839 }; |
6817 | 6840 |
6818 | 6841 |
6819 class HStoreKeyed V8_FINAL | 6842 class HStoreKeyed V8_FINAL |
6820 : public HTemplateInstruction<3>, public ArrayInstructionInterface { | 6843 : public HTemplateInstruction<3>, public ArrayInstructionInterface { |
6821 public: | 6844 public: |
6822 DECLARE_INSTRUCTION_FACTORY_P4(HStoreKeyed, HValue*, HValue*, HValue*, | 6845 DECLARE_INSTRUCTION_FACTORY_P4(HStoreKeyed, HValue*, HValue*, HValue*, |
6823 ElementsKind); | 6846 ElementsKind); |
6824 DECLARE_INSTRUCTION_FACTORY_P5(HStoreKeyed, HValue*, HValue*, HValue*, | 6847 DECLARE_INSTRUCTION_FACTORY_P5(HStoreKeyed, HValue*, HValue*, HValue*, |
6825 ElementsKind, StoreFieldOrKeyedMode); | 6848 ElementsKind, StoreFieldOrKeyedMode); |
| 6849 DECLARE_INSTRUCTION_FACTORY_P6(HStoreKeyed, HValue*, HValue*, HValue*, |
| 6850 ElementsKind, StoreFieldOrKeyedMode, int); |
6826 | 6851 |
6827 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 6852 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
6828 // kind_fast: tagged[int32] = tagged | 6853 // kind_fast: tagged[int32] = tagged |
6829 // kind_double: tagged[int32] = double | 6854 // kind_double: tagged[int32] = double |
6830 // kind_smi : tagged[int32] = smi | 6855 // kind_smi : tagged[int32] = smi |
6831 // kind_fixed_typed_array: tagged[int32] = (double | int32) | 6856 // kind_fixed_typed_array: tagged[int32] = (double | int32) |
6832 // kind_external: external[int32] = (double | int32) | 6857 // kind_external: external[int32] = (double | int32) |
6833 if (index == 0) { | 6858 if (index == 0) { |
6834 return is_external() ? Representation::External() | 6859 return is_external() ? Representation::External() |
6835 : Representation::Tagged(); | 6860 : Representation::Tagged(); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6888 } | 6913 } |
6889 | 6914 |
6890 HValue* elements() { return OperandAt(0); } | 6915 HValue* elements() { return OperandAt(0); } |
6891 HValue* key() { return OperandAt(1); } | 6916 HValue* key() { return OperandAt(1); } |
6892 HValue* value() { return OperandAt(2); } | 6917 HValue* value() { return OperandAt(2); } |
6893 bool value_is_smi() const { | 6918 bool value_is_smi() const { |
6894 return IsFastSmiElementsKind(elements_kind_); | 6919 return IsFastSmiElementsKind(elements_kind_); |
6895 } | 6920 } |
6896 StoreFieldOrKeyedMode store_mode() const { return store_mode_; } | 6921 StoreFieldOrKeyedMode store_mode() const { return store_mode_; } |
6897 ElementsKind elements_kind() const { return elements_kind_; } | 6922 ElementsKind elements_kind() const { return elements_kind_; } |
6898 uint32_t index_offset() { return index_offset_; } | 6923 uint32_t base_offset() { return base_offset_; } |
6899 void SetIndexOffset(uint32_t index_offset) { index_offset_ = index_offset; } | 6924 void IncreaseBaseOffset(uint32_t base_offset) { |
6900 virtual int MaxIndexOffsetBits() { | 6925 base_offset_ += base_offset; |
| 6926 } |
| 6927 virtual int MaxBaseOffsetBits() { |
6901 return 31 - ElementsKindToShiftSize(elements_kind_); | 6928 return 31 - ElementsKindToShiftSize(elements_kind_); |
6902 } | 6929 } |
6903 HValue* GetKey() { return key(); } | 6930 HValue* GetKey() { return key(); } |
6904 void SetKey(HValue* key) { SetOperandAt(1, key); } | 6931 void SetKey(HValue* key) { SetOperandAt(1, key); } |
6905 bool IsDehoisted() { return is_dehoisted_; } | 6932 bool IsDehoisted() { return is_dehoisted_; } |
6906 void SetDehoisted(bool is_dehoisted) { is_dehoisted_ = is_dehoisted; } | 6933 void SetDehoisted(bool is_dehoisted) { is_dehoisted_ = is_dehoisted; } |
6907 bool IsUninitialized() { return is_uninitialized_; } | 6934 bool IsUninitialized() { return is_uninitialized_; } |
6908 void SetUninitialized(bool is_uninitialized) { | 6935 void SetUninitialized(bool is_uninitialized) { |
6909 is_uninitialized_ = is_uninitialized; | 6936 is_uninitialized_ = is_uninitialized; |
6910 } | 6937 } |
(...skipping 23 matching lines...) Expand all Loading... |
6934 | 6961 |
6935 bool NeedsCanonicalization(); | 6962 bool NeedsCanonicalization(); |
6936 | 6963 |
6937 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 6964 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; |
6938 | 6965 |
6939 DECLARE_CONCRETE_INSTRUCTION(StoreKeyed) | 6966 DECLARE_CONCRETE_INSTRUCTION(StoreKeyed) |
6940 | 6967 |
6941 private: | 6968 private: |
6942 HStoreKeyed(HValue* obj, HValue* key, HValue* val, | 6969 HStoreKeyed(HValue* obj, HValue* key, HValue* val, |
6943 ElementsKind elements_kind, | 6970 ElementsKind elements_kind, |
6944 StoreFieldOrKeyedMode store_mode = INITIALIZING_STORE) | 6971 StoreFieldOrKeyedMode store_mode = INITIALIZING_STORE, |
| 6972 int offset = kDefaultKeyedHeaderOffsetSentinel) |
6945 : elements_kind_(elements_kind), | 6973 : elements_kind_(elements_kind), |
6946 index_offset_(0), | 6974 base_offset_(offset == kDefaultKeyedHeaderOffsetSentinel |
| 6975 ? GetDefaultHeaderSizeForElementsKind(elements_kind) |
| 6976 : offset), |
6947 is_dehoisted_(false), | 6977 is_dehoisted_(false), |
6948 is_uninitialized_(false), | 6978 is_uninitialized_(false), |
6949 store_mode_(store_mode), | 6979 store_mode_(store_mode), |
6950 new_space_dominator_(NULL) { | 6980 new_space_dominator_(NULL) { |
6951 SetOperandAt(0, obj); | 6981 SetOperandAt(0, obj); |
6952 SetOperandAt(1, key); | 6982 SetOperandAt(1, key); |
6953 SetOperandAt(2, val); | 6983 SetOperandAt(2, val); |
6954 | 6984 |
6955 ASSERT(store_mode != STORE_TO_INITIALIZED_ENTRY || | 6985 ASSERT(store_mode != STORE_TO_INITIALIZED_ENTRY || |
6956 elements_kind == FAST_SMI_ELEMENTS); | 6986 elements_kind == FAST_SMI_ELEMENTS); |
(...skipping 19 matching lines...) Expand all Loading... |
6976 // EXTERNAL_{UNSIGNED_,}{BYTE,SHORT,INT}_ELEMENTS are truncating. | 7006 // EXTERNAL_{UNSIGNED_,}{BYTE,SHORT,INT}_ELEMENTS are truncating. |
6977 if ((elements_kind >= EXTERNAL_INT8_ELEMENTS && | 7007 if ((elements_kind >= EXTERNAL_INT8_ELEMENTS && |
6978 elements_kind <= EXTERNAL_UINT32_ELEMENTS) || | 7008 elements_kind <= EXTERNAL_UINT32_ELEMENTS) || |
6979 (elements_kind >= UINT8_ELEMENTS && | 7009 (elements_kind >= UINT8_ELEMENTS && |
6980 elements_kind <= INT32_ELEMENTS)) { | 7010 elements_kind <= INT32_ELEMENTS)) { |
6981 SetFlag(kTruncatingToInt32); | 7011 SetFlag(kTruncatingToInt32); |
6982 } | 7012 } |
6983 } | 7013 } |
6984 | 7014 |
6985 ElementsKind elements_kind_; | 7015 ElementsKind elements_kind_; |
6986 uint32_t index_offset_; | 7016 uint32_t base_offset_; |
6987 bool is_dehoisted_ : 1; | 7017 bool is_dehoisted_ : 1; |
6988 bool is_uninitialized_ : 1; | 7018 bool is_uninitialized_ : 1; |
6989 StoreFieldOrKeyedMode store_mode_: 1; | 7019 StoreFieldOrKeyedMode store_mode_: 1; |
6990 HValue* new_space_dominator_; | 7020 HValue* new_space_dominator_; |
6991 }; | 7021 }; |
6992 | 7022 |
6993 | 7023 |
6994 class HStoreKeyedGeneric V8_FINAL : public HTemplateInstruction<4> { | 7024 class HStoreKeyedGeneric V8_FINAL : public HTemplateInstruction<4> { |
6995 public: | 7025 public: |
6996 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HStoreKeyedGeneric, HValue*, | 7026 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HStoreKeyedGeneric, HValue*, |
(...skipping 714 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7711 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 7741 virtual bool IsDeletable() const V8_OVERRIDE { return true; } |
7712 }; | 7742 }; |
7713 | 7743 |
7714 | 7744 |
7715 #undef DECLARE_INSTRUCTION | 7745 #undef DECLARE_INSTRUCTION |
7716 #undef DECLARE_CONCRETE_INSTRUCTION | 7746 #undef DECLARE_CONCRETE_INSTRUCTION |
7717 | 7747 |
7718 } } // namespace v8::internal | 7748 } } // namespace v8::internal |
7719 | 7749 |
7720 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 7750 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
OLD | NEW |