Index: src/compiler/mips/instruction-selector-mips.cc |
diff --git a/src/compiler/mips/instruction-selector-mips.cc b/src/compiler/mips/instruction-selector-mips.cc |
index 0e8df3e4481eb86fd5453454375d61377aceefbe..98ed5ae450497e2cc5b5ef2046efc23821e782a3 100644 |
--- a/src/compiler/mips/instruction-selector-mips.cc |
+++ b/src/compiler/mips/instruction-selector-mips.cc |
@@ -265,8 +265,7 @@ void InstructionSelector::VisitWord32Ror(Node* node) { |
void InstructionSelector::VisitWord32Clz(Node* node) { |
- MipsOperandGenerator g(this); |
- Emit(kMipsClz, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0))); |
+ VisitRR(this, kMipsClz, node); |
} |
@@ -313,15 +312,12 @@ void InstructionSelector::VisitInt32Mul(Node* node) { |
return; |
} |
} |
- Emit(kMipsMul, g.DefineAsRegister(node), g.UseRegister(m.left().node()), |
- g.UseRegister(m.right().node())); |
+ VisitRRR(this, kMipsMul, node); |
} |
void InstructionSelector::VisitInt32MulHigh(Node* node) { |
- MipsOperandGenerator g(this); |
- Emit(kMipsMulHigh, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), |
- g.UseRegister(node->InputAt(1))); |
+ VisitRRR(this, kMipsMulHigh, node); |
} |
@@ -365,39 +361,37 @@ void InstructionSelector::VisitUint32Mod(Node* node) { |
void InstructionSelector::VisitChangeFloat32ToFloat64(Node* node) { |
- MipsOperandGenerator g(this); |
- Emit(kMipsCvtDS, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0))); |
+ VisitRR(this, kMipsCvtDS, node); |
} |
void InstructionSelector::VisitChangeInt32ToFloat64(Node* node) { |
- MipsOperandGenerator g(this); |
- Emit(kMipsCvtDW, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0))); |
+ VisitRR(this, kMipsCvtDW, node); |
} |
void InstructionSelector::VisitChangeUint32ToFloat64(Node* node) { |
- MipsOperandGenerator g(this); |
- Emit(kMipsCvtDUw, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0))); |
+ VisitRR(this, kMipsCvtDUw, node); |
} |
void InstructionSelector::VisitChangeFloat64ToInt32(Node* node) { |
- MipsOperandGenerator g(this); |
- Emit(kMipsTruncWD, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0))); |
+ VisitRR(this, kMipsTruncWD, node); |
} |
void InstructionSelector::VisitChangeFloat64ToUint32(Node* node) { |
- MipsOperandGenerator g(this); |
- Emit(kMipsTruncUwD, g.DefineAsRegister(node), |
- g.UseRegister(node->InputAt(0))); |
+ VisitRR(this, kMipsTruncUwD, node); |
} |
void InstructionSelector::VisitTruncateFloat64ToFloat32(Node* node) { |
- MipsOperandGenerator g(this); |
- Emit(kMipsCvtSD, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0))); |
+ VisitRR(this, kMipsCvtSD, node); |
+} |
+ |
+ |
+void InstructionSelector::VisitFloat32Add(Node* node) { |
+ VisitRRR(this, kMipsAddS, node); |
} |
@@ -406,6 +400,11 @@ void InstructionSelector::VisitFloat64Add(Node* node) { |
} |
+void InstructionSelector::VisitFloat32Sub(Node* node) { |
+ VisitRRR(this, kMipsSubS, node); |
+} |
+ |
+ |
void InstructionSelector::VisitFloat64Sub(Node* node) { |
MipsOperandGenerator g(this); |
Float64BinopMatcher m(node); |
@@ -425,11 +424,21 @@ void InstructionSelector::VisitFloat64Sub(Node* node) { |
} |
+void InstructionSelector::VisitFloat32Mul(Node* node) { |
+ VisitRRR(this, kMipsMulS, node); |
+} |
+ |
+ |
void InstructionSelector::VisitFloat64Mul(Node* node) { |
VisitRRR(this, kMipsMulD, node); |
} |
+void InstructionSelector::VisitFloat32Div(Node* node) { |
+ VisitRRR(this, kMipsDivS, node); |
+} |
+ |
+ |
void InstructionSelector::VisitFloat64Div(Node* node) { |
VisitRRR(this, kMipsDivD, node); |
} |
@@ -442,15 +451,25 @@ void InstructionSelector::VisitFloat64Mod(Node* node) { |
} |
+void InstructionSelector::VisitFloat32Max(Node* node) { UNREACHABLE(); } |
+ |
+ |
void InstructionSelector::VisitFloat64Max(Node* node) { UNREACHABLE(); } |
+void InstructionSelector::VisitFloat32Min(Node* node) { UNREACHABLE(); } |
+ |
+ |
void InstructionSelector::VisitFloat64Min(Node* node) { UNREACHABLE(); } |
+void InstructionSelector::VisitFloat32Sqrt(Node* node) { |
+ VisitRR(this, kMipsSqrtS, node); |
+} |
+ |
+ |
void InstructionSelector::VisitFloat64Sqrt(Node* node) { |
- MipsOperandGenerator g(this); |
- Emit(kMipsSqrtD, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0))); |
+ VisitRR(this, kMipsSqrtD, node); |
} |
@@ -636,7 +655,18 @@ static void VisitCompare(InstructionSelector* selector, InstructionCode opcode, |
} |
-// Shared routine for multiple float compare operations. |
+// Shared routine for multiple float32 compare operations. |
+void VisitFloat32Compare(InstructionSelector* selector, Node* node, |
+ FlagsContinuation* cont) { |
+ MipsOperandGenerator g(selector); |
+ Node* left = node->InputAt(0); |
+ Node* right = node->InputAt(1); |
+ VisitCompare(selector, kMipsCmpS, g.UseRegister(left), g.UseRegister(right), |
+ cont); |
+} |
+ |
+ |
+// Shared routine for multiple float64 compare operations. |
void VisitFloat64Compare(InstructionSelector* selector, Node* node, |
FlagsContinuation* cont) { |
MipsOperandGenerator g(selector); |
@@ -708,6 +738,15 @@ void VisitWordCompareZero(InstructionSelector* selector, Node* user, |
case IrOpcode::kUint32LessThanOrEqual: |
cont->OverwriteAndNegateIfEqual(kUnsignedLessThanOrEqual); |
return VisitWordCompare(selector, value, cont); |
+ case IrOpcode::kFloat32Equal: |
+ cont->OverwriteAndNegateIfEqual(kEqual); |
+ return VisitFloat32Compare(selector, value, cont); |
+ case IrOpcode::kFloat32LessThan: |
+ cont->OverwriteAndNegateIfEqual(kUnsignedLessThan); |
+ return VisitFloat32Compare(selector, value, cont); |
+ case IrOpcode::kFloat32LessThanOrEqual: |
+ cont->OverwriteAndNegateIfEqual(kUnsignedLessThanOrEqual); |
+ return VisitFloat32Compare(selector, value, cont); |
case IrOpcode::kFloat64Equal: |
cont->OverwriteAndNegateIfEqual(kEqual); |
return VisitFloat64Compare(selector, value, cont); |
@@ -853,6 +892,24 @@ void InstructionSelector::VisitInt32SubWithOverflow(Node* node) { |
} |
+void InstructionSelector::VisitFloat32Equal(Node* node) { |
+ FlagsContinuation cont(kEqual, node); |
+ VisitFloat32Compare(this, node, &cont); |
+} |
+ |
+ |
+void InstructionSelector::VisitFloat32LessThan(Node* node) { |
+ FlagsContinuation cont(kUnsignedLessThan, node); |
+ VisitFloat32Compare(this, node, &cont); |
+} |
+ |
+ |
+void InstructionSelector::VisitFloat32LessThanOrEqual(Node* node) { |
+ FlagsContinuation cont(kUnsignedLessThanOrEqual, node); |
+ VisitFloat32Compare(this, node, &cont); |
+} |
+ |
+ |
void InstructionSelector::VisitFloat64Equal(Node* node) { |
FlagsContinuation cont(kEqual, node); |
VisitFloat64Compare(this, node, &cont); |