| 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/base/adapters.h" | 5 #include "src/base/adapters.h" |
| 6 #include "src/base/bits.h" | 6 #include "src/base/bits.h" |
| 7 #include "src/compiler/instruction-selector-impl.h" | 7 #include "src/compiler/instruction-selector-impl.h" |
| 8 #include "src/compiler/node-matchers.h" | 8 #include "src/compiler/node-matchers.h" |
| 9 #include "src/compiler/node-properties.h" | 9 #include "src/compiler/node-properties.h" |
| 10 | 10 |
| (...skipping 806 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 817 | 817 |
| 818 | 818 |
| 819 void InstructionSelector::VisitInt32Add(Node* node) { | 819 void InstructionSelector::VisitInt32Add(Node* node) { |
| 820 Mips64OperandGenerator g(this); | 820 Mips64OperandGenerator g(this); |
| 821 Int32BinopMatcher m(node); | 821 Int32BinopMatcher m(node); |
| 822 | 822 |
| 823 // Select Lsa for (left + (left_of_right << imm)). | 823 // Select Lsa for (left + (left_of_right << imm)). |
| 824 if (m.right().opcode() == IrOpcode::kWord32Shl && | 824 if (m.right().opcode() == IrOpcode::kWord32Shl && |
| 825 CanCover(node, m.left().node()) && CanCover(node, m.right().node())) { | 825 CanCover(node, m.left().node()) && CanCover(node, m.right().node())) { |
| 826 Int32BinopMatcher mright(m.right().node()); | 826 Int32BinopMatcher mright(m.right().node()); |
| 827 if (mright.right().HasValue()) { | 827 if (mright.right().HasValue() && !m.left().HasValue()) { |
| 828 int32_t shift_value = static_cast<int32_t>(mright.right().Value()); | 828 int32_t shift_value = static_cast<int32_t>(mright.right().Value()); |
| 829 Emit(kMips64Lsa, g.DefineAsRegister(node), g.UseRegister(m.left().node()), | 829 Emit(kMips64Lsa, g.DefineAsRegister(node), g.UseRegister(m.left().node()), |
| 830 g.UseRegister(mright.left().node()), g.TempImmediate(shift_value)); | 830 g.UseRegister(mright.left().node()), g.TempImmediate(shift_value)); |
| 831 return; | 831 return; |
| 832 } | 832 } |
| 833 } | 833 } |
| 834 | 834 |
| 835 // Select Lsa for ((left_of_left << imm) + right). | 835 // Select Lsa for ((left_of_left << imm) + right). |
| 836 if (m.left().opcode() == IrOpcode::kWord32Shl && | 836 if (m.left().opcode() == IrOpcode::kWord32Shl && |
| 837 CanCover(node, m.right().node()) && CanCover(node, m.left().node())) { | 837 CanCover(node, m.right().node()) && CanCover(node, m.left().node())) { |
| 838 Int32BinopMatcher mleft(m.left().node()); | 838 Int32BinopMatcher mleft(m.left().node()); |
| 839 if (mleft.right().HasValue()) { | 839 if (mleft.right().HasValue() && !m.right().HasValue()) { |
| 840 int32_t shift_value = static_cast<int32_t>(mleft.right().Value()); | 840 int32_t shift_value = static_cast<int32_t>(mleft.right().Value()); |
| 841 Emit(kMips64Lsa, g.DefineAsRegister(node), | 841 Emit(kMips64Lsa, g.DefineAsRegister(node), |
| 842 g.UseRegister(m.right().node()), g.UseRegister(mleft.left().node()), | 842 g.UseRegister(m.right().node()), g.UseRegister(mleft.left().node()), |
| 843 g.TempImmediate(shift_value)); | 843 g.TempImmediate(shift_value)); |
| 844 return; | 844 return; |
| 845 } | 845 } |
| 846 } | 846 } |
| 847 VisitBinop(this, node, kMips64Add, true, kMips64Add); | 847 VisitBinop(this, node, kMips64Add, true, kMips64Add); |
| 848 } | 848 } |
| 849 | 849 |
| 850 | 850 |
| 851 void InstructionSelector::VisitInt64Add(Node* node) { | 851 void InstructionSelector::VisitInt64Add(Node* node) { |
| 852 Mips64OperandGenerator g(this); | 852 Mips64OperandGenerator g(this); |
| 853 Int64BinopMatcher m(node); | 853 Int64BinopMatcher m(node); |
| 854 | 854 |
| 855 // Select Dlsa for (left + (left_of_right << imm)). | 855 // Select Dlsa for (left + (left_of_right << imm)). |
| 856 if (m.right().opcode() == IrOpcode::kWord64Shl && | 856 if (m.right().opcode() == IrOpcode::kWord64Shl && |
| 857 CanCover(node, m.left().node()) && CanCover(node, m.right().node())) { | 857 CanCover(node, m.left().node()) && CanCover(node, m.right().node())) { |
| 858 Int64BinopMatcher mright(m.right().node()); | 858 Int64BinopMatcher mright(m.right().node()); |
| 859 if (mright.right().HasValue()) { | 859 if (mright.right().HasValue() && !m.left().HasValue()) { |
| 860 int32_t shift_value = static_cast<int32_t>(mright.right().Value()); | 860 int32_t shift_value = static_cast<int32_t>(mright.right().Value()); |
| 861 Emit(kMips64Dlsa, g.DefineAsRegister(node), | 861 Emit(kMips64Dlsa, g.DefineAsRegister(node), |
| 862 g.UseRegister(m.left().node()), g.UseRegister(mright.left().node()), | 862 g.UseRegister(m.left().node()), g.UseRegister(mright.left().node()), |
| 863 g.TempImmediate(shift_value)); | 863 g.TempImmediate(shift_value)); |
| 864 return; | 864 return; |
| 865 } | 865 } |
| 866 } | 866 } |
| 867 | 867 |
| 868 // Select Dlsa for ((left_of_left << imm) + right). | 868 // Select Dlsa for ((left_of_left << imm) + right). |
| 869 if (m.left().opcode() == IrOpcode::kWord64Shl && | 869 if (m.left().opcode() == IrOpcode::kWord64Shl && |
| 870 CanCover(node, m.right().node()) && CanCover(node, m.left().node())) { | 870 CanCover(node, m.right().node()) && CanCover(node, m.left().node())) { |
| 871 Int64BinopMatcher mleft(m.left().node()); | 871 Int64BinopMatcher mleft(m.left().node()); |
| 872 if (mleft.right().HasValue()) { | 872 if (mleft.right().HasValue() && !m.right().HasValue()) { |
| 873 int32_t shift_value = static_cast<int32_t>(mleft.right().Value()); | 873 int32_t shift_value = static_cast<int32_t>(mleft.right().Value()); |
| 874 Emit(kMips64Dlsa, g.DefineAsRegister(node), | 874 Emit(kMips64Dlsa, g.DefineAsRegister(node), |
| 875 g.UseRegister(m.right().node()), g.UseRegister(mleft.left().node()), | 875 g.UseRegister(m.right().node()), g.UseRegister(mleft.left().node()), |
| 876 g.TempImmediate(shift_value)); | 876 g.TempImmediate(shift_value)); |
| 877 return; | 877 return; |
| 878 } | 878 } |
| 879 } | 879 } |
| 880 | 880 |
| 881 VisitBinop(this, node, kMips64Dadd, true, kMips64Dadd); | 881 VisitBinop(this, node, kMips64Dadd, true, kMips64Dadd); |
| 882 } | 882 } |
| (...skipping 1716 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2599 } else { | 2599 } else { |
| 2600 DCHECK(kArchVariant == kMips64r2); | 2600 DCHECK(kArchVariant == kMips64r2); |
| 2601 return MachineOperatorBuilder::AlignmentRequirements:: | 2601 return MachineOperatorBuilder::AlignmentRequirements:: |
| 2602 NoUnalignedAccessSupport(); | 2602 NoUnalignedAccessSupport(); |
| 2603 } | 2603 } |
| 2604 } | 2604 } |
| 2605 | 2605 |
| 2606 } // namespace compiler | 2606 } // namespace compiler |
| 2607 } // namespace internal | 2607 } // namespace internal |
| 2608 } // namespace v8 | 2608 } // namespace v8 |
| OLD | NEW |