< prev index next >

src/hotspot/cpu/x86/templateTable_x86.cpp

Print this page
rev 50307 : [mq]: cont


2597   __ dispatch_only(vtos, true);
2598 
2599   // default case -> j = default offset
2600   __ bind(default_case);
2601   __ profile_switch_default(i);
2602   __ movl(j, Address(array, -2 * BytesPerInt));
2603   __ bswapl(j);
2604   LP64_ONLY(__ movslq(j, j));
2605 
2606   NOT_LP64(__ restore_bcp());
2607   NOT_LP64(__ restore_locals());
2608 
2609   __ load_unsigned_byte(rbx, Address(rbcp, j, Address::times_1));
2610   __ addptr(rbcp, j);
2611   __ dispatch_only(vtos, true);
2612 }
2613 
2614 void TemplateTable::_return(TosState state) {
2615   transition(state, state);
2616 











2617   assert(_desc->calls_vm(),
2618          "inconsistent calls_vm information"); // call in remove_activation
2619 
2620   if (_desc->bytecode() == Bytecodes::_return_register_finalizer) {
2621     assert(state == vtos, "only valid state");
2622     Register robj = LP64_ONLY(c_rarg1) NOT_LP64(rax);
2623     __ movptr(robj, aaddress(0));
2624     __ load_klass(rdi, robj);
2625     __ movl(rdi, Address(rdi, Klass::access_flags_offset()));
2626     __ testl(rdi, JVM_ACC_HAS_FINALIZER);
2627     Label skip_register_finalizer;
2628     __ jcc(Assembler::zero, skip_register_finalizer);
2629 
2630     __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::register_finalizer), robj);
2631 
2632     __ bind(skip_register_finalizer);
2633   }
2634 
2635   if (SafepointMechanism::uses_thread_local_poll() && _desc->bytecode() != Bytecodes::_return_register_finalizer) {
2636     Label no_safepoint;




2597   __ dispatch_only(vtos, true);
2598 
2599   // default case -> j = default offset
2600   __ bind(default_case);
2601   __ profile_switch_default(i);
2602   __ movl(j, Address(array, -2 * BytesPerInt));
2603   __ bswapl(j);
2604   LP64_ONLY(__ movslq(j, j));
2605 
2606   NOT_LP64(__ restore_bcp());
2607   NOT_LP64(__ restore_locals());
2608 
2609   __ load_unsigned_byte(rbx, Address(rbcp, j, Address::times_1));
2610   __ addptr(rbcp, j);
2611   __ dispatch_only(vtos, true);
2612 }
2613 
2614 void TemplateTable::_return(TosState state) {
2615   transition(state, state);
2616 
2617   // {
2618   //   Label not_rb;
2619   //   Register aa = rcx, bb = rdi;
2620   //   __ movptr(aa, Address(rsp, 0));
2621   //   __ lea(bb, ExternalAddress(StubRoutines::cont_returnBarrier()));
2622   //   __ cmpq(aa, bb);
2623   //   // __ cmpq(ExternalAddress(StubRoutines::cont_returnBarrier()).addr(), aa);
2624   //   __ jcc(Assembler::notZero, not_rb);
2625   //   __ stop("WQWWQWQW");
2626   //   __ bind(not_rb);
2627   // }
2628   assert(_desc->calls_vm(),
2629          "inconsistent calls_vm information"); // call in remove_activation
2630 
2631   if (_desc->bytecode() == Bytecodes::_return_register_finalizer) {
2632     assert(state == vtos, "only valid state");
2633     Register robj = LP64_ONLY(c_rarg1) NOT_LP64(rax);
2634     __ movptr(robj, aaddress(0));
2635     __ load_klass(rdi, robj);
2636     __ movl(rdi, Address(rdi, Klass::access_flags_offset()));
2637     __ testl(rdi, JVM_ACC_HAS_FINALIZER);
2638     Label skip_register_finalizer;
2639     __ jcc(Assembler::zero, skip_register_finalizer);
2640 
2641     __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::register_finalizer), robj);
2642 
2643     __ bind(skip_register_finalizer);
2644   }
2645 
2646   if (SafepointMechanism::uses_thread_local_poll() && _desc->bytecode() != Bytecodes::_return_register_finalizer) {
2647     Label no_safepoint;


< prev index next >