OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/ic/ic.h" | 7 #include "src/ic/ic.h" |
8 #include "src/ic/ic-state.h" | 8 #include "src/ic/ic-state.h" |
9 | 9 |
10 namespace v8 { | 10 namespace v8 { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
45 | 45 |
46 | 46 |
47 BinaryOpICState::BinaryOpICState(Isolate* isolate, ExtraICState extra_ic_state) | 47 BinaryOpICState::BinaryOpICState(Isolate* isolate, ExtraICState extra_ic_state) |
48 : fixed_right_arg_( | 48 : fixed_right_arg_( |
49 HasFixedRightArgField::decode(extra_ic_state) | 49 HasFixedRightArgField::decode(extra_ic_state) |
50 ? Just(1 << FixedRightArgValueField::decode(extra_ic_state)) | 50 ? Just(1 << FixedRightArgValueField::decode(extra_ic_state)) |
51 : Nothing<int>()), | 51 : Nothing<int>()), |
52 isolate_(isolate) { | 52 isolate_(isolate) { |
53 op_ = | 53 op_ = |
54 static_cast<Token::Value>(FIRST_TOKEN + OpField::decode(extra_ic_state)); | 54 static_cast<Token::Value>(FIRST_TOKEN + OpField::decode(extra_ic_state)); |
| 55 strong_ = StrongField::decode(extra_ic_state); |
55 left_kind_ = LeftKindField::decode(extra_ic_state); | 56 left_kind_ = LeftKindField::decode(extra_ic_state); |
56 right_kind_ = fixed_right_arg_.IsJust() | 57 right_kind_ = fixed_right_arg_.IsJust() |
57 ? (Smi::IsValid(fixed_right_arg_.FromJust()) ? SMI : INT32) | 58 ? (Smi::IsValid(fixed_right_arg_.FromJust()) ? SMI : INT32) |
58 : RightKindField::decode(extra_ic_state); | 59 : RightKindField::decode(extra_ic_state); |
59 result_kind_ = ResultKindField::decode(extra_ic_state); | 60 result_kind_ = ResultKindField::decode(extra_ic_state); |
60 DCHECK_LE(FIRST_TOKEN, op_); | 61 DCHECK_LE(FIRST_TOKEN, op_); |
61 DCHECK_LE(op_, LAST_TOKEN); | 62 DCHECK_LE(op_, LAST_TOKEN); |
62 } | 63 } |
63 | 64 |
64 | 65 |
65 ExtraICState BinaryOpICState::GetExtraICState() const { | 66 ExtraICState BinaryOpICState::GetExtraICState() const { |
66 ExtraICState extra_ic_state = | 67 ExtraICState extra_ic_state = |
67 OpField::encode(op_ - FIRST_TOKEN) | LeftKindField::encode(left_kind_) | | 68 OpField::encode(op_ - FIRST_TOKEN) | LeftKindField::encode(left_kind_) | |
68 ResultKindField::encode(result_kind_) | | 69 ResultKindField::encode(result_kind_) | |
| 70 StrongField::encode(strong_) | |
69 HasFixedRightArgField::encode(fixed_right_arg_.IsJust()); | 71 HasFixedRightArgField::encode(fixed_right_arg_.IsJust()); |
70 if (fixed_right_arg_.IsJust()) { | 72 if (fixed_right_arg_.IsJust()) { |
71 extra_ic_state = FixedRightArgValueField::update( | 73 extra_ic_state = FixedRightArgValueField::update( |
72 extra_ic_state, WhichPowerOf2(fixed_right_arg_.FromJust())); | 74 extra_ic_state, WhichPowerOf2(fixed_right_arg_.FromJust())); |
73 } else { | 75 } else { |
74 extra_ic_state = RightKindField::update(extra_ic_state, right_kind_); | 76 extra_ic_state = RightKindField::update(extra_ic_state, right_kind_); |
75 } | 77 } |
76 return extra_ic_state; | 78 return extra_ic_state; |
77 } | 79 } |
78 | 80 |
79 | 81 |
80 // static | 82 // static |
81 void BinaryOpICState::GenerateAheadOfTime( | 83 void BinaryOpICState::GenerateAheadOfTime( |
82 Isolate* isolate, void (*Generate)(Isolate*, const BinaryOpICState&)) { | 84 Isolate* isolate, void (*Generate)(Isolate*, const BinaryOpICState&)) { |
83 // TODO(olivf) We should investigate why adding stubs to the snapshot is so | 85 // TODO(olivf) We should investigate why adding stubs to the snapshot is so |
84 // expensive at runtime. When solved we should be able to add most binops to | 86 // expensive at runtime. When solved we should be able to add most binops to |
85 // the snapshot instead of hand-picking them. | 87 // the snapshot instead of hand-picking them. |
86 // Generated list of commonly used stubs | 88 // Generated list of commonly used stubs |
87 #define GENERATE(op, left_kind, right_kind, result_kind) \ | 89 #define GENERATE(op, left_kind, right_kind, result_kind) \ |
88 do { \ | 90 do { \ |
89 BinaryOpICState state(isolate, op); \ | 91 BinaryOpICState state(isolate, op, LanguageMode::SLOPPY); \ |
90 state.left_kind_ = left_kind; \ | 92 state.left_kind_ = left_kind; \ |
91 state.fixed_right_arg_ = Nothing<int>(); \ | 93 state.fixed_right_arg_ = Nothing<int>(); \ |
92 state.right_kind_ = right_kind; \ | 94 state.right_kind_ = right_kind; \ |
93 state.result_kind_ = result_kind; \ | 95 state.result_kind_ = result_kind; \ |
94 Generate(isolate, state); \ | 96 Generate(isolate, state); \ |
95 } while (false) | 97 } while (false) |
96 GENERATE(Token::ADD, INT32, INT32, INT32); | 98 GENERATE(Token::ADD, INT32, INT32, INT32); |
97 GENERATE(Token::ADD, INT32, INT32, NUMBER); | 99 GENERATE(Token::ADD, INT32, INT32, NUMBER); |
98 GENERATE(Token::ADD, INT32, NUMBER, NUMBER); | 100 GENERATE(Token::ADD, INT32, NUMBER, NUMBER); |
99 GENERATE(Token::ADD, INT32, SMI, INT32); | 101 GENERATE(Token::ADD, INT32, SMI, INT32); |
100 GENERATE(Token::ADD, NUMBER, INT32, NUMBER); | 102 GENERATE(Token::ADD, NUMBER, INT32, NUMBER); |
101 GENERATE(Token::ADD, NUMBER, NUMBER, NUMBER); | 103 GENERATE(Token::ADD, NUMBER, NUMBER, NUMBER); |
102 GENERATE(Token::ADD, NUMBER, SMI, NUMBER); | 104 GENERATE(Token::ADD, NUMBER, SMI, NUMBER); |
103 GENERATE(Token::ADD, SMI, INT32, INT32); | 105 GENERATE(Token::ADD, SMI, INT32, INT32); |
104 GENERATE(Token::ADD, SMI, INT32, NUMBER); | 106 GENERATE(Token::ADD, SMI, INT32, NUMBER); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 GENERATE(Token::SUB, INT32, SMI, INT32); | 183 GENERATE(Token::SUB, INT32, SMI, INT32); |
182 GENERATE(Token::SUB, NUMBER, INT32, NUMBER); | 184 GENERATE(Token::SUB, NUMBER, INT32, NUMBER); |
183 GENERATE(Token::SUB, NUMBER, NUMBER, NUMBER); | 185 GENERATE(Token::SUB, NUMBER, NUMBER, NUMBER); |
184 GENERATE(Token::SUB, NUMBER, SMI, NUMBER); | 186 GENERATE(Token::SUB, NUMBER, SMI, NUMBER); |
185 GENERATE(Token::SUB, SMI, INT32, INT32); | 187 GENERATE(Token::SUB, SMI, INT32, INT32); |
186 GENERATE(Token::SUB, SMI, NUMBER, NUMBER); | 188 GENERATE(Token::SUB, SMI, NUMBER, NUMBER); |
187 GENERATE(Token::SUB, SMI, SMI, SMI); | 189 GENERATE(Token::SUB, SMI, SMI, SMI); |
188 #undef GENERATE | 190 #undef GENERATE |
189 #define GENERATE(op, left_kind, fixed_right_arg_value, result_kind) \ | 191 #define GENERATE(op, left_kind, fixed_right_arg_value, result_kind) \ |
190 do { \ | 192 do { \ |
191 BinaryOpICState state(isolate, op); \ | 193 BinaryOpICState state(isolate, op, LanguageMode::SLOPPY); \ |
192 state.left_kind_ = left_kind; \ | 194 state.left_kind_ = left_kind; \ |
193 state.fixed_right_arg_ = Just(fixed_right_arg_value); \ | 195 state.fixed_right_arg_ = Just(fixed_right_arg_value); \ |
194 state.right_kind_ = SMI; \ | 196 state.right_kind_ = SMI; \ |
195 state.result_kind_ = result_kind; \ | 197 state.result_kind_ = result_kind; \ |
196 Generate(isolate, state); \ | 198 Generate(isolate, state); \ |
197 } while (false) | 199 } while (false) |
198 GENERATE(Token::MOD, SMI, 2, SMI); | 200 GENERATE(Token::MOD, SMI, 2, SMI); |
199 GENERATE(Token::MOD, SMI, 4, SMI); | 201 GENERATE(Token::MOD, SMI, 4, SMI); |
200 GENERATE(Token::MOD, SMI, 8, SMI); | 202 GENERATE(Token::MOD, SMI, 8, SMI); |
201 GENERATE(Token::MOD, SMI, 16, SMI); | 203 GENERATE(Token::MOD, SMI, 16, SMI); |
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 case UNIQUE_NAME: | 506 case UNIQUE_NAME: |
505 case OBJECT: | 507 case OBJECT: |
506 case GENERIC: | 508 case GENERIC: |
507 return GENERIC; | 509 return GENERIC; |
508 } | 510 } |
509 UNREACHABLE(); | 511 UNREACHABLE(); |
510 return GENERIC; // Make the compiler happy. | 512 return GENERIC; // Make the compiler happy. |
511 } | 513 } |
512 } | 514 } |
513 } // namespace v8::internal | 515 } // namespace v8::internal |
OLD | NEW |