hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp
changeset 9324 c2e97d1d66d2
parent 8883 5569135acca3
child 9328 144894b3384b
equal deleted inserted replaced
9323:20cc2230dc8a 9324:c2e97d1d66d2
   411     __ verify_oop(rax);
   411     __ verify_oop(rax);
   412   }
   412   }
   413 
   413 
   414   Label L_done, L_throw_exception;
   414   Label L_done, L_throw_exception;
   415   const Register con_klass_temp = rcx;  // same as Rcache
   415   const Register con_klass_temp = rcx;  // same as Rcache
   416   __ movptr(con_klass_temp, Address(rax, oopDesc::klass_offset_in_bytes()));
   416   __ load_klass(con_klass_temp, rax);
   417   __ cmpptr(con_klass_temp, ExternalAddress((address)Universe::systemObjArrayKlassObj_addr()));
   417   __ cmpptr(con_klass_temp, ExternalAddress((address)Universe::systemObjArrayKlassObj_addr()));
   418   __ jcc(Assembler::notEqual, L_done);
   418   __ jcc(Assembler::notEqual, L_done);
   419   __ cmpl(Address(rax, arrayOopDesc::length_offset_in_bytes()), 0);
   419   __ cmpl(Address(rax, arrayOopDesc::length_offset_in_bytes()), 0);
   420   __ jcc(Assembler::notEqual, L_throw_exception);
   420   __ jcc(Assembler::notEqual, L_throw_exception);
   421   __ xorptr(rax, rax);
   421   __ xorptr(rax, rax);
   422   __ jmp(L_done);
   422   __ jmp(L_done);
   423 
   423 
   424   // Load the exception from the system-array which wraps it:
   424   // Load the exception from the system-array which wraps it:
   425   __ bind(L_throw_exception);
   425   __ bind(L_throw_exception);
   426   __ movptr(rax, Address(rax, arrayOopDesc::base_offset_in_bytes(T_OBJECT)));
   426   __ load_heap_oop(rax, Address(rax, arrayOopDesc::base_offset_in_bytes(T_OBJECT)));
   427   __ jump(ExternalAddress(Interpreter::throw_exception_entry()));
   427   __ jump(ExternalAddress(Interpreter::throw_exception_entry()));
   428 
   428 
   429   __ bind(L_done);
   429   __ bind(L_done);
   430 }
   430 }
   431 
   431 
   935   // do array store check - check for NULL value first
   935   // do array store check - check for NULL value first
   936   __ testptr(rax, rax);
   936   __ testptr(rax, rax);
   937   __ jcc(Assembler::zero, is_null);
   937   __ jcc(Assembler::zero, is_null);
   938 
   938 
   939   // Move subklass into EBX
   939   // Move subklass into EBX
   940   __ movptr(rbx, Address(rax, oopDesc::klass_offset_in_bytes()));
   940   __ load_klass(rbx, rax);
   941   // Move superklass into EAX
   941   // Move superklass into EAX
   942   __ movptr(rax, Address(rdx, oopDesc::klass_offset_in_bytes()));
   942   __ load_klass(rax, rdx);
   943   __ movptr(rax, Address(rax, sizeof(oopDesc) + objArrayKlass::element_klass_offset_in_bytes()));
   943   __ movptr(rax, Address(rax, sizeof(oopDesc) + objArrayKlass::element_klass_offset_in_bytes()));
   944   // Compress array+index*wordSize+12 into a single register.  Frees ECX.
   944   // Compress array+index*wordSize+12 into a single register.  Frees ECX.
   945   __ lea(rdx, element_address);
   945   __ lea(rdx, element_address);
   946 
   946 
   947   // Generate subtype check.  Blows ECX.  Resets EDI to locals.
   947   // Generate subtype check.  Blows ECX.  Resets EDI to locals.
  1990   assert(_desc->calls_vm(), "inconsistent calls_vm information"); // call in remove_activation
  1990   assert(_desc->calls_vm(), "inconsistent calls_vm information"); // call in remove_activation
  1991 
  1991 
  1992   if (_desc->bytecode() == Bytecodes::_return_register_finalizer) {
  1992   if (_desc->bytecode() == Bytecodes::_return_register_finalizer) {
  1993     assert(state == vtos, "only valid state");
  1993     assert(state == vtos, "only valid state");
  1994     __ movptr(rax, aaddress(0));
  1994     __ movptr(rax, aaddress(0));
  1995     __ movptr(rdi, Address(rax, oopDesc::klass_offset_in_bytes()));
  1995     __ load_klass(rdi, rax);
  1996     __ movl(rdi, Address(rdi, Klass::access_flags_offset_in_bytes() + sizeof(oopDesc)));
  1996     __ movl(rdi, Address(rdi, Klass::access_flags_offset_in_bytes() + sizeof(oopDesc)));
  1997     __ testl(rdi, JVM_ACC_HAS_FINALIZER);
  1997     __ testl(rdi, JVM_ACC_HAS_FINALIZER);
  1998     Label skip_register_finalizer;
  1998     Label skip_register_finalizer;
  1999     __ jcc(Assembler::zero, skip_register_finalizer);
  1999     __ jcc(Assembler::zero, skip_register_finalizer);
  2000 
  2000 
  2937   __ bind(notFinal);
  2937   __ bind(notFinal);
  2938 
  2938 
  2939   // get receiver klass
  2939   // get receiver klass
  2940   __ null_check(recv, oopDesc::klass_offset_in_bytes());
  2940   __ null_check(recv, oopDesc::klass_offset_in_bytes());
  2941   // Keep recv in rcx for callee expects it there
  2941   // Keep recv in rcx for callee expects it there
  2942   __ movptr(rax, Address(recv, oopDesc::klass_offset_in_bytes()));
  2942   __ load_klass(rax, recv);
  2943   __ verify_oop(rax);
  2943   __ verify_oop(rax);
  2944 
  2944 
  2945   // profile this call
  2945   // profile this call
  2946   __ profile_virtual_call(rax, rdi, rdx);
  2946   __ profile_virtual_call(rax, rdi, rdx);
  2947 
  2947 
  3017   invokevirtual_helper(rbx, rcx, rdx);
  3017   invokevirtual_helper(rbx, rcx, rdx);
  3018   __ bind(notMethod);
  3018   __ bind(notMethod);
  3019 
  3019 
  3020   // Get receiver klass into rdx - also a null check
  3020   // Get receiver klass into rdx - also a null check
  3021   __ restore_locals();  // restore rdi
  3021   __ restore_locals();  // restore rdi
  3022   __ movptr(rdx, Address(rcx, oopDesc::klass_offset_in_bytes()));
  3022   __ load_klass(rdx, rcx);
  3023   __ verify_oop(rdx);
  3023   __ verify_oop(rdx);
  3024 
  3024 
  3025   // profile this call
  3025   // profile this call
  3026   __ profile_virtual_call(rdx, rsi, rdi);
  3026   __ profile_virtual_call(rdx, rsi, rdi);
  3027 
  3027 
  3101     // %%% should make a type profile for any invokedynamic that takes a ref argument
  3101     // %%% should make a type profile for any invokedynamic that takes a ref argument
  3102     // profile this call
  3102     // profile this call
  3103     __ profile_call(rsi);
  3103     __ profile_call(rsi);
  3104   }
  3104   }
  3105 
  3105 
  3106   __ movptr(rcx_method_handle, Address(rax_callsite, __ delayed_value(java_lang_invoke_CallSite::target_offset_in_bytes, rcx)));
  3106   __ load_heap_oop(rcx_method_handle, Address(rax_callsite, __ delayed_value(java_lang_invoke_CallSite::target_offset_in_bytes, rcx)));
  3107   __ null_check(rcx_method_handle);
  3107   __ null_check(rcx_method_handle);
  3108   __ prepare_to_jump_from_interpreted();
  3108   __ prepare_to_jump_from_interpreted();
  3109   __ jump_to_method_handle_entry(rcx_method_handle, rdx);
  3109   __ jump_to_method_handle_entry(rcx_method_handle, rdx);
  3110 }
  3110 }
  3111 
  3111 
  3247     } else {
  3247     } else {
  3248       __ movptr(Address(rax, oopDesc::mark_offset_in_bytes ()),
  3248       __ movptr(Address(rax, oopDesc::mark_offset_in_bytes ()),
  3249                 (int32_t)markOopDesc::prototype()); // header
  3249                 (int32_t)markOopDesc::prototype()); // header
  3250       __ pop(rcx);   // get saved klass back in the register.
  3250       __ pop(rcx);   // get saved klass back in the register.
  3251     }
  3251     }
  3252     __ movptr(Address(rax, oopDesc::klass_offset_in_bytes()), rcx);  // klass
  3252     __ store_klass(rax, rcx);  // klass
  3253 
  3253 
  3254     {
  3254     {
  3255       SkipIfEqual skip_if(_masm, &DTraceAllocProbes, 0);
  3255       SkipIfEqual skip_if(_masm, &DTraceAllocProbes, 0);
  3256       // Trigger dtrace event for fastpath
  3256       // Trigger dtrace event for fastpath
  3257       __ push(atos);
  3257       __ push(atos);
  3322   __ bind(quicked);
  3322   __ bind(quicked);
  3323   __ mov(rdx, rax);          // Save object in EDX; EAX needed for subtype check
  3323   __ mov(rdx, rax);          // Save object in EDX; EAX needed for subtype check
  3324   __ movptr(rax, Address(rcx, rbx, Address::times_ptr, sizeof(constantPoolOopDesc)));
  3324   __ movptr(rax, Address(rcx, rbx, Address::times_ptr, sizeof(constantPoolOopDesc)));
  3325 
  3325 
  3326   __ bind(resolved);
  3326   __ bind(resolved);
  3327   __ movptr(rbx, Address(rdx, oopDesc::klass_offset_in_bytes()));
  3327   __ load_klass(rbx, rdx);
  3328 
  3328 
  3329   // Generate subtype check.  Blows ECX.  Resets EDI.  Object in EDX.
  3329   // Generate subtype check.  Blows ECX.  Resets EDI.  Object in EDX.
  3330   // Superklass in EAX.  Subklass in EBX.
  3330   // Superklass in EAX.  Subklass in EBX.
  3331   __ gen_subtype_check( rbx, ok_is_subtype );
  3331   __ gen_subtype_check( rbx, ok_is_subtype );
  3332 
  3332 
  3365   __ jcc(Assembler::equal, quicked);
  3365   __ jcc(Assembler::equal, quicked);
  3366 
  3366 
  3367   __ push(atos);
  3367   __ push(atos);
  3368   call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc) );
  3368   call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc) );
  3369   __ pop_ptr(rdx);
  3369   __ pop_ptr(rdx);
  3370   __ movptr(rdx, Address(rdx, oopDesc::klass_offset_in_bytes()));
  3370   __ load_klass(rdx, rdx);
  3371   __ jmp(resolved);
  3371   __ jmp(resolved);
  3372 
  3372 
  3373   // Get superklass in EAX and subklass in EDX
  3373   // Get superklass in EAX and subklass in EDX
  3374   __ bind(quicked);
  3374   __ bind(quicked);
  3375   __ movptr(rdx, Address(rax, oopDesc::klass_offset_in_bytes()));
  3375   __ load_klass(rdx, rax);
  3376   __ movptr(rax, Address(rcx, rbx, Address::times_ptr, sizeof(constantPoolOopDesc)));
  3376   __ movptr(rax, Address(rcx, rbx, Address::times_ptr, sizeof(constantPoolOopDesc)));
  3377 
  3377 
  3378   __ bind(resolved);
  3378   __ bind(resolved);
  3379 
  3379 
  3380   // Generate subtype check.  Blows ECX.  Resets EDI.
  3380   // Generate subtype check.  Blows ECX.  Resets EDI.