| 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 | 4 |
| 5 #include "src/builtins/builtins-utils.h" | 5 #include "src/builtins/builtins-utils.h" |
| 6 #include "src/builtins/builtins.h" | 6 #include "src/builtins/builtins.h" |
| 7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" |
| 8 | 8 |
| 9 namespace v8 { | 9 namespace v8 { |
| 10 namespace internal { | 10 namespace internal { |
| (...skipping 506 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 517 assembler->Bind(&if_lhsissmi); | 517 assembler->Bind(&if_lhsissmi); |
| 518 { | 518 { |
| 519 // Check if the {rhs} is also a Smi. | 519 // Check if the {rhs} is also a Smi. |
| 520 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); | 520 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); |
| 521 assembler->Branch(assembler->TaggedIsSmi(rhs), &if_rhsissmi, | 521 assembler->Branch(assembler->TaggedIsSmi(rhs), &if_rhsissmi, |
| 522 &if_rhsisnotsmi); | 522 &if_rhsisnotsmi); |
| 523 | 523 |
| 524 assembler->Bind(&if_rhsissmi); | 524 assembler->Bind(&if_rhsissmi); |
| 525 { | 525 { |
| 526 // Try fast Smi addition first. | 526 // Try fast Smi addition first. |
| 527 Node* pair = assembler->SmiAddWithOverflow(lhs, rhs); | 527 Node* pair = assembler->IntPtrAddWithOverflow( |
| 528 assembler->BitcastTaggedToWord(lhs), |
| 529 assembler->BitcastTaggedToWord(rhs)); |
| 528 Node* overflow = assembler->Projection(1, pair); | 530 Node* overflow = assembler->Projection(1, pair); |
| 529 | 531 |
| 530 // Check if the Smi additon overflowed. | 532 // Check if the Smi additon overflowed. |
| 531 Label if_overflow(assembler), if_notoverflow(assembler); | 533 Label if_overflow(assembler), if_notoverflow(assembler); |
| 532 assembler->Branch(overflow, &if_overflow, &if_notoverflow); | 534 assembler->Branch(overflow, &if_overflow, &if_notoverflow); |
| 533 | 535 |
| 534 assembler->Bind(&if_overflow); | 536 assembler->Bind(&if_overflow); |
| 535 { | 537 { |
| 536 var_fadd_lhs.Bind(assembler->SmiToFloat64(lhs)); | 538 var_fadd_lhs.Bind(assembler->SmiToFloat64(lhs)); |
| 537 var_fadd_rhs.Bind(assembler->SmiToFloat64(rhs)); | 539 var_fadd_rhs.Bind(assembler->SmiToFloat64(rhs)); |
| 538 assembler->Goto(&do_fadd); | 540 assembler->Goto(&do_fadd); |
| 539 } | 541 } |
| 540 | 542 |
| 541 assembler->Bind(&if_notoverflow); | 543 assembler->Bind(&if_notoverflow); |
| 542 var_result.Bind(assembler->Projection(0, pair)); | 544 var_result.Bind(assembler->BitcastWordToTaggedSigned( |
| 545 assembler->Projection(0, pair))); |
| 543 assembler->Goto(&end); | 546 assembler->Goto(&end); |
| 544 } | 547 } |
| 545 | 548 |
| 546 assembler->Bind(&if_rhsisnotsmi); | 549 assembler->Bind(&if_rhsisnotsmi); |
| 547 { | 550 { |
| 548 // Load the map of {rhs}. | 551 // Load the map of {rhs}. |
| 549 Node* rhs_map = assembler->LoadMap(rhs); | 552 Node* rhs_map = assembler->LoadMap(rhs); |
| 550 | 553 |
| 551 // Check if the {rhs} is a HeapNumber. | 554 // Check if the {rhs} is a HeapNumber. |
| 552 Label if_rhsisnumber(assembler), | 555 Label if_rhsisnumber(assembler), |
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 879 assembler->Bind(&if_lhsissmi); | 882 assembler->Bind(&if_lhsissmi); |
| 880 { | 883 { |
| 881 // Check if the {rhs} is also a Smi. | 884 // Check if the {rhs} is also a Smi. |
| 882 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); | 885 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); |
| 883 assembler->Branch(assembler->TaggedIsSmi(rhs), &if_rhsissmi, | 886 assembler->Branch(assembler->TaggedIsSmi(rhs), &if_rhsissmi, |
| 884 &if_rhsisnotsmi); | 887 &if_rhsisnotsmi); |
| 885 | 888 |
| 886 assembler->Bind(&if_rhsissmi); | 889 assembler->Bind(&if_rhsissmi); |
| 887 { | 890 { |
| 888 // Try a fast Smi subtraction first. | 891 // Try a fast Smi subtraction first. |
| 889 Node* pair = assembler->SmiSubWithOverflow(lhs, rhs); | 892 Node* pair = assembler->IntPtrSubWithOverflow( |
| 893 assembler->BitcastTaggedToWord(lhs), |
| 894 assembler->BitcastTaggedToWord(rhs)); |
| 890 Node* overflow = assembler->Projection(1, pair); | 895 Node* overflow = assembler->Projection(1, pair); |
| 891 | 896 |
| 892 // Check if the Smi subtraction overflowed. | 897 // Check if the Smi subtraction overflowed. |
| 893 Label if_overflow(assembler), if_notoverflow(assembler); | 898 Label if_overflow(assembler), if_notoverflow(assembler); |
| 894 assembler->Branch(overflow, &if_overflow, &if_notoverflow); | 899 assembler->Branch(overflow, &if_overflow, &if_notoverflow); |
| 895 | 900 |
| 896 assembler->Bind(&if_overflow); | 901 assembler->Bind(&if_overflow); |
| 897 { | 902 { |
| 898 // The result doesn't fit into Smi range. | 903 // The result doesn't fit into Smi range. |
| 899 var_fsub_lhs.Bind(assembler->SmiToFloat64(lhs)); | 904 var_fsub_lhs.Bind(assembler->SmiToFloat64(lhs)); |
| 900 var_fsub_rhs.Bind(assembler->SmiToFloat64(rhs)); | 905 var_fsub_rhs.Bind(assembler->SmiToFloat64(rhs)); |
| 901 assembler->Goto(&do_fsub); | 906 assembler->Goto(&do_fsub); |
| 902 } | 907 } |
| 903 | 908 |
| 904 assembler->Bind(&if_notoverflow); | 909 assembler->Bind(&if_notoverflow); |
| 905 var_result.Bind(assembler->Projection(0, pair)); | 910 var_result.Bind(assembler->BitcastWordToTaggedSigned( |
| 911 assembler->Projection(0, pair))); |
| 906 assembler->Goto(&end); | 912 assembler->Goto(&end); |
| 907 } | 913 } |
| 908 | 914 |
| 909 assembler->Bind(&if_rhsisnotsmi); | 915 assembler->Bind(&if_rhsisnotsmi); |
| 910 { | 916 { |
| 911 // Load the map of the {rhs}. | 917 // Load the map of the {rhs}. |
| 912 Node* rhs_map = assembler->LoadMap(rhs); | 918 Node* rhs_map = assembler->LoadMap(rhs); |
| 913 | 919 |
| 914 // Check if {rhs} is a HeapNumber. | 920 // Check if {rhs} is a HeapNumber. |
| 915 Label if_rhsisnumber(assembler), | 921 Label if_rhsisnumber(assembler), |
| (...skipping 788 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1704 compiler::Node* lhs = assembler->Parameter(0); | 1710 compiler::Node* lhs = assembler->Parameter(0); |
| 1705 compiler::Node* rhs = assembler->Parameter(1); | 1711 compiler::Node* rhs = assembler->Parameter(1); |
| 1706 compiler::Node* context = assembler->Parameter(2); | 1712 compiler::Node* context = assembler->Parameter(2); |
| 1707 | 1713 |
| 1708 assembler->Return(assembler->StrictEqual(CodeStubAssembler::kNegateResult, | 1714 assembler->Return(assembler->StrictEqual(CodeStubAssembler::kNegateResult, |
| 1709 lhs, rhs, context)); | 1715 lhs, rhs, context)); |
| 1710 } | 1716 } |
| 1711 | 1717 |
| 1712 } // namespace internal | 1718 } // namespace internal |
| 1713 } // namespace v8 | 1719 } // namespace v8 |
| OLD | NEW |