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

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

Issue 9425045: Support fast case for-in in Crankshaft. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: port to x64&arm, cleanup Created 8 years, 10 months 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 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 V(ThisFunction) \ 173 V(ThisFunction) \
174 V(Throw) \ 174 V(Throw) \
175 V(ToFastProperties) \ 175 V(ToFastProperties) \
176 V(ToInt32) \ 176 V(ToInt32) \
177 V(TransitionElementsKind) \ 177 V(TransitionElementsKind) \
178 V(Typeof) \ 178 V(Typeof) \
179 V(TypeofIsAndBranch) \ 179 V(TypeofIsAndBranch) \
180 V(UnaryMathOperation) \ 180 V(UnaryMathOperation) \
181 V(UnknownOSRValue) \ 181 V(UnknownOSRValue) \
182 V(UseConst) \ 182 V(UseConst) \
183 V(ValueOf) 183 V(ValueOf) \
184 V(ForInPrepareMap) \
185 V(ForInCacheArray) \
186 V(CheckMapValue) \
187 V(LoadFieldByIndex)
184 188
185 #define GVN_FLAG_LIST(V) \ 189 #define GVN_FLAG_LIST(V) \
186 V(Calls) \ 190 V(Calls) \
187 V(InobjectFields) \ 191 V(InobjectFields) \
188 V(BackingStoreFields) \ 192 V(BackingStoreFields) \
189 V(ElementsKind) \ 193 V(ElementsKind) \
190 V(ElementsPointer) \ 194 V(ElementsPointer) \
191 V(ArrayElements) \ 195 V(ArrayElements) \
192 V(DoubleArrayElements) \ 196 V(DoubleArrayElements) \
193 V(SpecializedArrayElements) \ 197 V(SpecializedArrayElements) \
(...skipping 1810 matching lines...) Expand 10 before | Expand all | Expand 10 after
2004 2008
2005 DECLARE_CONCRETE_INSTRUCTION(LoadExternalArrayPointer) 2009 DECLARE_CONCRETE_INSTRUCTION(LoadExternalArrayPointer)
2006 2010
2007 protected: 2011 protected:
2008 virtual bool DataEquals(HValue* other) { return true; } 2012 virtual bool DataEquals(HValue* other) { return true; }
2009 }; 2013 };
2010 2014
2011 2015
2012 class HCheckMap: public HTemplateInstruction<2> { 2016 class HCheckMap: public HTemplateInstruction<2> {
2013 public: 2017 public:
2014 HCheckMap(HValue* value, Handle<Map> map, 2018 HCheckMap(HValue* value,
2019 Handle<Map> map,
2015 HValue* typecheck = NULL, 2020 HValue* typecheck = NULL,
2016 CompareMapMode mode = REQUIRE_EXACT_MAP) 2021 CompareMapMode mode = REQUIRE_EXACT_MAP)
2017 : map_(map), 2022 : map_(map),
2018 mode_(mode) { 2023 mode_(mode) {
2019 SetOperandAt(0, value); 2024 SetOperandAt(0, value);
2020 // If callers don't depend on a typecheck, they can pass in NULL. In that 2025 // If callers don't depend on a typecheck, they can pass in NULL. In that
2021 // case we use a copy of the |value| argument as a dummy value. 2026 // case we use a copy of the |value| argument as a dummy value.
2022 SetOperandAt(1, typecheck != NULL ? typecheck : value); 2027 SetOperandAt(1, typecheck != NULL ? typecheck : value);
2023 set_representation(Representation::Tagged()); 2028 set_representation(Representation::Tagged());
2024 SetFlag(kUseGVN); 2029 SetFlag(kUseGVN);
(...skipping 1782 matching lines...) Expand 10 before | Expand all | Expand 10 after
3807 3812
3808 DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype) 3813 DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype)
3809 3814
3810 protected: 3815 protected:
3811 virtual bool DataEquals(HValue* other) { return true; } 3816 virtual bool DataEquals(HValue* other) { return true; }
3812 }; 3817 };
3813 3818
3814 3819
3815 class HLoadKeyedFastElement: public HTemplateInstruction<2> { 3820 class HLoadKeyedFastElement: public HTemplateInstruction<2> {
3816 public: 3821 public:
3817 HLoadKeyedFastElement(HValue* obj, HValue* key) { 3822 enum HoleCheckMode { PERFORM_HOLE_CHECK, OMIT_HOLE_CHECK };
3823
3824 HLoadKeyedFastElement(HValue* obj,
3825 HValue* key,
3826 HoleCheckMode hole_check_mode = PERFORM_HOLE_CHECK)
3827 : hole_check_mode_(hole_check_mode) {
3818 SetOperandAt(0, obj); 3828 SetOperandAt(0, obj);
3819 SetOperandAt(1, key); 3829 SetOperandAt(1, key);
3820 set_representation(Representation::Tagged()); 3830 set_representation(Representation::Tagged());
3821 SetGVNFlag(kDependsOnArrayElements); 3831 SetGVNFlag(kDependsOnArrayElements);
3822 SetFlag(kUseGVN); 3832 SetFlag(kUseGVN);
3823 } 3833 }
3824 3834
3825 HValue* object() { return OperandAt(0); } 3835 HValue* object() { return OperandAt(0); }
3826 HValue* key() { return OperandAt(1); } 3836 HValue* key() { return OperandAt(1); }
3827 3837
3828 virtual Representation RequiredInputRepresentation(int index) { 3838 virtual Representation RequiredInputRepresentation(int index) {
3829 // The key is supposed to be Integer32. 3839 // The key is supposed to be Integer32.
3830 return index == 0 3840 return index == 0
3831 ? Representation::Tagged() 3841 ? Representation::Tagged()
3832 : Representation::Integer32(); 3842 : Representation::Integer32();
3833 } 3843 }
3834 3844
3835 virtual void PrintDataTo(StringStream* stream); 3845 virtual void PrintDataTo(StringStream* stream);
3836 3846
3837 bool RequiresHoleCheck(); 3847 bool RequiresHoleCheck();
3838 3848
3839 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastElement) 3849 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastElement)
3840 3850
3841 protected: 3851 protected:
3842 virtual bool DataEquals(HValue* other) { return true; } 3852 virtual bool DataEquals(HValue* other) {
3853 if (!other->IsLoadKeyedFastElement()) return false;
3854 HLoadKeyedFastElement* other_load = HLoadKeyedFastElement::cast(other);
3855 return hole_check_mode_ == other_load->hole_check_mode_;
3856 }
3857
3858 private:
3859 HoleCheckMode hole_check_mode_;
3843 }; 3860 };
3844 3861
3845 3862
3846 class HLoadKeyedFastDoubleElement: public HTemplateInstruction<2> { 3863 class HLoadKeyedFastDoubleElement: public HTemplateInstruction<2> {
3847 public: 3864 public:
3848 HLoadKeyedFastDoubleElement(HValue* elements, HValue* key) { 3865 HLoadKeyedFastDoubleElement(HValue* elements, HValue* key) {
3849 SetOperandAt(0, elements); 3866 SetOperandAt(0, elements);
3850 SetOperandAt(1, key); 3867 SetOperandAt(1, key);
3851 set_representation(Representation::Double()); 3868 set_representation(Representation::Double());
3852 SetGVNFlag(kDependsOnDoubleArrayElements); 3869 SetGVNFlag(kDependsOnDoubleArrayElements);
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
3936 HValue* object() { return OperandAt(0); } 3953 HValue* object() { return OperandAt(0); }
3937 HValue* key() { return OperandAt(1); } 3954 HValue* key() { return OperandAt(1); }
3938 HValue* context() { return OperandAt(2); } 3955 HValue* context() { return OperandAt(2); }
3939 3956
3940 virtual void PrintDataTo(StringStream* stream); 3957 virtual void PrintDataTo(StringStream* stream);
3941 3958
3942 virtual Representation RequiredInputRepresentation(int index) { 3959 virtual Representation RequiredInputRepresentation(int index) {
3943 return Representation::Tagged(); 3960 return Representation::Tagged();
3944 } 3961 }
3945 3962
3963 virtual HValue* Canonicalize();
3964
3946 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric) 3965 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric)
3947 }; 3966 };
3948 3967
3949 3968
3950 class HStoreNamedField: public HTemplateInstruction<2> { 3969 class HStoreNamedField: public HTemplateInstruction<2> {
3951 public: 3970 public:
3952 HStoreNamedField(HValue* obj, 3971 HStoreNamedField(HValue* obj,
3953 Handle<String> name, 3972 Handle<String> name,
3954 HValue* val, 3973 HValue* val,
3955 bool in_object, 3974 bool in_object,
(...skipping 654 matching lines...) Expand 10 before | Expand all | Expand 10 after
4610 4629
4611 virtual HType CalculateInferredType() { 4630 virtual HType CalculateInferredType() {
4612 return HType::Boolean(); 4631 return HType::Boolean();
4613 } 4632 }
4614 4633
4615 virtual void PrintDataTo(StringStream* stream); 4634 virtual void PrintDataTo(StringStream* stream);
4616 4635
4617 DECLARE_CONCRETE_INSTRUCTION(In) 4636 DECLARE_CONCRETE_INSTRUCTION(In)
4618 }; 4637 };
4619 4638
4639
4640 class HCheckMapValue: public HTemplateInstruction<2> {
4641 public:
4642 HCheckMapValue(HValue* value,
4643 HValue* map) {
4644 SetOperandAt(0, value);
4645 SetOperandAt(1, map);
4646 set_representation(Representation::Tagged());
4647 SetFlag(kUseGVN);
4648 SetGVNFlag(kDependsOnMaps);
4649 SetGVNFlag(kDependsOnElementsKind);
4650 }
4651
4652 virtual Representation RequiredInputRepresentation(int index) {
4653 return Representation::Tagged();
4654 }
4655
4656 virtual void PrintDataTo(StringStream* stream);
4657
4658 virtual HType CalculateInferredType() {
4659 return HType::Tagged();
4660 }
4661
4662 HValue* value() { return OperandAt(0); }
4663 HValue* map() { return OperandAt(1); }
4664
4665 DECLARE_CONCRETE_INSTRUCTION(CheckMapValue)
4666
4667 protected:
4668 virtual bool DataEquals(HValue* other) {
4669 return true;
4670 }
4671 };
4672
4673
4674 class HForInPrepareMap : public HTemplateInstruction<2> {
4675 public:
4676 HForInPrepareMap(HValue* context,
4677 HValue* object) {
4678 SetOperandAt(0, context);
4679 SetOperandAt(1, object);
4680 set_representation(Representation::Tagged());
4681 SetAllSideEffects();
4682 }
4683
4684 virtual Representation RequiredInputRepresentation(int index) {
4685 return Representation::Tagged();
4686 }
4687
4688 HValue* context() { return OperandAt(0); }
4689 HValue* enumerable() { return OperandAt(1); }
4690
4691 virtual void PrintDataTo(StringStream* stream);
4692
4693 virtual HType CalculateInferredType() {
4694 return HType::Tagged();
4695 }
4696
4697 DECLARE_CONCRETE_INSTRUCTION(ForInPrepareMap);
4698 };
4699
4700
4701 class HForInCacheArray : public HTemplateInstruction<2> {
4702 public:
4703 HForInCacheArray(HValue* enumerable,
4704 HValue* keys,
4705 int idx) : idx_(idx) {
4706 SetOperandAt(0, enumerable);
4707 SetOperandAt(1, keys);
4708 set_representation(Representation::Tagged());
4709 }
4710
4711 virtual Representation RequiredInputRepresentation(int index) {
4712 return Representation::Tagged();
4713 }
4714
4715 HValue* enumerable() { return OperandAt(0); }
4716 HValue* map() { return OperandAt(1); }
4717 int idx() { return idx_; }
4718
4719 HForInCacheArray* index_cache() {
4720 return index_cache_;
4721 }
4722
4723 void set_index_cache(HForInCacheArray* index_cache) {
4724 index_cache_ = index_cache;
4725 }
4726
4727 virtual void PrintDataTo(StringStream* stream);
4728
4729 virtual HType CalculateInferredType() {
4730 return HType::Tagged();
4731 }
4732
4733 DECLARE_CONCRETE_INSTRUCTION(ForInCacheArray);
4734 private:
4735 int idx_;
4736 HForInCacheArray* index_cache_;
4737 };
4738
4739
4740 class HLoadFieldByIndex : public HTemplateInstruction<2> {
4741 public:
4742 HLoadFieldByIndex(HValue* object,
4743 HValue* index) {
4744 SetOperandAt(0, object);
4745 SetOperandAt(1, index);
4746 set_representation(Representation::Tagged());
4747 }
4748
4749 virtual Representation RequiredInputRepresentation(int index) {
4750 return Representation::Tagged();
4751 }
4752
4753 HValue* object() { return OperandAt(0); }
4754 HValue* index() { return OperandAt(1); }
4755
4756 virtual void PrintDataTo(StringStream* stream);
4757
4758 virtual HType CalculateInferredType() {
4759 return HType::Tagged();
4760 }
4761
4762 DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex);
4763 };
4764
4765
4620 #undef DECLARE_INSTRUCTION 4766 #undef DECLARE_INSTRUCTION
4621 #undef DECLARE_CONCRETE_INSTRUCTION 4767 #undef DECLARE_CONCRETE_INSTRUCTION
4622 4768
4623 } } // namespace v8::internal 4769 } } // namespace v8::internal
4624 4770
4625 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ 4771 #endif // V8_HYDROGEN_INSTRUCTIONS_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698