diff --git a/js/src/jit/MCallOptimize.cpp b/js/src/jit/MCallOptimize.cpp index 706f70e57278..82b7e527adbd 100644 --- a/js/src/jit/MCallOptimize.cpp +++ b/js/src/jit/MCallOptimize.cpp @@ -883,32 +883,36 @@ IonBuilder::inlineMathFRound(CallInfo &callInfo) IonBuilder::InliningStatus IonBuilder::inlineMathMinMax(CallInfo &callInfo, bool max) { - if (callInfo.argc() != 2 || callInfo.constructing()) + if (callInfo.argc() < 2 || callInfo.constructing()) return InliningStatus_NotInlined; MIRType returnType = getInlineReturnType(); if (!IsNumberType(returnType)) return InliningStatus_NotInlined; - MIRType arg0Type = callInfo.getArg(0)->type(); - if (!IsNumberType(arg0Type)) - return InliningStatus_NotInlined; - MIRType arg1Type = callInfo.getArg(1)->type(); - if (!IsNumberType(arg1Type)) - return InliningStatus_NotInlined; + for (unsigned i = 0; i < callInfo.argc(); i++) { + MIRType argType = callInfo.getArg(i)->type(); + if (!IsNumberType(argType)) + return InliningStatus_NotInlined; - if (returnType == MIRType_Int32 && - (arg0Type == MIRType_Double || arg1Type == MIRType_Double)) - { - // We would need to inform TI, if we happen to return a double. - return InliningStatus_NotInlined; + // We would need to inform TI if we happen to return a double. + if (returnType == MIRType_Int32 && IsFloatingPointType(argType)) + return InliningStatus_NotInlined; } callInfo.unwrapArgs(); - MMinMax *ins = MMinMax::New(callInfo.getArg(0), callInfo.getArg(1), returnType, max); - current->add(ins); - current->push(ins); + // Chain N-1 MMinMax instructions to compute the MinMax. + MMinMax *last = MMinMax::New(callInfo.getArg(0), callInfo.getArg(1), returnType, max); + current->add(last); + + for (unsigned i = 2; i < callInfo.argc(); i++) { + MMinMax *ins = MMinMax::New(last, callInfo.getArg(i), returnType, max); + current->add(ins); + last = ins; + } + + current->push(last); return InliningStatus_Inlined; }