Index: src/hydrogen-instructions.h |
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
index d1f2372db689de8059d55f532d8ad26bf3bd661a..f1720f444247d83635c84d00a99cf2457ee0022e 100644 |
--- a/src/hydrogen-instructions.h |
+++ b/src/hydrogen-instructions.h |
@@ -6049,9 +6049,14 @@ class HObjectAccess V8_FINAL { |
return HObjectAccess(kMaps, JSObject::kMapOffset); |
} |
- static HObjectAccess ForMapInstanceSize() { |
+ static HObjectAccess ForMapAsInteger32() { |
+ return HObjectAccess(kMaps, JSObject::kMapOffset, |
+ Representation::Integer32()); |
+ } |
+ |
+ static HObjectAccess ForMapInObjectProperties() { |
return HObjectAccess(kInobject, |
- Map::kInstanceSizeOffset, |
+ Map::kInObjectPropertiesOffset, |
Representation::UInteger8()); |
} |
@@ -6061,6 +6066,38 @@ class HObjectAccess V8_FINAL { |
Representation::UInteger8()); |
} |
+ static HObjectAccess ForMapInstanceSize() { |
+ return HObjectAccess(kInobject, |
+ Map::kInstanceSizeOffset, |
+ Representation::UInteger8()); |
+ } |
+ |
+ static HObjectAccess ForMapBitField() { |
+ return HObjectAccess(kInobject, |
+ Map::kBitFieldOffset, |
+ Representation::UInteger8()); |
+ } |
+ |
+ static HObjectAccess ForMapBitField2() { |
+ return HObjectAccess(kInobject, |
+ Map::kBitField2Offset, |
+ Representation::UInteger8()); |
+ } |
+ |
+ static HObjectAccess ForNameHashField() { |
+ return HObjectAccess(kInobject, |
+ Name::kHashFieldOffset, |
+ Representation::Integer32()); |
+ } |
+ |
+ static HObjectAccess ForMapInstanceTypeAndBitField() { |
+ STATIC_ASSERT((Map::kInstanceTypeOffset & 1) == 0); |
mtbrandy
2014/06/17 13:45:40
These asserts are invalid on big endian platforms.
|
+ STATIC_ASSERT(Map::kBitFieldOffset == Map::kInstanceTypeOffset + 1); |
+ return HObjectAccess(kInobject, |
+ Map::kInstanceTypeOffset, |
+ Representation::UInteger16()); |
+ } |
+ |
static HObjectAccess ForPropertyCellValue() { |
return HObjectAccess(kInobject, PropertyCell::kValueOffset); |
} |
@@ -6453,6 +6490,10 @@ class HLoadKeyed V8_FINAL |
bool HasDependency() const { return OperandAt(0) != OperandAt(2); } |
uint32_t base_offset() { return BaseOffsetField::decode(bit_field_); } |
void IncreaseBaseOffset(uint32_t base_offset) { |
+ // The base offset is usually simply the size of the array header, except |
+ // with dehoisting adds an addition offset due to a array index key |
+ // manipulation, in which case it becomes (array header size + |
+ // constant-offset-from-key * kPointerSize) |
base_offset += BaseOffsetField::decode(bit_field_); |
bit_field_ = BaseOffsetField::update(bit_field_, base_offset); |
} |
@@ -6465,7 +6506,7 @@ class HLoadKeyed V8_FINAL |
void SetDehoisted(bool is_dehoisted) { |
bit_field_ = IsDehoistedField::update(bit_field_, is_dehoisted); |
} |
- ElementsKind elements_kind() const { |
+ virtual ElementsKind elements_kind() const V8_OVERRIDE { |
return ElementsKindField::decode(bit_field_); |
} |
LoadKeyedHoleMode hole_mode() const { |
@@ -6923,6 +6964,10 @@ class HStoreKeyed V8_FINAL |
ElementsKind elements_kind() const { return elements_kind_; } |
uint32_t base_offset() { return base_offset_; } |
void IncreaseBaseOffset(uint32_t base_offset) { |
+ // The base offset is usually simply the size of the array header, except |
+ // with dehoisting adds an addition offset due to a array index key |
+ // manipulation, in which case it becomes (array header size + |
+ // constant-offset-from-key * kPointerSize) |
base_offset_ += base_offset; |
} |
virtual int MaxBaseOffsetBits() { |