Reviewers: paul.l..., dusmil, akos.palfi.imgtec, gergely.kis.imgtec,

Message:
PTAL,

Is the arch variant checking is OK and should/could we add min/max to mips32r6
also (in this CL)?

Description:
MIPS64: [turbofan] Support Float64Min and Float64Max.

Port b9ef7d42678d486123445aa17459ff778625bcb0

MIPS64r6 support for Float64Min and Float64Max machine operators using min and
max.

BUG=

Please review this at https://codereview.chromium.org/1027193002/

Base URL: https://chromium.googlesource.com/v8/v8.git@master

Affected files (+32, -2 lines):
  M src/compiler/mips64/code-generator-mips64.cc
  M src/compiler/mips64/instruction-codes-mips64.h
  M src/compiler/mips64/instruction-selector-mips64.cc


Index: src/compiler/mips64/code-generator-mips64.cc
diff --git a/src/compiler/mips64/code-generator-mips64.cc b/src/compiler/mips64/code-generator-mips64.cc index 6131ec773c2241c3b5c1f9b307eba377cd6baab6..1a823cd025416b67a20722ad7de855be4832f05e 100644
--- a/src/compiler/mips64/code-generator-mips64.cc
+++ b/src/compiler/mips64/code-generator-mips64.cc
@@ -654,6 +654,14 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
       __ sqrt_d(i.OutputDoubleRegister(), i.InputDoubleRegister(0));
       break;
     }
+    case kMips64MaxD:
+      __ max(D, i.OutputDoubleRegister(), i.InputDoubleRegister(0),
+             i.InputDoubleRegister(1));
+      break;
+    case kMips64MinD:
+      __ min(D, i.OutputDoubleRegister(), i.InputDoubleRegister(0),
+             i.InputDoubleRegister(1));
+      break;
     case kMips64CvtSD: {
       __ cvt_s_d(i.OutputSingleRegister(), i.InputDoubleRegister(0));
       break;
Index: src/compiler/mips64/instruction-codes-mips64.h
diff --git a/src/compiler/mips64/instruction-codes-mips64.h b/src/compiler/mips64/instruction-codes-mips64.h index b184018bd7502080cc5fd15ab612eecd5de03918..60f696b99a9eececa82d293ba47815136a841113 100644
--- a/src/compiler/mips64/instruction-codes-mips64.h
+++ b/src/compiler/mips64/instruction-codes-mips64.h
@@ -52,6 +52,8 @@ namespace compiler {
   V(Mips64DivD)                     \
   V(Mips64ModD)                     \
   V(Mips64SqrtD)                    \
+  V(Mips64MaxD)                     \
+  V(Mips64MinD)                     \
   V(Mips64Float64RoundDown)         \
   V(Mips64Float64RoundTruncate)     \
   V(Mips64Float64RoundUp)           \
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 728056f2405a06047235f32b614fbb798b37e262..85f5c60436f2b9681b2229e597c3b35dd011683a 100644
--- a/src/compiler/mips64/instruction-selector-mips64.cc
+++ b/src/compiler/mips64/instruction-selector-mips64.cc
@@ -594,10 +594,30 @@ void InstructionSelector::VisitFloat64Mod(Node* node) {
 }


-void InstructionSelector::VisitFloat64Max(Node* node) { UNREACHABLE(); }
+void InstructionSelector::VisitFloat64Max(Node* node) {
+  if (kArchVariant == kMips64r6) {
+    Mips64OperandGenerator g(this);
+    Node* left = node->InputAt(0);
+    Node* right = node->InputAt(1);
+    Emit(kMips64MaxD, g.DefineAsRegister(node), g.UseRegister(left),
+         g.UseRegister(right));
+  } else {
+    UNREACHABLE();
+  }
+}


-void InstructionSelector::VisitFloat64Min(Node* node) { UNREACHABLE(); }
+void InstructionSelector::VisitFloat64Min(Node* node) {
+  if (kArchVariant == kMips64r6) {
+    Mips64OperandGenerator g(this);
+    Node* left = node->InputAt(0);
+    Node* right = node->InputAt(1);
+    Emit(kMips64MinD, g.DefineAsRegister(node), g.UseRegister(left),
+         g.UseRegister(right));
+  } else {
+    UNREACHABLE();
+  }
+}


 void InstructionSelector::VisitFloat64Sqrt(Node* node) {


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to