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