OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/compiler/instruction-selector-impl.h" | 6 #include "src/compiler/instruction-selector-impl.h" |
7 #include "src/compiler/node-matchers.h" | 7 #include "src/compiler/node-matchers.h" |
8 #include "src/compiler/node-properties.h" | 8 #include "src/compiler/node-properties.h" |
9 #include "src/s390/frames-s390.h" | 9 #include "src/s390/frames-s390.h" |
10 | 10 |
(...skipping 13 matching lines...) Expand all Loading... |
24 // Instr format | 24 // Instr format |
25 kAllowRRR = 1u << 7, | 25 kAllowRRR = 1u << 7, |
26 kAllowRM = 1u << 8, | 26 kAllowRM = 1u << 8, |
27 kAllowRI = 1u << 9, | 27 kAllowRI = 1u << 9, |
28 kAllowRRI = 1u << 10, | 28 kAllowRRI = 1u << 10, |
29 kAllowRRM = 1u << 11, | 29 kAllowRRM = 1u << 11, |
30 // Useful combination | 30 // Useful combination |
31 kAllowImmediate = kAllowRI | kAllowRRI, | 31 kAllowImmediate = kAllowRI | kAllowRRI, |
32 kAllowMemoryOperand = kAllowRM | kAllowRRM, | 32 kAllowMemoryOperand = kAllowRM | kAllowRRM, |
33 kAllowDistinctOps = kAllowRRR | kAllowRRI | kAllowRRM, | 33 kAllowDistinctOps = kAllowRRR | kAllowRRI | kAllowRRM, |
34 kBitWiseCommonMode = kAllowRI | kUint32Imm, | 34 kBitWiseCommonMode = kAllowRI, |
35 kArithmeticCommonMode = kAllowRM | kAllowRI | 35 kArithmeticCommonMode = kAllowRM | kAllowRI |
36 }; | 36 }; |
37 | 37 |
38 typedef base::Flags<OperandMode, uint32_t> OperandModes; | 38 typedef base::Flags<OperandMode, uint32_t> OperandModes; |
39 DEFINE_OPERATORS_FOR_FLAGS(OperandModes); | 39 DEFINE_OPERATORS_FOR_FLAGS(OperandModes); |
40 OperandModes immediateModeMask = | 40 OperandModes immediateModeMask = |
41 OperandMode::kShift32Imm | OperandMode::kShift64Imm | | 41 OperandMode::kShift32Imm | OperandMode::kShift64Imm | |
42 OperandMode::kInt32Imm | OperandMode::kInt32Imm_Negate | | 42 OperandMode::kInt32Imm | OperandMode::kInt32Imm_Negate | |
43 OperandMode::kUint32Imm | OperandMode::kInt20Imm; | 43 OperandMode::kUint32Imm | OperandMode::kInt20Imm; |
44 | 44 |
45 #define BitWiseOperandMode \ | 45 #define AndOperandMode \ |
46 ((OperandMode::kBitWiseCommonMode | \ | 46 ((OperandMode::kBitWiseCommonMode | OperandMode::kUint32Imm | \ |
47 (CpuFeatures::IsSupported(DISTINCT_OPS) \ | 47 OperandMode::kAllowRM | (CpuFeatures::IsSupported(DISTINCT_OPS) \ |
48 ? OperandMode::kAllowRRR \ | 48 ? OperandMode::kAllowRRR \ |
| 49 : OperandMode::kBitWiseCommonMode))) |
| 50 |
| 51 #define OrOperandMode AndOperandMode |
| 52 #define XorOperandMode AndOperandMode |
| 53 |
| 54 #define ShiftOperandMode \ |
| 55 ((OperandMode::kBitWiseCommonMode | OperandMode::kShift64Imm | \ |
| 56 (CpuFeatures::IsSupported(DISTINCT_OPS) \ |
| 57 ? OperandMode::kAllowRRR \ |
49 : OperandMode::kBitWiseCommonMode))) | 58 : OperandMode::kBitWiseCommonMode))) |
| 59 |
50 #define AddOperandMode \ | 60 #define AddOperandMode \ |
51 ((OperandMode::kArithmeticCommonMode | OperandMode::kInt32Imm | \ | 61 ((OperandMode::kArithmeticCommonMode | OperandMode::kInt32Imm | \ |
52 (CpuFeatures::IsSupported(DISTINCT_OPS) \ | 62 (CpuFeatures::IsSupported(DISTINCT_OPS) \ |
53 ? (OperandMode::kAllowRRR | OperandMode::kAllowRRI) \ | 63 ? (OperandMode::kAllowRRR | OperandMode::kAllowRRI) \ |
54 : OperandMode::kArithmeticCommonMode))) | 64 : OperandMode::kArithmeticCommonMode))) |
55 #define SubOperandMode \ | 65 #define SubOperandMode \ |
56 ((OperandMode::kArithmeticCommonMode | OperandMode::kInt32Imm_Negate | \ | 66 ((OperandMode::kArithmeticCommonMode | OperandMode::kInt32Imm_Negate | \ |
57 (CpuFeatures::IsSupported(DISTINCT_OPS) \ | 67 (CpuFeatures::IsSupported(DISTINCT_OPS) \ |
58 ? (OperandMode::kAllowRRR | OperandMode::kAllowRRI) \ | 68 ? (OperandMode::kAllowRRR | OperandMode::kAllowRRI) \ |
59 : OperandMode::kArithmeticCommonMode))) | 69 : OperandMode::kArithmeticCommonMode))) |
(...skipping 762 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
822 int mask_lsb = base::bits::CountTrailingZeros64(value); | 832 int mask_lsb = base::bits::CountTrailingZeros64(value); |
823 if ((mask_width == 0) || (mask_msb + mask_width + mask_lsb != 64)) | 833 if ((mask_width == 0) || (mask_msb + mask_width + mask_lsb != 64)) |
824 return false; | 834 return false; |
825 *mb = mask_lsb + mask_width - 1; | 835 *mb = mask_lsb + mask_width - 1; |
826 *me = mask_lsb; | 836 *me = mask_lsb; |
827 return true; | 837 return true; |
828 } | 838 } |
829 #endif | 839 #endif |
830 | 840 |
831 void InstructionSelector::VisitWord32And(Node* node) { | 841 void InstructionSelector::VisitWord32And(Node* node) { |
832 VisitBin32op(this, node, kS390_And32, | 842 VisitBin32op(this, node, kS390_And32, AndOperandMode); |
833 BitWiseOperandMode | OperandMode::kAllowRM); | |
834 } | 843 } |
835 | 844 |
836 #if V8_TARGET_ARCH_S390X | 845 #if V8_TARGET_ARCH_S390X |
837 void InstructionSelector::VisitWord64And(Node* node) { | 846 void InstructionSelector::VisitWord64And(Node* node) { |
838 S390OperandGenerator g(this); | 847 S390OperandGenerator g(this); |
839 Int64BinopMatcher m(node); | 848 Int64BinopMatcher m(node); |
840 int mb = 0; | 849 int mb = 0; |
841 int me = 0; | 850 int me = 0; |
842 if (m.right().HasValue() && IsContiguousMask64(m.right().Value(), &mb, &me)) { | 851 if (m.right().HasValue() && IsContiguousMask64(m.right().Value(), &mb, &me)) { |
843 int sh = 0; | 852 int sh = 0; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
881 return; | 890 return; |
882 } | 891 } |
883 } | 892 } |
884 } | 893 } |
885 VisitBinop<Int64BinopMatcher>(this, node, kS390_And64, | 894 VisitBinop<Int64BinopMatcher>(this, node, kS390_And64, |
886 OperandMode::kUint32Imm); | 895 OperandMode::kUint32Imm); |
887 } | 896 } |
888 #endif | 897 #endif |
889 | 898 |
890 void InstructionSelector::VisitWord32Or(Node* node) { | 899 void InstructionSelector::VisitWord32Or(Node* node) { |
891 VisitBin32op(this, node, kS390_Or32, | 900 VisitBin32op(this, node, kS390_Or32, OrOperandMode); |
892 BitWiseOperandMode | OperandMode::kAllowRM); | |
893 } | 901 } |
894 | 902 |
895 #if V8_TARGET_ARCH_S390X | 903 #if V8_TARGET_ARCH_S390X |
896 void InstructionSelector::VisitWord64Or(Node* node) { | 904 void InstructionSelector::VisitWord64Or(Node* node) { |
897 Int64BinopMatcher m(node); | 905 Int64BinopMatcher m(node); |
898 VisitBinop<Int64BinopMatcher>(this, node, kS390_Or64, | 906 VisitBinop<Int64BinopMatcher>(this, node, kS390_Or64, |
899 OperandMode::kUint32Imm); | 907 OperandMode::kUint32Imm); |
900 } | 908 } |
901 #endif | 909 #endif |
902 | 910 |
903 void InstructionSelector::VisitWord32Xor(Node* node) { | 911 void InstructionSelector::VisitWord32Xor(Node* node) { |
904 VisitBin32op(this, node, kS390_Xor32, | 912 VisitBin32op(this, node, kS390_Xor32, XorOperandMode); |
905 BitWiseOperandMode | OperandMode::kAllowRM); | |
906 } | 913 } |
907 | 914 |
908 #if V8_TARGET_ARCH_S390X | 915 #if V8_TARGET_ARCH_S390X |
909 void InstructionSelector::VisitWord64Xor(Node* node) { | 916 void InstructionSelector::VisitWord64Xor(Node* node) { |
910 VisitBinop<Int64BinopMatcher>(this, node, kS390_Xor64, | 917 VisitBinop<Int64BinopMatcher>(this, node, kS390_Xor64, |
911 OperandMode::kUint32Imm); | 918 OperandMode::kUint32Imm); |
912 } | 919 } |
913 #endif | 920 #endif |
914 | 921 |
915 void InstructionSelector::VisitWord32Shl(Node* node) { | 922 void InstructionSelector::VisitWord32Shl(Node* node) { |
916 VisitBin32op(this, node, kS390_ShiftLeft32, BitWiseOperandMode); | 923 VisitBin32op(this, node, kS390_ShiftLeft32, ShiftOperandMode); |
917 } | 924 } |
918 | 925 |
919 #if V8_TARGET_ARCH_S390X | 926 #if V8_TARGET_ARCH_S390X |
920 void InstructionSelector::VisitWord64Shl(Node* node) { | 927 void InstructionSelector::VisitWord64Shl(Node* node) { |
921 S390OperandGenerator g(this); | 928 S390OperandGenerator g(this); |
922 Int64BinopMatcher m(node); | 929 Int64BinopMatcher m(node); |
923 // TODO(mbrandy): eliminate left sign extension if right >= 32 | 930 // TODO(mbrandy): eliminate left sign extension if right >= 32 |
924 if (m.left().IsWord64And() && m.right().IsInRange(0, 63)) { | 931 if (m.left().IsWord64And() && m.right().IsInRange(0, 63)) { |
925 Int64BinopMatcher mleft(m.left().node()); | 932 Int64BinopMatcher mleft(m.left().node()); |
926 int sh = m.right().Value(); | 933 int sh = m.right().Value(); |
(...skipping 27 matching lines...) Expand all Loading... |
954 return; | 961 return; |
955 } | 962 } |
956 } | 963 } |
957 } | 964 } |
958 } | 965 } |
959 VisitRRO(this, kS390_ShiftLeft64, node, OperandMode::kShift64Imm); | 966 VisitRRO(this, kS390_ShiftLeft64, node, OperandMode::kShift64Imm); |
960 } | 967 } |
961 #endif | 968 #endif |
962 | 969 |
963 void InstructionSelector::VisitWord32Shr(Node* node) { | 970 void InstructionSelector::VisitWord32Shr(Node* node) { |
964 VisitBin32op(this, node, kS390_ShiftRight32, BitWiseOperandMode); | 971 VisitBin32op(this, node, kS390_ShiftRight32, ShiftOperandMode); |
965 } | 972 } |
966 | 973 |
967 #if V8_TARGET_ARCH_S390X | 974 #if V8_TARGET_ARCH_S390X |
968 void InstructionSelector::VisitWord64Shr(Node* node) { | 975 void InstructionSelector::VisitWord64Shr(Node* node) { |
969 S390OperandGenerator g(this); | 976 S390OperandGenerator g(this); |
970 Int64BinopMatcher m(node); | 977 Int64BinopMatcher m(node); |
971 if (m.left().IsWord64And() && m.right().IsInRange(0, 63)) { | 978 if (m.left().IsWord64And() && m.right().IsInRange(0, 63)) { |
972 Int64BinopMatcher mleft(m.left().node()); | 979 Int64BinopMatcher mleft(m.left().node()); |
973 int sh = m.right().Value(); | 980 int sh = m.right().Value(); |
974 int mb; | 981 int mb; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1017 g.UseRegister(mleft.left().node()), g.TempImmediate(doZeroExt)); | 1024 g.UseRegister(mleft.left().node()), g.TempImmediate(doZeroExt)); |
1018 return; | 1025 return; |
1019 } else if (mleft.right().Is(24) && m.right().Is(24)) { | 1026 } else if (mleft.right().Is(24) && m.right().Is(24)) { |
1020 bool doZeroExt = !ZeroExtendsWord32ToWord64(mleft.left().node()); | 1027 bool doZeroExt = !ZeroExtendsWord32ToWord64(mleft.left().node()); |
1021 Emit(kS390_ExtendSignWord8, | 1028 Emit(kS390_ExtendSignWord8, |
1022 doZeroExt ? g.DefineAsRegister(node) : g.DefineSameAsFirst(node), | 1029 doZeroExt ? g.DefineAsRegister(node) : g.DefineSameAsFirst(node), |
1023 g.UseRegister(mleft.left().node()), g.TempImmediate(doZeroExt)); | 1030 g.UseRegister(mleft.left().node()), g.TempImmediate(doZeroExt)); |
1024 return; | 1031 return; |
1025 } | 1032 } |
1026 } | 1033 } |
1027 VisitBin32op(this, node, kS390_ShiftRightArith32, BitWiseOperandMode); | 1034 VisitBin32op(this, node, kS390_ShiftRightArith32, ShiftOperandMode); |
1028 } | 1035 } |
1029 | 1036 |
1030 #if !V8_TARGET_ARCH_S390X | 1037 #if !V8_TARGET_ARCH_S390X |
1031 void VisitPairBinop(InstructionSelector* selector, InstructionCode opcode, | 1038 void VisitPairBinop(InstructionSelector* selector, InstructionCode opcode, |
1032 InstructionCode opcode2, Node* node) { | 1039 InstructionCode opcode2, Node* node) { |
1033 S390OperandGenerator g(selector); | 1040 S390OperandGenerator g(selector); |
1034 | 1041 |
1035 Node* projection1 = NodeProperties::FindProjection(node, 1); | 1042 Node* projection1 = NodeProperties::FindProjection(node, 1); |
1036 if (projection1) { | 1043 if (projection1) { |
1037 // We use UseUniqueRegister here to avoid register sharing with the output | 1044 // We use UseUniqueRegister here to avoid register sharing with the output |
(...skipping 1269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2307 // static | 2314 // static |
2308 MachineOperatorBuilder::AlignmentRequirements | 2315 MachineOperatorBuilder::AlignmentRequirements |
2309 InstructionSelector::AlignmentRequirements() { | 2316 InstructionSelector::AlignmentRequirements() { |
2310 return MachineOperatorBuilder::AlignmentRequirements:: | 2317 return MachineOperatorBuilder::AlignmentRequirements:: |
2311 FullUnalignedAccessSupport(); | 2318 FullUnalignedAccessSupport(); |
2312 } | 2319 } |
2313 | 2320 |
2314 } // namespace compiler | 2321 } // namespace compiler |
2315 } // namespace internal | 2322 } // namespace internal |
2316 } // namespace v8 | 2323 } // namespace v8 |
OLD | NEW |