OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 560 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
571 void ClearAllSideEffects() { flags_ &= ~AllSideEffects(); } | 571 void ClearAllSideEffects() { flags_ &= ~AllSideEffects(); } |
572 bool HasSideEffects() const { return (flags_ & AllSideEffects()) != 0; } | 572 bool HasSideEffects() const { return (flags_ & AllSideEffects()) != 0; } |
573 | 573 |
574 Range* range() const { return range_; } | 574 Range* range() const { return range_; } |
575 bool HasRange() const { return range_ != NULL; } | 575 bool HasRange() const { return range_ != NULL; } |
576 void AddNewRange(Range* r); | 576 void AddNewRange(Range* r); |
577 void RemoveLastAddedRange(); | 577 void RemoveLastAddedRange(); |
578 void ComputeInitialRange(); | 578 void ComputeInitialRange(); |
579 | 579 |
580 // Representation helpers. | 580 // Representation helpers. |
581 virtual Representation RequiredInputRepresentation(int index) const { | 581 virtual Representation RequiredInputRepresentation(int index) const = 0; |
582 return Representation::None(); | 582 |
583 } | |
584 virtual Representation InferredRepresentation() { | 583 virtual Representation InferredRepresentation() { |
585 return representation(); | 584 return representation(); |
586 } | 585 } |
587 | 586 |
588 // This gives the instruction an opportunity to replace itself with an | 587 // This gives the instruction an opportunity to replace itself with an |
589 // instruction that does the same in some better way. To replace an | 588 // instruction that does the same in some better way. To replace an |
590 // instruction with a new one, first add the new instruction to the graph, | 589 // instruction with a new one, first add the new instruction to the graph, |
591 // then return it. Return NULL to have the instruction deleted. | 590 // then return it. Return NULL to have the instruction deleted. |
592 virtual HValue* Canonicalize() { return this; } | 591 virtual HValue* Canonicalize() { return this; } |
593 | 592 |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
712 HInstruction* next_; | 711 HInstruction* next_; |
713 HInstruction* previous_; | 712 HInstruction* previous_; |
714 int position_; | 713 int position_; |
715 | 714 |
716 friend class HBasicBlock; | 715 friend class HBasicBlock; |
717 }; | 716 }; |
718 | 717 |
719 | 718 |
720 class HBlockEntry: public HInstruction { | 719 class HBlockEntry: public HInstruction { |
721 public: | 720 public: |
| 721 |
| 722 virtual Representation RequiredInputRepresentation(int index) const { |
| 723 return Representation::None(); |
| 724 } |
| 725 |
722 DECLARE_CONCRETE_INSTRUCTION(BlockEntry, "block_entry") | 726 DECLARE_CONCRETE_INSTRUCTION(BlockEntry, "block_entry") |
723 }; | 727 }; |
724 | 728 |
725 | 729 |
726 class HControlInstruction: public HInstruction { | 730 class HControlInstruction: public HInstruction { |
727 public: | 731 public: |
728 HControlInstruction(HBasicBlock* first, HBasicBlock* second) | 732 HControlInstruction(HBasicBlock* first, HBasicBlock* second) |
729 : first_successor_(first), second_successor_(second) { | 733 : first_successor_(first), second_successor_(second) { |
730 } | 734 } |
731 | 735 |
732 HBasicBlock* FirstSuccessor() const { return first_successor_; } | 736 HBasicBlock* FirstSuccessor() const { return first_successor_; } |
733 HBasicBlock* SecondSuccessor() const { return second_successor_; } | 737 HBasicBlock* SecondSuccessor() const { return second_successor_; } |
734 | 738 |
735 virtual void PrintDataTo(StringStream* stream); | 739 virtual void PrintDataTo(StringStream* stream); |
736 | 740 |
737 DECLARE_INSTRUCTION(ControlInstruction) | 741 DECLARE_INSTRUCTION(ControlInstruction) |
738 | 742 |
739 private: | 743 private: |
740 HBasicBlock* first_successor_; | 744 HBasicBlock* first_successor_; |
741 HBasicBlock* second_successor_; | 745 HBasicBlock* second_successor_; |
742 }; | 746 }; |
743 | 747 |
744 | 748 |
745 class HDeoptimize: public HControlInstruction { | 749 class HDeoptimize: public HControlInstruction { |
746 public: | 750 public: |
747 HDeoptimize() : HControlInstruction(NULL, NULL) { } | 751 HDeoptimize() : HControlInstruction(NULL, NULL) { } |
748 | 752 |
| 753 virtual Representation RequiredInputRepresentation(int index) const { |
| 754 return Representation::None(); |
| 755 } |
| 756 |
749 DECLARE_CONCRETE_INSTRUCTION(Deoptimize, "deoptimize") | 757 DECLARE_CONCRETE_INSTRUCTION(Deoptimize, "deoptimize") |
750 }; | 758 }; |
751 | 759 |
752 | 760 |
753 class HGoto: public HControlInstruction { | 761 class HGoto: public HControlInstruction { |
754 public: | 762 public: |
755 explicit HGoto(HBasicBlock* target) | 763 explicit HGoto(HBasicBlock* target) |
756 : HControlInstruction(target, NULL), include_stack_check_(false) { | 764 : HControlInstruction(target, NULL), include_stack_check_(false) { |
757 } | 765 } |
758 | 766 |
759 void set_include_stack_check(bool include_stack_check) { | 767 void set_include_stack_check(bool include_stack_check) { |
760 include_stack_check_ = include_stack_check; | 768 include_stack_check_ = include_stack_check; |
761 } | 769 } |
762 bool include_stack_check() const { return include_stack_check_; } | 770 bool include_stack_check() const { return include_stack_check_; } |
763 | 771 |
| 772 virtual Representation RequiredInputRepresentation(int index) const { |
| 773 return Representation::None(); |
| 774 } |
| 775 |
764 DECLARE_CONCRETE_INSTRUCTION(Goto, "goto") | 776 DECLARE_CONCRETE_INSTRUCTION(Goto, "goto") |
765 | 777 |
766 private: | 778 private: |
767 bool include_stack_check_; | 779 bool include_stack_check_; |
768 }; | 780 }; |
769 | 781 |
770 | 782 |
771 class HUnaryControlInstruction: public HControlInstruction { | 783 class HUnaryControlInstruction: public HControlInstruction { |
772 public: | 784 public: |
773 explicit HUnaryControlInstruction(HValue* value, | 785 explicit HUnaryControlInstruction(HValue* value, |
774 HBasicBlock* true_target, | 786 HBasicBlock* true_target, |
775 HBasicBlock* false_target) | 787 HBasicBlock* false_target) |
776 : HControlInstruction(true_target, false_target) { | 788 : HControlInstruction(true_target, false_target) { |
777 SetOperandAt(0, value); | 789 SetOperandAt(0, value); |
778 } | 790 } |
779 | 791 |
780 virtual Representation RequiredInputRepresentation(int index) const { | |
781 return Representation::Tagged(); | |
782 } | |
783 | |
784 virtual void PrintDataTo(StringStream* stream); | 792 virtual void PrintDataTo(StringStream* stream); |
785 | 793 |
786 HValue* value() { return OperandAt(0); } | 794 HValue* value() { return OperandAt(0); } |
787 virtual int OperandCount() { return 1; } | 795 virtual int OperandCount() { return 1; } |
788 virtual HValue* OperandAt(int index) { return operands_[index]; } | 796 virtual HValue* OperandAt(int index) { return operands_[index]; } |
789 | 797 |
790 DECLARE_INSTRUCTION(UnaryControlInstruction) | 798 DECLARE_INSTRUCTION(UnaryControlInstruction) |
791 | 799 |
792 protected: | 800 protected: |
793 virtual void InternalSetOperandAt(int index, HValue* value) { | 801 virtual void InternalSetOperandAt(int index, HValue* value) { |
(...skipping 30 matching lines...) Expand all Loading... |
824 map_(map) { | 832 map_(map) { |
825 ASSERT(true_target != NULL); | 833 ASSERT(true_target != NULL); |
826 ASSERT(false_target != NULL); | 834 ASSERT(false_target != NULL); |
827 ASSERT(!map.is_null()); | 835 ASSERT(!map.is_null()); |
828 } | 836 } |
829 | 837 |
830 virtual void PrintDataTo(StringStream* stream); | 838 virtual void PrintDataTo(StringStream* stream); |
831 | 839 |
832 Handle<Map> map() const { return map_; } | 840 Handle<Map> map() const { return map_; } |
833 | 841 |
| 842 virtual Representation RequiredInputRepresentation(int index) const { |
| 843 return Representation::Tagged(); |
| 844 } |
| 845 |
834 DECLARE_CONCRETE_INSTRUCTION(CompareMap, "compare_map") | 846 DECLARE_CONCRETE_INSTRUCTION(CompareMap, "compare_map") |
835 | 847 |
836 private: | 848 private: |
837 Handle<Map> map_; | 849 Handle<Map> map_; |
838 }; | 850 }; |
839 | 851 |
840 | 852 |
841 class HReturn: public HUnaryControlInstruction { | 853 class HReturn: public HUnaryControlInstruction { |
842 public: | 854 public: |
843 explicit HReturn(HValue* value) | 855 explicit HReturn(HValue* value) |
844 : HUnaryControlInstruction(value, NULL, NULL) { | 856 : HUnaryControlInstruction(value, NULL, NULL) { |
845 } | 857 } |
846 | 858 |
| 859 virtual Representation RequiredInputRepresentation(int index) const { |
| 860 return Representation::Tagged(); |
| 861 } |
| 862 |
847 DECLARE_CONCRETE_INSTRUCTION(Return, "return") | 863 DECLARE_CONCRETE_INSTRUCTION(Return, "return") |
848 }; | 864 }; |
849 | 865 |
850 | 866 |
851 class HAbnormalExit: public HControlInstruction { | 867 class HAbnormalExit: public HControlInstruction { |
852 public: | 868 public: |
853 HAbnormalExit() : HControlInstruction(NULL, NULL) { } | 869 HAbnormalExit() : HControlInstruction(NULL, NULL) { } |
854 | 870 |
| 871 virtual Representation RequiredInputRepresentation(int index) const { |
| 872 return Representation::None(); |
| 873 } |
| 874 |
855 DECLARE_CONCRETE_INSTRUCTION(AbnormalExit, "abnormal_exit") | 875 DECLARE_CONCRETE_INSTRUCTION(AbnormalExit, "abnormal_exit") |
856 }; | 876 }; |
857 | 877 |
858 | 878 |
859 class HUnaryOperation: public HInstruction { | 879 class HUnaryOperation: public HInstruction { |
860 public: | 880 public: |
861 explicit HUnaryOperation(HValue* value) { | 881 explicit HUnaryOperation(HValue* value) { |
862 SetOperandAt(0, value); | 882 SetOperandAt(0, value); |
863 } | 883 } |
864 | 884 |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
976 } | 996 } |
977 void AddAssignedValue(int index, HValue* value) { | 997 void AddAssignedValue(int index, HValue* value) { |
978 AddValue(index, value); | 998 AddValue(index, value); |
979 } | 999 } |
980 void AddPushedValue(HValue* value) { | 1000 void AddPushedValue(HValue* value) { |
981 AddValue(kNoIndex, value); | 1001 AddValue(kNoIndex, value); |
982 } | 1002 } |
983 virtual int OperandCount() { return values_.length(); } | 1003 virtual int OperandCount() { return values_.length(); } |
984 virtual HValue* OperandAt(int index) { return values_[index]; } | 1004 virtual HValue* OperandAt(int index) { return values_[index]; } |
985 | 1005 |
| 1006 virtual Representation RequiredInputRepresentation(int index) const { |
| 1007 return Representation::None(); |
| 1008 } |
| 1009 |
986 DECLARE_CONCRETE_INSTRUCTION(Simulate, "simulate") | 1010 DECLARE_CONCRETE_INSTRUCTION(Simulate, "simulate") |
987 | 1011 |
988 #ifdef DEBUG | 1012 #ifdef DEBUG |
989 virtual void Verify(); | 1013 virtual void Verify(); |
990 #endif | 1014 #endif |
991 | 1015 |
992 protected: | 1016 protected: |
993 virtual void InternalSetOperandAt(int index, HValue* value) { | 1017 virtual void InternalSetOperandAt(int index, HValue* value) { |
994 values_[index] = value; | 1018 values_[index] = value; |
995 } | 1019 } |
(...skipping 13 matching lines...) Expand all Loading... |
1009 int environment_length_; | 1033 int environment_length_; |
1010 ZoneList<HValue*> values_; | 1034 ZoneList<HValue*> values_; |
1011 ZoneList<int> assigned_indexes_; | 1035 ZoneList<int> assigned_indexes_; |
1012 }; | 1036 }; |
1013 | 1037 |
1014 | 1038 |
1015 class HStackCheck: public HInstruction { | 1039 class HStackCheck: public HInstruction { |
1016 public: | 1040 public: |
1017 HStackCheck() { } | 1041 HStackCheck() { } |
1018 | 1042 |
| 1043 virtual Representation RequiredInputRepresentation(int index) const { |
| 1044 return Representation::None(); |
| 1045 } |
| 1046 |
1019 DECLARE_CONCRETE_INSTRUCTION(StackCheck, "stack_check") | 1047 DECLARE_CONCRETE_INSTRUCTION(StackCheck, "stack_check") |
1020 }; | 1048 }; |
1021 | 1049 |
1022 | 1050 |
1023 class HEnterInlined: public HInstruction { | 1051 class HEnterInlined: public HInstruction { |
1024 public: | 1052 public: |
1025 HEnterInlined(Handle<JSFunction> closure, FunctionLiteral* function) | 1053 HEnterInlined(Handle<JSFunction> closure, FunctionLiteral* function) |
1026 : closure_(closure), function_(function) { | 1054 : closure_(closure), function_(function) { |
1027 } | 1055 } |
1028 | 1056 |
1029 virtual void PrintDataTo(StringStream* stream); | 1057 virtual void PrintDataTo(StringStream* stream); |
1030 | 1058 |
1031 Handle<JSFunction> closure() const { return closure_; } | 1059 Handle<JSFunction> closure() const { return closure_; } |
1032 FunctionLiteral* function() const { return function_; } | 1060 FunctionLiteral* function() const { return function_; } |
1033 | 1061 |
| 1062 virtual Representation RequiredInputRepresentation(int index) const { |
| 1063 return Representation::None(); |
| 1064 } |
| 1065 |
1034 DECLARE_CONCRETE_INSTRUCTION(EnterInlined, "enter_inlined") | 1066 DECLARE_CONCRETE_INSTRUCTION(EnterInlined, "enter_inlined") |
1035 | 1067 |
1036 private: | 1068 private: |
1037 Handle<JSFunction> closure_; | 1069 Handle<JSFunction> closure_; |
1038 FunctionLiteral* function_; | 1070 FunctionLiteral* function_; |
1039 }; | 1071 }; |
1040 | 1072 |
1041 | 1073 |
1042 class HLeaveInlined: public HInstruction { | 1074 class HLeaveInlined: public HInstruction { |
1043 public: | 1075 public: |
1044 HLeaveInlined() {} | 1076 HLeaveInlined() {} |
1045 | 1077 |
| 1078 virtual Representation RequiredInputRepresentation(int index) const { |
| 1079 return Representation::None(); |
| 1080 } |
| 1081 |
1046 DECLARE_CONCRETE_INSTRUCTION(LeaveInlined, "leave_inlined") | 1082 DECLARE_CONCRETE_INSTRUCTION(LeaveInlined, "leave_inlined") |
1047 }; | 1083 }; |
1048 | 1084 |
1049 | 1085 |
1050 class HPushArgument: public HUnaryOperation { | 1086 class HPushArgument: public HUnaryOperation { |
1051 public: | 1087 public: |
1052 explicit HPushArgument(HValue* value) : HUnaryOperation(value) { | 1088 explicit HPushArgument(HValue* value) : HUnaryOperation(value) { |
1053 set_representation(Representation::Tagged()); | 1089 set_representation(Representation::Tagged()); |
1054 } | 1090 } |
1055 | 1091 |
1056 virtual Representation RequiredInputRepresentation(int index) const { | 1092 virtual Representation RequiredInputRepresentation(int index) const { |
1057 return Representation::Tagged(); | 1093 return Representation::Tagged(); |
1058 } | 1094 } |
1059 | 1095 |
1060 HValue* argument() { return OperandAt(0); } | 1096 HValue* argument() { return OperandAt(0); } |
1061 | 1097 |
1062 DECLARE_CONCRETE_INSTRUCTION(PushArgument, "push_argument") | 1098 DECLARE_CONCRETE_INSTRUCTION(PushArgument, "push_argument") |
1063 }; | 1099 }; |
1064 | 1100 |
1065 | 1101 |
1066 class HContext: public HInstruction { | 1102 class HContext: public HInstruction { |
1067 public: | 1103 public: |
1068 HContext() { | 1104 HContext() { |
1069 set_representation(Representation::Tagged()); | 1105 set_representation(Representation::Tagged()); |
1070 SetFlag(kUseGVN); | 1106 SetFlag(kUseGVN); |
1071 } | 1107 } |
1072 | 1108 |
| 1109 virtual Representation RequiredInputRepresentation(int index) const { |
| 1110 return Representation::None(); |
| 1111 } |
| 1112 |
1073 DECLARE_CONCRETE_INSTRUCTION(Context, "context"); | 1113 DECLARE_CONCRETE_INSTRUCTION(Context, "context"); |
1074 | 1114 |
1075 protected: | 1115 protected: |
1076 virtual bool DataEquals(HValue* other) { return true; } | 1116 virtual bool DataEquals(HValue* other) { return true; } |
1077 }; | 1117 }; |
1078 | 1118 |
1079 | 1119 |
1080 class HOuterContext: public HUnaryOperation { | 1120 class HOuterContext: public HUnaryOperation { |
1081 public: | 1121 public: |
1082 explicit HOuterContext(HValue* inner) : HUnaryOperation(inner) { | 1122 explicit HOuterContext(HValue* inner) : HUnaryOperation(inner) { |
1083 set_representation(Representation::Tagged()); | 1123 set_representation(Representation::Tagged()); |
1084 SetFlag(kUseGVN); | 1124 SetFlag(kUseGVN); |
1085 } | 1125 } |
1086 | 1126 |
1087 DECLARE_CONCRETE_INSTRUCTION(OuterContext, "outer_context"); | 1127 DECLARE_CONCRETE_INSTRUCTION(OuterContext, "outer_context"); |
1088 | 1128 |
| 1129 virtual Representation RequiredInputRepresentation(int index) const { |
| 1130 return Representation::Tagged(); |
| 1131 } |
| 1132 |
1089 protected: | 1133 protected: |
1090 virtual bool DataEquals(HValue* other) { return true; } | 1134 virtual bool DataEquals(HValue* other) { return true; } |
1091 }; | 1135 }; |
1092 | 1136 |
1093 | 1137 |
1094 class HGlobalObject: public HUnaryOperation { | 1138 class HGlobalObject: public HUnaryOperation { |
1095 public: | 1139 public: |
1096 explicit HGlobalObject(HValue* context) : HUnaryOperation(context) { | 1140 explicit HGlobalObject(HValue* context) : HUnaryOperation(context) { |
1097 set_representation(Representation::Tagged()); | 1141 set_representation(Representation::Tagged()); |
1098 SetFlag(kUseGVN); | 1142 SetFlag(kUseGVN); |
1099 } | 1143 } |
1100 | 1144 |
1101 DECLARE_CONCRETE_INSTRUCTION(GlobalObject, "global_object") | 1145 DECLARE_CONCRETE_INSTRUCTION(GlobalObject, "global_object") |
1102 | 1146 |
| 1147 virtual Representation RequiredInputRepresentation(int index) const { |
| 1148 return Representation::Tagged(); |
| 1149 } |
| 1150 |
1103 protected: | 1151 protected: |
1104 virtual bool DataEquals(HValue* other) { return true; } | 1152 virtual bool DataEquals(HValue* other) { return true; } |
1105 }; | 1153 }; |
1106 | 1154 |
1107 | 1155 |
1108 class HGlobalReceiver: public HUnaryOperation { | 1156 class HGlobalReceiver: public HUnaryOperation { |
1109 public: | 1157 public: |
1110 explicit HGlobalReceiver(HValue* global_object) | 1158 explicit HGlobalReceiver(HValue* global_object) |
1111 : HUnaryOperation(global_object) { | 1159 : HUnaryOperation(global_object) { |
1112 set_representation(Representation::Tagged()); | 1160 set_representation(Representation::Tagged()); |
1113 SetFlag(kUseGVN); | 1161 SetFlag(kUseGVN); |
1114 } | 1162 } |
1115 | 1163 |
1116 DECLARE_CONCRETE_INSTRUCTION(GlobalReceiver, "global_receiver") | 1164 DECLARE_CONCRETE_INSTRUCTION(GlobalReceiver, "global_receiver") |
1117 | 1165 |
| 1166 virtual Representation RequiredInputRepresentation(int index) const { |
| 1167 return Representation::Tagged(); |
| 1168 } |
| 1169 |
1118 protected: | 1170 protected: |
1119 virtual bool DataEquals(HValue* other) { return true; } | 1171 virtual bool DataEquals(HValue* other) { return true; } |
1120 }; | 1172 }; |
1121 | 1173 |
1122 | 1174 |
1123 class HCall: public HInstruction { | 1175 class HCall: public HInstruction { |
1124 public: | 1176 public: |
1125 // The argument count includes the receiver. | 1177 // The argument count includes the receiver. |
1126 explicit HCall(int argument_count) : argument_count_(argument_count) { | 1178 explicit HCall(int argument_count) : argument_count_(argument_count) { |
1127 set_representation(Representation::Tagged()); | 1179 set_representation(Representation::Tagged()); |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1205 : HCall(argument_count), function_(function) { } | 1257 : HCall(argument_count), function_(function) { } |
1206 | 1258 |
1207 Handle<JSFunction> function() const { return function_; } | 1259 Handle<JSFunction> function() const { return function_; } |
1208 | 1260 |
1209 bool IsApplyFunction() const { | 1261 bool IsApplyFunction() const { |
1210 return function_->code() == Builtins::builtin(Builtins::FunctionApply); | 1262 return function_->code() == Builtins::builtin(Builtins::FunctionApply); |
1211 } | 1263 } |
1212 | 1264 |
1213 virtual void PrintDataTo(StringStream* stream); | 1265 virtual void PrintDataTo(StringStream* stream); |
1214 | 1266 |
| 1267 virtual Representation RequiredInputRepresentation(int index) const { |
| 1268 return Representation::None(); |
| 1269 } |
| 1270 |
1215 DECLARE_CONCRETE_INSTRUCTION(CallConstantFunction, "call_constant_function") | 1271 DECLARE_CONCRETE_INSTRUCTION(CallConstantFunction, "call_constant_function") |
1216 | 1272 |
1217 private: | 1273 private: |
1218 Handle<JSFunction> function_; | 1274 Handle<JSFunction> function_; |
1219 }; | 1275 }; |
1220 | 1276 |
1221 | 1277 |
1222 class HCallKeyed: public HBinaryCall { | 1278 class HCallKeyed: public HBinaryCall { |
1223 public: | 1279 public: |
1224 HCallKeyed(HValue* context, HValue* key, int argument_count) | 1280 HCallKeyed(HValue* context, HValue* key, int argument_count) |
(...skipping 17 matching lines...) Expand all Loading... |
1242 : HUnaryCall(context, argument_count), name_(name) { | 1298 : HUnaryCall(context, argument_count), name_(name) { |
1243 } | 1299 } |
1244 | 1300 |
1245 virtual void PrintDataTo(StringStream* stream); | 1301 virtual void PrintDataTo(StringStream* stream); |
1246 | 1302 |
1247 HValue* context() { return value(); } | 1303 HValue* context() { return value(); } |
1248 Handle<String> name() const { return name_; } | 1304 Handle<String> name() const { return name_; } |
1249 | 1305 |
1250 DECLARE_CONCRETE_INSTRUCTION(CallNamed, "call_named") | 1306 DECLARE_CONCRETE_INSTRUCTION(CallNamed, "call_named") |
1251 | 1307 |
| 1308 virtual Representation RequiredInputRepresentation(int index) const { |
| 1309 return Representation::Tagged(); |
| 1310 } |
| 1311 |
1252 private: | 1312 private: |
1253 Handle<String> name_; | 1313 Handle<String> name_; |
1254 }; | 1314 }; |
1255 | 1315 |
1256 | 1316 |
1257 class HCallFunction: public HUnaryCall { | 1317 class HCallFunction: public HUnaryCall { |
1258 public: | 1318 public: |
1259 HCallFunction(HValue* context, int argument_count) | 1319 HCallFunction(HValue* context, int argument_count) |
1260 : HUnaryCall(context, argument_count) { | 1320 : HUnaryCall(context, argument_count) { |
1261 } | 1321 } |
1262 | 1322 |
1263 HValue* context() { return value(); } | 1323 HValue* context() { return value(); } |
1264 | 1324 |
| 1325 virtual Representation RequiredInputRepresentation(int index) const { |
| 1326 return Representation::Tagged(); |
| 1327 } |
| 1328 |
1265 DECLARE_CONCRETE_INSTRUCTION(CallFunction, "call_function") | 1329 DECLARE_CONCRETE_INSTRUCTION(CallFunction, "call_function") |
1266 }; | 1330 }; |
1267 | 1331 |
1268 | 1332 |
1269 class HCallGlobal: public HUnaryCall { | 1333 class HCallGlobal: public HUnaryCall { |
1270 public: | 1334 public: |
1271 HCallGlobal(HValue* context, Handle<String> name, int argument_count) | 1335 HCallGlobal(HValue* context, Handle<String> name, int argument_count) |
1272 : HUnaryCall(context, argument_count), name_(name) { | 1336 : HUnaryCall(context, argument_count), name_(name) { |
1273 } | 1337 } |
1274 | 1338 |
1275 virtual void PrintDataTo(StringStream* stream); | 1339 virtual void PrintDataTo(StringStream* stream); |
1276 | 1340 |
1277 HValue* context() { return value(); } | 1341 HValue* context() { return value(); } |
1278 Handle<String> name() const { return name_; } | 1342 Handle<String> name() const { return name_; } |
1279 | 1343 |
| 1344 virtual Representation RequiredInputRepresentation(int index) const { |
| 1345 return Representation::Tagged(); |
| 1346 } |
| 1347 |
1280 DECLARE_CONCRETE_INSTRUCTION(CallGlobal, "call_global") | 1348 DECLARE_CONCRETE_INSTRUCTION(CallGlobal, "call_global") |
1281 | 1349 |
1282 private: | 1350 private: |
1283 Handle<String> name_; | 1351 Handle<String> name_; |
1284 }; | 1352 }; |
1285 | 1353 |
1286 | 1354 |
1287 class HCallKnownGlobal: public HCall { | 1355 class HCallKnownGlobal: public HCall { |
1288 public: | 1356 public: |
1289 HCallKnownGlobal(Handle<JSFunction> target, int argument_count) | 1357 HCallKnownGlobal(Handle<JSFunction> target, int argument_count) |
1290 : HCall(argument_count), target_(target) { } | 1358 : HCall(argument_count), target_(target) { } |
1291 | 1359 |
1292 virtual void PrintDataTo(StringStream* stream); | 1360 virtual void PrintDataTo(StringStream* stream); |
1293 | 1361 |
1294 Handle<JSFunction> target() const { return target_; } | 1362 Handle<JSFunction> target() const { return target_; } |
1295 | 1363 |
| 1364 virtual Representation RequiredInputRepresentation(int index) const { |
| 1365 return Representation::None(); |
| 1366 } |
| 1367 |
1296 DECLARE_CONCRETE_INSTRUCTION(CallKnownGlobal, "call_known_global") | 1368 DECLARE_CONCRETE_INSTRUCTION(CallKnownGlobal, "call_known_global") |
1297 | 1369 |
1298 private: | 1370 private: |
1299 Handle<JSFunction> target_; | 1371 Handle<JSFunction> target_; |
1300 }; | 1372 }; |
1301 | 1373 |
1302 | 1374 |
1303 class HCallNew: public HBinaryCall { | 1375 class HCallNew: public HBinaryCall { |
1304 public: | 1376 public: |
1305 HCallNew(HValue* context, HValue* constructor, int argument_count) | 1377 HCallNew(HValue* context, HValue* constructor, int argument_count) |
(...skipping 15 matching lines...) Expand all Loading... |
1321 public: | 1393 public: |
1322 HCallRuntime(Handle<String> name, | 1394 HCallRuntime(Handle<String> name, |
1323 Runtime::Function* c_function, | 1395 Runtime::Function* c_function, |
1324 int argument_count) | 1396 int argument_count) |
1325 : HCall(argument_count), c_function_(c_function), name_(name) { } | 1397 : HCall(argument_count), c_function_(c_function), name_(name) { } |
1326 virtual void PrintDataTo(StringStream* stream); | 1398 virtual void PrintDataTo(StringStream* stream); |
1327 | 1399 |
1328 Runtime::Function* function() const { return c_function_; } | 1400 Runtime::Function* function() const { return c_function_; } |
1329 Handle<String> name() const { return name_; } | 1401 Handle<String> name() const { return name_; } |
1330 | 1402 |
| 1403 virtual Representation RequiredInputRepresentation(int index) const { |
| 1404 return Representation::None(); |
| 1405 } |
| 1406 |
1331 DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call_runtime") | 1407 DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call_runtime") |
1332 | 1408 |
1333 private: | 1409 private: |
1334 Runtime::Function* c_function_; | 1410 Runtime::Function* c_function_; |
1335 Handle<String> name_; | 1411 Handle<String> name_; |
1336 }; | 1412 }; |
1337 | 1413 |
1338 | 1414 |
1339 class HJSArrayLength: public HUnaryOperation { | 1415 class HJSArrayLength: public HUnaryOperation { |
1340 public: | 1416 public: |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1455 switch (op_) { | 1531 switch (op_) { |
1456 case kMathFloor: | 1532 case kMathFloor: |
1457 case kMathRound: | 1533 case kMathRound: |
1458 case kMathCeil: | 1534 case kMathCeil: |
1459 case kMathSqrt: | 1535 case kMathSqrt: |
1460 case kMathPowHalf: | 1536 case kMathPowHalf: |
1461 case kMathLog: | 1537 case kMathLog: |
1462 case kMathSin: | 1538 case kMathSin: |
1463 case kMathCos: | 1539 case kMathCos: |
1464 return Representation::Double(); | 1540 return Representation::Double(); |
1465 break; | |
1466 case kMathAbs: | 1541 case kMathAbs: |
1467 return representation(); | 1542 return representation(); |
1468 break; | |
1469 default: | 1543 default: |
| 1544 UNREACHABLE(); |
1470 return Representation::None(); | 1545 return Representation::None(); |
1471 } | 1546 } |
1472 } | 1547 } |
1473 | 1548 |
1474 virtual HValue* Canonicalize() { | 1549 virtual HValue* Canonicalize() { |
1475 // If the input is integer32 then we replace the floor instruction | 1550 // If the input is integer32 then we replace the floor instruction |
1476 // with its inputs. This happens before the representation changes are | 1551 // with its inputs. This happens before the representation changes are |
1477 // introduced. | 1552 // introduced. |
1478 if (op() == kMathFloor) { | 1553 if (op() == kMathFloor) { |
1479 if (value()->representation().IsInteger32()) return value(); | 1554 if (value()->representation().IsInteger32()) return value(); |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1698 | 1773 |
1699 #ifdef DEBUG | 1774 #ifdef DEBUG |
1700 virtual void Verify(); | 1775 virtual void Verify(); |
1701 #endif | 1776 #endif |
1702 | 1777 |
1703 Handle<JSObject> prototype() const { return prototype_; } | 1778 Handle<JSObject> prototype() const { return prototype_; } |
1704 Handle<JSObject> holder() const { return holder_; } | 1779 Handle<JSObject> holder() const { return holder_; } |
1705 | 1780 |
1706 DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps, "check_prototype_maps") | 1781 DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps, "check_prototype_maps") |
1707 | 1782 |
| 1783 virtual Representation RequiredInputRepresentation(int index) const { |
| 1784 return Representation::None(); |
| 1785 } |
| 1786 |
1708 virtual intptr_t Hashcode() { | 1787 virtual intptr_t Hashcode() { |
1709 ASSERT(!Heap::IsAllocationAllowed()); | 1788 ASSERT(!Heap::IsAllocationAllowed()); |
1710 intptr_t hash = reinterpret_cast<intptr_t>(*prototype()); | 1789 intptr_t hash = reinterpret_cast<intptr_t>(*prototype()); |
1711 hash = 17 * hash + reinterpret_cast<intptr_t>(*holder()); | 1790 hash = 17 * hash + reinterpret_cast<intptr_t>(*holder()); |
1712 return hash; | 1791 return hash; |
1713 } | 1792 } |
1714 | 1793 |
1715 protected: | 1794 protected: |
1716 virtual bool DataEquals(HValue* other) { | 1795 virtual bool DataEquals(HValue* other) { |
1717 HCheckPrototypeMaps* b = HCheckPrototypeMaps::cast(other); | 1796 HCheckPrototypeMaps* b = HCheckPrototypeMaps::cast(other); |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1844 }; | 1923 }; |
1845 | 1924 |
1846 | 1925 |
1847 class HArgumentsObject: public HInstruction { | 1926 class HArgumentsObject: public HInstruction { |
1848 public: | 1927 public: |
1849 HArgumentsObject() { | 1928 HArgumentsObject() { |
1850 set_representation(Representation::Tagged()); | 1929 set_representation(Representation::Tagged()); |
1851 SetFlag(kIsArguments); | 1930 SetFlag(kIsArguments); |
1852 } | 1931 } |
1853 | 1932 |
| 1933 virtual Representation RequiredInputRepresentation(int index) const { |
| 1934 return Representation::None(); |
| 1935 } |
| 1936 |
1854 DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject, "arguments-object") | 1937 DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject, "arguments-object") |
1855 }; | 1938 }; |
1856 | 1939 |
1857 | 1940 |
1858 class HConstant: public HInstruction { | 1941 class HConstant: public HInstruction { |
1859 public: | 1942 public: |
1860 HConstant(Handle<Object> handle, Representation r); | 1943 HConstant(Handle<Object> handle, Representation r); |
1861 | 1944 |
1862 Handle<Object> handle() const { return handle_; } | 1945 Handle<Object> handle() const { return handle_; } |
1863 | 1946 |
1864 bool InOldSpace() const { return !Heap::InNewSpace(*handle_); } | 1947 bool InOldSpace() const { return !Heap::InNewSpace(*handle_); } |
1865 | 1948 |
| 1949 virtual Representation RequiredInputRepresentation(int index) const { |
| 1950 return Representation::None(); |
| 1951 } |
| 1952 |
1866 virtual bool EmitAtUses() const { return !representation().IsDouble(); } | 1953 virtual bool EmitAtUses() const { return !representation().IsDouble(); } |
1867 virtual void PrintDataTo(StringStream* stream); | 1954 virtual void PrintDataTo(StringStream* stream); |
1868 virtual HType CalculateInferredType(); | 1955 virtual HType CalculateInferredType(); |
1869 bool IsInteger() const { return handle_->IsSmi(); } | 1956 bool IsInteger() const { return handle_->IsSmi(); } |
1870 HConstant* CopyToRepresentation(Representation r) const; | 1957 HConstant* CopyToRepresentation(Representation r) const; |
1871 HConstant* CopyToTruncatedInt32() const; | 1958 HConstant* CopyToTruncatedInt32() const; |
1872 bool HasInteger32Value() const { return has_int32_value_; } | 1959 bool HasInteger32Value() const { return has_int32_value_; } |
1873 int32_t Integer32Value() const { | 1960 int32_t Integer32Value() const { |
1874 ASSERT(HasInteger32Value()); | 1961 ASSERT(HasInteger32Value()); |
1875 return int32_value_; | 1962 return int32_value_; |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1998 public: | 2085 public: |
1999 HArgumentsElements() { | 2086 HArgumentsElements() { |
2000 // The value produced by this instruction is a pointer into the stack | 2087 // The value produced by this instruction is a pointer into the stack |
2001 // that looks as if it was a smi because of alignment. | 2088 // that looks as if it was a smi because of alignment. |
2002 set_representation(Representation::Tagged()); | 2089 set_representation(Representation::Tagged()); |
2003 SetFlag(kUseGVN); | 2090 SetFlag(kUseGVN); |
2004 } | 2091 } |
2005 | 2092 |
2006 DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements, "arguments_elements") | 2093 DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements, "arguments_elements") |
2007 | 2094 |
| 2095 virtual Representation RequiredInputRepresentation(int index) const { |
| 2096 return Representation::None(); |
| 2097 } |
| 2098 |
2008 protected: | 2099 protected: |
2009 virtual bool DataEquals(HValue* other) { return true; } | 2100 virtual bool DataEquals(HValue* other) { return true; } |
2010 }; | 2101 }; |
2011 | 2102 |
2012 | 2103 |
2013 class HArgumentsLength: public HUnaryOperation { | 2104 class HArgumentsLength: public HUnaryOperation { |
2014 public: | 2105 public: |
2015 explicit HArgumentsLength(HValue* value) : HUnaryOperation(value) { | 2106 explicit HArgumentsLength(HValue* value) : HUnaryOperation(value) { |
2016 set_representation(Representation::Integer32()); | 2107 set_representation(Representation::Integer32()); |
2017 SetFlag(kUseGVN); | 2108 SetFlag(kUseGVN); |
2018 } | 2109 } |
2019 | 2110 |
2020 DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength, "arguments_length") | 2111 DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength, "arguments_length") |
2021 | 2112 |
| 2113 virtual Representation RequiredInputRepresentation(int index) const { |
| 2114 return Representation::Tagged(); |
| 2115 } |
| 2116 |
2022 protected: | 2117 protected: |
2023 virtual bool DataEquals(HValue* other) { return true; } | 2118 virtual bool DataEquals(HValue* other) { return true; } |
2024 }; | 2119 }; |
2025 | 2120 |
2026 | 2121 |
2027 class HAccessArgumentsAt: public HInstruction { | 2122 class HAccessArgumentsAt: public HInstruction { |
2028 public: | 2123 public: |
2029 HAccessArgumentsAt(HValue* arguments, HValue* length, HValue* index) { | 2124 HAccessArgumentsAt(HValue* arguments, HValue* length, HValue* index) { |
2030 set_representation(Representation::Tagged()); | 2125 set_representation(Representation::Tagged()); |
2031 SetFlag(kUseGVN); | 2126 SetFlag(kUseGVN); |
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2282 public: | 2377 public: |
2283 HIsConstructCall() { | 2378 HIsConstructCall() { |
2284 set_representation(Representation::Tagged()); | 2379 set_representation(Representation::Tagged()); |
2285 SetFlag(kUseGVN); | 2380 SetFlag(kUseGVN); |
2286 } | 2381 } |
2287 | 2382 |
2288 virtual bool EmitAtUses() const { | 2383 virtual bool EmitAtUses() const { |
2289 return !HasSideEffects() && (uses()->length() <= 1); | 2384 return !HasSideEffects() && (uses()->length() <= 1); |
2290 } | 2385 } |
2291 | 2386 |
| 2387 virtual Representation RequiredInputRepresentation(int index) const { |
| 2388 return Representation::None(); |
| 2389 } |
| 2390 |
2292 DECLARE_CONCRETE_INSTRUCTION(IsConstructCall, "is_construct_call") | 2391 DECLARE_CONCRETE_INSTRUCTION(IsConstructCall, "is_construct_call") |
2293 | 2392 |
2294 protected: | 2393 protected: |
2295 virtual bool DataEquals(HValue* other) { return true; } | 2394 virtual bool DataEquals(HValue* other) { return true; } |
2296 }; | 2395 }; |
2297 | 2396 |
2298 | 2397 |
2299 class HHasInstanceType: public HUnaryPredicate { | 2398 class HHasInstanceType: public HUnaryPredicate { |
2300 public: | 2399 public: |
2301 HHasInstanceType(HValue* value, InstanceType type) | 2400 HHasInstanceType(HValue* value, InstanceType type) |
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2662 | 2761 |
2663 | 2762 |
2664 class HOsrEntry: public HInstruction { | 2763 class HOsrEntry: public HInstruction { |
2665 public: | 2764 public: |
2666 explicit HOsrEntry(int ast_id) : ast_id_(ast_id) { | 2765 explicit HOsrEntry(int ast_id) : ast_id_(ast_id) { |
2667 SetFlag(kChangesOsrEntries); | 2766 SetFlag(kChangesOsrEntries); |
2668 } | 2767 } |
2669 | 2768 |
2670 int ast_id() const { return ast_id_; } | 2769 int ast_id() const { return ast_id_; } |
2671 | 2770 |
| 2771 virtual Representation RequiredInputRepresentation(int index) const { |
| 2772 return Representation::None(); |
| 2773 } |
| 2774 |
2672 DECLARE_CONCRETE_INSTRUCTION(OsrEntry, "osr_entry") | 2775 DECLARE_CONCRETE_INSTRUCTION(OsrEntry, "osr_entry") |
2673 | 2776 |
2674 private: | 2777 private: |
2675 int ast_id_; | 2778 int ast_id_; |
2676 }; | 2779 }; |
2677 | 2780 |
2678 | 2781 |
2679 class HParameter: public HInstruction { | 2782 class HParameter: public HInstruction { |
2680 public: | 2783 public: |
2681 explicit HParameter(unsigned index) : index_(index) { | 2784 explicit HParameter(unsigned index) : index_(index) { |
2682 set_representation(Representation::Tagged()); | 2785 set_representation(Representation::Tagged()); |
2683 } | 2786 } |
2684 | 2787 |
2685 unsigned index() const { return index_; } | 2788 unsigned index() const { return index_; } |
2686 | 2789 |
2687 virtual void PrintDataTo(StringStream* stream); | 2790 virtual void PrintDataTo(StringStream* stream); |
2688 | 2791 |
| 2792 virtual Representation RequiredInputRepresentation(int index) const { |
| 2793 return Representation::None(); |
| 2794 } |
| 2795 |
2689 DECLARE_CONCRETE_INSTRUCTION(Parameter, "parameter") | 2796 DECLARE_CONCRETE_INSTRUCTION(Parameter, "parameter") |
2690 | 2797 |
2691 private: | 2798 private: |
2692 unsigned index_; | 2799 unsigned index_; |
2693 }; | 2800 }; |
2694 | 2801 |
2695 | 2802 |
2696 class HCallStub: public HUnaryCall { | 2803 class HCallStub: public HUnaryCall { |
2697 public: | 2804 public: |
2698 HCallStub(HValue* context, CodeStub::Major major_key, int argument_count) | 2805 HCallStub(HValue* context, CodeStub::Major major_key, int argument_count) |
2699 : HUnaryCall(context, argument_count), | 2806 : HUnaryCall(context, argument_count), |
2700 major_key_(major_key), | 2807 major_key_(major_key), |
2701 transcendental_type_(TranscendentalCache::kNumberOfCaches) { | 2808 transcendental_type_(TranscendentalCache::kNumberOfCaches) { |
2702 } | 2809 } |
2703 | 2810 |
2704 CodeStub::Major major_key() { return major_key_; } | 2811 CodeStub::Major major_key() { return major_key_; } |
2705 | 2812 |
2706 HValue* context() { return value(); } | 2813 HValue* context() { return value(); } |
2707 | 2814 |
2708 void set_transcendental_type(TranscendentalCache::Type transcendental_type) { | 2815 void set_transcendental_type(TranscendentalCache::Type transcendental_type) { |
2709 transcendental_type_ = transcendental_type; | 2816 transcendental_type_ = transcendental_type; |
2710 } | 2817 } |
2711 TranscendentalCache::Type transcendental_type() { | 2818 TranscendentalCache::Type transcendental_type() { |
2712 return transcendental_type_; | 2819 return transcendental_type_; |
2713 } | 2820 } |
2714 | 2821 |
2715 virtual void PrintDataTo(StringStream* stream); | 2822 virtual void PrintDataTo(StringStream* stream); |
2716 | 2823 |
| 2824 virtual Representation RequiredInputRepresentation(int index) const { |
| 2825 return Representation::Tagged(); |
| 2826 } |
| 2827 |
2717 DECLARE_CONCRETE_INSTRUCTION(CallStub, "call_stub") | 2828 DECLARE_CONCRETE_INSTRUCTION(CallStub, "call_stub") |
2718 | 2829 |
2719 private: | 2830 private: |
2720 CodeStub::Major major_key_; | 2831 CodeStub::Major major_key_; |
2721 TranscendentalCache::Type transcendental_type_; | 2832 TranscendentalCache::Type transcendental_type_; |
2722 }; | 2833 }; |
2723 | 2834 |
2724 | 2835 |
2725 class HUnknownOSRValue: public HInstruction { | 2836 class HUnknownOSRValue: public HInstruction { |
2726 public: | 2837 public: |
2727 HUnknownOSRValue() { set_representation(Representation::Tagged()); } | 2838 HUnknownOSRValue() { set_representation(Representation::Tagged()); } |
2728 | 2839 |
| 2840 virtual Representation RequiredInputRepresentation(int index) const { |
| 2841 return Representation::None(); |
| 2842 } |
| 2843 |
2729 DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue, "unknown_osr_value") | 2844 DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue, "unknown_osr_value") |
2730 }; | 2845 }; |
2731 | 2846 |
2732 | 2847 |
2733 class HLoadGlobal: public HInstruction { | 2848 class HLoadGlobal: public HInstruction { |
2734 public: | 2849 public: |
2735 HLoadGlobal(Handle<JSGlobalPropertyCell> cell, bool check_hole_value) | 2850 HLoadGlobal(Handle<JSGlobalPropertyCell> cell, bool check_hole_value) |
2736 : cell_(cell), check_hole_value_(check_hole_value) { | 2851 : cell_(cell), check_hole_value_(check_hole_value) { |
2737 set_representation(Representation::Tagged()); | 2852 set_representation(Representation::Tagged()); |
2738 SetFlag(kUseGVN); | 2853 SetFlag(kUseGVN); |
2739 SetFlag(kDependsOnGlobalVars); | 2854 SetFlag(kDependsOnGlobalVars); |
2740 } | 2855 } |
2741 | 2856 |
2742 Handle<JSGlobalPropertyCell> cell() const { return cell_; } | 2857 Handle<JSGlobalPropertyCell> cell() const { return cell_; } |
2743 bool check_hole_value() const { return check_hole_value_; } | 2858 bool check_hole_value() const { return check_hole_value_; } |
2744 | 2859 |
2745 virtual Representation RequiredInputRepresentation(int index) const { | |
2746 return Representation::Tagged(); | |
2747 } | |
2748 virtual void PrintDataTo(StringStream* stream); | 2860 virtual void PrintDataTo(StringStream* stream); |
2749 | 2861 |
2750 virtual intptr_t Hashcode() { | 2862 virtual intptr_t Hashcode() { |
2751 ASSERT(!Heap::allow_allocation(false)); | 2863 ASSERT(!Heap::allow_allocation(false)); |
2752 return reinterpret_cast<intptr_t>(*cell_); | 2864 return reinterpret_cast<intptr_t>(*cell_); |
2753 } | 2865 } |
2754 | 2866 |
| 2867 virtual Representation RequiredInputRepresentation(int index) const { |
| 2868 return Representation::None(); |
| 2869 } |
| 2870 |
2755 DECLARE_CONCRETE_INSTRUCTION(LoadGlobal, "load_global") | 2871 DECLARE_CONCRETE_INSTRUCTION(LoadGlobal, "load_global") |
2756 | 2872 |
2757 protected: | 2873 protected: |
2758 virtual bool DataEquals(HValue* other) { | 2874 virtual bool DataEquals(HValue* other) { |
2759 HLoadGlobal* b = HLoadGlobal::cast(other); | 2875 HLoadGlobal* b = HLoadGlobal::cast(other); |
2760 return cell_.is_identical_to(b->cell()); | 2876 return cell_.is_identical_to(b->cell()); |
2761 } | 2877 } |
2762 | 2878 |
2763 private: | 2879 private: |
2764 Handle<JSGlobalPropertyCell> cell_; | 2880 Handle<JSGlobalPropertyCell> cell_; |
(...skipping 570 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3335 int depth) | 3451 int depth) |
3336 : HMaterializedLiteral(literal_index, depth), | 3452 : HMaterializedLiteral(literal_index, depth), |
3337 length_(length), | 3453 length_(length), |
3338 constant_elements_(constant_elements) {} | 3454 constant_elements_(constant_elements) {} |
3339 | 3455 |
3340 Handle<FixedArray> constant_elements() const { return constant_elements_; } | 3456 Handle<FixedArray> constant_elements() const { return constant_elements_; } |
3341 int length() const { return length_; } | 3457 int length() const { return length_; } |
3342 | 3458 |
3343 bool IsCopyOnWrite() const; | 3459 bool IsCopyOnWrite() const; |
3344 | 3460 |
| 3461 virtual Representation RequiredInputRepresentation(int index) const { |
| 3462 return Representation::None(); |
| 3463 } |
| 3464 |
3345 DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral, "array_literal") | 3465 DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral, "array_literal") |
3346 | 3466 |
3347 private: | 3467 private: |
3348 int length_; | 3468 int length_; |
3349 Handle<FixedArray> constant_elements_; | 3469 Handle<FixedArray> constant_elements_; |
3350 }; | 3470 }; |
3351 | 3471 |
3352 | 3472 |
3353 class HObjectLiteral: public HMaterializedLiteral { | 3473 class HObjectLiteral: public HMaterializedLiteral { |
3354 public: | 3474 public: |
(...skipping 11 matching lines...) Expand all Loading... |
3366 | 3486 |
3367 HValue* context() const { return context_; } | 3487 HValue* context() const { return context_; } |
3368 Handle<FixedArray> constant_properties() const { | 3488 Handle<FixedArray> constant_properties() const { |
3369 return constant_properties_; | 3489 return constant_properties_; |
3370 } | 3490 } |
3371 bool fast_elements() const { return fast_elements_; } | 3491 bool fast_elements() const { return fast_elements_; } |
3372 | 3492 |
3373 virtual int OperandCount() { return 1; } | 3493 virtual int OperandCount() { return 1; } |
3374 virtual HValue* OperandAt(int index) { return context_; } | 3494 virtual HValue* OperandAt(int index) { return context_; } |
3375 | 3495 |
| 3496 virtual Representation RequiredInputRepresentation(int index) const { |
| 3497 return Representation::Tagged(); |
| 3498 } |
| 3499 |
3376 DECLARE_CONCRETE_INSTRUCTION(ObjectLiteral, "object_literal") | 3500 DECLARE_CONCRETE_INSTRUCTION(ObjectLiteral, "object_literal") |
3377 | 3501 |
3378 protected: | 3502 protected: |
3379 virtual void InternalSetOperandAt(int index, HValue* value) { | 3503 virtual void InternalSetOperandAt(int index, HValue* value) { |
3380 context_ = value; | 3504 context_ = value; |
3381 } | 3505 } |
3382 | 3506 |
3383 private: | 3507 private: |
3384 HValue* context_; | 3508 HValue* context_; |
3385 Handle<FixedArray> constant_properties_; | 3509 Handle<FixedArray> constant_properties_; |
3386 bool fast_elements_; | 3510 bool fast_elements_; |
3387 }; | 3511 }; |
3388 | 3512 |
3389 | 3513 |
3390 class HRegExpLiteral: public HMaterializedLiteral { | 3514 class HRegExpLiteral: public HMaterializedLiteral { |
3391 public: | 3515 public: |
3392 HRegExpLiteral(Handle<String> pattern, | 3516 HRegExpLiteral(Handle<String> pattern, |
3393 Handle<String> flags, | 3517 Handle<String> flags, |
3394 int literal_index) | 3518 int literal_index) |
3395 : HMaterializedLiteral(literal_index, 0), | 3519 : HMaterializedLiteral(literal_index, 0), |
3396 pattern_(pattern), | 3520 pattern_(pattern), |
3397 flags_(flags) { } | 3521 flags_(flags) { } |
3398 | 3522 |
3399 Handle<String> pattern() { return pattern_; } | 3523 Handle<String> pattern() { return pattern_; } |
3400 Handle<String> flags() { return flags_; } | 3524 Handle<String> flags() { return flags_; } |
3401 | 3525 |
| 3526 virtual Representation RequiredInputRepresentation(int index) const { |
| 3527 return Representation::None(); |
| 3528 } |
| 3529 |
3402 DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral, "regexp_literal") | 3530 DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral, "regexp_literal") |
3403 | 3531 |
3404 private: | 3532 private: |
3405 Handle<String> pattern_; | 3533 Handle<String> pattern_; |
3406 Handle<String> flags_; | 3534 Handle<String> flags_; |
3407 }; | 3535 }; |
3408 | 3536 |
3409 | 3537 |
3410 class HFunctionLiteral: public HInstruction { | 3538 class HFunctionLiteral: public HInstruction { |
3411 public: | 3539 public: |
3412 HFunctionLiteral(Handle<SharedFunctionInfo> shared, bool pretenure) | 3540 HFunctionLiteral(Handle<SharedFunctionInfo> shared, bool pretenure) |
3413 : shared_info_(shared), pretenure_(pretenure) { | 3541 : shared_info_(shared), pretenure_(pretenure) { |
3414 set_representation(Representation::Tagged()); | 3542 set_representation(Representation::Tagged()); |
3415 } | 3543 } |
3416 | 3544 |
| 3545 virtual Representation RequiredInputRepresentation(int index) const { |
| 3546 return Representation::None(); |
| 3547 } |
| 3548 |
3417 DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral, "function_literal") | 3549 DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral, "function_literal") |
3418 | 3550 |
3419 Handle<SharedFunctionInfo> shared_info() const { return shared_info_; } | 3551 Handle<SharedFunctionInfo> shared_info() const { return shared_info_; } |
3420 bool pretenure() const { return pretenure_; } | 3552 bool pretenure() const { return pretenure_; } |
3421 | 3553 |
3422 private: | 3554 private: |
3423 Handle<SharedFunctionInfo> shared_info_; | 3555 Handle<SharedFunctionInfo> shared_info_; |
3424 bool pretenure_; | 3556 bool pretenure_; |
3425 }; | 3557 }; |
3426 | 3558 |
(...skipping 11 matching lines...) Expand all Loading... |
3438 DECLARE_CONCRETE_INSTRUCTION(Typeof, "typeof") | 3570 DECLARE_CONCRETE_INSTRUCTION(Typeof, "typeof") |
3439 }; | 3571 }; |
3440 | 3572 |
3441 | 3573 |
3442 class HValueOf: public HUnaryOperation { | 3574 class HValueOf: public HUnaryOperation { |
3443 public: | 3575 public: |
3444 explicit HValueOf(HValue* value) : HUnaryOperation(value) { | 3576 explicit HValueOf(HValue* value) : HUnaryOperation(value) { |
3445 set_representation(Representation::Tagged()); | 3577 set_representation(Representation::Tagged()); |
3446 } | 3578 } |
3447 | 3579 |
| 3580 virtual Representation RequiredInputRepresentation(int index) const { |
| 3581 return Representation::Tagged(); |
| 3582 } |
| 3583 |
3448 DECLARE_CONCRETE_INSTRUCTION(ValueOf, "value_of") | 3584 DECLARE_CONCRETE_INSTRUCTION(ValueOf, "value_of") |
3449 }; | 3585 }; |
3450 | 3586 |
3451 | 3587 |
3452 class HDeleteProperty: public HBinaryOperation { | 3588 class HDeleteProperty: public HBinaryOperation { |
3453 public: | 3589 public: |
3454 HDeleteProperty(HValue* obj, HValue* key) | 3590 HDeleteProperty(HValue* obj, HValue* key) |
3455 : HBinaryOperation(obj, key) { | 3591 : HBinaryOperation(obj, key) { |
3456 set_representation(Representation::Tagged()); | 3592 set_representation(Representation::Tagged()); |
3457 SetAllSideEffects(); | 3593 SetAllSideEffects(); |
3458 } | 3594 } |
3459 | 3595 |
3460 virtual Representation RequiredInputRepresentation(int index) const { | 3596 virtual Representation RequiredInputRepresentation(int index) const { |
3461 return Representation::Tagged(); | 3597 return Representation::Tagged(); |
3462 } | 3598 } |
3463 | 3599 |
3464 DECLARE_CONCRETE_INSTRUCTION(DeleteProperty, "delete_property") | 3600 DECLARE_CONCRETE_INSTRUCTION(DeleteProperty, "delete_property") |
3465 | 3601 |
3466 HValue* object() { return left(); } | 3602 HValue* object() { return left(); } |
3467 HValue* key() { return right(); } | 3603 HValue* key() { return right(); } |
3468 }; | 3604 }; |
3469 | 3605 |
3470 #undef DECLARE_INSTRUCTION | 3606 #undef DECLARE_INSTRUCTION |
3471 #undef DECLARE_CONCRETE_INSTRUCTION | 3607 #undef DECLARE_CONCRETE_INSTRUCTION |
3472 | 3608 |
3473 } } // namespace v8::internal | 3609 } } // namespace v8::internal |
3474 | 3610 |
3475 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 3611 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
OLD | NEW |