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

Unified 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: update on store and some optimization on load Created 4 years, 6 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 side-by-side diff with in-line comments
Download patch
Index: src/compiler/s390/instruction-selector-s390.cc
diff --git a/src/compiler/s390/instruction-selector-s390.cc b/src/compiler/s390/instruction-selector-s390.cc
index 8176419e15ab1e6dc86f67f2f33c6b6263575210..72772e9f0ea77fde4fb4e7e66e52786ab7fb6ac5 100644
--- a/src/compiler/s390/instruction-selector-s390.cc
+++ b/src/compiler/s390/instruction-selector-s390.cc
@@ -264,6 +264,7 @@ void InstructionSelector::VisitStore(Node* node) {
} else {
ArchOpcode opcode = kArchNop;
ImmediateMode mode = kInt16Imm;
+ NodeMatcher m(value);
switch (rep) {
case MachineRepresentation::kFloat32:
opcode = kS390_StoreFloat32;
@@ -277,18 +278,30 @@ void InstructionSelector::VisitStore(Node* node) {
break;
case MachineRepresentation::kWord16:
opcode = kS390_StoreWord16;
+ if (m.IsWord16ReverseBytes()) {
+ opcode = kS390_StoreReverse16;
+ value = value->InputAt(0);
+ }
break;
#if !V8_TARGET_ARCH_S390X
case MachineRepresentation::kTagged: // Fall through.
#endif
case MachineRepresentation::kWord32:
opcode = kS390_StoreWord32;
+ if (m.IsWord32ReverseBytes()) {
+ opcode = kS390_StoreReverse32;
+ value = value->InputAt(0);
+ }
break;
#if V8_TARGET_ARCH_S390X
case MachineRepresentation::kTagged: // Fall through.
case MachineRepresentation::kWord64:
opcode = kS390_StoreWord64;
mode = kInt16Imm_4ByteAligned;
+ if (m.IsWord64ReverseBytes()) {
+ opcode = kS390_StoreReverse64;
+ value = value->InputAt(0);
+ }
break;
#else
case MachineRepresentation::kWord64: // Fall through.
@@ -880,6 +893,51 @@ void InstructionSelector::VisitWord32ReverseBits(Node* node) { UNREACHABLE(); }
void InstructionSelector::VisitWord64ReverseBits(Node* node) { UNREACHABLE(); }
#endif
+void InstructionSelector::VisitWord64ReverseBytes(Node* node) {
+ UNREACHABLE();
+ S390OperandGenerator g(this);
+ Emit(kS390_LoadReverse64RR, g.DefineAsRegister(node),
+ g.UseRegister(node->InputAt(0)));
+}
+
+void InstructionSelector::VisitWord32ReverseBytes(Node* node) {
+ S390OperandGenerator g(this);
+ NodeMatcher input(node->InputAt(0));
+ if (CanCover(node, input.node()) && input.IsLoad()) {
+ LoadRepresentation load_rep = LoadRepresentationOf(input.node()->op());
+ if (load_rep.representation() == MachineRepresentation::kWord32) {
+ Node* base = input.node()->InputAt(0);
+ Node* offset = input.node()->InputAt(1);
+ Emit(kS390_LoadReverse32 | AddressingModeField::encode(kMode_MRR),
+ // TODO(john.yan): one of the base and offset can be imm.
+ g.DefineAsRegister(node), g.UseRegister(base),
+ g.UseRegister(offset));
+ return;
+ }
+ }
+ Emit(kS390_LoadReverse32RR, g.DefineAsRegister(node),
+ g.UseRegister(node->InputAt(0)));
+}
+
+void InstructionSelector::VisitWord16ReverseBytes(Node* node) {
+ S390OperandGenerator g(this);
+ NodeMatcher input(node->InputAt(0));
+ if (CanCover(node, input.node()) && input.IsLoad()) {
+ LoadRepresentation load_rep = LoadRepresentationOf(input.node()->op());
+ if (load_rep.representation() == MachineRepresentation::kWord16) {
+ Node* base = input.node()->InputAt(0);
+ Node* offset = input.node()->InputAt(1);
+ Emit(kS390_LoadReverse16 | AddressingModeField::encode(kMode_MRR),
+ // TODO(john.yan): one of the base and offset can be imm.
+ g.DefineAsRegister(node), g.UseRegister(base),
+ g.UseRegister(offset));
+ return;
+ }
+ }
+ Emit(kS390_LoadReverse16RR, g.DefineAsRegister(node),
+ g.UseRegister(node->InputAt(0)));
+}
+
void InstructionSelector::VisitInt32Add(Node* node) {
VisitBinop<Int32BinopMatcher>(this, node, kS390_Add, kInt16Imm);
}
@@ -1830,6 +1888,9 @@ InstructionSelector::SupportedMachineOperatorFlags() {
MachineOperatorBuilder::kFloat64RoundTruncate |
MachineOperatorBuilder::kFloat64RoundTiesAway |
MachineOperatorBuilder::kWord32Popcnt |
+ MachineOperatorBuilder::kWord16ReverseBytes |
+ MachineOperatorBuilder::kWord32ReverseBytes |
+ MachineOperatorBuilder::kWord64ReverseBytes |
MachineOperatorBuilder::kWord64Popcnt;
}

Powered by Google App Engine
This is Rietveld 408576698