< prev index next >

src/hotspot/share/opto/library_call.cpp

Print this page
rev 50307 : [mq]: cont

@@ -323,10 +323,15 @@
   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,10 +869,23 @@
 
   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,10 +6354,60 @@
   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 >