OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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 #include "src/code-stub-assembler.h" | 4 #include "src/code-stub-assembler.h" |
5 #include "src/code-factory.h" | 5 #include "src/code-factory.h" |
6 #include "src/frames-inl.h" | 6 #include "src/frames-inl.h" |
7 #include "src/frames.h" | 7 #include "src/frames.h" |
8 | 8 |
9 namespace v8 { | 9 namespace v8 { |
10 namespace internal { | 10 namespace internal { |
(...skipping 3265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3276 Node* CodeStubAssembler::IsName(Node* object) { | 3276 Node* CodeStubAssembler::IsName(Node* object) { |
3277 return Int32LessThanOrEqual(LoadInstanceType(object), | 3277 return Int32LessThanOrEqual(LoadInstanceType(object), |
3278 Int32Constant(LAST_NAME_TYPE)); | 3278 Int32Constant(LAST_NAME_TYPE)); |
3279 } | 3279 } |
3280 | 3280 |
3281 Node* CodeStubAssembler::IsString(Node* object) { | 3281 Node* CodeStubAssembler::IsString(Node* object) { |
3282 return Int32LessThan(LoadInstanceType(object), | 3282 return Int32LessThan(LoadInstanceType(object), |
3283 Int32Constant(FIRST_NONSTRING_TYPE)); | 3283 Int32Constant(FIRST_NONSTRING_TYPE)); |
3284 } | 3284 } |
3285 | 3285 |
| 3286 Node* CodeStubAssembler::IsSymbolInstanceType(Node* instance_type) { |
| 3287 return Word32Equal(instance_type, Int32Constant(SYMBOL_TYPE)); |
| 3288 } |
| 3289 |
3286 Node* CodeStubAssembler::IsSymbol(Node* object) { | 3290 Node* CodeStubAssembler::IsSymbol(Node* object) { |
3287 return IsSymbolMap(LoadMap(object)); | 3291 return IsSymbolMap(LoadMap(object)); |
3288 } | 3292 } |
3289 | 3293 |
3290 Node* CodeStubAssembler::IsPrivateSymbol(Node* object) { | 3294 Node* CodeStubAssembler::IsPrivateSymbol(Node* object) { |
3291 return Select( | 3295 return Select( |
3292 IsSymbol(object), | 3296 IsSymbol(object), |
3293 [=] { | 3297 [=] { |
3294 Node* const flags = | 3298 Node* const flags = |
3295 SmiToWord32(LoadObjectField(object, Symbol::kFlagsOffset)); | 3299 SmiToWord32(LoadObjectField(object, Symbol::kFlagsOffset)); |
(...skipping 4131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7427 | 7431 |
7428 // Check if the HeapNumber value is a NaN. | 7432 // Check if the HeapNumber value is a NaN. |
7429 BranchIfFloat64IsNaN(value_value, if_notequal, if_equal); | 7433 BranchIfFloat64IsNaN(value_value, if_notequal, if_equal); |
7430 } | 7434 } |
7431 | 7435 |
7432 BIND(&if_valueisnotnumber); | 7436 BIND(&if_valueisnotnumber); |
7433 if (var_type_feedback != nullptr) { | 7437 if (var_type_feedback != nullptr) { |
7434 // Collect type feedback. | 7438 // Collect type feedback. |
7435 Node* instance_type = LoadMapInstanceType(value_map); | 7439 Node* instance_type = LoadMapInstanceType(value_map); |
7436 | 7440 |
7437 Label if_valueisstring(this), if_valueisnotstring(this); | 7441 Label if_valueisstring(this), if_valueisreceiver(this), |
7438 Branch(IsStringInstanceType(instance_type), &if_valueisstring, | 7442 if_valueissymbol(this), if_valueisother(this, Label::kDeferred); |
7439 &if_valueisnotstring); | 7443 GotoIf(IsStringInstanceType(instance_type), &if_valueisstring); |
| 7444 GotoIf(IsJSReceiverInstanceType(instance_type), &if_valueisreceiver); |
| 7445 Branch(IsSymbolInstanceType(instance_type), &if_valueissymbol, |
| 7446 &if_valueisother); |
7440 | 7447 |
7441 BIND(&if_valueisstring); | 7448 BIND(&if_valueisstring); |
7442 { | 7449 { |
7443 CombineFeedback(var_type_feedback, | 7450 CombineFeedback(var_type_feedback, |
7444 CollectFeedbackForString(instance_type)); | 7451 CollectFeedbackForString(instance_type)); |
7445 Goto(if_equal); | 7452 Goto(if_equal); |
7446 } | 7453 } |
7447 | 7454 |
7448 BIND(&if_valueisnotstring); | 7455 BIND(&if_valueissymbol); |
7449 { | 7456 { |
7450 var_type_feedback->Bind(SmiConstant(CompareOperationFeedback::kAny)); | 7457 CombineFeedback(var_type_feedback, |
7451 GotoIfNot(IsJSReceiverInstanceType(instance_type), if_equal); | 7458 SmiConstant(CompareOperationFeedback::kSymbol)); |
| 7459 Goto(if_equal); |
| 7460 } |
7452 | 7461 |
| 7462 BIND(&if_valueisreceiver); |
| 7463 { |
7453 CombineFeedback(var_type_feedback, | 7464 CombineFeedback(var_type_feedback, |
7454 SmiConstant(CompareOperationFeedback::kReceiver)); | 7465 SmiConstant(CompareOperationFeedback::kReceiver)); |
7455 Goto(if_equal); | 7466 Goto(if_equal); |
7456 } | 7467 } |
| 7468 |
| 7469 BIND(&if_valueisother); |
| 7470 { |
| 7471 CombineFeedback(var_type_feedback, |
| 7472 SmiConstant(CompareOperationFeedback::kAny)); |
| 7473 Goto(if_equal); |
| 7474 } |
7457 } else { | 7475 } else { |
7458 Goto(if_equal); | 7476 Goto(if_equal); |
7459 } | 7477 } |
7460 } | 7478 } |
7461 | 7479 |
7462 BIND(&if_valueissmi); | 7480 BIND(&if_valueissmi); |
7463 if (var_type_feedback != nullptr) { | 7481 if (var_type_feedback != nullptr) { |
7464 CombineFeedback(var_type_feedback, | 7482 CombineFeedback(var_type_feedback, |
7465 SmiConstant(CompareOperationFeedback::kSignedSmall)); | 7483 SmiConstant(CompareOperationFeedback::kSignedSmall)); |
7466 } | 7484 } |
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7844 Branch(Word32Equal( | 7862 Branch(Word32Equal( |
7845 Word32And(rhs_bitfield, | 7863 Word32And(rhs_bitfield, |
7846 Int32Constant(1 << Map::kIsUndetectable)), | 7864 Int32Constant(1 << Map::kIsUndetectable)), |
7847 Int32Constant(0)), | 7865 Int32Constant(0)), |
7848 &if_notequal, &if_equal); | 7866 &if_notequal, &if_equal); |
7849 } | 7867 } |
7850 } | 7868 } |
7851 | 7869 |
7852 BIND(&if_lhsissymbol); | 7870 BIND(&if_lhsissymbol); |
7853 { | 7871 { |
7854 if (var_type_feedback != nullptr) { | |
7855 var_type_feedback->Bind( | |
7856 SmiConstant(CompareOperationFeedback::kAny)); | |
7857 } | |
7858 | |
7859 // Check if the {rhs} is a JSReceiver. | 7872 // Check if the {rhs} is a JSReceiver. |
7860 Label if_rhsisreceiver(this), if_rhsisnotreceiver(this); | 7873 Label if_rhsisreceiver(this), if_rhsisnotreceiver(this); |
7861 STATIC_ASSERT(LAST_TYPE == LAST_JS_RECEIVER_TYPE); | |
7862 Branch(IsJSReceiverInstanceType(rhs_instance_type), | 7874 Branch(IsJSReceiverInstanceType(rhs_instance_type), |
7863 &if_rhsisreceiver, &if_rhsisnotreceiver); | 7875 &if_rhsisreceiver, &if_rhsisnotreceiver); |
7864 | 7876 |
7865 BIND(&if_rhsisreceiver); | 7877 BIND(&if_rhsisreceiver); |
7866 { | 7878 { |
7867 // The {lhs} is a Primitive and the {rhs} is a JSReceiver. | 7879 // The {lhs} is a Primitive and the {rhs} is a JSReceiver. |
7868 // Swapping {lhs} and {rhs} is not observable and doesn't | 7880 // Swapping {lhs} and {rhs} is not observable and doesn't |
7869 // matter for the result, so we can just swap them and use | 7881 // matter for the result, so we can just swap them and use |
7870 // the JSReceiver handling below (for {lhs} being a JSReceiver). | 7882 // the JSReceiver handling below (for {lhs} being a JSReceiver). |
| 7883 if (var_type_feedback != nullptr) { |
| 7884 var_type_feedback->Bind( |
| 7885 SmiConstant(CompareOperationFeedback::kAny)); |
| 7886 } |
7871 var_lhs.Bind(rhs); | 7887 var_lhs.Bind(rhs); |
7872 var_rhs.Bind(lhs); | 7888 var_rhs.Bind(lhs); |
7873 Goto(&loop); | 7889 Goto(&loop); |
7874 } | 7890 } |
7875 | 7891 |
7876 BIND(&if_rhsisnotreceiver); | 7892 BIND(&if_rhsisnotreceiver); |
7877 { | 7893 { |
7878 // The {rhs} is not a JSReceiver and also not the same Symbol | 7894 // The {rhs} is not a JSReceiver and also not the same Symbol |
7879 // as the {lhs}, so this is equality check is considered false. | 7895 // as the {lhs}, so this is equality check is considered false. |
7880 Goto(&if_notequal); | 7896 if (var_type_feedback != nullptr) { |
| 7897 Label if_rhsissymbol(this), if_rhsisnotsymbol(this); |
| 7898 Branch(IsSymbolInstanceType(rhs_instance_type), &if_rhsissymbol, |
| 7899 &if_rhsisnotsymbol); |
| 7900 |
| 7901 BIND(&if_rhsissymbol); |
| 7902 { |
| 7903 var_type_feedback->Bind( |
| 7904 SmiConstant(CompareOperationFeedback::kSymbol)); |
| 7905 Goto(&if_notequal); |
| 7906 } |
| 7907 |
| 7908 BIND(&if_rhsisnotsymbol); |
| 7909 { |
| 7910 var_type_feedback->Bind( |
| 7911 SmiConstant(CompareOperationFeedback::kAny)); |
| 7912 Goto(&if_notequal); |
| 7913 } |
| 7914 } else { |
| 7915 Goto(&if_notequal); |
| 7916 } |
7881 } | 7917 } |
7882 } | 7918 } |
7883 | 7919 |
7884 BIND(&if_lhsisreceiver); | 7920 BIND(&if_lhsisreceiver); |
7885 { | 7921 { |
7886 // Check if the {rhs} is also a JSReceiver. | 7922 // Check if the {rhs} is also a JSReceiver. |
7887 Label if_rhsisreceiver(this), if_rhsisnotreceiver(this); | 7923 Label if_rhsisreceiver(this), if_rhsisnotreceiver(this); |
7888 STATIC_ASSERT(LAST_TYPE == LAST_JS_RECEIVER_TYPE); | 7924 STATIC_ASSERT(LAST_TYPE == LAST_JS_RECEIVER_TYPE); |
7889 Branch(IsJSReceiverInstanceType(rhs_instance_type), | 7925 Branch(IsJSReceiverInstanceType(rhs_instance_type), |
7890 &if_rhsisreceiver, &if_rhsisnotreceiver); | 7926 &if_rhsisreceiver, &if_rhsisnotreceiver); |
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8160 result.Bind(CallStub(callable, NoContextConstant(), lhs, rhs)); | 8196 result.Bind(CallStub(callable, NoContextConstant(), lhs, rhs)); |
8161 Goto(&end); | 8197 Goto(&end); |
8162 } | 8198 } |
8163 | 8199 |
8164 BIND(&if_rhsisnotstring); | 8200 BIND(&if_rhsisnotstring); |
8165 Goto(&if_notequal); | 8201 Goto(&if_notequal); |
8166 } | 8202 } |
8167 | 8203 |
8168 BIND(&if_lhsisnotstring); | 8204 BIND(&if_lhsisnotstring); |
8169 if (var_type_feedback != nullptr) { | 8205 if (var_type_feedback != nullptr) { |
8170 GotoIfNot(IsJSReceiverInstanceType(lhs_instance_type), | 8206 Label if_lhsissymbol(this), if_lhsisreceiver(this); |
8171 &if_notequal); | 8207 GotoIf(IsJSReceiverInstanceType(lhs_instance_type), |
8172 GotoIfNot(IsJSReceiverInstanceType(rhs_instance_type), | 8208 &if_lhsisreceiver); |
8173 &if_notequal); | 8209 Branch(IsSymbolInstanceType(lhs_instance_type), &if_lhsissymbol, |
8174 var_type_feedback->Bind( | 8210 &if_notequal); |
8175 SmiConstant(CompareOperationFeedback::kReceiver)); | 8211 |
| 8212 BIND(&if_lhsisreceiver); |
| 8213 { |
| 8214 GotoIfNot(IsJSReceiverInstanceType(rhs_instance_type), |
| 8215 &if_notequal); |
| 8216 var_type_feedback->Bind( |
| 8217 SmiConstant(CompareOperationFeedback::kReceiver)); |
| 8218 Goto(&if_notequal); |
| 8219 } |
| 8220 |
| 8221 BIND(&if_lhsissymbol); |
| 8222 { |
| 8223 GotoIfNot(IsSymbolInstanceType(rhs_instance_type), &if_notequal); |
| 8224 var_type_feedback->Bind( |
| 8225 SmiConstant(CompareOperationFeedback::kSymbol)); |
| 8226 Goto(&if_notequal); |
| 8227 } |
| 8228 } else { |
| 8229 Goto(&if_notequal); |
8176 } | 8230 } |
8177 Goto(&if_notequal); | |
8178 } | 8231 } |
8179 } | 8232 } |
8180 } | 8233 } |
8181 | 8234 |
8182 BIND(&if_lhsissmi); | 8235 BIND(&if_lhsissmi); |
8183 { | 8236 { |
8184 // We already know that {lhs} and {rhs} are not reference equal, and {lhs} | 8237 // We already know that {lhs} and {rhs} are not reference equal, and {lhs} |
8185 // is a Smi; so {lhs} and {rhs} can only be strictly equal if {rhs} is a | 8238 // is a Smi; so {lhs} and {rhs} can only be strictly equal if {rhs} is a |
8186 // HeapNumber with an equal floating point value. | 8239 // HeapNumber with an equal floating point value. |
8187 | 8240 |
(...skipping 1003 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9191 formatted.c_str(), TENURED); | 9244 formatted.c_str(), TENURED); |
9192 CallRuntime(Runtime::kGlobalPrint, NoContextConstant(), | 9245 CallRuntime(Runtime::kGlobalPrint, NoContextConstant(), |
9193 HeapConstant(string)); | 9246 HeapConstant(string)); |
9194 } | 9247 } |
9195 CallRuntime(Runtime::kDebugPrint, NoContextConstant(), tagged_value); | 9248 CallRuntime(Runtime::kDebugPrint, NoContextConstant(), tagged_value); |
9196 #endif | 9249 #endif |
9197 } | 9250 } |
9198 | 9251 |
9199 } // namespace internal | 9252 } // namespace internal |
9200 } // namespace v8 | 9253 } // namespace v8 |
OLD | NEW |