src/share/vm/opto/library_call.cpp
Print this page
@@ -223,10 +223,11 @@
bool inline_math_subtractExactL(bool is_decrement);
bool inline_exp();
bool inline_pow();
Node* finish_pow_exp(Node* result, Node* x, Node* y, const TypeFunc* call_type, address funcAddr, const char* funcName);
bool inline_min_max(vmIntrinsics::ID id);
+ bool inline_notify(vmIntrinsics::ID id);
Node* generate_min_max(vmIntrinsics::ID id, Node* x, Node* y);
// This returns Type::AnyPtr, RawPtr, or OopPtr.
int classify_unsafe_addr(Node* &base, Node* &offset);
Node* make_unsafe_address(Node* base, Node* offset);
// Helper for inline_unsafe_access.
@@ -735,10 +736,17 @@
case vmIntrinsics::_dpow: return inline_math_native(intrinsic_id());
case vmIntrinsics::_min:
case vmIntrinsics::_max: return inline_min_max(intrinsic_id());
+ case vmIntrinsics::_notify:
+ case vmIntrinsics::_notifyAll:
+ if (InlineNotify) {
+ return inline_notify(intrinsic_id());
+ }
+ return false;
+
case vmIntrinsics::_addExactI: return inline_math_addExactI(false /* add */);
case vmIntrinsics::_addExactL: return inline_math_addExactL(false /* add */);
case vmIntrinsics::_decrementExactI: return inline_math_subtractExactI(true /* decrement */);
case vmIntrinsics::_decrementExactL: return inline_math_subtractExactL(true /* decrement */);
case vmIntrinsics::_incrementExactI: return inline_math_addExactI(true /* increment */);
@@ -2015,10 +2023,25 @@
|| n->is_Proj() // parameter or return value
|| n->is_Phi() // local of some sort
);
}
+//----------------------------inline_notify-----------------------------------*
+bool LibraryCallKit::inline_notify(vmIntrinsics::ID id) {
+ const TypeFunc* ftype = OptoRuntime::monitor_notify_Type();
+ address func;
+ if (id == vmIntrinsics::_notify) {
+ func = OptoRuntime::monitor_notify_Java();
+ } else {
+ func = OptoRuntime::monitor_notifyAll_Java();
+ }
+ Node* call = make_runtime_call(RC_NO_LEAF, ftype, func, NULL, TypeRawPtr::BOTTOM, argument(0));
+ make_slow_call_ex(call, env()->Throwable_klass(), false);
+ return true;
+}
+
+
//----------------------------inline_min_max-----------------------------------
bool LibraryCallKit::inline_min_max(vmIntrinsics::ID id) {
set_result(generate_min_max(id, argument(0), argument(1)));
return true;
}