| 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 1478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1489 GETTER_CALL_RETURN, // Returning from a getter, need to restore context. | 1489 GETTER_CALL_RETURN, // Returning from a getter, need to restore context. |
| 1490 SETTER_CALL_RETURN // Use the RHS of the assignment as the return value. | 1490 SETTER_CALL_RETURN // Use the RHS of the assignment as the return value. |
| 1491 }; | 1491 }; |
| 1492 | 1492 |
| 1493 | 1493 |
| 1494 class HEnterInlined: public HTemplateInstruction<0> { | 1494 class HEnterInlined: public HTemplateInstruction<0> { |
| 1495 public: | 1495 public: |
| 1496 HEnterInlined(Handle<JSFunction> closure, | 1496 HEnterInlined(Handle<JSFunction> closure, |
| 1497 int arguments_count, | 1497 int arguments_count, |
| 1498 FunctionLiteral* function, | 1498 FunctionLiteral* function, |
| 1499 CallKind call_kind, | |
| 1500 InliningKind inlining_kind, | 1499 InliningKind inlining_kind, |
| 1501 Variable* arguments_var, | 1500 Variable* arguments_var, |
| 1502 ZoneList<HValue*>* arguments_values) | 1501 ZoneList<HValue*>* arguments_values, |
| 1502 bool undefined_receiver) |
| 1503 : closure_(closure), | 1503 : closure_(closure), |
| 1504 arguments_count_(arguments_count), | 1504 arguments_count_(arguments_count), |
| 1505 arguments_pushed_(false), | 1505 arguments_pushed_(false), |
| 1506 function_(function), | 1506 function_(function), |
| 1507 call_kind_(call_kind), | |
| 1508 inlining_kind_(inlining_kind), | 1507 inlining_kind_(inlining_kind), |
| 1509 arguments_var_(arguments_var), | 1508 arguments_var_(arguments_var), |
| 1510 arguments_values_(arguments_values) { | 1509 arguments_values_(arguments_values), |
| 1510 undefined_receiver_(undefined_receiver) { |
| 1511 } | 1511 } |
| 1512 | 1512 |
| 1513 virtual void PrintDataTo(StringStream* stream); | 1513 virtual void PrintDataTo(StringStream* stream); |
| 1514 | 1514 |
| 1515 Handle<JSFunction> closure() const { return closure_; } | 1515 Handle<JSFunction> closure() const { return closure_; } |
| 1516 int arguments_count() const { return arguments_count_; } | 1516 int arguments_count() const { return arguments_count_; } |
| 1517 bool arguments_pushed() const { return arguments_pushed_; } | 1517 bool arguments_pushed() const { return arguments_pushed_; } |
| 1518 void set_arguments_pushed() { arguments_pushed_ = true; } | 1518 void set_arguments_pushed() { arguments_pushed_ = true; } |
| 1519 FunctionLiteral* function() const { return function_; } | 1519 FunctionLiteral* function() const { return function_; } |
| 1520 CallKind call_kind() const { return call_kind_; } | |
| 1521 InliningKind inlining_kind() const { return inlining_kind_; } | 1520 InliningKind inlining_kind() const { return inlining_kind_; } |
| 1521 bool undefined_receiver() const { return undefined_receiver_; } |
| 1522 | 1522 |
| 1523 virtual Representation RequiredInputRepresentation(int index) { | 1523 virtual Representation RequiredInputRepresentation(int index) { |
| 1524 return Representation::None(); | 1524 return Representation::None(); |
| 1525 } | 1525 } |
| 1526 | 1526 |
| 1527 Variable* arguments_var() { return arguments_var_; } | 1527 Variable* arguments_var() { return arguments_var_; } |
| 1528 ZoneList<HValue*>* arguments_values() { return arguments_values_; } | 1528 ZoneList<HValue*>* arguments_values() { return arguments_values_; } |
| 1529 | 1529 |
| 1530 DECLARE_CONCRETE_INSTRUCTION(EnterInlined) | 1530 DECLARE_CONCRETE_INSTRUCTION(EnterInlined) |
| 1531 | 1531 |
| 1532 private: | 1532 private: |
| 1533 Handle<JSFunction> closure_; | 1533 Handle<JSFunction> closure_; |
| 1534 int arguments_count_; | 1534 int arguments_count_; |
| 1535 bool arguments_pushed_; | 1535 bool arguments_pushed_; |
| 1536 FunctionLiteral* function_; | 1536 FunctionLiteral* function_; |
| 1537 CallKind call_kind_; | |
| 1538 InliningKind inlining_kind_; | 1537 InliningKind inlining_kind_; |
| 1539 Variable* arguments_var_; | 1538 Variable* arguments_var_; |
| 1540 ZoneList<HValue*>* arguments_values_; | 1539 ZoneList<HValue*>* arguments_values_; |
| 1540 bool undefined_receiver_; |
| 1541 }; | 1541 }; |
| 1542 | 1542 |
| 1543 | 1543 |
| 1544 class HLeaveInlined: public HTemplateInstruction<0> { | 1544 class HLeaveInlined: public HTemplateInstruction<0> { |
| 1545 public: | 1545 public: |
| 1546 HLeaveInlined() { } | 1546 HLeaveInlined() { } |
| 1547 | 1547 |
| 1548 virtual Representation RequiredInputRepresentation(int index) { | 1548 virtual Representation RequiredInputRepresentation(int index) { |
| 1549 return Representation::None(); | 1549 return Representation::None(); |
| 1550 } | 1550 } |
| (...skipping 764 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2315 SmallMapList map_set_; | 2315 SmallMapList map_set_; |
| 2316 }; | 2316 }; |
| 2317 | 2317 |
| 2318 | 2318 |
| 2319 class HCheckFunction: public HUnaryOperation { | 2319 class HCheckFunction: public HUnaryOperation { |
| 2320 public: | 2320 public: |
| 2321 HCheckFunction(HValue* value, Handle<JSFunction> function) | 2321 HCheckFunction(HValue* value, Handle<JSFunction> function) |
| 2322 : HUnaryOperation(value), target_(function) { | 2322 : HUnaryOperation(value), target_(function) { |
| 2323 set_representation(Representation::Tagged()); | 2323 set_representation(Representation::Tagged()); |
| 2324 SetFlag(kUseGVN); | 2324 SetFlag(kUseGVN); |
| 2325 target_in_new_space_ = Isolate::Current()->heap()->InNewSpace(*function); |
| 2325 } | 2326 } |
| 2326 | 2327 |
| 2327 virtual Representation RequiredInputRepresentation(int index) { | 2328 virtual Representation RequiredInputRepresentation(int index) { |
| 2328 return Representation::Tagged(); | 2329 return Representation::Tagged(); |
| 2329 } | 2330 } |
| 2330 virtual void PrintDataTo(StringStream* stream); | 2331 virtual void PrintDataTo(StringStream* stream); |
| 2331 virtual HType CalculateInferredType(); | 2332 virtual HType CalculateInferredType(); |
| 2332 | 2333 |
| 2333 #ifdef DEBUG | 2334 #ifdef DEBUG |
| 2334 virtual void Verify(); | 2335 virtual void Verify(); |
| 2335 #endif | 2336 #endif |
| 2336 | 2337 |
| 2337 Handle<JSFunction> target() const { return target_; } | 2338 Handle<JSFunction> target() const { return target_; } |
| 2339 bool target_in_new_space() const { return target_in_new_space_; } |
| 2338 | 2340 |
| 2339 DECLARE_CONCRETE_INSTRUCTION(CheckFunction) | 2341 DECLARE_CONCRETE_INSTRUCTION(CheckFunction) |
| 2340 | 2342 |
| 2341 protected: | 2343 protected: |
| 2342 virtual bool DataEquals(HValue* other) { | 2344 virtual bool DataEquals(HValue* other) { |
| 2343 HCheckFunction* b = HCheckFunction::cast(other); | 2345 HCheckFunction* b = HCheckFunction::cast(other); |
| 2344 return target_.is_identical_to(b->target()); | 2346 return target_.is_identical_to(b->target()); |
| 2345 } | 2347 } |
| 2346 | 2348 |
| 2347 private: | 2349 private: |
| 2348 Handle<JSFunction> target_; | 2350 Handle<JSFunction> target_; |
| 2351 bool target_in_new_space_; |
| 2349 }; | 2352 }; |
| 2350 | 2353 |
| 2351 | 2354 |
| 2352 class HCheckInstanceType: public HUnaryOperation { | 2355 class HCheckInstanceType: public HUnaryOperation { |
| 2353 public: | 2356 public: |
| 2354 static HCheckInstanceType* NewIsSpecObject(HValue* value, Zone* zone) { | 2357 static HCheckInstanceType* NewIsSpecObject(HValue* value, Zone* zone) { |
| 2355 return new(zone) HCheckInstanceType(value, IS_SPEC_OBJECT); | 2358 return new(zone) HCheckInstanceType(value, IS_SPEC_OBJECT); |
| 2356 } | 2359 } |
| 2357 static HCheckInstanceType* NewIsJSArray(HValue* value, Zone* zone) { | 2360 static HCheckInstanceType* NewIsJSArray(HValue* value, Zone* zone) { |
| 2358 return new(zone) HCheckInstanceType(value, IS_JS_ARRAY); | 2361 return new(zone) HCheckInstanceType(value, IS_JS_ARRAY); |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2468 DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps) | 2471 DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps) |
| 2469 | 2472 |
| 2470 virtual Representation RequiredInputRepresentation(int index) { | 2473 virtual Representation RequiredInputRepresentation(int index) { |
| 2471 return Representation::None(); | 2474 return Representation::None(); |
| 2472 } | 2475 } |
| 2473 | 2476 |
| 2474 virtual void PrintDataTo(StringStream* stream); | 2477 virtual void PrintDataTo(StringStream* stream); |
| 2475 | 2478 |
| 2476 virtual intptr_t Hashcode() { | 2479 virtual intptr_t Hashcode() { |
| 2477 ASSERT_ALLOCATION_DISABLED; | 2480 ASSERT_ALLOCATION_DISABLED; |
| 2481 // Dereferencing to use the object's raw address for hashing is safe. |
| 2482 AllowHandleDereference allow_handle_deref; |
| 2478 intptr_t hash = 0; | 2483 intptr_t hash = 0; |
| 2479 for (int i = 0; i < prototypes_.length(); i++) { | 2484 for (int i = 0; i < prototypes_.length(); i++) { |
| 2480 hash = 17 * hash + reinterpret_cast<intptr_t>(*prototypes_[i]); | 2485 hash = 17 * hash + reinterpret_cast<intptr_t>(*prototypes_[i]); |
| 2481 hash = 17 * hash + reinterpret_cast<intptr_t>(*maps_[i]); | 2486 hash = 17 * hash + reinterpret_cast<intptr_t>(*maps_[i]); |
| 2482 } | 2487 } |
| 2483 return hash; | 2488 return hash; |
| 2484 } | 2489 } |
| 2485 | 2490 |
| 2486 protected: | 2491 protected: |
| 2487 virtual bool DataEquals(HValue* other) { | 2492 virtual bool DataEquals(HValue* other) { |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2685 isnan(double_value_)) { | 2690 isnan(double_value_)) { |
| 2686 return true; | 2691 return true; |
| 2687 } | 2692 } |
| 2688 return false; | 2693 return false; |
| 2689 } | 2694 } |
| 2690 | 2695 |
| 2691 ASSERT(!handle_.is_null()); | 2696 ASSERT(!handle_.is_null()); |
| 2692 Heap* heap = HEAP; | 2697 Heap* heap = HEAP; |
| 2693 // We should have handled minus_zero_value and nan_value in the | 2698 // We should have handled minus_zero_value and nan_value in the |
| 2694 // has_double_value_ clause above. | 2699 // has_double_value_ clause above. |
| 2700 // Dereferencing is safe to compare against singletons. |
| 2701 AllowHandleDereference allow_handle_deref; |
| 2695 ASSERT(*handle_ != heap->minus_zero_value()); | 2702 ASSERT(*handle_ != heap->minus_zero_value()); |
| 2696 ASSERT(*handle_ != heap->nan_value()); | 2703 ASSERT(*handle_ != heap->nan_value()); |
| 2697 if (*handle_ == heap->undefined_value()) return true; | 2704 return *handle_ == heap->undefined_value() || |
| 2698 if (*handle_ == heap->null_value()) return true; | 2705 *handle_ == heap->null_value() || |
| 2699 if (*handle_ == heap->true_value()) return true; | 2706 *handle_ == heap->true_value() || |
| 2700 if (*handle_ == heap->false_value()) return true; | 2707 *handle_ == heap->false_value() || |
| 2701 if (*handle_ == heap->the_hole_value()) return true; | 2708 *handle_ == heap->the_hole_value() || |
| 2702 if (*handle_ == heap->empty_string()) return true; | 2709 *handle_ == heap->empty_string(); |
| 2703 return false; | |
| 2704 } | 2710 } |
| 2705 | 2711 |
| 2706 virtual Representation RequiredInputRepresentation(int index) { | 2712 virtual Representation RequiredInputRepresentation(int index) { |
| 2707 return Representation::None(); | 2713 return Representation::None(); |
| 2708 } | 2714 } |
| 2709 | 2715 |
| 2710 virtual bool IsConvertibleToInteger() const { | 2716 virtual bool IsConvertibleToInteger() const { |
| 2711 return has_int32_value_; | 2717 return has_int32_value_; |
| 2712 } | 2718 } |
| 2713 | 2719 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2745 virtual intptr_t Hashcode() { | 2751 virtual intptr_t Hashcode() { |
| 2746 ASSERT_ALLOCATION_DISABLED; | 2752 ASSERT_ALLOCATION_DISABLED; |
| 2747 intptr_t hash; | 2753 intptr_t hash; |
| 2748 | 2754 |
| 2749 if (has_int32_value_) { | 2755 if (has_int32_value_) { |
| 2750 hash = static_cast<intptr_t>(int32_value_); | 2756 hash = static_cast<intptr_t>(int32_value_); |
| 2751 } else if (has_double_value_) { | 2757 } else if (has_double_value_) { |
| 2752 hash = static_cast<intptr_t>(BitCast<int64_t>(double_value_)); | 2758 hash = static_cast<intptr_t>(BitCast<int64_t>(double_value_)); |
| 2753 } else { | 2759 } else { |
| 2754 ASSERT(!handle_.is_null()); | 2760 ASSERT(!handle_.is_null()); |
| 2761 // Dereferencing to use the object's raw address for hashing is safe. |
| 2762 AllowHandleDereference allow_handle_deref; |
| 2755 hash = reinterpret_cast<intptr_t>(*handle_); | 2763 hash = reinterpret_cast<intptr_t>(*handle_); |
| 2756 } | 2764 } |
| 2757 | 2765 |
| 2758 return hash; | 2766 return hash; |
| 2759 } | 2767 } |
| 2760 | 2768 |
| 2761 #ifdef DEBUG | 2769 #ifdef DEBUG |
| 2762 virtual void Verify() { } | 2770 virtual void Verify() { } |
| 2763 #endif | 2771 #endif |
| 2764 | 2772 |
| 2765 DECLARE_CONCRETE_INSTRUCTION(Constant) | 2773 DECLARE_CONCRETE_INSTRUCTION(Constant) |
| 2766 | 2774 |
| 2767 protected: | 2775 protected: |
| 2768 virtual Range* InferRange(Zone* zone); | 2776 virtual Range* InferRange(Zone* zone); |
| 2769 | 2777 |
| 2770 virtual bool DataEquals(HValue* other) { | 2778 virtual bool DataEquals(HValue* other) { |
| 2771 HConstant* other_constant = HConstant::cast(other); | 2779 HConstant* other_constant = HConstant::cast(other); |
| 2772 if (has_int32_value_) { | 2780 if (has_int32_value_) { |
| 2773 return other_constant->has_int32_value_ && | 2781 return other_constant->has_int32_value_ && |
| 2774 int32_value_ == other_constant->int32_value_; | 2782 int32_value_ == other_constant->int32_value_; |
| 2775 } else if (has_double_value_) { | 2783 } else if (has_double_value_) { |
| 2776 return other_constant->has_double_value_ && | 2784 return other_constant->has_double_value_ && |
| 2777 BitCast<int64_t>(double_value_) == | 2785 BitCast<int64_t>(double_value_) == |
| 2778 BitCast<int64_t>(other_constant->double_value_); | 2786 BitCast<int64_t>(other_constant->double_value_); |
| 2779 } else { | 2787 } else { |
| 2780 ASSERT(!handle_.is_null()); | 2788 ASSERT(!handle_.is_null()); |
| 2781 return !other_constant->handle_.is_null() && | 2789 return !other_constant->handle_.is_null() && |
| 2782 *handle_ == *other_constant->handle_; | 2790 handle_.is_identical_to(other_constant->handle_); |
| 2783 } | 2791 } |
| 2784 } | 2792 } |
| 2785 | 2793 |
| 2786 private: | 2794 private: |
| 2787 virtual bool IsDeletable() const { return true; } | 2795 virtual bool IsDeletable() const { return true; } |
| 2788 | 2796 |
| 2789 // If this is a numerical constant, handle_ either points to to the | 2797 // If this is a numerical constant, handle_ either points to to the |
| 2790 // HeapObject the constant originated from or is null. If the | 2798 // HeapObject the constant originated from or is null. If the |
| 2791 // constant is non-numeric, handle_ always points to a valid | 2799 // constant is non-numeric, handle_ always points to a valid |
| 2792 // constant HeapObject. | 2800 // constant HeapObject. |
| (...skipping 1213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4006 | 4014 |
| 4007 class HLoadGlobalCell: public HTemplateInstruction<0> { | 4015 class HLoadGlobalCell: public HTemplateInstruction<0> { |
| 4008 public: | 4016 public: |
| 4009 HLoadGlobalCell(Handle<JSGlobalPropertyCell> cell, PropertyDetails details) | 4017 HLoadGlobalCell(Handle<JSGlobalPropertyCell> cell, PropertyDetails details) |
| 4010 : cell_(cell), details_(details) { | 4018 : cell_(cell), details_(details) { |
| 4011 set_representation(Representation::Tagged()); | 4019 set_representation(Representation::Tagged()); |
| 4012 SetFlag(kUseGVN); | 4020 SetFlag(kUseGVN); |
| 4013 SetGVNFlag(kDependsOnGlobalVars); | 4021 SetGVNFlag(kDependsOnGlobalVars); |
| 4014 } | 4022 } |
| 4015 | 4023 |
| 4016 Handle<JSGlobalPropertyCell> cell() const { return cell_; } | 4024 Handle<JSGlobalPropertyCell> cell() const { return cell_; } |
| 4017 bool RequiresHoleCheck() const; | 4025 bool RequiresHoleCheck() const; |
| 4018 | 4026 |
| 4019 virtual void PrintDataTo(StringStream* stream); | 4027 virtual void PrintDataTo(StringStream* stream); |
| 4020 | 4028 |
| 4021 virtual intptr_t Hashcode() { | 4029 virtual intptr_t Hashcode() { |
| 4022 ASSERT_ALLOCATION_DISABLED; | 4030 ASSERT_ALLOCATION_DISABLED; |
| 4031 // Dereferencing to use the object's raw address for hashing is safe. |
| 4032 AllowHandleDereference allow_handle_deref; |
| 4023 return reinterpret_cast<intptr_t>(*cell_); | 4033 return reinterpret_cast<intptr_t>(*cell_); |
| 4024 } | 4034 } |
| 4025 | 4035 |
| 4026 virtual Representation RequiredInputRepresentation(int index) { | 4036 virtual Representation RequiredInputRepresentation(int index) { |
| 4027 return Representation::None(); | 4037 return Representation::None(); |
| 4028 } | 4038 } |
| 4029 | 4039 |
| 4030 DECLARE_CONCRETE_INSTRUCTION(LoadGlobalCell) | 4040 DECLARE_CONCRETE_INSTRUCTION(LoadGlobalCell) |
| 4031 | 4041 |
| 4032 protected: | 4042 protected: |
| (...skipping 772 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4805 StrictModeFlag strict_mode_flag_; | 4815 StrictModeFlag strict_mode_flag_; |
| 4806 }; | 4816 }; |
| 4807 | 4817 |
| 4808 | 4818 |
| 4809 class HTransitionElementsKind: public HTemplateInstruction<1> { | 4819 class HTransitionElementsKind: public HTemplateInstruction<1> { |
| 4810 public: | 4820 public: |
| 4811 HTransitionElementsKind(HValue* object, | 4821 HTransitionElementsKind(HValue* object, |
| 4812 Handle<Map> original_map, | 4822 Handle<Map> original_map, |
| 4813 Handle<Map> transitioned_map) | 4823 Handle<Map> transitioned_map) |
| 4814 : original_map_(original_map), | 4824 : original_map_(original_map), |
| 4815 transitioned_map_(transitioned_map) { | 4825 transitioned_map_(transitioned_map), |
| 4826 from_kind_(original_map->elements_kind()), |
| 4827 to_kind_(transitioned_map->elements_kind()) { |
| 4816 SetOperandAt(0, object); | 4828 SetOperandAt(0, object); |
| 4817 SetFlag(kUseGVN); | 4829 SetFlag(kUseGVN); |
| 4818 SetGVNFlag(kChangesElementsKind); | 4830 SetGVNFlag(kChangesElementsKind); |
| 4819 if (original_map->has_fast_double_elements()) { | 4831 if (original_map->has_fast_double_elements()) { |
| 4820 SetGVNFlag(kChangesElementsPointer); | 4832 SetGVNFlag(kChangesElementsPointer); |
| 4821 SetGVNFlag(kChangesNewSpacePromotion); | 4833 SetGVNFlag(kChangesNewSpacePromotion); |
| 4822 } | 4834 } |
| 4823 if (transitioned_map->has_fast_double_elements()) { | 4835 if (transitioned_map->has_fast_double_elements()) { |
| 4824 SetGVNFlag(kChangesElementsPointer); | 4836 SetGVNFlag(kChangesElementsPointer); |
| 4825 SetGVNFlag(kChangesNewSpacePromotion); | 4837 SetGVNFlag(kChangesNewSpacePromotion); |
| 4826 } | 4838 } |
| 4827 set_representation(Representation::Tagged()); | 4839 set_representation(Representation::Tagged()); |
| 4828 } | 4840 } |
| 4829 | 4841 |
| 4830 virtual Representation RequiredInputRepresentation(int index) { | 4842 virtual Representation RequiredInputRepresentation(int index) { |
| 4831 return Representation::Tagged(); | 4843 return Representation::Tagged(); |
| 4832 } | 4844 } |
| 4833 | 4845 |
| 4834 HValue* object() { return OperandAt(0); } | 4846 HValue* object() { return OperandAt(0); } |
| 4835 Handle<Map> original_map() { return original_map_; } | 4847 Handle<Map> original_map() { return original_map_; } |
| 4836 Handle<Map> transitioned_map() { return transitioned_map_; } | 4848 Handle<Map> transitioned_map() { return transitioned_map_; } |
| 4849 ElementsKind from_kind() { return from_kind_; } |
| 4850 ElementsKind to_kind() { return to_kind_; } |
| 4837 | 4851 |
| 4838 virtual void PrintDataTo(StringStream* stream); | 4852 virtual void PrintDataTo(StringStream* stream); |
| 4839 | 4853 |
| 4840 DECLARE_CONCRETE_INSTRUCTION(TransitionElementsKind) | 4854 DECLARE_CONCRETE_INSTRUCTION(TransitionElementsKind) |
| 4841 | 4855 |
| 4842 protected: | 4856 protected: |
| 4843 virtual bool DataEquals(HValue* other) { | 4857 virtual bool DataEquals(HValue* other) { |
| 4844 HTransitionElementsKind* instr = HTransitionElementsKind::cast(other); | 4858 HTransitionElementsKind* instr = HTransitionElementsKind::cast(other); |
| 4845 return original_map_.is_identical_to(instr->original_map()) && | 4859 return original_map_.is_identical_to(instr->original_map()) && |
| 4846 transitioned_map_.is_identical_to(instr->transitioned_map()); | 4860 transitioned_map_.is_identical_to(instr->transitioned_map()); |
| 4847 } | 4861 } |
| 4848 | 4862 |
| 4849 private: | 4863 private: |
| 4850 Handle<Map> original_map_; | 4864 Handle<Map> original_map_; |
| 4851 Handle<Map> transitioned_map_; | 4865 Handle<Map> transitioned_map_; |
| 4866 ElementsKind from_kind_; |
| 4867 ElementsKind to_kind_; |
| 4852 }; | 4868 }; |
| 4853 | 4869 |
| 4854 | 4870 |
| 4855 class HStringAdd: public HBinaryOperation { | 4871 class HStringAdd: public HBinaryOperation { |
| 4856 public: | 4872 public: |
| 4857 HStringAdd(HValue* context, HValue* left, HValue* right) | 4873 HStringAdd(HValue* context, HValue* left, HValue* right) |
| 4858 : HBinaryOperation(context, left, right) { | 4874 : HBinaryOperation(context, left, right) { |
| 4859 set_representation(Representation::Tagged()); | 4875 set_representation(Representation::Tagged()); |
| 4860 SetFlag(kUseGVN); | 4876 SetFlag(kUseGVN); |
| 4861 SetGVNFlag(kDependsOnMaps); | 4877 SetGVNFlag(kDependsOnMaps); |
| (...skipping 641 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5503 virtual bool IsDeletable() const { return true; } | 5519 virtual bool IsDeletable() const { return true; } |
| 5504 }; | 5520 }; |
| 5505 | 5521 |
| 5506 | 5522 |
| 5507 #undef DECLARE_INSTRUCTION | 5523 #undef DECLARE_INSTRUCTION |
| 5508 #undef DECLARE_CONCRETE_INSTRUCTION | 5524 #undef DECLARE_CONCRETE_INSTRUCTION |
| 5509 | 5525 |
| 5510 } } // namespace v8::internal | 5526 } } // namespace v8::internal |
| 5511 | 5527 |
| 5512 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 5528 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
| OLD | NEW |