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

Side by Side Diff: src/hydrogen-instructions.h

Issue 57123002: Reland 21774: Generate KeyedLoadGeneric with Hydrogen (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Turn off by default Created 7 years 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 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 1045 matching lines...) Expand 10 before | Expand all | Expand 10 after
1056 static I* New(Zone* zone, \ 1056 static I* New(Zone* zone, \
1057 HValue* context, \ 1057 HValue* context, \
1058 P1 p1, \ 1058 P1 p1, \
1059 P2 p2, \ 1059 P2 p2, \
1060 P3 p3, \ 1060 P3 p3, \
1061 P4 p4, \ 1061 P4 p4, \
1062 P5 p5) { \ 1062 P5 p5) { \
1063 return new(zone) I(p1, p2, p3, p4, p5); \ 1063 return new(zone) I(p1, p2, p3, p4, p5); \
1064 } 1064 }
1065 1065
1066 #define DECLARE_INSTRUCTION_FACTORY_P6(I, P1, P2, P3, P4, P5, P6) \
1067 static I* New(Zone* zone, \
1068 HValue* context, \
1069 P1 p1, \
1070 P2 p2, \
1071 P3 p3, \
1072 P4 p4, \
1073 P5 p5, \
1074 P6 p6) { \
1075 return new(zone) I(p1, p2, p3, p4, p5, p6); \
1076 }
1077
1066 #define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P0(I) \ 1078 #define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P0(I) \
1067 static I* New(Zone* zone, HValue* context) { \ 1079 static I* New(Zone* zone, HValue* context) { \
1068 return new(zone) I(context); \ 1080 return new(zone) I(context); \
1069 } 1081 }
1070 1082
1071 #define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(I, P1) \ 1083 #define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(I, P1) \
1072 static I* New(Zone* zone, HValue* context, P1 p1) { \ 1084 static I* New(Zone* zone, HValue* context, P1 p1) { \
1073 return new(zone) I(context, p1); \ 1085 return new(zone) I(context, p1); \
1074 } 1086 }
1075 1087
(...skipping 4947 matching lines...) Expand 10 before | Expand all | Expand 10 after
6023 } 6035 }
6024 6036
6025 static HObjectAccess ForFunctionContextPointer() { 6037 static HObjectAccess ForFunctionContextPointer() {
6026 return HObjectAccess(kInobject, JSFunction::kContextOffset); 6038 return HObjectAccess(kInobject, JSFunction::kContextOffset);
6027 } 6039 }
6028 6040
6029 static HObjectAccess ForMap() { 6041 static HObjectAccess ForMap() {
6030 return HObjectAccess(kMaps, JSObject::kMapOffset); 6042 return HObjectAccess(kMaps, JSObject::kMapOffset);
6031 } 6043 }
6032 6044
6033 static HObjectAccess ForMapInstanceSize() { 6045 static HObjectAccess ForMapAsInteger32() {
6046 return HObjectAccess(kMaps, JSObject::kMapOffset,
6047 Representation::Integer32());
6048 }
6049
6050 static HObjectAccess ForMapInObjectProperties() {
6034 return HObjectAccess(kInobject, 6051 return HObjectAccess(kInobject,
6035 Map::kInstanceSizeOffset, 6052 Map::kInObjectPropertiesOffset,
6036 Representation::UInteger8()); 6053 Representation::UInteger8());
6037 } 6054 }
6038 6055
6039 static HObjectAccess ForMapInstanceType() { 6056 static HObjectAccess ForMapInstanceType() {
6040 return HObjectAccess(kInobject, 6057 return HObjectAccess(kInobject,
6041 Map::kInstanceTypeOffset, 6058 Map::kInstanceTypeOffset,
6042 Representation::UInteger8()); 6059 Representation::UInteger8());
6043 } 6060 }
6044 6061
6062 static HObjectAccess ForMapInstanceSize() {
6063 return HObjectAccess(kInobject,
6064 Map::kInstanceSizeOffset,
6065 Representation::UInteger8());
6066 }
6067
6068 static HObjectAccess ForMapBitField() {
6069 return HObjectAccess(kInobject,
6070 Map::kBitFieldOffset,
6071 Representation::UInteger8());
6072 }
6073
6074 static HObjectAccess ForMapBitField2() {
6075 return HObjectAccess(kInobject,
6076 Map::kBitField2Offset,
6077 Representation::UInteger8());
6078 }
6079
6080 static HObjectAccess ForNameHashField() {
6081 return HObjectAccess(kInobject,
6082 Name::kHashFieldOffset,
6083 Representation::Integer32());
6084 }
6085
6086 static HObjectAccess ForMapInstanceTypeAndBitField() {
6087 STATIC_ASSERT((Map::kInstanceTypeOffset & 1) == 0);
6088 STATIC_ASSERT(Map::kBitFieldOffset == Map::kInstanceTypeOffset + 1);
6089 return HObjectAccess(kInobject,
6090 Map::kInstanceTypeOffset,
6091 Representation::UInteger16());
6092 }
6093
6045 static HObjectAccess ForPropertyCellValue() { 6094 static HObjectAccess ForPropertyCellValue() {
6046 return HObjectAccess(kInobject, PropertyCell::kValueOffset); 6095 return HObjectAccess(kInobject, PropertyCell::kValueOffset);
6047 } 6096 }
6048 6097
6049 static HObjectAccess ForCellValue() { 6098 static HObjectAccess ForCellValue() {
6050 return HObjectAccess(kInobject, Cell::kValueOffset); 6099 return HObjectAccess(kInobject, Cell::kValueOffset);
6051 } 6100 }
6052 6101
6053 static HObjectAccess ForAllocationMementoSite() { 6102 static HObjectAccess ForAllocationMementoSite() {
6054 return HObjectAccess(kInobject, AllocationMemento::kAllocationSiteOffset); 6103 return HObjectAccess(kInobject, AllocationMemento::kAllocationSiteOffset);
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
6287 set_representation(Representation::Tagged()); 6336 set_representation(Representation::Tagged());
6288 SetFlag(kUseGVN); 6337 SetFlag(kUseGVN);
6289 SetGVNFlag(kDependsOnCalls); 6338 SetGVNFlag(kDependsOnCalls);
6290 } 6339 }
6291 }; 6340 };
6292 6341
6293 class ArrayInstructionInterface { 6342 class ArrayInstructionInterface {
6294 public: 6343 public:
6295 virtual HValue* GetKey() = 0; 6344 virtual HValue* GetKey() = 0;
6296 virtual void SetKey(HValue* key) = 0; 6345 virtual void SetKey(HValue* key) = 0;
6297 virtual void SetIndexOffset(uint32_t index_offset) = 0; 6346 virtual ElementsKind elements_kind() const = 0;
6298 virtual int MaxIndexOffsetBits() = 0; 6347 virtual void IncreaseBaseOffset(uint32_t base_offset) = 0;
6348 virtual int MaxBaseOffsetBits() = 0;
6299 virtual bool IsDehoisted() = 0; 6349 virtual bool IsDehoisted() = 0;
6300 virtual void SetDehoisted(bool is_dehoisted) = 0; 6350 virtual void SetDehoisted(bool is_dehoisted) = 0;
6301 virtual ~ArrayInstructionInterface() { }; 6351 virtual ~ArrayInstructionInterface() { };
6302 6352
6303 static Representation KeyedAccessIndexRequirement(Representation r) { 6353 static Representation KeyedAccessIndexRequirement(Representation r) {
6304 return r.IsInteger32() || SmiValuesAre32Bits() 6354 return r.IsInteger32() || SmiValuesAre32Bits()
6305 ? Representation::Integer32() : Representation::Smi(); 6355 ? Representation::Integer32() : Representation::Smi();
6306 } 6356 }
6307 }; 6357 };
6308 6358
6309 6359
6360 static const int kDefaultKeyedHeaderOffsetSentinel = -1;
6361
Toon Verwaest 2013/12/04 17:29:26 super nit: seems like we're pretty inconsistent in
danno 2014/06/06 15:43:50 Well, a few weeks ago we decided that we would jus
6310 enum LoadKeyedHoleMode { 6362 enum LoadKeyedHoleMode {
6311 NEVER_RETURN_HOLE, 6363 NEVER_RETURN_HOLE,
6312 ALLOW_RETURN_HOLE 6364 ALLOW_RETURN_HOLE
6313 }; 6365 };
6314 6366
6315 6367
6316 class HLoadKeyed V8_FINAL 6368 class HLoadKeyed V8_FINAL
6317 : public HTemplateInstruction<3>, public ArrayInstructionInterface { 6369 : public HTemplateInstruction<3>, public ArrayInstructionInterface {
6318 public: 6370 public:
6319 DECLARE_INSTRUCTION_FACTORY_P4(HLoadKeyed, HValue*, HValue*, HValue*, 6371 DECLARE_INSTRUCTION_FACTORY_P4(HLoadKeyed, HValue*, HValue*, HValue*,
6320 ElementsKind); 6372 ElementsKind);
6321 DECLARE_INSTRUCTION_FACTORY_P5(HLoadKeyed, HValue*, HValue*, HValue*, 6373 DECLARE_INSTRUCTION_FACTORY_P5(HLoadKeyed, HValue*, HValue*, HValue*,
6322 ElementsKind, LoadKeyedHoleMode); 6374 ElementsKind, LoadKeyedHoleMode);
6375 DECLARE_INSTRUCTION_FACTORY_P6(HLoadKeyed, HValue*, HValue*, HValue*,
6376 ElementsKind, LoadKeyedHoleMode, int);
6323 6377
6324 bool is_external() const { 6378 bool is_external() const {
6325 return IsExternalArrayElementsKind(elements_kind()); 6379 return IsExternalArrayElementsKind(elements_kind());
6326 } 6380 }
6327 HValue* elements() { return OperandAt(0); } 6381 HValue* elements() { return OperandAt(0); }
6328 HValue* key() { return OperandAt(1); } 6382 HValue* key() { return OperandAt(1); }
6329 HValue* dependency() { 6383 HValue* dependency() {
6330 ASSERT(HasDependency()); 6384 ASSERT(HasDependency());
6331 return OperandAt(2); 6385 return OperandAt(2);
6332 } 6386 }
6333 bool HasDependency() const { return OperandAt(0) != OperandAt(2); } 6387 bool HasDependency() const { return OperandAt(0) != OperandAt(2); }
6334 uint32_t index_offset() { return IndexOffsetField::decode(bit_field_); } 6388 uint32_t base_offset() { return BaseOffsetField::decode(bit_field_); }
6335 void SetIndexOffset(uint32_t index_offset) { 6389 void IncreaseBaseOffset(uint32_t base_offset) {
6336 bit_field_ = IndexOffsetField::update(bit_field_, index_offset); 6390 base_offset += BaseOffsetField::decode(bit_field_);
6391 bit_field_ = BaseOffsetField::update(bit_field_, base_offset);
6337 } 6392 }
6338 virtual int MaxIndexOffsetBits() { 6393 virtual int MaxBaseOffsetBits() {
6339 return kBitsForIndexOffset; 6394 return kBitsForBaseOffset;
6340 } 6395 }
6341 HValue* GetKey() { return key(); } 6396 HValue* GetKey() { return key(); }
6342 void SetKey(HValue* key) { SetOperandAt(1, key); } 6397 void SetKey(HValue* key) { SetOperandAt(1, key); }
6343 bool IsDehoisted() { return IsDehoistedField::decode(bit_field_); } 6398 bool IsDehoisted() { return IsDehoistedField::decode(bit_field_); }
6344 void SetDehoisted(bool is_dehoisted) { 6399 void SetDehoisted(bool is_dehoisted) {
6345 bit_field_ = IsDehoistedField::update(bit_field_, is_dehoisted); 6400 bit_field_ = IsDehoistedField::update(bit_field_, is_dehoisted);
6346 } 6401 }
6347 ElementsKind elements_kind() const { 6402 virtual ElementsKind elements_kind() const V8_OVERRIDE {
6348 return ElementsKindField::decode(bit_field_); 6403 return ElementsKindField::decode(bit_field_);
6349 } 6404 }
6350 LoadKeyedHoleMode hole_mode() const { 6405 LoadKeyedHoleMode hole_mode() const {
6351 return HoleModeField::decode(bit_field_); 6406 return HoleModeField::decode(bit_field_);
6352 } 6407 }
6353 6408
6354 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 6409 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE {
6355 // kind_fast: tagged[int32] (none) 6410 // kind_fast: tagged[int32] (none)
6356 // kind_double: tagged[int32] (none) 6411 // kind_double: tagged[int32] (none)
6357 // kind_external: external[int32] (none) 6412 // kind_external: external[int32] (none)
(...skipping 20 matching lines...) Expand all
6378 6433
6379 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; 6434 virtual Range* InferRange(Zone* zone) V8_OVERRIDE;
6380 6435
6381 DECLARE_CONCRETE_INSTRUCTION(LoadKeyed) 6436 DECLARE_CONCRETE_INSTRUCTION(LoadKeyed)
6382 6437
6383 protected: 6438 protected:
6384 virtual bool DataEquals(HValue* other) V8_OVERRIDE { 6439 virtual bool DataEquals(HValue* other) V8_OVERRIDE {
6385 if (!other->IsLoadKeyed()) return false; 6440 if (!other->IsLoadKeyed()) return false;
6386 HLoadKeyed* other_load = HLoadKeyed::cast(other); 6441 HLoadKeyed* other_load = HLoadKeyed::cast(other);
6387 6442
6388 if (IsDehoisted() && index_offset() != other_load->index_offset()) 6443 if (IsDehoisted() && base_offset() != other_load->base_offset())
6389 return false; 6444 return false;
6390 return elements_kind() == other_load->elements_kind(); 6445 return elements_kind() == other_load->elements_kind();
6391 } 6446 }
6392 6447
6393 private: 6448 private:
6394 HLoadKeyed(HValue* obj, 6449 HLoadKeyed(HValue* obj,
6395 HValue* key, 6450 HValue* key,
6396 HValue* dependency, 6451 HValue* dependency,
6397 ElementsKind elements_kind, 6452 ElementsKind elements_kind,
6398 LoadKeyedHoleMode mode = NEVER_RETURN_HOLE) 6453 LoadKeyedHoleMode mode = NEVER_RETURN_HOLE,
6454 int offset = kDefaultKeyedHeaderOffsetSentinel)
6399 : bit_field_(0) { 6455 : bit_field_(0) {
6456 offset = offset == kDefaultKeyedHeaderOffsetSentinel
6457 ? GetDefaultHeaderSizeForElementsKind(elements_kind)
6458 : offset;
6400 bit_field_ = ElementsKindField::encode(elements_kind) | 6459 bit_field_ = ElementsKindField::encode(elements_kind) |
6401 HoleModeField::encode(mode); 6460 HoleModeField::encode(mode) |
6461 BaseOffsetField::encode(offset);
6402 6462
6403 SetOperandAt(0, obj); 6463 SetOperandAt(0, obj);
6404 SetOperandAt(1, key); 6464 SetOperandAt(1, key);
6405 SetOperandAt(2, dependency != NULL ? dependency : obj); 6465 SetOperandAt(2, dependency != NULL ? dependency : obj);
6406 6466
6407 if (!is_external()) { 6467 if (!is_external()) {
6408 // I can detect the case between storing double (holey and fast) and 6468 // I can detect the case between storing double (holey and fast) and
6409 // smi/object by looking at elements_kind_. 6469 // smi/object by looking at elements_kind_.
6410 ASSERT(IsFastSmiOrObjectElementsKind(elements_kind) || 6470 ASSERT(IsFastSmiOrObjectElementsKind(elements_kind) ||
6411 IsFastDoubleElementsKind(elements_kind)); 6471 IsFastDoubleElementsKind(elements_kind));
(...skipping 30 matching lines...) Expand all
6442 } 6502 }
6443 6503
6444 virtual bool IsDeletable() const V8_OVERRIDE { 6504 virtual bool IsDeletable() const V8_OVERRIDE {
6445 return !RequiresHoleCheck(); 6505 return !RequiresHoleCheck();
6446 } 6506 }
6447 6507
6448 // Establish some checks around our packed fields 6508 // Establish some checks around our packed fields
6449 enum LoadKeyedBits { 6509 enum LoadKeyedBits {
6450 kBitsForElementsKind = 5, 6510 kBitsForElementsKind = 5,
6451 kBitsForHoleMode = 1, 6511 kBitsForHoleMode = 1,
6452 kBitsForIndexOffset = 25, 6512 kBitsForBaseOffset = 25,
6453 kBitsForIsDehoisted = 1, 6513 kBitsForIsDehoisted = 1,
6454 6514
6455 kStartElementsKind = 0, 6515 kStartElementsKind = 0,
6456 kStartHoleMode = kStartElementsKind + kBitsForElementsKind, 6516 kStartHoleMode = kStartElementsKind + kBitsForElementsKind,
6457 kStartIndexOffset = kStartHoleMode + kBitsForHoleMode, 6517 kStartBaseOffset = kStartHoleMode + kBitsForHoleMode,
6458 kStartIsDehoisted = kStartIndexOffset + kBitsForIndexOffset 6518 kStartIsDehoisted = kStartBaseOffset + kBitsForBaseOffset
6459 }; 6519 };
6460 6520
6461 STATIC_ASSERT((kBitsForElementsKind + kBitsForIndexOffset + 6521 STATIC_ASSERT((kBitsForElementsKind + kBitsForBaseOffset +
6462 kBitsForIsDehoisted) <= sizeof(uint32_t)*8); 6522 kBitsForIsDehoisted) <= sizeof(uint32_t)*8);
6463 STATIC_ASSERT(kElementsKindCount <= (1 << kBitsForElementsKind)); 6523 STATIC_ASSERT(kElementsKindCount <= (1 << kBitsForElementsKind));
6464 class ElementsKindField: 6524 class ElementsKindField:
6465 public BitField<ElementsKind, kStartElementsKind, kBitsForElementsKind> 6525 public BitField<ElementsKind, kStartElementsKind, kBitsForElementsKind>
6466 {}; // NOLINT 6526 {}; // NOLINT
6467 class HoleModeField: 6527 class HoleModeField:
6468 public BitField<LoadKeyedHoleMode, kStartHoleMode, kBitsForHoleMode> 6528 public BitField<LoadKeyedHoleMode, kStartHoleMode, kBitsForHoleMode>
6469 {}; // NOLINT 6529 {}; // NOLINT
6470 class IndexOffsetField: 6530 class BaseOffsetField:
6471 public BitField<uint32_t, kStartIndexOffset, kBitsForIndexOffset> 6531 public BitField<uint32_t, kStartBaseOffset, kBitsForBaseOffset>
6472 {}; // NOLINT 6532 {}; // NOLINT
6473 class IsDehoistedField: 6533 class IsDehoistedField:
6474 public BitField<bool, kStartIsDehoisted, kBitsForIsDehoisted> 6534 public BitField<bool, kStartIsDehoisted, kBitsForIsDehoisted>
6475 {}; // NOLINT 6535 {}; // NOLINT
6476 uint32_t bit_field_; 6536 uint32_t bit_field_;
6477 }; 6537 };
6478 6538
6479 6539
6480 class HLoadKeyedGeneric V8_FINAL : public HTemplateInstruction<3> { 6540 class HLoadKeyedGeneric V8_FINAL : public HTemplateInstruction<3> {
6481 public: 6541 public:
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
6661 Handle<String> name_; 6721 Handle<String> name_;
6662 StrictModeFlag strict_mode_flag_; 6722 StrictModeFlag strict_mode_flag_;
6663 }; 6723 };
6664 6724
6665 6725
6666 class HStoreKeyed V8_FINAL 6726 class HStoreKeyed V8_FINAL
6667 : public HTemplateInstruction<3>, public ArrayInstructionInterface { 6727 : public HTemplateInstruction<3>, public ArrayInstructionInterface {
6668 public: 6728 public:
6669 DECLARE_INSTRUCTION_FACTORY_P4(HStoreKeyed, HValue*, HValue*, HValue*, 6729 DECLARE_INSTRUCTION_FACTORY_P4(HStoreKeyed, HValue*, HValue*, HValue*,
6670 ElementsKind); 6730 ElementsKind);
6731 DECLARE_INSTRUCTION_FACTORY_P5(HStoreKeyed, HValue*, HValue*, HValue*,
6732 ElementsKind, int);
6671 6733
6672 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 6734 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE {
6673 // kind_fast: tagged[int32] = tagged 6735 // kind_fast: tagged[int32] = tagged
6674 // kind_double: tagged[int32] = double 6736 // kind_double: tagged[int32] = double
6675 // kind_smi : tagged[int32] = smi 6737 // kind_smi : tagged[int32] = smi
6676 // kind_external: external[int32] = (double | int32) 6738 // kind_external: external[int32] = (double | int32)
6677 if (index == 0) { 6739 if (index == 0) {
6678 return is_external() ? Representation::External() 6740 return is_external() ? Representation::External()
6679 : Representation::Tagged(); 6741 : Representation::Tagged();
6680 } else if (index == 1) { 6742 } else if (index == 1) {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
6716 // For fast object elements kinds, don't assume anything. 6778 // For fast object elements kinds, don't assume anything.
6717 return Representation::None(); 6779 return Representation::None();
6718 } 6780 }
6719 6781
6720 HValue* elements() { return OperandAt(0); } 6782 HValue* elements() { return OperandAt(0); }
6721 HValue* key() { return OperandAt(1); } 6783 HValue* key() { return OperandAt(1); }
6722 HValue* value() { return OperandAt(2); } 6784 HValue* value() { return OperandAt(2); }
6723 bool value_is_smi() const { 6785 bool value_is_smi() const {
6724 return IsFastSmiElementsKind(elements_kind_); 6786 return IsFastSmiElementsKind(elements_kind_);
6725 } 6787 }
6726 ElementsKind elements_kind() const { return elements_kind_; } 6788 virtual ElementsKind elements_kind() const V8_OVERRIDE {
6727 uint32_t index_offset() { return index_offset_; } 6789 return elements_kind_;
6728 void SetIndexOffset(uint32_t index_offset) { index_offset_ = index_offset; } 6790 }
6729 virtual int MaxIndexOffsetBits() { 6791 uint32_t base_offset() { return base_offset_; }
6792 void IncreaseBaseOffset(uint32_t base_offset) {
Toon Verwaest 2013/12/04 17:29:26 Could you add a comment indicating to what you are
danno 2014/06/06 15:43:50 Done.
6793 base_offset_ += base_offset;
6794 }
6795 virtual int MaxBaseOffsetBits() {
6730 return 31 - ElementsKindToShiftSize(elements_kind_); 6796 return 31 - ElementsKindToShiftSize(elements_kind_);
6731 } 6797 }
6732 HValue* GetKey() { return key(); } 6798 HValue* GetKey() { return key(); }
6733 void SetKey(HValue* key) { SetOperandAt(1, key); } 6799 void SetKey(HValue* key) { SetOperandAt(1, key); }
6734 bool IsDehoisted() { return is_dehoisted_; } 6800 bool IsDehoisted() { return is_dehoisted_; }
6735 void SetDehoisted(bool is_dehoisted) { is_dehoisted_ = is_dehoisted; } 6801 void SetDehoisted(bool is_dehoisted) { is_dehoisted_ = is_dehoisted; }
6736 bool IsUninitialized() { return is_uninitialized_; } 6802 bool IsUninitialized() { return is_uninitialized_; }
6737 void SetUninitialized(bool is_uninitialized) { 6803 void SetUninitialized(bool is_uninitialized) {
6738 is_uninitialized_ = is_uninitialized; 6804 is_uninitialized_ = is_uninitialized;
6739 } 6805 }
(...skipping 20 matching lines...) Expand all
6760 } 6826 }
6761 6827
6762 bool NeedsCanonicalization(); 6828 bool NeedsCanonicalization();
6763 6829
6764 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 6830 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
6765 6831
6766 DECLARE_CONCRETE_INSTRUCTION(StoreKeyed) 6832 DECLARE_CONCRETE_INSTRUCTION(StoreKeyed)
6767 6833
6768 private: 6834 private:
6769 HStoreKeyed(HValue* obj, HValue* key, HValue* val, 6835 HStoreKeyed(HValue* obj, HValue* key, HValue* val,
6770 ElementsKind elements_kind) 6836 ElementsKind elements_kind,
6837 int offset = kDefaultKeyedHeaderOffsetSentinel)
6771 : elements_kind_(elements_kind), 6838 : elements_kind_(elements_kind),
6772 index_offset_(0), 6839 base_offset_(offset == kDefaultKeyedHeaderOffsetSentinel
6840 ? GetDefaultHeaderSizeForElementsKind(elements_kind)
6841 : offset),
6773 is_dehoisted_(false), 6842 is_dehoisted_(false),
6774 is_uninitialized_(false), 6843 is_uninitialized_(false),
6775 new_space_dominator_(NULL) { 6844 new_space_dominator_(NULL) {
6776 SetOperandAt(0, obj); 6845 SetOperandAt(0, obj);
6777 SetOperandAt(1, key); 6846 SetOperandAt(1, key);
6778 SetOperandAt(2, val); 6847 SetOperandAt(2, val);
6779 6848
6780 if (IsFastObjectElementsKind(elements_kind)) { 6849 if (IsFastObjectElementsKind(elements_kind)) {
6781 SetFlag(kTrackSideEffectDominators); 6850 SetFlag(kTrackSideEffectDominators);
6782 SetGVNFlag(kDependsOnNewSpacePromotion); 6851 SetGVNFlag(kDependsOnNewSpacePromotion);
(...skipping 10 matching lines...) Expand all
6793 } 6862 }
6794 6863
6795 // EXTERNAL_{UNSIGNED_,}{BYTE,SHORT,INT}_ELEMENTS are truncating. 6864 // EXTERNAL_{UNSIGNED_,}{BYTE,SHORT,INT}_ELEMENTS are truncating.
6796 if (elements_kind >= EXTERNAL_BYTE_ELEMENTS && 6865 if (elements_kind >= EXTERNAL_BYTE_ELEMENTS &&
6797 elements_kind <= EXTERNAL_UNSIGNED_INT_ELEMENTS) { 6866 elements_kind <= EXTERNAL_UNSIGNED_INT_ELEMENTS) {
6798 SetFlag(kTruncatingToInt32); 6867 SetFlag(kTruncatingToInt32);
6799 } 6868 }
6800 } 6869 }
6801 6870
6802 ElementsKind elements_kind_; 6871 ElementsKind elements_kind_;
6803 uint32_t index_offset_; 6872 uint32_t base_offset_;
6804 bool is_dehoisted_ : 1; 6873 bool is_dehoisted_ : 1;
6805 bool is_uninitialized_ : 1; 6874 bool is_uninitialized_ : 1;
6806 HValue* new_space_dominator_; 6875 HValue* new_space_dominator_;
6807 }; 6876 };
6808 6877
6809 6878
6810 class HStoreKeyedGeneric V8_FINAL : public HTemplateInstruction<4> { 6879 class HStoreKeyedGeneric V8_FINAL : public HTemplateInstruction<4> {
6811 public: 6880 public:
6812 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HStoreKeyedGeneric, HValue*, 6881 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HStoreKeyedGeneric, HValue*,
6813 HValue*, HValue*, StrictModeFlag); 6882 HValue*, HValue*, StrictModeFlag);
(...skipping 638 matching lines...) Expand 10 before | Expand all | Expand 10 after
7452 set_representation(Representation::Tagged()); 7521 set_representation(Representation::Tagged());
7453 } 7522 }
7454 7523
7455 int idx_; 7524 int idx_;
7456 HForInCacheArray* index_cache_; 7525 HForInCacheArray* index_cache_;
7457 }; 7526 };
7458 7527
7459 7528
7460 class HLoadFieldByIndex V8_FINAL : public HTemplateInstruction<2> { 7529 class HLoadFieldByIndex V8_FINAL : public HTemplateInstruction<2> {
7461 public: 7530 public:
7462 HLoadFieldByIndex(HValue* object, 7531 DECLARE_INSTRUCTION_FACTORY_P2(HLoadFieldByIndex, HValue*, HValue*);
7463 HValue* index) {
7464 SetOperandAt(0, object);
7465 SetOperandAt(1, index);
7466 set_representation(Representation::Tagged());
7467 }
7468 7532
7469 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 7533 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE {
7470 return Representation::Tagged(); 7534 if (index == 1) {
7535 return Representation::Integer32();
7536 } else {
7537 return Representation::Tagged();
7538 }
7471 } 7539 }
7472 7540
7473 HValue* object() { return OperandAt(0); } 7541 HValue* object() { return OperandAt(0); }
7474 HValue* index() { return OperandAt(1); } 7542 HValue* index() { return OperandAt(1); }
7475 7543
7476 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; 7544 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
7477 7545
7478 virtual HType CalculateInferredType() V8_OVERRIDE { 7546 virtual HType CalculateInferredType() V8_OVERRIDE {
7479 return HType::Tagged(); 7547 return HType::Tagged();
7480 } 7548 }
7481 7549
7482 DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex); 7550 DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex);
7483 7551
7484 private: 7552 private:
7553 HLoadFieldByIndex(HValue* object,
7554 HValue* index) {
7555 SetOperandAt(0, object);
7556 SetOperandAt(1, index);
7557 set_representation(Representation::Tagged());
7558 }
7559
7485 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 7560 virtual bool IsDeletable() const V8_OVERRIDE { return true; }
7486 }; 7561 };
7487 7562
7488 7563
7489 #undef DECLARE_INSTRUCTION 7564 #undef DECLARE_INSTRUCTION
7490 #undef DECLARE_CONCRETE_INSTRUCTION 7565 #undef DECLARE_CONCRETE_INSTRUCTION
7491 7566
7492 } } // namespace v8::internal 7567 } } // namespace v8::internal
7493 7568
7494 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ 7569 #endif // V8_HYDROGEN_INSTRUCTIONS_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698