| 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 |