OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_ | 5 #ifndef V8_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_ |
6 #define V8_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_ | 6 #define V8_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_ |
7 | 7 |
8 #include <cstring> | 8 #include <cstring> |
9 #include <iosfwd> | 9 #include <iosfwd> |
10 | 10 |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
99 V(InvokeFunction) \ | 99 V(InvokeFunction) \ |
100 V(HasInPrototypeChainAndBranch) \ | 100 V(HasInPrototypeChainAndBranch) \ |
101 V(IsStringAndBranch) \ | 101 V(IsStringAndBranch) \ |
102 V(IsSmiAndBranch) \ | 102 V(IsSmiAndBranch) \ |
103 V(IsUndetectableAndBranch) \ | 103 V(IsUndetectableAndBranch) \ |
104 V(LeaveInlined) \ | 104 V(LeaveInlined) \ |
105 V(LoadContextSlot) \ | 105 V(LoadContextSlot) \ |
106 V(LoadFieldByIndex) \ | 106 V(LoadFieldByIndex) \ |
107 V(LoadFunctionPrototype) \ | 107 V(LoadFunctionPrototype) \ |
108 V(LoadKeyed) \ | 108 V(LoadKeyed) \ |
109 V(LoadKeyedGeneric) \ | |
110 V(LoadNamedField) \ | 109 V(LoadNamedField) \ |
111 V(LoadRoot) \ | 110 V(LoadRoot) \ |
112 V(MathFloorOfDiv) \ | 111 V(MathFloorOfDiv) \ |
113 V(MathMinMax) \ | 112 V(MathMinMax) \ |
114 V(MaybeGrowElements) \ | 113 V(MaybeGrowElements) \ |
115 V(Mod) \ | 114 V(Mod) \ |
116 V(Mul) \ | 115 V(Mul) \ |
117 V(OsrEntry) \ | 116 V(OsrEntry) \ |
118 V(Parameter) \ | 117 V(Parameter) \ |
119 V(Power) \ | 118 V(Power) \ |
(...skipping 2032 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2152 | 2151 |
2153 class HCallWithDescriptor final : public HInstruction { | 2152 class HCallWithDescriptor final : public HInstruction { |
2154 public: | 2153 public: |
2155 static HCallWithDescriptor* New( | 2154 static HCallWithDescriptor* New( |
2156 Isolate* isolate, Zone* zone, HValue* context, HValue* target, | 2155 Isolate* isolate, Zone* zone, HValue* context, HValue* target, |
2157 int argument_count, CallInterfaceDescriptor descriptor, | 2156 int argument_count, CallInterfaceDescriptor descriptor, |
2158 const Vector<HValue*>& operands, | 2157 const Vector<HValue*>& operands, |
2159 TailCallMode syntactic_tail_call_mode = TailCallMode::kDisallow, | 2158 TailCallMode syntactic_tail_call_mode = TailCallMode::kDisallow, |
2160 TailCallMode tail_call_mode = TailCallMode::kDisallow) { | 2159 TailCallMode tail_call_mode = TailCallMode::kDisallow) { |
2161 HCallWithDescriptor* res = new (zone) HCallWithDescriptor( | 2160 HCallWithDescriptor* res = new (zone) HCallWithDescriptor( |
2162 context, target, argument_count, descriptor, operands, | 2161 Code::STUB, context, target, argument_count, descriptor, operands, |
2163 syntactic_tail_call_mode, tail_call_mode, zone); | 2162 syntactic_tail_call_mode, tail_call_mode, zone); |
2164 return res; | 2163 return res; |
2165 } | 2164 } |
| 2165 |
| 2166 static HCallWithDescriptor* New( |
| 2167 Isolate* isolate, Zone* zone, HValue* context, Code::Kind kind, |
| 2168 HValue* target, int argument_count, CallInterfaceDescriptor descriptor, |
| 2169 const Vector<HValue*>& operands, |
| 2170 TailCallMode syntactic_tail_call_mode = TailCallMode::kDisallow, |
| 2171 TailCallMode tail_call_mode = TailCallMode::kDisallow) { |
| 2172 HCallWithDescriptor* res = new (zone) HCallWithDescriptor( |
| 2173 kind, context, target, argument_count, descriptor, operands, |
| 2174 syntactic_tail_call_mode, tail_call_mode, zone); |
| 2175 return res; |
| 2176 } |
2166 | 2177 |
2167 int OperandCount() const final { return values_.length(); } | 2178 int OperandCount() const final { return values_.length(); } |
2168 HValue* OperandAt(int index) const final { return values_[index]; } | 2179 HValue* OperandAt(int index) const final { return values_[index]; } |
2169 | 2180 |
2170 Representation RequiredInputRepresentation(int index) final { | 2181 Representation RequiredInputRepresentation(int index) final { |
2171 if (index == 0 || index == 1) { | 2182 if (index == 0 || index == 1) { |
2172 // Target + context | 2183 // Target + context |
2173 return Representation::Tagged(); | 2184 return Representation::Tagged(); |
2174 } else { | 2185 } else { |
2175 int par_index = index - 2; | 2186 int par_index = index - 2; |
2176 DCHECK(par_index < GetParameterCount()); | 2187 DCHECK(par_index < GetParameterCount()); |
2177 return RepresentationFromMachineType( | 2188 return RepresentationFromMachineType( |
2178 descriptor_.GetParameterType(par_index)); | 2189 descriptor_.GetParameterType(par_index)); |
2179 } | 2190 } |
2180 } | 2191 } |
2181 | 2192 |
2182 DECLARE_CONCRETE_INSTRUCTION(CallWithDescriptor) | 2193 DECLARE_CONCRETE_INSTRUCTION(CallWithDescriptor) |
2183 | 2194 |
2184 // Defines whether this instruction corresponds to a JS call at tail position. | 2195 // Defines whether this instruction corresponds to a JS call at tail position. |
2185 TailCallMode syntactic_tail_call_mode() const { | 2196 TailCallMode syntactic_tail_call_mode() const { |
2186 return SyntacticTailCallModeField::decode(bit_field_); | 2197 return SyntacticTailCallModeField::decode(bit_field_); |
2187 } | 2198 } |
2188 | 2199 |
2189 // Defines whether this call should be generated as a tail call. | 2200 // Defines whether this call should be generated as a tail call. |
2190 TailCallMode tail_call_mode() const { | 2201 TailCallMode tail_call_mode() const { |
2191 return TailCallModeField::decode(bit_field_); | 2202 return TailCallModeField::decode(bit_field_); |
2192 } | 2203 } |
2193 bool IsTailCall() const { return tail_call_mode() == TailCallMode::kAllow; } | 2204 bool IsTailCall() const { return tail_call_mode() == TailCallMode::kAllow; } |
2194 | 2205 |
| 2206 Code::Kind kind() const { return KindField::decode(bit_field_); } |
| 2207 |
2195 virtual int argument_count() const { | 2208 virtual int argument_count() const { |
2196 return argument_count_; | 2209 return argument_count_; |
2197 } | 2210 } |
2198 | 2211 |
2199 int argument_delta() const override { return -argument_count_; } | 2212 int argument_delta() const override { return -argument_count_; } |
2200 | 2213 |
2201 CallInterfaceDescriptor descriptor() const { return descriptor_; } | 2214 CallInterfaceDescriptor descriptor() const { return descriptor_; } |
2202 | 2215 |
2203 HValue* target() { return OperandAt(0); } | 2216 HValue* target() { return OperandAt(0); } |
2204 HValue* context() { return OperandAt(1); } | 2217 HValue* context() { return OperandAt(1); } |
2205 HValue* parameter(int index) { | 2218 HValue* parameter(int index) { |
2206 DCHECK_LT(index, GetParameterCount()); | 2219 DCHECK_LT(index, GetParameterCount()); |
2207 return OperandAt(index + 2); | 2220 return OperandAt(index + 2); |
2208 } | 2221 } |
2209 | 2222 |
| 2223 HValue* Canonicalize() override; |
| 2224 |
2210 std::ostream& PrintDataTo(std::ostream& os) const override; // NOLINT | 2225 std::ostream& PrintDataTo(std::ostream& os) const override; // NOLINT |
2211 | 2226 |
2212 private: | 2227 private: |
2213 // The argument count includes the receiver. | 2228 // The argument count includes the receiver. |
2214 HCallWithDescriptor(HValue* context, HValue* target, int argument_count, | 2229 HCallWithDescriptor(Code::Kind kind, HValue* context, HValue* target, |
2215 CallInterfaceDescriptor descriptor, | 2230 int argument_count, CallInterfaceDescriptor descriptor, |
2216 const Vector<HValue*>& operands, | 2231 const Vector<HValue*>& operands, |
2217 TailCallMode syntactic_tail_call_mode, | 2232 TailCallMode syntactic_tail_call_mode, |
2218 TailCallMode tail_call_mode, Zone* zone) | 2233 TailCallMode tail_call_mode, Zone* zone) |
2219 : descriptor_(descriptor), | 2234 : descriptor_(descriptor), |
2220 values_(GetParameterCount() + 2, zone), // +2 for context and target. | 2235 values_(GetParameterCount() + 2, zone), // +2 for context and target. |
2221 argument_count_(argument_count), | 2236 argument_count_(argument_count), |
2222 bit_field_( | 2237 bit_field_( |
2223 TailCallModeField::encode(tail_call_mode) | | 2238 TailCallModeField::encode(tail_call_mode) | |
2224 SyntacticTailCallModeField::encode(syntactic_tail_call_mode)) { | 2239 SyntacticTailCallModeField::encode(syntactic_tail_call_mode) | |
| 2240 KindField::encode(kind)) { |
2225 DCHECK_EQ(operands.length(), GetParameterCount()); | 2241 DCHECK_EQ(operands.length(), GetParameterCount()); |
2226 // We can only tail call without any stack arguments. | 2242 // We can only tail call without any stack arguments. |
2227 DCHECK(tail_call_mode != TailCallMode::kAllow || argument_count == 0); | 2243 DCHECK(tail_call_mode != TailCallMode::kAllow || argument_count == 0); |
2228 AddOperand(target, zone); | 2244 AddOperand(target, zone); |
2229 AddOperand(context, zone); | 2245 AddOperand(context, zone); |
2230 for (int i = 0; i < operands.length(); i++) { | 2246 for (int i = 0; i < operands.length(); i++) { |
2231 AddOperand(operands[i], zone); | 2247 AddOperand(operands[i], zone); |
2232 } | 2248 } |
2233 this->set_representation(Representation::Tagged()); | 2249 this->set_representation(Representation::Tagged()); |
2234 this->SetAllSideEffects(); | 2250 this->SetAllSideEffects(); |
2235 } | 2251 } |
2236 | 2252 |
2237 void AddOperand(HValue* v, Zone* zone) { | 2253 void AddOperand(HValue* v, Zone* zone) { |
2238 values_.Add(NULL, zone); | 2254 values_.Add(NULL, zone); |
2239 SetOperandAt(values_.length() - 1, v); | 2255 SetOperandAt(values_.length() - 1, v); |
2240 } | 2256 } |
2241 | 2257 |
2242 int GetParameterCount() const { return descriptor_.GetParameterCount(); } | 2258 int GetParameterCount() const { return descriptor_.GetParameterCount(); } |
2243 | 2259 |
2244 void InternalSetOperandAt(int index, HValue* value) final { | 2260 void InternalSetOperandAt(int index, HValue* value) final { |
2245 values_[index] = value; | 2261 values_[index] = value; |
2246 } | 2262 } |
2247 | 2263 |
2248 CallInterfaceDescriptor descriptor_; | 2264 CallInterfaceDescriptor descriptor_; |
2249 ZoneList<HValue*> values_; | 2265 ZoneList<HValue*> values_; |
2250 int argument_count_; | 2266 int argument_count_; |
2251 class TailCallModeField : public BitField<TailCallMode, 0, 1> {}; | 2267 class TailCallModeField : public BitField<TailCallMode, 0, 1> {}; |
2252 class SyntacticTailCallModeField | 2268 class SyntacticTailCallModeField |
2253 : public BitField<TailCallMode, TailCallModeField::kNext, 1> {}; | 2269 : public BitField<TailCallMode, TailCallModeField::kNext, 1> {}; |
| 2270 class KindField |
| 2271 : public BitField<Code::Kind, SyntacticTailCallModeField::kNext, 5> {}; |
2254 uint32_t bit_field_; | 2272 uint32_t bit_field_; |
2255 }; | 2273 }; |
2256 | 2274 |
2257 | 2275 |
2258 class HInvokeFunction final : public HBinaryCall { | 2276 class HInvokeFunction final : public HBinaryCall { |
2259 public: | 2277 public: |
2260 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P5(HInvokeFunction, HValue*, | 2278 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P5(HInvokeFunction, HValue*, |
2261 Handle<JSFunction>, int, | 2279 Handle<JSFunction>, int, |
2262 TailCallMode, TailCallMode); | 2280 TailCallMode, TailCallMode); |
2263 | 2281 |
(...skipping 3770 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6034 class BaseOffsetField: | 6052 class BaseOffsetField: |
6035 public BitField<uint32_t, kStartBaseOffset, kBitsForBaseOffset> | 6053 public BitField<uint32_t, kStartBaseOffset, kBitsForBaseOffset> |
6036 {}; // NOLINT | 6054 {}; // NOLINT |
6037 class IsDehoistedField: | 6055 class IsDehoistedField: |
6038 public BitField<bool, kStartIsDehoisted, kBitsForIsDehoisted> | 6056 public BitField<bool, kStartIsDehoisted, kBitsForIsDehoisted> |
6039 {}; // NOLINT | 6057 {}; // NOLINT |
6040 uint32_t bit_field_; | 6058 uint32_t bit_field_; |
6041 }; | 6059 }; |
6042 | 6060 |
6043 | 6061 |
6044 class HLoadKeyedGeneric final : public HTemplateInstruction<3> { | |
6045 public: | |
6046 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HLoadKeyedGeneric, HValue*, | |
6047 HValue*, | |
6048 Handle<TypeFeedbackVector>, | |
6049 FeedbackVectorSlot); | |
6050 HValue* object() const { return OperandAt(0); } | |
6051 HValue* key() const { return OperandAt(1); } | |
6052 HValue* context() const { return OperandAt(2); } | |
6053 FeedbackVectorSlot slot() const { return slot_; } | |
6054 Handle<TypeFeedbackVector> feedback_vector() const { | |
6055 return feedback_vector_; | |
6056 } | |
6057 | |
6058 std::ostream& PrintDataTo(std::ostream& os) const override; // NOLINT | |
6059 | |
6060 Representation RequiredInputRepresentation(int index) override { | |
6061 // tagged[tagged] | |
6062 return Representation::Tagged(); | |
6063 } | |
6064 | |
6065 HValue* Canonicalize() override; | |
6066 | |
6067 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric) | |
6068 | |
6069 private: | |
6070 HLoadKeyedGeneric(HValue* context, HValue* obj, HValue* key, | |
6071 Handle<TypeFeedbackVector> vector, FeedbackVectorSlot slot) | |
6072 : feedback_vector_(vector), slot_(slot) { | |
6073 set_representation(Representation::Tagged()); | |
6074 SetOperandAt(0, obj); | |
6075 SetOperandAt(1, key); | |
6076 SetOperandAt(2, context); | |
6077 SetAllSideEffects(); | |
6078 } | |
6079 | |
6080 Handle<TypeFeedbackVector> feedback_vector_; | |
6081 FeedbackVectorSlot slot_; | |
6082 }; | |
6083 | |
6084 | |
6085 // Indicates whether the store is a store to an entry that was previously | 6062 // Indicates whether the store is a store to an entry that was previously |
6086 // initialized or not. | 6063 // initialized or not. |
6087 enum StoreFieldOrKeyedMode { | 6064 enum StoreFieldOrKeyedMode { |
6088 // The entry could be either previously initialized or not. | 6065 // The entry could be either previously initialized or not. |
6089 INITIALIZING_STORE, | 6066 INITIALIZING_STORE, |
6090 // At the time of this store it is guaranteed that the entry is already | 6067 // At the time of this store it is guaranteed that the entry is already |
6091 // initialized. | 6068 // initialized. |
6092 STORE_TO_INITIALIZED_ENTRY | 6069 STORE_TO_INITIALIZED_ENTRY |
6093 }; | 6070 }; |
6094 | 6071 |
(...skipping 856 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6951 bool IsDeletable() const override { return true; } | 6928 bool IsDeletable() const override { return true; } |
6952 }; | 6929 }; |
6953 | 6930 |
6954 #undef DECLARE_INSTRUCTION | 6931 #undef DECLARE_INSTRUCTION |
6955 #undef DECLARE_CONCRETE_INSTRUCTION | 6932 #undef DECLARE_CONCRETE_INSTRUCTION |
6956 | 6933 |
6957 } // namespace internal | 6934 } // namespace internal |
6958 } // namespace v8 | 6935 } // namespace v8 |
6959 | 6936 |
6960 #endif // V8_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_ | 6937 #endif // V8_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_ |
OLD | NEW |