< 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 >