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 1926 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1937 | 1937 |
1938 class HJSArrayLength: public HTemplateInstruction<2> { | 1938 class HJSArrayLength: public HTemplateInstruction<2> { |
1939 public: | 1939 public: |
1940 HJSArrayLength(HValue* value, HValue* typecheck, | 1940 HJSArrayLength(HValue* value, HValue* typecheck, |
1941 HType type = HType::Tagged()) { | 1941 HType type = HType::Tagged()) { |
1942 set_type(type); | 1942 set_type(type); |
1943 // The length of an array is stored as a tagged value in the array | 1943 // The length of an array is stored as a tagged value in the array |
1944 // object. It is guaranteed to be 32 bit integer, but it can be | 1944 // object. It is guaranteed to be 32 bit integer, but it can be |
1945 // represented as either a smi or heap number. | 1945 // represented as either a smi or heap number. |
1946 SetOperandAt(0, value); | 1946 SetOperandAt(0, value); |
1947 SetOperandAt(1, typecheck); | 1947 SetOperandAt(1, typecheck != NULL ? typecheck : value); |
Jakob Kummerow
2012/12/11 14:05:54
I could swear I've reviewed this change before...
danno
2012/12/12 00:36:03
Landed the other patch first, rebased on it.
On 20
| |
1948 set_representation(Representation::Tagged()); | 1948 set_representation(Representation::Tagged()); |
1949 SetFlag(kUseGVN); | 1949 SetFlag(kUseGVN); |
1950 SetGVNFlag(kDependsOnArrayLengths); | 1950 SetGVNFlag(kDependsOnArrayLengths); |
1951 SetGVNFlag(kDependsOnMaps); | 1951 SetGVNFlag(kDependsOnMaps); |
1952 } | 1952 } |
1953 | 1953 |
1954 virtual Representation RequiredInputRepresentation(int index) { | 1954 virtual Representation RequiredInputRepresentation(int index) { |
1955 return Representation::Tagged(); | 1955 return Representation::Tagged(); |
1956 } | 1956 } |
1957 | 1957 |
1958 virtual void PrintDataTo(StringStream* stream); | 1958 virtual void PrintDataTo(StringStream* stream); |
1959 | 1959 |
1960 HValue* value() { return OperandAt(0); } | 1960 HValue* value() { return OperandAt(0); } |
1961 HValue* typecheck() { return OperandAt(1); } | 1961 HValue* typecheck() { |
1962 ASSERT(HasTypeCheck()); | |
1963 return OperandAt(1); | |
1964 } | |
1965 bool HasTypeCheck() const { return OperandAt(0) != OperandAt(1); } | |
1962 | 1966 |
1963 DECLARE_CONCRETE_INSTRUCTION(JSArrayLength) | 1967 DECLARE_CONCRETE_INSTRUCTION(JSArrayLength) |
1964 | 1968 |
1965 protected: | 1969 protected: |
1966 virtual bool DataEquals(HValue* other_raw) { return true; } | 1970 virtual bool DataEquals(HValue* other_raw) { return true; } |
1967 | 1971 |
1968 private: | 1972 private: |
1969 virtual bool IsDeletable() const { return true; } | 1973 virtual bool IsDeletable() const { return true; } |
1970 }; | 1974 }; |
1971 | 1975 |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2152 virtual bool IsDeletable() const { return true; } | 2156 virtual bool IsDeletable() const { return true; } |
2153 | 2157 |
2154 BuiltinFunctionId op_; | 2158 BuiltinFunctionId op_; |
2155 }; | 2159 }; |
2156 | 2160 |
2157 | 2161 |
2158 class HLoadElements: public HTemplateInstruction<2> { | 2162 class HLoadElements: public HTemplateInstruction<2> { |
2159 public: | 2163 public: |
2160 HLoadElements(HValue* value, HValue* typecheck) { | 2164 HLoadElements(HValue* value, HValue* typecheck) { |
2161 SetOperandAt(0, value); | 2165 SetOperandAt(0, value); |
2162 SetOperandAt(1, typecheck); | 2166 SetOperandAt(1, typecheck != NULL ? typecheck : value); |
2163 set_representation(Representation::Tagged()); | 2167 set_representation(Representation::Tagged()); |
2164 SetFlag(kUseGVN); | 2168 SetFlag(kUseGVN); |
2165 SetGVNFlag(kDependsOnElementsPointer); | 2169 SetGVNFlag(kDependsOnElementsPointer); |
2166 } | 2170 } |
2167 | 2171 |
2168 HValue* value() { return OperandAt(0); } | 2172 HValue* value() { return OperandAt(0); } |
2169 HValue* typecheck() { return OperandAt(1); } | 2173 HValue* typecheck() { |
2174 ASSERT(HasTypeCheck()); | |
2175 return OperandAt(1); | |
2176 } | |
2177 bool HasTypeCheck() const { return OperandAt(0) != OperandAt(1); } | |
2170 | 2178 |
2171 virtual void PrintDataTo(StringStream* stream); | 2179 virtual void PrintDataTo(StringStream* stream); |
2172 | 2180 |
2173 virtual Representation RequiredInputRepresentation(int index) { | 2181 virtual Representation RequiredInputRepresentation(int index) { |
2174 return Representation::Tagged(); | 2182 return Representation::Tagged(); |
2175 } | 2183 } |
2176 | 2184 |
2177 DECLARE_CONCRETE_INSTRUCTION(LoadElements) | 2185 DECLARE_CONCRETE_INSTRUCTION(LoadElements) |
2178 | 2186 |
2179 protected: | 2187 protected: |
(...skipping 2200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4380 : public HTemplateInstruction<4>, public ArrayInstructionInterface { | 4388 : public HTemplateInstruction<4>, public ArrayInstructionInterface { |
4381 public: | 4389 public: |
4382 HLoadKeyed(HValue* obj, | 4390 HLoadKeyed(HValue* obj, |
4383 HValue* checked_key, | 4391 HValue* checked_key, |
4384 HValue* dependency, | 4392 HValue* dependency, |
4385 ElementsKind elements_kind) | 4393 ElementsKind elements_kind) |
4386 : bit_field_(0) { | 4394 : bit_field_(0) { |
4387 bit_field_ = ElementsKindField::encode(elements_kind); | 4395 bit_field_ = ElementsKindField::encode(elements_kind); |
4388 SetOperandAt(0, obj); | 4396 SetOperandAt(0, obj); |
4389 SetOperandAt(1, HBoundsCheck::ExtractUncheckedIndex(checked_key)); | 4397 SetOperandAt(1, HBoundsCheck::ExtractUncheckedIndex(checked_key)); |
4390 SetOperandAt(2, dependency); | 4398 SetOperandAt(2, dependency != NULL ? dependency : obj); |
4391 SetOperandAt(3, checked_key); | 4399 SetOperandAt(3, checked_key); |
4392 | 4400 |
4393 if (!is_external()) { | 4401 if (!is_external()) { |
4394 // I can detect the case between storing double (holey and fast) and | 4402 // I can detect the case between storing double (holey and fast) and |
4395 // smi/object by looking at elements_kind_. | 4403 // smi/object by looking at elements_kind_. |
4396 ASSERT(IsFastSmiOrObjectElementsKind(elements_kind) || | 4404 ASSERT(IsFastSmiOrObjectElementsKind(elements_kind) || |
4397 IsFastDoubleElementsKind(elements_kind)); | 4405 IsFastDoubleElementsKind(elements_kind)); |
4398 | 4406 |
4399 if (IsFastSmiOrObjectElementsKind(elements_kind)) { | 4407 if (IsFastSmiOrObjectElementsKind(elements_kind)) { |
4400 if (IsFastSmiElementsKind(elements_kind) && | 4408 if (IsFastSmiElementsKind(elements_kind) && |
(...skipping 21 matching lines...) Expand all Loading... | |
4422 } | 4430 } |
4423 | 4431 |
4424 SetFlag(kUseGVN); | 4432 SetFlag(kUseGVN); |
4425 } | 4433 } |
4426 | 4434 |
4427 bool is_external() const { | 4435 bool is_external() const { |
4428 return IsExternalArrayElementsKind(elements_kind()); | 4436 return IsExternalArrayElementsKind(elements_kind()); |
4429 } | 4437 } |
4430 HValue* elements() { return OperandAt(0); } | 4438 HValue* elements() { return OperandAt(0); } |
4431 HValue* key() { return OperandAt(1); } | 4439 HValue* key() { return OperandAt(1); } |
4432 HValue* dependency() { return OperandAt(2); } | 4440 HValue* dependency() { |
4441 ASSERT(HasDependency()); | |
4442 return OperandAt(2); | |
4443 } | |
4444 bool HasDependency() const { return OperandAt(0) != OperandAt(2); } | |
4433 HValue* checked_key() { return OperandAt(3); } | 4445 HValue* checked_key() { return OperandAt(3); } |
4434 uint32_t index_offset() { return IndexOffsetField::decode(bit_field_); } | 4446 uint32_t index_offset() { return IndexOffsetField::decode(bit_field_); } |
4435 void SetIndexOffset(uint32_t index_offset) { | 4447 void SetIndexOffset(uint32_t index_offset) { |
4436 bit_field_ = IndexOffsetField::update(bit_field_, index_offset); | 4448 bit_field_ = IndexOffsetField::update(bit_field_, index_offset); |
4437 } | 4449 } |
4438 HValue* GetKey() { return key(); } | 4450 HValue* GetKey() { return key(); } |
4439 void SetKey(HValue* key) { SetOperandAt(1, key); } | 4451 void SetKey(HValue* key) { SetOperandAt(1, key); } |
4440 bool IsDehoisted() { return IsDehoistedField::decode(bit_field_); } | 4452 bool IsDehoisted() { return IsDehoistedField::decode(bit_field_); } |
4441 void SetDehoisted(bool is_dehoisted) { | 4453 void SetDehoisted(bool is_dehoisted) { |
4442 bit_field_ = IsDehoistedField::update(bit_field_, is_dehoisted); | 4454 bit_field_ = IsDehoistedField::update(bit_field_, is_dehoisted); |
(...skipping 1027 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5470 virtual bool IsDeletable() const { return true; } | 5482 virtual bool IsDeletable() const { return true; } |
5471 }; | 5483 }; |
5472 | 5484 |
5473 | 5485 |
5474 #undef DECLARE_INSTRUCTION | 5486 #undef DECLARE_INSTRUCTION |
5475 #undef DECLARE_CONCRETE_INSTRUCTION | 5487 #undef DECLARE_CONCRETE_INSTRUCTION |
5476 | 5488 |
5477 } } // namespace v8::internal | 5489 } } // namespace v8::internal |
5478 | 5490 |
5479 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 5491 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
OLD | NEW |