< prev index next >

src/hotspot/cpu/sparc/templateTable_sparc.cpp

Print this page
rev 47596 : imported patch Interpreter-Poll-7
rev 47597 : imported patch Interpreter-Poll-Wide_Ret-8
rev 47598 : imported patch Interpreter-Poll-Switch-10
rev 47599 : imported patch Interpreter-Poll-Ret-11

@@ -1497,11 +1497,11 @@
     // Bump Lbcp to target of JSR
     __ add(Lbcp, O1_disp, Lbcp);
     // Push returnAddress for "ret" on stack
     __ push_ptr(Otos_i);
     // And away we go!
-    __ dispatch_next(vtos);
+    __ dispatch_next(vtos, 0, true);
     return;
   }
 
   // Normal (non-jsr) branch handling
 

@@ -1605,11 +1605,11 @@
     __ add( O1_disp, Lbcp, Lbcp );// add to bc addr
 
   // continue with bytecode @ target
   // %%%%% Like Intel, could speed things up by moving bytecode fetch to code above,
   // %%%%% and changing dispatch_next to dispatch_only
-  __ dispatch_next(vtos);
+  __ dispatch_next(vtos, 0, true);
 }
 
 
 // Note Condition in argument is TemplateTable::Condition
 // arg scope is within class scope

@@ -1674,11 +1674,11 @@
   __ profile_ret(vtos, Otos_i, G4_scratch);
 
   __ ld_ptr(Lmethod, Method::const_offset(), G3_scratch);
   __ add(G3_scratch, Otos_i, G3_scratch);
   __ add(G3_scratch, in_bytes(ConstMethod::codes_offset()), Lbcp);
-  __ dispatch_next(vtos);
+  __ dispatch_next(vtos, 0, true);
 }
 
 
 void TemplateTable::wide_ret() {
   transition(vtos, vtos);

@@ -1689,11 +1689,11 @@
   __ profile_ret(vtos, Otos_i, G4_scratch);
 
   __ ld_ptr(Lmethod, Method::const_offset(), G3_scratch);
   __ add(G3_scratch, Otos_i, G3_scratch);
   __ add(G3_scratch, in_bytes(ConstMethod::codes_offset()), Lbcp);
-  __ dispatch_next(vtos);
+  __ dispatch_next(vtos, 0, true);
 }
 
 
 void TemplateTable::tableswitch() {
   transition(itos, vtos);

@@ -1725,11 +1725,11 @@
   __ profile_switch_default(O3);
   __ ld(O1, 0, O2); // get default offset
   // continue execution
   __ bind(continue_execution);
   __ add(Lbcp, O2, Lbcp);
-  __ dispatch_next(vtos);
+  __ dispatch_next(vtos, 0, true);
 }
 
 
 void TemplateTable::lookupswitch() {
   transition(itos, itos);

@@ -1777,11 +1777,11 @@
     __ profile_switch_case(O3, O1, O2, G3_scratch);
 
     __ bind(continue_execution);
   }
   __ add(Lbcp, O4, Lbcp);
-  __ dispatch_next(vtos);
+  __ dispatch_next(vtos, 0, true);
 }
 
 
 void TemplateTable::fast_binaryswitch() {
   transition(itos, vtos);

@@ -1886,18 +1886,30 @@
   __ bind(default_case); // fall through (if not profiling)
   __ profile_switch_default(Ri);
 
   __ bind(continue_execution);
   __ add( Lbcp, Rj, Lbcp );
-  __ dispatch_next( vtos );
+  __ dispatch_next(vtos, 0, true);
 }
 
 
 void TemplateTable::_return(TosState state) {
   transition(state, state);
   assert(_desc->calls_vm(), "inconsistent calls_vm information");
 
+  if (SafepointMechanism::uses_thread_local_poll()) {
+    Label no_safepoint;
+    __ ldx(Address(G2_thread, Thread::polling_page_offset()), G3_scratch, 0);
+    __ btst(SafepointMechanism::poll_bit(), G3_scratch);
+    __ br(Assembler::zero, false, Assembler::pt, no_safepoint);
+    __ delayed()->nop();
+    __ push(state); //?
+    __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint));
+    __ pop(state); //?
+    __ bind(no_safepoint);
+  }
+
   if (_desc->bytecode() == Bytecodes::_return_register_finalizer) {
     assert(state == vtos, "only valid state");
     __ mov(G0, G3_scratch);
     __ access_local_ptr(G3_scratch, Otos_i);
     __ load_klass(Otos_i, O2);
< prev index next >