hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp
changeset 34173 01bb07d23a5b
parent 34162 16b54851eaf6
child 34185 ee71c590a456
equal deleted inserted replaced
34172:19299c8b7c81 34173:01bb07d23a5b
  2827     __ movl(c_rarg1, Address(r15_thread, in_bytes(JavaThread::pending_deoptimization_offset())));
  2827     __ movl(c_rarg1, Address(r15_thread, in_bytes(JavaThread::pending_deoptimization_offset())));
  2828     __ movl(Address(r15_thread, in_bytes(JavaThread::pending_deoptimization_offset())), -1);
  2828     __ movl(Address(r15_thread, in_bytes(JavaThread::pending_deoptimization_offset())), -1);
  2829 
  2829 
  2830     __ movl(r14, (int32_t)Deoptimization::Unpack_reexecute);
  2830     __ movl(r14, (int32_t)Deoptimization::Unpack_reexecute);
  2831     __ mov(c_rarg0, r15_thread);
  2831     __ mov(c_rarg0, r15_thread);
       
  2832     __ movl(c_rarg2, r14); // exec mode
  2832     __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, Deoptimization::uncommon_trap)));
  2833     __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, Deoptimization::uncommon_trap)));
  2833     oop_maps->add_gc_map( __ pc()-start, map->deep_copy());
  2834     oop_maps->add_gc_map( __ pc()-start, map->deep_copy());
  2834 
  2835 
  2835     __ reset_last_Java_frame(false, false);
  2836     __ reset_last_Java_frame(false, false);
  2836 
  2837 
  2913     __ stop("SharedRuntime::generate_deopt_blob: last_Java_fp not cleared");
  2914     __ stop("SharedRuntime::generate_deopt_blob: last_Java_fp not cleared");
  2914     __ bind(L);
  2915     __ bind(L);
  2915   }
  2916   }
  2916 #endif // ASSERT
  2917 #endif // ASSERT
  2917   __ mov(c_rarg0, r15_thread);
  2918   __ mov(c_rarg0, r15_thread);
       
  2919   __ movl(c_rarg1, r14); // exec_mode
  2918   __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, Deoptimization::fetch_unroll_info)));
  2920   __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, Deoptimization::fetch_unroll_info)));
  2919 
  2921 
  2920   // Need to have an oopmap that tells fetch_unroll_info where to
  2922   // Need to have an oopmap that tells fetch_unroll_info where to
  2921   // find any register it might need.
  2923   // find any register it might need.
  2922   oop_maps->add_gc_map(__ pc() - start, map);
  2924   oop_maps->add_gc_map(__ pc() - start, map);
  2930 #endif
  2932 #endif
  2931 
  2933 
  2932   // Load UnrollBlock* into rdi
  2934   // Load UnrollBlock* into rdi
  2933   __ mov(rdi, rax);
  2935   __ mov(rdi, rax);
  2934 
  2936 
       
  2937   __ movl(r14, Address(rdi, Deoptimization::UnrollBlock::unpack_kind_offset_in_bytes()));
  2935    Label noException;
  2938    Label noException;
  2936   __ cmpl(r14, Deoptimization::Unpack_exception);   // Was exception pending?
  2939   __ cmpl(r14, Deoptimization::Unpack_exception);   // Was exception pending?
  2937   __ jcc(Assembler::notEqual, noException);
  2940   __ jcc(Assembler::notEqual, noException);
  2938   __ movptr(rax, Address(r15_thread, JavaThread::exception_oop_offset()));
  2941   __ movptr(rax, Address(r15_thread, JavaThread::exception_oop_offset()));
  2939   // QQQ this is useless it was NULL above
  2942   // QQQ this is useless it was NULL above
  3148   // Thread is in rdi already.
  3151   // Thread is in rdi already.
  3149   //
  3152   //
  3150   // UnrollBlock* uncommon_trap(JavaThread* thread, jint unloaded_class_index);
  3153   // UnrollBlock* uncommon_trap(JavaThread* thread, jint unloaded_class_index);
  3151 
  3154 
  3152   __ mov(c_rarg0, r15_thread);
  3155   __ mov(c_rarg0, r15_thread);
       
  3156   __ movl(c_rarg2, Deoptimization::Unpack_uncommon_trap);
  3153   __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, Deoptimization::uncommon_trap)));
  3157   __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, Deoptimization::uncommon_trap)));
  3154 
  3158 
  3155   // Set an oopmap for the call site
  3159   // Set an oopmap for the call site
  3156   OopMapSet* oop_maps = new OopMapSet();
  3160   OopMapSet* oop_maps = new OopMapSet();
  3157   OopMap* map = new OopMap(SimpleRuntimeFrame::framesize, 0);
  3161   OopMap* map = new OopMap(SimpleRuntimeFrame::framesize, 0);
  3162 
  3166 
  3163   __ reset_last_Java_frame(false, false);
  3167   __ reset_last_Java_frame(false, false);
  3164 
  3168 
  3165   // Load UnrollBlock* into rdi
  3169   // Load UnrollBlock* into rdi
  3166   __ mov(rdi, rax);
  3170   __ mov(rdi, rax);
       
  3171 
       
  3172 #ifdef ASSERT
       
  3173   { Label L;
       
  3174     __ cmpptr(Address(rdi, Deoptimization::UnrollBlock::unpack_kind_offset_in_bytes()),
       
  3175             (int32_t)Deoptimization::Unpack_uncommon_trap);
       
  3176     __ jcc(Assembler::equal, L);
       
  3177     __ stop("SharedRuntime::generate_deopt_blob: expected Unpack_uncommon_trap");
       
  3178     __ bind(L);
       
  3179   }
       
  3180 #endif
  3167 
  3181 
  3168   // Pop all the frames we must move/replace.
  3182   // Pop all the frames we must move/replace.
  3169   //
  3183   //
  3170   // Frame picture (youngest to oldest)
  3184   // Frame picture (youngest to oldest)
  3171   // 1: self-frame (no frame link)
  3185   // 1: self-frame (no frame link)