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 <algorithm> | 5 #include <algorithm> |
6 | 6 |
7 #include "src/base/adapters.h" | 7 #include "src/base/adapters.h" |
8 #include "src/compiler/instruction-selector-impl.h" | 8 #include "src/compiler/instruction-selector-impl.h" |
9 #include "src/compiler/node-matchers.h" | 9 #include "src/compiler/node-matchers.h" |
10 #include "src/compiler/node-properties.h" | 10 #include "src/compiler/node-properties.h" |
(...skipping 830 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
841 g.UseImmediate(right)); | 841 g.UseImmediate(right)); |
842 } else { | 842 } else { |
843 if (g.CanBeBetterLeftOperand(right)) { | 843 if (g.CanBeBetterLeftOperand(right)) { |
844 std::swap(left, right); | 844 std::swap(left, right); |
845 } | 845 } |
846 selector->Emit(opcode, g.DefineSameAsFirst(node), g.UseRegister(left), | 846 selector->Emit(opcode, g.DefineSameAsFirst(node), g.UseRegister(left), |
847 g.Use(right)); | 847 g.Use(right)); |
848 } | 848 } |
849 } | 849 } |
850 | 850 |
851 | |
852 void VisitMulHigh(InstructionSelector* selector, Node* node, | 851 void VisitMulHigh(InstructionSelector* selector, Node* node, |
853 ArchOpcode opcode) { | 852 ArchOpcode opcode) { |
854 X64OperandGenerator g(selector); | 853 X64OperandGenerator g(selector); |
855 Node* left = node->InputAt(0); | 854 Node* left = node->InputAt(0); |
856 Node* right = node->InputAt(1); | 855 Node* right = node->InputAt(1); |
857 if (selector->IsLive(left) && !selector->IsLive(right)) { | 856 if (selector->IsLive(left) && !selector->IsLive(right)) { |
858 std::swap(left, right); | 857 std::swap(left, right); |
859 } | 858 } |
860 InstructionOperand temps[] = {g.TempRegister(rax)}; | 859 InstructionOperand temps[] = {g.TempRegister(rax)}; |
861 // TODO(turbofan): We use UseUniqueRegister here to improve register | 860 // TODO(turbofan): We use UseUniqueRegister here to improve register |
(...skipping 28 matching lines...) Expand all Loading... |
890 if (m.matches()) { | 889 if (m.matches()) { |
891 Node* index = node->InputAt(0); | 890 Node* index = node->InputAt(0); |
892 Node* base = m.power_of_two_plus_one() ? index : nullptr; | 891 Node* base = m.power_of_two_plus_one() ? index : nullptr; |
893 EmitLea(this, kX64Lea32, node, index, m.scale(), base, nullptr, | 892 EmitLea(this, kX64Lea32, node, index, m.scale(), base, nullptr, |
894 kPositiveDisplacement); | 893 kPositiveDisplacement); |
895 return; | 894 return; |
896 } | 895 } |
897 VisitMul(this, node, kX64Imul32); | 896 VisitMul(this, node, kX64Imul32); |
898 } | 897 } |
899 | 898 |
| 899 void InstructionSelector::VisitInt32MulWithOverflow(Node* node) { |
| 900 // TODO(mvstanton): Use Int32ScaleMatcher somehow. |
| 901 if (Node* ovf = NodeProperties::FindProjection(node, 1)) { |
| 902 FlagsContinuation cont = FlagsContinuation::ForSet(kOverflow, ovf); |
| 903 return VisitBinop(this, node, kX64Imul32, &cont); |
| 904 } |
| 905 FlagsContinuation cont; |
| 906 VisitBinop(this, node, kX64Imul32, &cont); |
| 907 } |
900 | 908 |
901 void InstructionSelector::VisitInt64Mul(Node* node) { | 909 void InstructionSelector::VisitInt64Mul(Node* node) { |
902 VisitMul(this, node, kX64Imul); | 910 VisitMul(this, node, kX64Imul); |
903 } | 911 } |
904 | 912 |
905 | |
906 void InstructionSelector::VisitInt32MulHigh(Node* node) { | 913 void InstructionSelector::VisitInt32MulHigh(Node* node) { |
907 VisitMulHigh(this, node, kX64ImulHigh32); | 914 VisitMulHigh(this, node, kX64ImulHigh32); |
908 } | 915 } |
909 | 916 |
910 | 917 |
911 void InstructionSelector::VisitInt32Div(Node* node) { | 918 void InstructionSelector::VisitInt32Div(Node* node) { |
912 VisitDiv(this, node, kX64Idiv32); | 919 VisitDiv(this, node, kX64Idiv32); |
913 } | 920 } |
914 | 921 |
915 | 922 |
(...skipping 853 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1769 Node* const node = value->InputAt(0); | 1776 Node* const node = value->InputAt(0); |
1770 Node* const result = NodeProperties::FindProjection(node, 0); | 1777 Node* const result = NodeProperties::FindProjection(node, 0); |
1771 if (result == nullptr || selector->IsDefined(result)) { | 1778 if (result == nullptr || selector->IsDefined(result)) { |
1772 switch (node->opcode()) { | 1779 switch (node->opcode()) { |
1773 case IrOpcode::kInt32AddWithOverflow: | 1780 case IrOpcode::kInt32AddWithOverflow: |
1774 cont->OverwriteAndNegateIfEqual(kOverflow); | 1781 cont->OverwriteAndNegateIfEqual(kOverflow); |
1775 return VisitBinop(selector, node, kX64Add32, cont); | 1782 return VisitBinop(selector, node, kX64Add32, cont); |
1776 case IrOpcode::kInt32SubWithOverflow: | 1783 case IrOpcode::kInt32SubWithOverflow: |
1777 cont->OverwriteAndNegateIfEqual(kOverflow); | 1784 cont->OverwriteAndNegateIfEqual(kOverflow); |
1778 return VisitBinop(selector, node, kX64Sub32, cont); | 1785 return VisitBinop(selector, node, kX64Sub32, cont); |
| 1786 case IrOpcode::kInt32MulWithOverflow: |
| 1787 cont->OverwriteAndNegateIfEqual(kOverflow); |
| 1788 return VisitBinop(selector, node, kX64Imul32, cont); |
1779 case IrOpcode::kInt64AddWithOverflow: | 1789 case IrOpcode::kInt64AddWithOverflow: |
1780 cont->OverwriteAndNegateIfEqual(kOverflow); | 1790 cont->OverwriteAndNegateIfEqual(kOverflow); |
1781 return VisitBinop(selector, node, kX64Add, cont); | 1791 return VisitBinop(selector, node, kX64Add, cont); |
1782 case IrOpcode::kInt64SubWithOverflow: | 1792 case IrOpcode::kInt64SubWithOverflow: |
1783 cont->OverwriteAndNegateIfEqual(kOverflow); | 1793 cont->OverwriteAndNegateIfEqual(kOverflow); |
1784 return VisitBinop(selector, node, kX64Sub, cont); | 1794 return VisitBinop(selector, node, kX64Sub, cont); |
1785 default: | 1795 default: |
1786 break; | 1796 break; |
1787 } | 1797 } |
1788 } | 1798 } |
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2146 // static | 2156 // static |
2147 MachineOperatorBuilder::AlignmentRequirements | 2157 MachineOperatorBuilder::AlignmentRequirements |
2148 InstructionSelector::AlignmentRequirements() { | 2158 InstructionSelector::AlignmentRequirements() { |
2149 return MachineOperatorBuilder::AlignmentRequirements:: | 2159 return MachineOperatorBuilder::AlignmentRequirements:: |
2150 FullUnalignedAccessSupport(); | 2160 FullUnalignedAccessSupport(); |
2151 } | 2161 } |
2152 | 2162 |
2153 } // namespace compiler | 2163 } // namespace compiler |
2154 } // namespace internal | 2164 } // namespace internal |
2155 } // namespace v8 | 2165 } // namespace v8 |
OLD | NEW |