< prev index next >
src/share/vm/opto/library_call.cpp
Print this page
@@ -315,10 +315,11 @@
bool inline_squareToLen();
bool inline_mulAdd();
bool inline_montgomeryMultiply();
bool inline_montgomerySquare();
bool inline_vectorizedMismatch();
+ bool inline_fma(vmIntrinsics::ID id);
bool inline_profileBoolean();
bool inline_isCompileConstant();
};
@@ -823,10 +824,14 @@
return inline_isCompileConstant();
case vmIntrinsics::_hasNegatives:
return inline_hasNegatives();
+ case vmIntrinsics::_fmaD:
+ case vmIntrinsics::_fmaF:
+ return inline_fma(intrinsic_id());
+
default:
// If you get here, it may be that someone has added a new intrinsic
// to the list in vmSymbols.hpp without implementing it here.
#ifndef PRODUCT
if ((PrintMiscellaneous && (Verbose || WizardMode)) || PrintOpto) {
@@ -6648,10 +6653,38 @@
Node* instof_false = generate_guard(bool_instof, NULL, PROB_MIN);
return instof_false; // even if it is NULL
}
+//-------------inline_fma-----------------------------------
+bool LibraryCallKit::inline_fma(vmIntrinsics::ID id) {
+ Node *a = NULL;
+ Node *b = NULL;
+ Node *c = NULL;
+ Node* result = NULL;
+ switch (id) {
+ case vmIntrinsics::_fmaD:
+ assert(callee()->signature()->size() == 6, "fma has 3 parameters of size 2 each.");
+ // no receiver since it is static method
+ a = round_double_node(argument(0));
+ b = round_double_node(argument(2));
+ c = round_double_node(argument(4));
+ result = _gvn.transform(new FmaDNode(control(), a, b, c));
+ break;
+ case vmIntrinsics::_fmaF:
+ assert(callee()->signature()->size() == 3, "fma has 3 parameters of size 1 each.");
+ a = argument(0);
+ b = argument(1);
+ c = argument(2);
+ result = _gvn.transform(new FmaFNode(control(), a, b, c));
+ break;
+ default: fatal_unexpected_iid(id); break;
+ }
+ set_result(result);
+ return true;
+}
+
bool LibraryCallKit::inline_profileBoolean() {
Node* counts = argument(1);
const TypeAryPtr* ary = NULL;
ciArray* aobj = NULL;
if (counts->is_Con()
< prev index next >