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

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: fix according to ahaas Created 4 years, 4 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;
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698