diff -r c868a2f327c6 -r 57e7b1c75d17 hotspot/src/cpu/s390/vm/c1_LIRGenerator_s390.cpp --- a/hotspot/src/cpu/s390/vm/c1_LIRGenerator_s390.cpp Tue Dec 20 13:02:16 2016 +0000 +++ b/hotspot/src/cpu/s390/vm/c1_LIRGenerator_s390.cpp Tue Dec 20 14:55:18 2016 +0100 @@ -1237,7 +1237,28 @@ } void LIRGenerator::do_FmaIntrinsic(Intrinsic* x) { - fatal("FMA intrinsic is not implemented on this platform"); + assert(x->number_of_arguments() == 3, "wrong type"); + assert(UseFMA, "Needs FMA instructions support."); + LIRItem value(x->argument_at(0), this); + LIRItem value1(x->argument_at(1), this); + LIRItem value2(x->argument_at(2), this); + + value2.set_destroys_register(); + + value.load_item(); + value1.load_item(); + value2.load_item(); + + LIR_Opr calc_input = value.result(); + LIR_Opr calc_input1 = value1.result(); + LIR_Opr calc_input2 = value2.result(); + LIR_Opr calc_result = rlock_result(x); + + switch (x->id()) { + case vmIntrinsics::_fmaD: __ fmad(calc_input, calc_input1, calc_input2, calc_result); break; + case vmIntrinsics::_fmaF: __ fmaf(calc_input, calc_input1, calc_input2, calc_result); break; + default: ShouldNotReachHere(); + } } void LIRGenerator::do_vectorizedMismatch(Intrinsic* x) {