--- old/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64ArithmeticLIRGenerator.java 2019-05-14 01:06:00.824374259 +0200 +++ new/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64ArithmeticLIRGenerator.java 2019-05-14 01:06:00.420371312 +0200 @@ -57,6 +57,8 @@ import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VADDSS; import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VDIVSD; import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VDIVSS; +import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VFMADD231SD; +import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VFMADD231SS; import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VMULSD; import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VMULSS; import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VORPD; @@ -120,6 +122,7 @@ import org.graalvm.compiler.lir.amd64.AMD64MulDivOp; import org.graalvm.compiler.lir.amd64.AMD64ShiftOp; import org.graalvm.compiler.lir.amd64.AMD64SignExtendOp; +import org.graalvm.compiler.lir.amd64.AMD64Ternary; import org.graalvm.compiler.lir.amd64.AMD64Unary; import org.graalvm.compiler.lir.amd64.AMD64ZeroMemoryOp; import org.graalvm.compiler.lir.amd64.vector.AMD64VectorBinary; @@ -961,6 +964,22 @@ } return result; } + + @Override + public Variable emitFusedMultiplyAdd(Value a, Value b, Value c) { + Variable result = getLIRGen().newVariable(LIRKind.combine(a, b, c)); + assert ((AMD64Kind) a.getPlatformKind()).isXMM() && ((AMD64Kind) b.getPlatformKind()).isXMM() && ((AMD64Kind) c.getPlatformKind()).isXMM(); + assert a.getPlatformKind().equals(b.getPlatformKind()); + assert b.getPlatformKind().equals(c.getPlatformKind()); + + if (a.getPlatformKind() == AMD64Kind.DOUBLE) { + getLIRGen().append(new AMD64Ternary.ThreeOp(VFMADD231SD, AVXSize.XMM, result, asAllocatable(c), asAllocatable(a), asAllocatable(b))); + } else { + assert a.getPlatformKind() == AMD64Kind.SINGLE; + getLIRGen().append(new AMD64Ternary.ThreeOp(VFMADD231SS, AVXSize.XMM, result, asAllocatable(c), asAllocatable(a), asAllocatable(b))); + } + return result; + } @Override public Value emitCountLeadingZeros(Value value) {