--- old/src/hotspot/share/opto/library_call.cpp 2018-04-20 00:47:09.000000000 +0100 +++ new/src/hotspot/share/opto/library_call.cpp 2018-04-20 00:47:09.000000000 +0100 @@ -329,6 +329,10 @@ bool inline_profileBoolean(); bool inline_isCompileConstant(); + bool inline_continuation(vmIntrinsics::ID id); + bool inline_get_frame_pointer(); + bool inline_continuation_do_yield(); + bool inline_continuation_do_continue(); void clear_upper_avx() { #ifdef X86 if (UseAVX >= 2) { @@ -870,6 +874,17 @@ case vmIntrinsics::_fmaF: return inline_fma(intrinsic_id()); + case vmIntrinsics::_Continuation_getFP: + return inline_get_frame_pointer(); + + case vmIntrinsics::_Continuation_getSP: + case vmIntrinsics::_Continuation_getPC: + return inline_continuation(intrinsic_id()); + case vmIntrinsics::_Continuation_doContinue: + return inline_continuation_do_continue(); + case vmIntrinsics::_Continuation_doYield: + return inline_continuation_do_yield(); + 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. @@ -6888,6 +6903,50 @@ return instof_false; // even if it is NULL } +// long Continuations::getFP() ()J +bool LibraryCallKit::inline_get_frame_pointer() { + Node *frame = _gvn.transform(new GetFPNode(control())); + set_result(frame); + return true; +} + +bool LibraryCallKit::inline_continuation(vmIntrinsics::ID id) { + address call_addr = NULL; + const char *name = NULL; + + switch (id) { + case vmIntrinsics::_Continuation_getSP: call_addr = StubRoutines::cont_getSP(); name = "getSP"; break; + case vmIntrinsics::_Continuation_getPC: call_addr = StubRoutines::cont_getPC(); name = "getPC"; break; + default: fatal("error"); return false; + } + + const TypeFunc* tf = OptoRuntime::void_long_Type(); + const TypePtr* no_memory_effects = NULL; + Node* call = make_runtime_call(RC_LEAF, tf, call_addr, name, no_memory_effects); + Node* value = _gvn.transform(new ProjNode(call, TypeFunc::Parms+0)); +#ifdef ASSERT + Node* value_top = _gvn.transform(new ProjNode(call, TypeFunc::Parms+1)); + assert(value_top == top(), "second value must be top"); +#endif + set_result(value); + return true; +} + +bool LibraryCallKit::inline_continuation_do_continue() { + address call_addr = StubRoutines::cont_thaw(2); + const TypeFunc* tf = OptoRuntime::void_void_Type(); + Node* call = make_runtime_call(RC_NO_LEAF, tf, call_addr, "doContinue", TypeRawPtr::BOTTOM); + return true; +} + +bool LibraryCallKit::inline_continuation_do_yield() { + address call_addr = StubRoutines::cont_doYield(); + Node* arg0 = argument(0); + const TypeFunc* tf = OptoRuntime::continuation_doYield_Type(); + Node* call = make_runtime_call(RC_NO_LEAF, tf, call_addr, "doYield", TypeRawPtr::BOTTOM, arg0); + return true; +} + //-------------inline_fma----------------------------------- bool LibraryCallKit::inline_fma(vmIntrinsics::ID id) { Node *a = NULL;