Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(128)

Side by Side Diff: src/compiler/s390/instruction-selector-s390.cc

Issue 2045943002: [compiler] [wasm] Introduce Word32/64ReverseBytes as TF Optional Opcode (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Use ByteReverse in simulator Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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;
288 if (m.IsWord16ReverseBytes()) {
289 opcode = kS390_StoreReverse16;
290 value = value->InputAt(0);
291 }
287 break; 292 break;
288 #if !V8_TARGET_ARCH_S390X 293 #if !V8_TARGET_ARCH_S390X
289 case MachineRepresentation::kTagged: // Fall through. 294 case MachineRepresentation::kTagged: // Fall through.
290 #endif 295 #endif
291 case MachineRepresentation::kWord32: 296 case MachineRepresentation::kWord32:
292 opcode = kS390_StoreWord32; 297 opcode = kS390_StoreWord32;
298 if (m.IsWord32ReverseBytes()) {
299 opcode = kS390_StoreReverse32;
300 value = value->InputAt(0);
301 }
293 break; 302 break;
294 #if V8_TARGET_ARCH_S390X 303 #if V8_TARGET_ARCH_S390X
295 case MachineRepresentation::kTagged: // Fall through. 304 case MachineRepresentation::kTagged: // Fall through.
296 case MachineRepresentation::kWord64: 305 case MachineRepresentation::kWord64:
297 opcode = kS390_StoreWord64; 306 opcode = kS390_StoreWord64;
298 mode = kInt16Imm_4ByteAligned; 307 mode = kInt16Imm_4ByteAligned;
308 if (m.IsWord64ReverseBytes()) {
309 opcode = kS390_StoreReverse64;
310 value = value->InputAt(0);
311 }
299 break; 312 break;
300 #else 313 #else
301 case MachineRepresentation::kWord64: // Fall through. 314 case MachineRepresentation::kWord64: // Fall through.
302 #endif 315 #endif
303 case MachineRepresentation::kSimd128: // Fall through. 316 case MachineRepresentation::kSimd128: // Fall through.
304 case MachineRepresentation::kNone: 317 case MachineRepresentation::kNone:
305 UNREACHABLE(); 318 UNREACHABLE();
306 return; 319 return;
307 } 320 }
308 if (g.CanBeImmediate(offset, mode)) { 321 if (g.CanBeImmediate(offset, mode)) {
(...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after
880 #if V8_TARGET_ARCH_S390X 893 #if V8_TARGET_ARCH_S390X
881 void InstructionSelector::VisitWord64Ctz(Node* node) { UNREACHABLE(); } 894 void InstructionSelector::VisitWord64Ctz(Node* node) { UNREACHABLE(); }
882 #endif 895 #endif
883 896
884 void InstructionSelector::VisitWord32ReverseBits(Node* node) { UNREACHABLE(); } 897 void InstructionSelector::VisitWord32ReverseBits(Node* node) { UNREACHABLE(); }
885 898
886 #if V8_TARGET_ARCH_S390X 899 #if V8_TARGET_ARCH_S390X
887 void InstructionSelector::VisitWord64ReverseBits(Node* node) { UNREACHABLE(); } 900 void InstructionSelector::VisitWord64ReverseBits(Node* node) { UNREACHABLE(); }
888 #endif 901 #endif
889 902
903 void InstructionSelector::VisitWord64ReverseBytes(Node* node) {
904 S390OperandGenerator g(this);
905 Emit(kS390_LoadReverse64RR, g.DefineAsRegister(node),
906 g.UseRegister(node->InputAt(0)));
907 }
908
909 void InstructionSelector::VisitWord32ReverseBytes(Node* node) {
910 S390OperandGenerator g(this);
911 NodeMatcher input(node->InputAt(0));
912 if (CanCover(node, input.node()) && input.IsLoad()) {
913 LoadRepresentation load_rep = LoadRepresentationOf(input.node()->op());
914 if (load_rep.representation() == MachineRepresentation::kWord32) {
915 Node* base = input.node()->InputAt(0);
916 Node* offset = input.node()->InputAt(1);
917 Emit(kS390_LoadReverse32 | AddressingModeField::encode(kMode_MRR),
918 // TODO(john.yan): one of the base and offset can be imm.
919 g.DefineAsRegister(node), g.UseRegister(base),
920 g.UseRegister(offset));
921 return;
922 }
923 }
924 Emit(kS390_LoadReverse32RR, g.DefineAsRegister(node),
925 g.UseRegister(node->InputAt(0)));
926 }
927
928 void InstructionSelector::VisitWord16ReverseBytes(Node* node) {
929 S390OperandGenerator g(this);
930 NodeMatcher input(node->InputAt(0));
931 if (CanCover(node, input.node()) && input.IsLoad()) {
932 LoadRepresentation load_rep = LoadRepresentationOf(input.node()->op());
933 if (load_rep.representation() == MachineRepresentation::kWord16) {
934 Node* base = input.node()->InputAt(0);
935 Node* offset = input.node()->InputAt(1);
936 Emit(kS390_LoadReverse16 | AddressingModeField::encode(kMode_MRR),
937 // TODO(john.yan): one of the base and offset can be imm.
938 g.DefineAsRegister(node), g.UseRegister(base),
939 g.UseRegister(offset));
940 return;
941 }
942 }
943 Emit(kS390_LoadReverse16RR, g.DefineAsRegister(node),
944 g.UseRegister(node->InputAt(0)));
945 }
946
890 void InstructionSelector::VisitInt32Add(Node* node) { 947 void InstructionSelector::VisitInt32Add(Node* node) {
891 VisitBinop<Int32BinopMatcher>(this, node, kS390_Add, kInt16Imm); 948 VisitBinop<Int32BinopMatcher>(this, node, kS390_Add, kInt16Imm);
892 } 949 }
893 950
894 #if V8_TARGET_ARCH_S390X 951 #if V8_TARGET_ARCH_S390X
895 void InstructionSelector::VisitInt64Add(Node* node) { 952 void InstructionSelector::VisitInt64Add(Node* node) {
896 VisitBinop<Int64BinopMatcher>(this, node, kS390_Add, kInt16Imm); 953 VisitBinop<Int64BinopMatcher>(this, node, kS390_Add, kInt16Imm);
897 } 954 }
898 #endif 955 #endif
899 956
(...skipping 984 matching lines...) Expand 10 before | Expand all | Expand 10 after
1884 MachineOperatorBuilder::Flags 1941 MachineOperatorBuilder::Flags
1885 InstructionSelector::SupportedMachineOperatorFlags() { 1942 InstructionSelector::SupportedMachineOperatorFlags() {
1886 return MachineOperatorBuilder::kFloat32RoundDown | 1943 return MachineOperatorBuilder::kFloat32RoundDown |
1887 MachineOperatorBuilder::kFloat64RoundDown | 1944 MachineOperatorBuilder::kFloat64RoundDown |
1888 MachineOperatorBuilder::kFloat32RoundUp | 1945 MachineOperatorBuilder::kFloat32RoundUp |
1889 MachineOperatorBuilder::kFloat64RoundUp | 1946 MachineOperatorBuilder::kFloat64RoundUp |
1890 MachineOperatorBuilder::kFloat32RoundTruncate | 1947 MachineOperatorBuilder::kFloat32RoundTruncate |
1891 MachineOperatorBuilder::kFloat64RoundTruncate | 1948 MachineOperatorBuilder::kFloat64RoundTruncate |
1892 MachineOperatorBuilder::kFloat64RoundTiesAway | 1949 MachineOperatorBuilder::kFloat64RoundTiesAway |
1893 MachineOperatorBuilder::kWord32Popcnt | 1950 MachineOperatorBuilder::kWord32Popcnt |
1951 MachineOperatorBuilder::kWord16ReverseBytes |
1952 MachineOperatorBuilder::kWord32ReverseBytes |
1953 MachineOperatorBuilder::kWord64ReverseBytes |
1894 MachineOperatorBuilder::kWord64Popcnt; 1954 MachineOperatorBuilder::kWord64Popcnt;
1895 } 1955 }
1896 1956
1897 // static 1957 // static
1898 MachineOperatorBuilder::AlignmentRequirements 1958 MachineOperatorBuilder::AlignmentRequirements
1899 InstructionSelector::AlignmentRequirements() { 1959 InstructionSelector::AlignmentRequirements() {
1900 return MachineOperatorBuilder::AlignmentRequirements:: 1960 return MachineOperatorBuilder::AlignmentRequirements::
1901 FullUnalignedAccessSupport(); 1961 FullUnalignedAccessSupport();
1902 } 1962 }
1903 1963
1904 } // namespace compiler 1964 } // namespace compiler
1905 } // namespace internal 1965 } // namespace internal
1906 } // namespace v8 1966 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698