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 1205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1216 bool is_truncating, | 1216 bool is_truncating, |
1217 bool deoptimize_on_undefined) | 1217 bool deoptimize_on_undefined) |
1218 : HUnaryOperation(value) { | 1218 : HUnaryOperation(value) { |
1219 ASSERT(!value->representation().IsNone() && !to.IsNone()); | 1219 ASSERT(!value->representation().IsNone() && !to.IsNone()); |
1220 ASSERT(!value->representation().Equals(to)); | 1220 ASSERT(!value->representation().Equals(to)); |
1221 set_representation(to); | 1221 set_representation(to); |
1222 set_type(HType::TaggedNumber()); | 1222 set_type(HType::TaggedNumber()); |
1223 SetFlag(kUseGVN); | 1223 SetFlag(kUseGVN); |
1224 if (deoptimize_on_undefined) SetFlag(kDeoptimizeOnUndefined); | 1224 if (deoptimize_on_undefined) SetFlag(kDeoptimizeOnUndefined); |
1225 if (is_truncating) SetFlag(kTruncatingToInt32); | 1225 if (is_truncating) SetFlag(kTruncatingToInt32); |
| 1226 if (to.IsTagged()) SetGVNFlag(kChangesNewSpacePromotion); |
1226 } | 1227 } |
1227 | 1228 |
1228 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); | 1229 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); |
1229 virtual HType CalculateInferredType(); | 1230 virtual HType CalculateInferredType(); |
1230 virtual HValue* Canonicalize(); | 1231 virtual HValue* Canonicalize(); |
1231 | 1232 |
1232 Representation from() { return value()->representation(); } | 1233 Representation from() { return value()->representation(); } |
1233 Representation to() { return representation(); } | 1234 Representation to() { return representation(); } |
1234 bool deoptimize_on_undefined() const { | 1235 bool deoptimize_on_undefined() const { |
1235 return CheckFlag(kDeoptimizeOnUndefined); | 1236 return CheckFlag(kDeoptimizeOnUndefined); |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1341 | 1342 |
1342 class HStackCheck: public HTemplateInstruction<1> { | 1343 class HStackCheck: public HTemplateInstruction<1> { |
1343 public: | 1344 public: |
1344 enum Type { | 1345 enum Type { |
1345 kFunctionEntry, | 1346 kFunctionEntry, |
1346 kBackwardsBranch | 1347 kBackwardsBranch |
1347 }; | 1348 }; |
1348 | 1349 |
1349 HStackCheck(HValue* context, Type type) : type_(type) { | 1350 HStackCheck(HValue* context, Type type) : type_(type) { |
1350 SetOperandAt(0, context); | 1351 SetOperandAt(0, context); |
| 1352 SetGVNFlag(kChangesNewSpacePromotion); |
1351 } | 1353 } |
1352 | 1354 |
1353 HValue* context() { return OperandAt(0); } | 1355 HValue* context() { return OperandAt(0); } |
1354 | 1356 |
1355 virtual Representation RequiredInputRepresentation(int index) { | 1357 virtual Representation RequiredInputRepresentation(int index) { |
1356 return Representation::Tagged(); | 1358 return Representation::Tagged(); |
1357 } | 1359 } |
1358 | 1360 |
1359 void Eliminate() { | 1361 void Eliminate() { |
1360 // The stack check eliminator might try to eliminate the same stack | 1362 // The stack check eliminator might try to eliminate the same stack |
(...skipping 558 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1919 SetOperandAt(1, value); | 1921 SetOperandAt(1, value); |
1920 switch (op) { | 1922 switch (op) { |
1921 case kMathFloor: | 1923 case kMathFloor: |
1922 case kMathRound: | 1924 case kMathRound: |
1923 case kMathCeil: | 1925 case kMathCeil: |
1924 set_representation(Representation::Integer32()); | 1926 set_representation(Representation::Integer32()); |
1925 break; | 1927 break; |
1926 case kMathAbs: | 1928 case kMathAbs: |
1927 set_representation(Representation::Tagged()); | 1929 set_representation(Representation::Tagged()); |
1928 SetFlag(kFlexibleRepresentation); | 1930 SetFlag(kFlexibleRepresentation); |
| 1931 SetGVNFlag(kChangesNewSpacePromotion); |
1929 break; | 1932 break; |
1930 case kMathSqrt: | 1933 case kMathSqrt: |
1931 case kMathPowHalf: | 1934 case kMathPowHalf: |
1932 case kMathLog: | 1935 case kMathLog: |
1933 case kMathSin: | 1936 case kMathSin: |
1934 case kMathCos: | 1937 case kMathCos: |
1935 case kMathTan: | 1938 case kMathTan: |
1936 set_representation(Representation::Double()); | 1939 set_representation(Representation::Double()); |
| 1940 SetGVNFlag(kChangesNewSpacePromotion); |
1937 break; | 1941 break; |
1938 default: | 1942 default: |
1939 UNREACHABLE(); | 1943 UNREACHABLE(); |
1940 } | 1944 } |
1941 SetFlag(kUseGVN); | 1945 SetFlag(kUseGVN); |
1942 } | 1946 } |
1943 | 1947 |
1944 HValue* context() { return OperandAt(0); } | 1948 HValue* context() { return OperandAt(0); } |
1945 HValue* value() { return OperandAt(1); } | 1949 HValue* value() { return OperandAt(1); } |
1946 | 1950 |
(...skipping 1200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3147 }; | 3151 }; |
3148 | 3152 |
3149 | 3153 |
3150 class HPower: public HTemplateInstruction<2> { | 3154 class HPower: public HTemplateInstruction<2> { |
3151 public: | 3155 public: |
3152 HPower(HValue* left, HValue* right) { | 3156 HPower(HValue* left, HValue* right) { |
3153 SetOperandAt(0, left); | 3157 SetOperandAt(0, left); |
3154 SetOperandAt(1, right); | 3158 SetOperandAt(1, right); |
3155 set_representation(Representation::Double()); | 3159 set_representation(Representation::Double()); |
3156 SetFlag(kUseGVN); | 3160 SetFlag(kUseGVN); |
| 3161 SetGVNFlag(kChangesNewSpacePromotion); |
3157 } | 3162 } |
3158 | 3163 |
3159 HValue* left() { return OperandAt(0); } | 3164 HValue* left() { return OperandAt(0); } |
3160 HValue* right() { return OperandAt(1); } | 3165 HValue* right() { return OperandAt(1); } |
3161 | 3166 |
3162 virtual Representation RequiredInputRepresentation(int index) { | 3167 virtual Representation RequiredInputRepresentation(int index) { |
3163 return index == 0 | 3168 return index == 0 |
3164 ? Representation::Double() | 3169 ? Representation::Double() |
3165 : Representation::None(); | 3170 : Representation::None(); |
3166 } | 3171 } |
(...skipping 1149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4316 public: | 4321 public: |
4317 HTransitionElementsKind(HValue* object, | 4322 HTransitionElementsKind(HValue* object, |
4318 Handle<Map> original_map, | 4323 Handle<Map> original_map, |
4319 Handle<Map> transitioned_map) | 4324 Handle<Map> transitioned_map) |
4320 : original_map_(original_map), | 4325 : original_map_(original_map), |
4321 transitioned_map_(transitioned_map) { | 4326 transitioned_map_(transitioned_map) { |
4322 SetOperandAt(0, object); | 4327 SetOperandAt(0, object); |
4323 SetFlag(kUseGVN); | 4328 SetFlag(kUseGVN); |
4324 SetGVNFlag(kChangesElementsKind); | 4329 SetGVNFlag(kChangesElementsKind); |
4325 SetGVNFlag(kChangesElementsPointer); | 4330 SetGVNFlag(kChangesElementsPointer); |
| 4331 SetGVNFlag(kChangesNewSpacePromotion); |
4326 set_representation(Representation::Tagged()); | 4332 set_representation(Representation::Tagged()); |
4327 } | 4333 } |
4328 | 4334 |
4329 virtual Representation RequiredInputRepresentation(int index) { | 4335 virtual Representation RequiredInputRepresentation(int index) { |
4330 return Representation::Tagged(); | 4336 return Representation::Tagged(); |
4331 } | 4337 } |
4332 | 4338 |
4333 HValue* object() { return OperandAt(0); } | 4339 HValue* object() { return OperandAt(0); } |
4334 Handle<Map> original_map() { return original_map_; } | 4340 Handle<Map> original_map() { return original_map_; } |
4335 Handle<Map> transitioned_map() { return transitioned_map_; } | 4341 Handle<Map> transitioned_map() { return transitioned_map_; } |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4377 | 4383 |
4378 class HStringCharCodeAt: public HTemplateInstruction<3> { | 4384 class HStringCharCodeAt: public HTemplateInstruction<3> { |
4379 public: | 4385 public: |
4380 HStringCharCodeAt(HValue* context, HValue* string, HValue* index) { | 4386 HStringCharCodeAt(HValue* context, HValue* string, HValue* index) { |
4381 SetOperandAt(0, context); | 4387 SetOperandAt(0, context); |
4382 SetOperandAt(1, string); | 4388 SetOperandAt(1, string); |
4383 SetOperandAt(2, index); | 4389 SetOperandAt(2, index); |
4384 set_representation(Representation::Integer32()); | 4390 set_representation(Representation::Integer32()); |
4385 SetFlag(kUseGVN); | 4391 SetFlag(kUseGVN); |
4386 SetGVNFlag(kDependsOnMaps); | 4392 SetGVNFlag(kDependsOnMaps); |
| 4393 SetGVNFlag(kChangesNewSpacePromotion); |
4387 } | 4394 } |
4388 | 4395 |
4389 virtual Representation RequiredInputRepresentation(int index) { | 4396 virtual Representation RequiredInputRepresentation(int index) { |
4390 // The index is supposed to be Integer32. | 4397 // The index is supposed to be Integer32. |
4391 return index == 2 | 4398 return index == 2 |
4392 ? Representation::Integer32() | 4399 ? Representation::Integer32() |
4393 : Representation::Tagged(); | 4400 : Representation::Tagged(); |
4394 } | 4401 } |
4395 | 4402 |
4396 HValue* context() { return OperandAt(0); } | 4403 HValue* context() { return OperandAt(0); } |
(...skipping 11 matching lines...) Expand all Loading... |
4408 }; | 4415 }; |
4409 | 4416 |
4410 | 4417 |
4411 class HStringCharFromCode: public HTemplateInstruction<2> { | 4418 class HStringCharFromCode: public HTemplateInstruction<2> { |
4412 public: | 4419 public: |
4413 HStringCharFromCode(HValue* context, HValue* char_code) { | 4420 HStringCharFromCode(HValue* context, HValue* char_code) { |
4414 SetOperandAt(0, context); | 4421 SetOperandAt(0, context); |
4415 SetOperandAt(1, char_code); | 4422 SetOperandAt(1, char_code); |
4416 set_representation(Representation::Tagged()); | 4423 set_representation(Representation::Tagged()); |
4417 SetFlag(kUseGVN); | 4424 SetFlag(kUseGVN); |
| 4425 SetGVNFlag(kChangesNewSpacePromotion); |
4418 } | 4426 } |
4419 | 4427 |
4420 virtual Representation RequiredInputRepresentation(int index) { | 4428 virtual Representation RequiredInputRepresentation(int index) { |
4421 return index == 0 | 4429 return index == 0 |
4422 ? Representation::Tagged() | 4430 ? Representation::Tagged() |
4423 : Representation::Integer32(); | 4431 : Representation::Integer32(); |
4424 } | 4432 } |
4425 virtual HType CalculateInferredType(); | 4433 virtual HType CalculateInferredType(); |
4426 | 4434 |
4427 HValue* context() { return OperandAt(0); } | 4435 HValue* context() { return OperandAt(0); } |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4509 public: | 4517 public: |
4510 HFastLiteral(HValue* context, | 4518 HFastLiteral(HValue* context, |
4511 Handle<JSObject> boilerplate, | 4519 Handle<JSObject> boilerplate, |
4512 int total_size, | 4520 int total_size, |
4513 int literal_index, | 4521 int literal_index, |
4514 int depth) | 4522 int depth) |
4515 : HMaterializedLiteral<1>(literal_index, depth), | 4523 : HMaterializedLiteral<1>(literal_index, depth), |
4516 boilerplate_(boilerplate), | 4524 boilerplate_(boilerplate), |
4517 total_size_(total_size) { | 4525 total_size_(total_size) { |
4518 SetOperandAt(0, context); | 4526 SetOperandAt(0, context); |
| 4527 SetGVNFlag(kChangesNewSpacePromotion); |
4519 } | 4528 } |
4520 | 4529 |
4521 // Maximum depth and total number of elements and properties for literal | 4530 // Maximum depth and total number of elements and properties for literal |
4522 // graphs to be considered for fast deep-copying. | 4531 // graphs to be considered for fast deep-copying. |
4523 static const int kMaxLiteralDepth = 3; | 4532 static const int kMaxLiteralDepth = 3; |
4524 static const int kMaxLiteralProperties = 8; | 4533 static const int kMaxLiteralProperties = 8; |
4525 | 4534 |
4526 HValue* context() { return OperandAt(0); } | 4535 HValue* context() { return OperandAt(0); } |
4527 Handle<JSObject> boilerplate() const { return boilerplate_; } | 4536 Handle<JSObject> boilerplate() const { return boilerplate_; } |
4528 int total_size() const { return total_size_; } | 4537 int total_size() const { return total_size_; } |
(...skipping 15 matching lines...) Expand all Loading... |
4544 public: | 4553 public: |
4545 HArrayLiteral(HValue* context, | 4554 HArrayLiteral(HValue* context, |
4546 Handle<HeapObject> boilerplate_object, | 4555 Handle<HeapObject> boilerplate_object, |
4547 int length, | 4556 int length, |
4548 int literal_index, | 4557 int literal_index, |
4549 int depth) | 4558 int depth) |
4550 : HMaterializedLiteral<1>(literal_index, depth), | 4559 : HMaterializedLiteral<1>(literal_index, depth), |
4551 length_(length), | 4560 length_(length), |
4552 boilerplate_object_(boilerplate_object) { | 4561 boilerplate_object_(boilerplate_object) { |
4553 SetOperandAt(0, context); | 4562 SetOperandAt(0, context); |
| 4563 SetGVNFlag(kChangesNewSpacePromotion); |
4554 } | 4564 } |
4555 | 4565 |
4556 HValue* context() { return OperandAt(0); } | 4566 HValue* context() { return OperandAt(0); } |
4557 ElementsKind boilerplate_elements_kind() const { | 4567 ElementsKind boilerplate_elements_kind() const { |
4558 if (!boilerplate_object_->IsJSObject()) { | 4568 if (!boilerplate_object_->IsJSObject()) { |
4559 return FAST_ELEMENTS; | 4569 return FAST_ELEMENTS; |
4560 } | 4570 } |
4561 return Handle<JSObject>::cast(boilerplate_object_)->GetElementsKind(); | 4571 return Handle<JSObject>::cast(boilerplate_object_)->GetElementsKind(); |
4562 } | 4572 } |
4563 Handle<HeapObject> boilerplate_object() const { return boilerplate_object_; } | 4573 Handle<HeapObject> boilerplate_object() const { return boilerplate_object_; } |
(...skipping 20 matching lines...) Expand all Loading... |
4584 Handle<FixedArray> constant_properties, | 4594 Handle<FixedArray> constant_properties, |
4585 bool fast_elements, | 4595 bool fast_elements, |
4586 int literal_index, | 4596 int literal_index, |
4587 int depth, | 4597 int depth, |
4588 bool has_function) | 4598 bool has_function) |
4589 : HMaterializedLiteral<1>(literal_index, depth), | 4599 : HMaterializedLiteral<1>(literal_index, depth), |
4590 constant_properties_(constant_properties), | 4600 constant_properties_(constant_properties), |
4591 fast_elements_(fast_elements), | 4601 fast_elements_(fast_elements), |
4592 has_function_(has_function) { | 4602 has_function_(has_function) { |
4593 SetOperandAt(0, context); | 4603 SetOperandAt(0, context); |
| 4604 SetGVNFlag(kChangesNewSpacePromotion); |
4594 } | 4605 } |
4595 | 4606 |
4596 HValue* context() { return OperandAt(0); } | 4607 HValue* context() { return OperandAt(0); } |
4597 Handle<FixedArray> constant_properties() const { | 4608 Handle<FixedArray> constant_properties() const { |
4598 return constant_properties_; | 4609 return constant_properties_; |
4599 } | 4610 } |
4600 bool fast_elements() const { return fast_elements_; } | 4611 bool fast_elements() const { return fast_elements_; } |
4601 bool has_function() const { return has_function_; } | 4612 bool has_function() const { return has_function_; } |
4602 | 4613 |
4603 virtual Representation RequiredInputRepresentation(int index) { | 4614 virtual Representation RequiredInputRepresentation(int index) { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4645 | 4656 |
4646 | 4657 |
4647 class HFunctionLiteral: public HTemplateInstruction<1> { | 4658 class HFunctionLiteral: public HTemplateInstruction<1> { |
4648 public: | 4659 public: |
4649 HFunctionLiteral(HValue* context, | 4660 HFunctionLiteral(HValue* context, |
4650 Handle<SharedFunctionInfo> shared, | 4661 Handle<SharedFunctionInfo> shared, |
4651 bool pretenure) | 4662 bool pretenure) |
4652 : shared_info_(shared), pretenure_(pretenure) { | 4663 : shared_info_(shared), pretenure_(pretenure) { |
4653 SetOperandAt(0, context); | 4664 SetOperandAt(0, context); |
4654 set_representation(Representation::Tagged()); | 4665 set_representation(Representation::Tagged()); |
| 4666 SetGVNFlag(kChangesNewSpacePromotion); |
4655 } | 4667 } |
4656 | 4668 |
4657 HValue* context() { return OperandAt(0); } | 4669 HValue* context() { return OperandAt(0); } |
4658 | 4670 |
4659 virtual Representation RequiredInputRepresentation(int index) { | 4671 virtual Representation RequiredInputRepresentation(int index) { |
4660 return Representation::Tagged(); | 4672 return Representation::Tagged(); |
4661 } | 4673 } |
4662 virtual HType CalculateInferredType(); | 4674 virtual HType CalculateInferredType(); |
4663 | 4675 |
4664 DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral) | 4676 DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral) |
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4921 DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex); | 4933 DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex); |
4922 }; | 4934 }; |
4923 | 4935 |
4924 | 4936 |
4925 #undef DECLARE_INSTRUCTION | 4937 #undef DECLARE_INSTRUCTION |
4926 #undef DECLARE_CONCRETE_INSTRUCTION | 4938 #undef DECLARE_CONCRETE_INSTRUCTION |
4927 | 4939 |
4928 } } // namespace v8::internal | 4940 } } // namespace v8::internal |
4929 | 4941 |
4930 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 4942 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
OLD | NEW |