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 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
264 } | 264 } |
265 InstructionOperand temps[] = {g.TempRegister(), g.TempRegister()}; | 265 InstructionOperand temps[] = {g.TempRegister(), g.TempRegister()}; |
266 size_t const temp_count = arraysize(temps); | 266 size_t const temp_count = arraysize(temps); |
267 InstructionCode code = kArchStoreWithWriteBarrier; | 267 InstructionCode code = kArchStoreWithWriteBarrier; |
268 code |= AddressingModeField::encode(addressing_mode); | 268 code |= AddressingModeField::encode(addressing_mode); |
269 code |= MiscField::encode(static_cast<int>(record_write_mode)); | 269 code |= MiscField::encode(static_cast<int>(record_write_mode)); |
270 Emit(code, 0, nullptr, input_count, inputs, temp_count, temps); | 270 Emit(code, 0, nullptr, input_count, inputs, temp_count, temps); |
271 } else { | 271 } else { |
272 ArchOpcode opcode = kArchNop; | 272 ArchOpcode opcode = kArchNop; |
273 ImmediateMode mode = kInt16Imm; | 273 ImmediateMode mode = kInt16Imm; |
| 274 NodeMatcher m(value); |
274 switch (rep) { | 275 switch (rep) { |
275 case MachineRepresentation::kFloat32: | 276 case MachineRepresentation::kFloat32: |
276 opcode = kS390_StoreFloat32; | 277 opcode = kS390_StoreFloat32; |
277 break; | 278 break; |
278 case MachineRepresentation::kFloat64: | 279 case MachineRepresentation::kFloat64: |
279 opcode = kS390_StoreDouble; | 280 opcode = kS390_StoreDouble; |
280 break; | 281 break; |
281 case MachineRepresentation::kBit: // Fall through. | 282 case MachineRepresentation::kBit: // Fall through. |
282 case MachineRepresentation::kWord8: | 283 case MachineRepresentation::kWord8: |
283 opcode = kS390_StoreWord8; | 284 opcode = kS390_StoreWord8; |
284 break; | 285 break; |
285 case MachineRepresentation::kWord16: | 286 case MachineRepresentation::kWord16: |
286 opcode = kS390_StoreWord16; | 287 opcode = kS390_StoreWord16; |
287 break; | 288 break; |
288 #if !V8_TARGET_ARCH_S390X | 289 #if !V8_TARGET_ARCH_S390X |
289 case MachineRepresentation::kTagged: // Fall through. | 290 case MachineRepresentation::kTagged: // Fall through. |
290 #endif | 291 #endif |
291 case MachineRepresentation::kWord32: | 292 case MachineRepresentation::kWord32: |
292 opcode = kS390_StoreWord32; | 293 opcode = kS390_StoreWord32; |
| 294 if (m.IsWord32ReverseBytes()) { |
| 295 opcode = kS390_StoreReverse32; |
| 296 value = value->InputAt(0); |
| 297 } |
293 break; | 298 break; |
294 #if V8_TARGET_ARCH_S390X | 299 #if V8_TARGET_ARCH_S390X |
295 case MachineRepresentation::kTagged: // Fall through. | 300 case MachineRepresentation::kTagged: // Fall through. |
296 case MachineRepresentation::kWord64: | 301 case MachineRepresentation::kWord64: |
297 opcode = kS390_StoreWord64; | 302 opcode = kS390_StoreWord64; |
298 mode = kInt16Imm_4ByteAligned; | 303 mode = kInt16Imm_4ByteAligned; |
| 304 if (m.IsWord64ReverseBytes()) { |
| 305 opcode = kS390_StoreReverse64; |
| 306 value = value->InputAt(0); |
| 307 } |
299 break; | 308 break; |
300 #else | 309 #else |
301 case MachineRepresentation::kWord64: // Fall through. | 310 case MachineRepresentation::kWord64: // Fall through. |
302 #endif | 311 #endif |
303 case MachineRepresentation::kSimd128: // Fall through. | 312 case MachineRepresentation::kSimd128: // Fall through. |
304 case MachineRepresentation::kNone: | 313 case MachineRepresentation::kNone: |
305 UNREACHABLE(); | 314 UNREACHABLE(); |
306 return; | 315 return; |
307 } | 316 } |
308 if (g.CanBeImmediate(offset, mode)) { | 317 if (g.CanBeImmediate(offset, mode)) { |
(...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
880 #if V8_TARGET_ARCH_S390X | 889 #if V8_TARGET_ARCH_S390X |
881 void InstructionSelector::VisitWord64Ctz(Node* node) { UNREACHABLE(); } | 890 void InstructionSelector::VisitWord64Ctz(Node* node) { UNREACHABLE(); } |
882 #endif | 891 #endif |
883 | 892 |
884 void InstructionSelector::VisitWord32ReverseBits(Node* node) { UNREACHABLE(); } | 893 void InstructionSelector::VisitWord32ReverseBits(Node* node) { UNREACHABLE(); } |
885 | 894 |
886 #if V8_TARGET_ARCH_S390X | 895 #if V8_TARGET_ARCH_S390X |
887 void InstructionSelector::VisitWord64ReverseBits(Node* node) { UNREACHABLE(); } | 896 void InstructionSelector::VisitWord64ReverseBits(Node* node) { UNREACHABLE(); } |
888 #endif | 897 #endif |
889 | 898 |
| 899 void InstructionSelector::VisitWord64ReverseBytes(Node* node) { |
| 900 S390OperandGenerator g(this); |
| 901 Emit(kS390_LoadReverse64RR, g.DefineAsRegister(node), |
| 902 g.UseRegister(node->InputAt(0))); |
| 903 } |
| 904 |
| 905 void InstructionSelector::VisitWord32ReverseBytes(Node* node) { |
| 906 S390OperandGenerator g(this); |
| 907 NodeMatcher input(node->InputAt(0)); |
| 908 if (CanCover(node, input.node()) && input.IsLoad()) { |
| 909 LoadRepresentation load_rep = LoadRepresentationOf(input.node()->op()); |
| 910 if (load_rep.representation() == MachineRepresentation::kWord32) { |
| 911 Node* base = input.node()->InputAt(0); |
| 912 Node* offset = input.node()->InputAt(1); |
| 913 Emit(kS390_LoadReverse32 | AddressingModeField::encode(kMode_MRR), |
| 914 // TODO(john.yan): one of the base and offset can be imm. |
| 915 g.DefineAsRegister(node), g.UseRegister(base), |
| 916 g.UseRegister(offset)); |
| 917 return; |
| 918 } |
| 919 } |
| 920 Emit(kS390_LoadReverse32RR, g.DefineAsRegister(node), |
| 921 g.UseRegister(node->InputAt(0))); |
| 922 } |
| 923 |
890 void InstructionSelector::VisitInt32Add(Node* node) { | 924 void InstructionSelector::VisitInt32Add(Node* node) { |
891 VisitBinop<Int32BinopMatcher>(this, node, kS390_Add, kInt16Imm); | 925 VisitBinop<Int32BinopMatcher>(this, node, kS390_Add, kInt16Imm); |
892 } | 926 } |
893 | 927 |
894 #if V8_TARGET_ARCH_S390X | 928 #if V8_TARGET_ARCH_S390X |
895 void InstructionSelector::VisitInt64Add(Node* node) { | 929 void InstructionSelector::VisitInt64Add(Node* node) { |
896 VisitBinop<Int64BinopMatcher>(this, node, kS390_Add, kInt16Imm); | 930 VisitBinop<Int64BinopMatcher>(this, node, kS390_Add, kInt16Imm); |
897 } | 931 } |
898 #endif | 932 #endif |
899 | 933 |
(...skipping 984 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1884 MachineOperatorBuilder::Flags | 1918 MachineOperatorBuilder::Flags |
1885 InstructionSelector::SupportedMachineOperatorFlags() { | 1919 InstructionSelector::SupportedMachineOperatorFlags() { |
1886 return MachineOperatorBuilder::kFloat32RoundDown | | 1920 return MachineOperatorBuilder::kFloat32RoundDown | |
1887 MachineOperatorBuilder::kFloat64RoundDown | | 1921 MachineOperatorBuilder::kFloat64RoundDown | |
1888 MachineOperatorBuilder::kFloat32RoundUp | | 1922 MachineOperatorBuilder::kFloat32RoundUp | |
1889 MachineOperatorBuilder::kFloat64RoundUp | | 1923 MachineOperatorBuilder::kFloat64RoundUp | |
1890 MachineOperatorBuilder::kFloat32RoundTruncate | | 1924 MachineOperatorBuilder::kFloat32RoundTruncate | |
1891 MachineOperatorBuilder::kFloat64RoundTruncate | | 1925 MachineOperatorBuilder::kFloat64RoundTruncate | |
1892 MachineOperatorBuilder::kFloat64RoundTiesAway | | 1926 MachineOperatorBuilder::kFloat64RoundTiesAway | |
1893 MachineOperatorBuilder::kWord32Popcnt | | 1927 MachineOperatorBuilder::kWord32Popcnt | |
| 1928 MachineOperatorBuilder::kWord32ReverseBytes | |
| 1929 MachineOperatorBuilder::kWord64ReverseBytes | |
1894 MachineOperatorBuilder::kWord64Popcnt; | 1930 MachineOperatorBuilder::kWord64Popcnt; |
1895 } | 1931 } |
1896 | 1932 |
1897 // static | 1933 // static |
1898 MachineOperatorBuilder::AlignmentRequirements | 1934 MachineOperatorBuilder::AlignmentRequirements |
1899 InstructionSelector::AlignmentRequirements() { | 1935 InstructionSelector::AlignmentRequirements() { |
1900 return MachineOperatorBuilder::AlignmentRequirements:: | 1936 return MachineOperatorBuilder::AlignmentRequirements:: |
1901 FullUnalignedAccessSupport(); | 1937 FullUnalignedAccessSupport(); |
1902 } | 1938 } |
1903 | 1939 |
1904 } // namespace compiler | 1940 } // namespace compiler |
1905 } // namespace internal | 1941 } // namespace internal |
1906 } // namespace v8 | 1942 } // namespace v8 |
OLD | NEW |