Index: src/compiler/mips/code-generator-mips.cc |
diff --git a/src/compiler/mips/code-generator-mips.cc b/src/compiler/mips/code-generator-mips.cc |
index a581ca5c3ae02a6eaa946e3d9258b2aff81a1739..578d211c76a94ab7ac8c8e819eb1e73fe75768eb 100644 |
--- a/src/compiler/mips/code-generator-mips.cc |
+++ b/src/compiler/mips/code-generator-mips.cc |
@@ -721,6 +721,62 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) { |
ASSEMBLE_ROUND_DOUBLE_TO_DOUBLE(ceil_l_d, Ceil); |
break; |
} |
+ case kMipsFloat64Max: { |
+ // (b < a) ? a : b |
+ if (IsMipsArchVariant(kMips32r6)) { |
+ __ cmp_d(OLT, i.OutputDoubleRegister(), i.InputDoubleRegister(1), |
+ i.InputDoubleRegister(0)); |
+ __ sel_d(i.OutputDoubleRegister(), i.InputDoubleRegister(1), |
+ i.InputDoubleRegister(0)); |
+ } else { |
+ __ c_d(OLT, i.InputDoubleRegister(0), i.InputDoubleRegister(1)); |
+ // Left operand is result, passthrough if false. |
+ __ movt_d(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); |
+ } |
+ break; |
+ } |
+ case kMipsFloat64Min: { |
+ // (a < b) ? a : b |
+ if (IsMipsArchVariant(kMips32r6)) { |
+ __ cmp_d(OLT, i.OutputDoubleRegister(), i.InputDoubleRegister(0), |
+ i.InputDoubleRegister(1)); |
+ __ sel_d(i.OutputDoubleRegister(), i.InputDoubleRegister(1), |
+ i.InputDoubleRegister(0)); |
+ } else { |
+ __ c_d(OLT, i.InputDoubleRegister(1), i.InputDoubleRegister(0)); |
+ // Right operand is result, passthrough if false. |
+ __ movt_d(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); |
+ } |
+ break; |
+ } |
+ case kMipsFloat32Max: { |
+ // (b < a) ? a : b |
+ if (IsMipsArchVariant(kMips32r6)) { |
+ __ cmp_s(OLT, i.OutputDoubleRegister(), i.InputDoubleRegister(1), |
+ i.InputDoubleRegister(0)); |
+ __ sel_s(i.OutputDoubleRegister(), i.InputDoubleRegister(1), |
+ i.InputDoubleRegister(0)); |
+ } else { |
+ __ c_s(OLT, i.InputDoubleRegister(0), i.InputDoubleRegister(1)); |
+ // Left operand is result, passthrough if false. |
+ __ movt_s(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); |
+ } |
+ break; |
+ } |
+ case kMipsFloat32Min: { |
+ // (a < b) ? a : b |
+ if (IsMipsArchVariant(kMips32r6)) { |
+ __ cmp_s(OLT, i.OutputDoubleRegister(), i.InputDoubleRegister(0), |
+ i.InputDoubleRegister(1)); |
+ __ sel_s(i.OutputDoubleRegister(), i.InputDoubleRegister(1), |
+ i.InputDoubleRegister(0)); |
+ } else { |
+ __ c_s(OLT, i.InputDoubleRegister(1), i.InputDoubleRegister(0)); |
+ // Right operand is result, passthrough if false. |
+ __ movt_s(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); |
+ } |
+ break; |
+ } |
case kMipsCvtSD: { |
__ cvt_s_d(i.OutputSingleRegister(), i.InputDoubleRegister(0)); |
break; |