Index: src/compiler/ia32/code-generator-ia32.cc |
diff --git a/src/compiler/ia32/code-generator-ia32.cc b/src/compiler/ia32/code-generator-ia32.cc |
index 88eda422edb297af7ad81ce3443553bcd5dcaf42..d4afd3789f7616851203bc72d0cd249430896dae 100644 |
--- a/src/compiler/ia32/code-generator-ia32.cc |
+++ b/src/compiler/ia32/code-generator-ia32.cc |
@@ -1048,6 +1048,32 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
// when there is a (v)mulsd depending on the result. |
__ movaps(i.OutputDoubleRegister(), i.OutputDoubleRegister()); |
break; |
+ case kSSEFloat32Max: { |
+ Label compare_nan, compare_swap, done_compare; |
+ if (instr->InputAt(1)->IsFPRegister()) { |
+ __ ucomiss(i.InputDoubleRegister(0), i.InputDoubleRegister(1)); |
+ } else { |
+ __ ucomiss(i.InputDoubleRegister(0), i.InputOperand(1)); |
+ } |
+ auto ool = |
+ new (zone()) OutOfLineLoadFloat32NaN(this, i.OutputDoubleRegister()); |
+ __ j(parity_even, ool->entry()); |
+ __ j(above, &done_compare, Label::kNear); |
+ __ j(below, &compare_swap, Label::kNear); |
+ __ movmskps(i.TempRegister(0), i.InputDoubleRegister(0)); |
+ __ test(i.TempRegister(0), Immediate(1)); |
+ __ j(zero, &done_compare, Label::kNear); |
+ __ bind(&compare_swap); |
+ if (instr->InputAt(1)->IsFPRegister()) { |
+ __ movss(i.InputDoubleRegister(0), i.InputDoubleRegister(1)); |
+ } else { |
+ __ movss(i.InputDoubleRegister(0), i.InputOperand(1)); |
+ } |
+ __ bind(&done_compare); |
+ __ bind(ool->exit()); |
+ break; |
+ } |
+ |
case kSSEFloat64Max: { |
Label compare_nan, compare_swap, done_compare; |
if (instr->InputAt(1)->IsFPRegister()) { |
@@ -1073,6 +1099,36 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
__ bind(ool->exit()); |
break; |
} |
+ case kSSEFloat32Min: { |
+ Label compare_swap, done_compare; |
+ if (instr->InputAt(1)->IsFPRegister()) { |
+ __ ucomiss(i.InputDoubleRegister(0), i.InputDoubleRegister(1)); |
+ } else { |
+ __ ucomiss(i.InputDoubleRegister(0), i.InputOperand(1)); |
+ } |
+ auto ool = |
+ new (zone()) OutOfLineLoadFloat32NaN(this, i.OutputDoubleRegister()); |
+ __ j(parity_even, ool->entry()); |
+ __ j(below, &done_compare, Label::kNear); |
+ __ j(above, &compare_swap, Label::kNear); |
+ if (instr->InputAt(1)->IsFPRegister()) { |
+ __ movmskps(i.TempRegister(0), i.InputDoubleRegister(1)); |
+ } else { |
+ __ movss(kScratchDoubleReg, i.InputOperand(1)); |
+ __ movmskps(i.TempRegister(0), kScratchDoubleReg); |
+ } |
+ __ test(i.TempRegister(0), Immediate(1)); |
+ __ j(zero, &done_compare, Label::kNear); |
+ __ bind(&compare_swap); |
+ if (instr->InputAt(1)->IsFPRegister()) { |
+ __ movss(i.InputDoubleRegister(0), i.InputDoubleRegister(1)); |
+ } else { |
+ __ movss(i.InputDoubleRegister(0), i.InputOperand(1)); |
+ } |
+ __ bind(&done_compare); |
+ __ bind(ool->exit()); |
+ break; |
+ } |
case kSSEFloat64Min: { |
Label compare_swap, done_compare; |
if (instr->InputAt(1)->IsFPRegister()) { |