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

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

Issue 2391043005: [crankshaft] Remove HLoadKeyedGeneric and use HCallWithDescriptor to call KeyedLoadIC. (Closed)
Patch Set: Rebasing Created 4 years, 2 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
« no previous file with comments | « src/crankshaft/hydrogen.cc ('k') | src/crankshaft/hydrogen-instructions.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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_
OLDNEW
« no previous file with comments | « src/crankshaft/hydrogen.cc ('k') | src/crankshaft/hydrogen-instructions.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698