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

Side by Side Diff: src/ast/ast.h

Issue 2209633002: [Interpreter] Assign feedback slots for binary operations and use them in ignition. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 4 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 | « no previous file | src/ast/ast.cc » ('j') | src/ast/ast.cc » ('J')
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_AST_AST_H_ 5 #ifndef V8_AST_AST_H_
6 #define V8_AST_AST_H_ 6 #define V8_AST_AST_H_
7 7
8 #include "src/ast/ast-value-factory.h" 8 #include "src/ast/ast-value-factory.h"
9 #include "src/ast/modules.h" 9 #include "src/ast/modules.h"
10 #include "src/ast/variables.h" 10 #include "src/ast/variables.h"
(...skipping 2104 matching lines...) Expand 10 before | Expand all | Expand 10 after
2115 default: 2115 default:
2116 break; 2116 break;
2117 } 2117 }
2118 } 2118 }
2119 2119
2120 // The short-circuit logical operations need an AST ID for their 2120 // The short-circuit logical operations need an AST ID for their
2121 // right-hand subexpression. 2121 // right-hand subexpression.
2122 static int num_ids() { return parent_num_ids() + 2; } 2122 static int num_ids() { return parent_num_ids() + 2; }
2123 BailoutId RightId() const { return BailoutId(local_id(0)); } 2123 BailoutId RightId() const { return BailoutId(local_id(0)); }
2124 2124
2125 // BinaryOperation will have both a slot in the feedback vector and the
2126 // TypeFeedbackId to record the type information. TypeFeedbackId is used
2127 // by full codegen and the feedback vector slot is used by interpreter.
2128 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec,
2129 FeedbackVectorSlotCache* cache);
2130
2131 FeedbackVectorSlot BinaryOperationFeedbackSlot() const {
2132 return type_feedback_slot_;
2133 }
2134
2125 TypeFeedbackId BinaryOperationFeedbackId() const { 2135 TypeFeedbackId BinaryOperationFeedbackId() const {
2126 return TypeFeedbackId(local_id(1)); 2136 return TypeFeedbackId(local_id(1));
2127 } 2137 }
2128 Maybe<int> fixed_right_arg() const { 2138 Maybe<int> fixed_right_arg() const {
2129 return has_fixed_right_arg_ ? Just(fixed_right_arg_value_) : Nothing<int>(); 2139 return has_fixed_right_arg_ ? Just(fixed_right_arg_value_) : Nothing<int>();
2130 } 2140 }
2131 void set_fixed_right_arg(Maybe<int> arg) { 2141 void set_fixed_right_arg(Maybe<int> arg) {
2132 has_fixed_right_arg_ = arg.IsJust(); 2142 has_fixed_right_arg_ = arg.IsJust();
2133 if (arg.IsJust()) fixed_right_arg_value_ = arg.FromJust(); 2143 if (arg.IsJust()) fixed_right_arg_value_ = arg.FromJust();
2134 } 2144 }
(...skipping 17 matching lines...) Expand all
2152 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 2162 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
2153 2163
2154 const byte op_; // actually Token::Value 2164 const byte op_; // actually Token::Value
2155 // TODO(rossberg): the fixed arg should probably be represented as a Constant 2165 // TODO(rossberg): the fixed arg should probably be represented as a Constant
2156 // type for the RHS. Currenty it's actually a Maybe<int> 2166 // type for the RHS. Currenty it's actually a Maybe<int>
2157 bool has_fixed_right_arg_; 2167 bool has_fixed_right_arg_;
2158 int fixed_right_arg_value_; 2168 int fixed_right_arg_value_;
2159 Expression* left_; 2169 Expression* left_;
2160 Expression* right_; 2170 Expression* right_;
2161 Handle<AllocationSite> allocation_site_; 2171 Handle<AllocationSite> allocation_site_;
2172 FeedbackVectorSlot type_feedback_slot_;
2162 }; 2173 };
2163 2174
2164 2175
2165 class CountOperation final : public Expression { 2176 class CountOperation final : public Expression {
2166 public: 2177 public:
2167 DECLARE_NODE_TYPE(CountOperation) 2178 DECLARE_NODE_TYPE(CountOperation)
2168 2179
2169 bool is_prefix() const { return IsPrefixField::decode(bit_field_); } 2180 bool is_prefix() const { return IsPrefixField::decode(bit_field_); }
2170 bool is_postfix() const { return !is_prefix(); } 2181 bool is_postfix() const { return !is_prefix(); }
2171 2182
(...skipping 23 matching lines...) Expand all
2195 static int num_ids() { return parent_num_ids() + 4; } 2206 static int num_ids() { return parent_num_ids() + 4; }
2196 BailoutId AssignmentId() const { return BailoutId(local_id(0)); } 2207 BailoutId AssignmentId() const { return BailoutId(local_id(0)); }
2197 BailoutId ToNumberId() const { return BailoutId(local_id(1)); } 2208 BailoutId ToNumberId() const { return BailoutId(local_id(1)); }
2198 TypeFeedbackId CountBinOpFeedbackId() const { 2209 TypeFeedbackId CountBinOpFeedbackId() const {
2199 return TypeFeedbackId(local_id(2)); 2210 return TypeFeedbackId(local_id(2));
2200 } 2211 }
2201 TypeFeedbackId CountStoreFeedbackId() const { 2212 TypeFeedbackId CountStoreFeedbackId() const {
2202 return TypeFeedbackId(local_id(3)); 2213 return TypeFeedbackId(local_id(3));
2203 } 2214 }
2204 2215
2216 // Feedback slot for binary operation is only used by ignition.
2217 FeedbackVectorSlot CountBinaryOpFeedbackSlot() const {
2218 return binary_operation_slot_;
2219 }
2220
2205 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 2221 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec,
2206 FeedbackVectorSlotCache* cache); 2222 FeedbackVectorSlotCache* cache);
2207 FeedbackVectorSlot CountSlot() const { return slot_; } 2223 FeedbackVectorSlot CountSlot() const { return slot_; }
2208 2224
2209 protected: 2225 protected:
2210 CountOperation(Zone* zone, Token::Value op, bool is_prefix, Expression* expr, 2226 CountOperation(Zone* zone, Token::Value op, bool is_prefix, Expression* expr,
2211 int pos) 2227 int pos)
2212 : Expression(zone, pos, kCountOperation), 2228 : Expression(zone, pos, kCountOperation),
2213 bit_field_( 2229 bit_field_(
2214 IsPrefixField::encode(is_prefix) | KeyTypeField::encode(ELEMENT) | 2230 IsPrefixField::encode(is_prefix) | KeyTypeField::encode(ELEMENT) |
2215 StoreModeField::encode(STANDARD_STORE) | TokenField::encode(op)), 2231 StoreModeField::encode(STANDARD_STORE) | TokenField::encode(op)),
2216 type_(NULL), 2232 type_(NULL),
2217 expression_(expr) {} 2233 expression_(expr) {}
2218 static int parent_num_ids() { return Expression::num_ids(); } 2234 static int parent_num_ids() { return Expression::num_ids(); }
2219 2235
2220 private: 2236 private:
2221 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 2237 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
2222 2238
2223 class IsPrefixField : public BitField16<bool, 0, 1> {}; 2239 class IsPrefixField : public BitField16<bool, 0, 1> {};
2224 class KeyTypeField : public BitField16<IcCheckType, 1, 1> {}; 2240 class KeyTypeField : public BitField16<IcCheckType, 1, 1> {};
2225 class StoreModeField : public BitField16<KeyedAccessStoreMode, 2, 3> {}; 2241 class StoreModeField : public BitField16<KeyedAccessStoreMode, 2, 3> {};
2226 class TokenField : public BitField16<Token::Value, 5, 8> {}; 2242 class TokenField : public BitField16<Token::Value, 5, 8> {};
2227 2243
2228 // Starts with 16-bit field, which should get packed together with 2244 // Starts with 16-bit field, which should get packed together with
2229 // Expression's trailing 16-bit field. 2245 // Expression's trailing 16-bit field.
2230 uint16_t bit_field_; 2246 uint16_t bit_field_;
2231 FeedbackVectorSlot slot_; 2247 FeedbackVectorSlot slot_;
2248 FeedbackVectorSlot binary_operation_slot_;
2232 Type* type_; 2249 Type* type_;
2233 Expression* expression_; 2250 Expression* expression_;
2234 SmallMapList receiver_types_; 2251 SmallMapList receiver_types_;
2235 }; 2252 };
2236 2253
2237 2254
2238 class CompareOperation final : public Expression { 2255 class CompareOperation final : public Expression {
2239 public: 2256 public:
2240 DECLARE_NODE_TYPE(CompareOperation) 2257 DECLARE_NODE_TYPE(CompareOperation)
2241 2258
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
2363 void set_value(Expression* e) { value_ = e; } 2380 void set_value(Expression* e) { value_ = e; }
2364 2381
2365 BinaryOperation* binary_operation() const { return binary_operation_; } 2382 BinaryOperation* binary_operation() const { return binary_operation_; }
2366 2383
2367 // This check relies on the definition order of token in token.h. 2384 // This check relies on the definition order of token in token.h.
2368 bool is_compound() const { return op() > Token::ASSIGN; } 2385 bool is_compound() const { return op() > Token::ASSIGN; }
2369 2386
2370 static int num_ids() { return parent_num_ids() + 2; } 2387 static int num_ids() { return parent_num_ids() + 2; }
2371 BailoutId AssignmentId() const { return BailoutId(local_id(0)); } 2388 BailoutId AssignmentId() const { return BailoutId(local_id(0)); }
2372 2389
2390 // Type feedback vector slot. Used only by ignition.
2391 FeedbackVectorSlot BinaryOperationFeedbackSlot() const {
2392 return binary_operation_slot_;
2393 }
2394
2373 // Type feedback information. 2395 // Type feedback information.
2374 TypeFeedbackId AssignmentFeedbackId() { return TypeFeedbackId(local_id(1)); } 2396 TypeFeedbackId AssignmentFeedbackId() { return TypeFeedbackId(local_id(1)); }
2375 bool IsUninitialized() const { 2397 bool IsUninitialized() const {
2376 return IsUninitializedField::decode(bit_field_); 2398 return IsUninitializedField::decode(bit_field_);
2377 } 2399 }
2378 bool HasNoTypeInformation() { 2400 bool HasNoTypeInformation() {
2379 return IsUninitializedField::decode(bit_field_); 2401 return IsUninitializedField::decode(bit_field_);
2380 } 2402 }
2381 bool IsMonomorphic() const { return receiver_types_.length() == 1; } 2403 bool IsMonomorphic() const { return receiver_types_.length() == 1; }
2382 SmallMapList* GetReceiverTypes() { return &receiver_types_; } 2404 SmallMapList* GetReceiverTypes() { return &receiver_types_; }
(...skipping 28 matching lines...) Expand all
2411 : public BitField16<IcCheckType, IsUninitializedField::kNext, 1> {}; 2433 : public BitField16<IcCheckType, IsUninitializedField::kNext, 1> {};
2412 class StoreModeField 2434 class StoreModeField
2413 : public BitField16<KeyedAccessStoreMode, KeyTypeField::kNext, 3> {}; 2435 : public BitField16<KeyedAccessStoreMode, KeyTypeField::kNext, 3> {};
2414 class TokenField : public BitField16<Token::Value, StoreModeField::kNext, 8> { 2436 class TokenField : public BitField16<Token::Value, StoreModeField::kNext, 8> {
2415 }; 2437 };
2416 2438
2417 // Starts with 16-bit field, which should get packed together with 2439 // Starts with 16-bit field, which should get packed together with
2418 // Expression's trailing 16-bit field. 2440 // Expression's trailing 16-bit field.
2419 uint16_t bit_field_; 2441 uint16_t bit_field_;
2420 FeedbackVectorSlot slot_; 2442 FeedbackVectorSlot slot_;
2443 FeedbackVectorSlot binary_operation_slot_;
2421 Expression* target_; 2444 Expression* target_;
2422 Expression* value_; 2445 Expression* value_;
2423 BinaryOperation* binary_operation_; 2446 BinaryOperation* binary_operation_;
2424 SmallMapList receiver_types_; 2447 SmallMapList receiver_types_;
2425 }; 2448 };
2426 2449
2427 2450
2428 // The RewritableExpression class is a wrapper for AST nodes that wait 2451 // The RewritableExpression class is a wrapper for AST nodes that wait
2429 // for some potential rewriting. However, even if such nodes are indeed 2452 // for some potential rewriting. However, even if such nodes are indeed
2430 // rewritten, the RewritableExpression wrapper nodes will survive in the 2453 // rewritten, the RewritableExpression wrapper nodes will survive in the
(...skipping 1088 matching lines...) Expand 10 before | Expand all | Expand 10 after
3519 : NULL; \ 3542 : NULL; \
3520 } 3543 }
3521 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) 3544 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS)
3522 #undef DECLARE_NODE_FUNCTIONS 3545 #undef DECLARE_NODE_FUNCTIONS
3523 3546
3524 3547
3525 } // namespace internal 3548 } // namespace internal
3526 } // namespace v8 3549 } // namespace v8
3527 3550
3528 #endif // V8_AST_AST_H_ 3551 #endif // V8_AST_AST_H_
OLDNEW
« no previous file with comments | « no previous file | src/ast/ast.cc » ('j') | src/ast/ast.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698