804 // Seems to be precise |
804 // Seems to be precise |
805 post_barrier(addr, val.result()); |
805 post_barrier(addr, val.result()); |
806 } |
806 } |
807 } |
807 } |
808 |
808 |
|
809 void LIRGenerator::do_FmaIntrinsic(Intrinsic* x) { |
|
810 assert(x->number_of_arguments() == 3, "wrong type"); |
|
811 assert(UseFMA, "Needs FMA instructions support."); |
|
812 LIRItem value(x->argument_at(0), this); |
|
813 LIRItem value1(x->argument_at(1), this); |
|
814 LIRItem value2(x->argument_at(2), this); |
|
815 |
|
816 value2.set_destroys_register(); |
|
817 |
|
818 value.load_item(); |
|
819 value1.load_item(); |
|
820 value2.load_item(); |
|
821 |
|
822 LIR_Opr calc_input = value.result(); |
|
823 LIR_Opr calc_input1 = value1.result(); |
|
824 LIR_Opr calc_input2 = value2.result(); |
|
825 LIR_Opr calc_result = rlock_result(x); |
|
826 |
|
827 switch (x->id()) { |
|
828 case vmIntrinsics::_fmaD: __ fmad(calc_input, calc_input1, calc_input2, calc_result); break; |
|
829 case vmIntrinsics::_fmaF: __ fmaf(calc_input, calc_input1, calc_input2, calc_result); break; |
|
830 default: ShouldNotReachHere(); |
|
831 } |
|
832 |
|
833 } |
|
834 |
809 |
835 |
810 void LIRGenerator::do_MathIntrinsic(Intrinsic* x) { |
836 void LIRGenerator::do_MathIntrinsic(Intrinsic* x) { |
811 assert(x->number_of_arguments() == 1 || (x->number_of_arguments() == 2 && x->id() == vmIntrinsics::_dpow), "wrong type"); |
837 assert(x->number_of_arguments() == 1 || (x->number_of_arguments() == 2 && x->id() == vmIntrinsics::_dpow), "wrong type"); |
812 |
838 |
813 if (x->id() == vmIntrinsics::_dexp || x->id() == vmIntrinsics::_dlog || |
839 if (x->id() == vmIntrinsics::_dexp || x->id() == vmIntrinsics::_dlog || |