< prev index next >

src/hotspot/share/opto/library_call.cpp

Print this page
rev 50307 : [mq]: cont

*** 323,332 **** --- 323,337 ---- bool inline_vectorizedMismatch(); bool inline_fma(vmIntrinsics::ID id); 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_runLevel(); + bool inline_continuation_do_continue(); void clear_upper_avx() { #ifdef X86 if (UseAVX >= 2) { C->set_clear_upper_avx(true); }
*** 864,873 **** --- 869,891 ---- case vmIntrinsics::_fmaD: 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(); + case vmIntrinsics::_Continuation_runLevel: + return inline_continuation_runLevel(); + 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) {
*** 6336,6345 **** --- 6354,6413 ---- Node* instof_false = generate_guard(bool_instof, NULL, PROB_MIN); 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; + case vmIntrinsics::_Continuation_getFP: call_addr = OptoRuntime::continuation_getFP_Java(); name = "getFP"; 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_runLevel() { + set_result(intcon(2)); + return true; + } + + bool LibraryCallKit::inline_continuation_do_continue() { + address call_addr = StubRoutines::cont_thaw(); + 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); // type int + 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; Node *b = NULL; Node *c = NULL;
< prev index next >