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

Unified Diff: src/compiler/mips64/instruction-selector-mips64.cc

Issue 2472703002: MIPS[64]: Use immediate constants in Add, And, Or and Xor instructions in turbofan (Closed)
Patch Set: Created 4 years, 1 month 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
« no previous file with comments | « src/compiler/mips/instruction-selector-mips.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/mips64/instruction-selector-mips64.cc
diff --git a/src/compiler/mips64/instruction-selector-mips64.cc b/src/compiler/mips64/instruction-selector-mips64.cc
index 6f72c6451d1fb920c0aae444f7cf1dbeb3ff6182..56bb80ec98c817495a5b8d397e01f2fa0b4a2165 100644
--- a/src/compiler/mips64/instruction-selector-mips64.cc
+++ b/src/compiler/mips64/instruction-selector-mips64.cc
@@ -59,6 +59,12 @@ class Mips64OperandGenerator final : public OperandGenerator {
case kMips64Dsar:
case kMips64Dshr:
return is_uint6(value);
+ case kMips64Add:
+ case kMips64And32:
+ case kMips64And:
+ case kMips64Dadd:
+ case kMips64Or32:
+ case kMips64Or:
case kMips64Xor:
return is_uint16(value);
case kMips64Ldc1:
@@ -173,8 +179,23 @@ bool TryEmitExtendingLoad(InstructionSelector* selector, Node* node) {
return false;
}
+bool TryMatchImmediate(InstructionSelector* selector,
+ InstructionCode* opcode_return, Node* node,
+ size_t* input_count_return, InstructionOperand* inputs) {
+ Mips64OperandGenerator g(selector);
+ if (g.CanBeImmediate(node, *opcode_return)) {
+ *opcode_return |= AddressingModeField::encode(kMode_MRI);
+ inputs[0] = g.UseImmediate(node);
+ *input_count_return = 1;
+ return true;
+ }
+ return false;
+}
+
static void VisitBinop(InstructionSelector* selector, Node* node,
- InstructionCode opcode, FlagsContinuation* cont) {
+ InstructionCode opcode, bool has_reverse_opcode,
+ InstructionCode reverse_opcode,
+ FlagsContinuation* cont) {
Mips64OperandGenerator g(selector);
Int32BinopMatcher m(node);
InstructionOperand inputs[4];
@@ -182,8 +203,21 @@ static void VisitBinop(InstructionSelector* selector, Node* node,
InstructionOperand outputs[2];
size_t output_count = 0;
- inputs[input_count++] = g.UseRegister(m.left().node());
- inputs[input_count++] = g.UseOperand(m.right().node(), opcode);
+ if (TryMatchImmediate(selector, &opcode, m.right().node(), &input_count,
+ &inputs[1])) {
+ inputs[0] = g.UseRegister(m.left().node());
+ input_count++;
+ }
+ if (has_reverse_opcode &&
+ TryMatchImmediate(selector, &reverse_opcode, m.left().node(),
+ &input_count, &inputs[1])) {
+ inputs[0] = g.UseRegister(m.right().node());
+ opcode = reverse_opcode;
+ input_count++;
+ } else {
+ inputs[input_count++] = g.UseRegister(m.left().node());
+ inputs[input_count++] = g.UseOperand(m.right().node(), opcode);
+ }
if (cont->IsBranch()) {
inputs[input_count++] = g.Label(cont->true_block());
@@ -216,11 +250,21 @@ static void VisitBinop(InstructionSelector* selector, Node* node,
}
}
+static void VisitBinop(InstructionSelector* selector, Node* node,
+ InstructionCode opcode, bool has_reverse_opcode,
+ InstructionCode reverse_opcode) {
+ FlagsContinuation cont;
+ VisitBinop(selector, node, opcode, has_reverse_opcode, reverse_opcode, &cont);
+}
+
+static void VisitBinop(InstructionSelector* selector, Node* node,
+ InstructionCode opcode, FlagsContinuation* cont) {
+ VisitBinop(selector, node, opcode, false, kArchNop, cont);
+}
static void VisitBinop(InstructionSelector* selector, Node* node,
InstructionCode opcode) {
- FlagsContinuation cont;
- VisitBinop(selector, node, opcode, &cont);
+ VisitBinop(selector, node, opcode, false, kArchNop);
}
void EmitLoad(InstructionSelector* selector, Node* node, InstructionCode opcode,
@@ -415,7 +459,7 @@ void InstructionSelector::VisitWord32And(Node* node) {
return;
}
}
- VisitBinop(this, node, kMips64And32);
+ VisitBinop(this, node, kMips64And32, true, kMips64And32);
}
@@ -466,17 +510,17 @@ void InstructionSelector::VisitWord64And(Node* node) {
return;
}
}
- VisitBinop(this, node, kMips64And);
+ VisitBinop(this, node, kMips64And, true, kMips64And);
}
void InstructionSelector::VisitWord32Or(Node* node) {
- VisitBinop(this, node, kMips64Or32);
+ VisitBinop(this, node, kMips64Or32, true, kMips64Or32);
}
void InstructionSelector::VisitWord64Or(Node* node) {
- VisitBinop(this, node, kMips64Or);
+ VisitBinop(this, node, kMips64Or, true, kMips64Or);
}
@@ -500,7 +544,7 @@ void InstructionSelector::VisitWord32Xor(Node* node) {
g.TempImmediate(0));
return;
}
- VisitBinop(this, node, kMips64Xor32);
+ VisitBinop(this, node, kMips64Xor32, true, kMips64Xor32);
}
@@ -524,7 +568,7 @@ void InstructionSelector::VisitWord64Xor(Node* node) {
g.TempImmediate(0));
return;
}
- VisitBinop(this, node, kMips64Xor);
+ VisitBinop(this, node, kMips64Xor, true, kMips64Xor);
}
@@ -774,7 +818,7 @@ void InstructionSelector::VisitInt32Add(Node* node) {
return;
}
}
- VisitBinop(this, node, kMips64Add);
+ VisitBinop(this, node, kMips64Add, true, kMips64Add);
}
@@ -808,7 +852,7 @@ void InstructionSelector::VisitInt64Add(Node* node) {
}
}
- VisitBinop(this, node, kMips64Dadd);
+ VisitBinop(this, node, kMips64Dadd, true, kMips64Dadd);
}
« no previous file with comments | « src/compiler/mips/instruction-selector-mips.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698