hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp
changeset 20702 bbe0fcde6e13
parent 17003 c88b0123f0f6
child 21198 dd647e8d1d72
child 21515 ec29f0abf481
equal deleted inserted replaced
20701:ef9996662fd5 20702:bbe0fcde6e13
  3024   // It's final, need a null check here!
  3024   // It's final, need a null check here!
  3025   __ null_check(recv);
  3025   __ null_check(recv);
  3026 
  3026 
  3027   // profile this call
  3027   // profile this call
  3028   __ profile_final_call(rax);
  3028   __ profile_final_call(rax);
       
  3029   __ profile_arguments_type(rax, method, r13, true);
  3029 
  3030 
  3030   __ jump_from_interpreted(method, rax);
  3031   __ jump_from_interpreted(method, rax);
  3031 
  3032 
  3032   __ bind(notFinal);
  3033   __ bind(notFinal);
  3033 
  3034 
  3038   // profile this call
  3039   // profile this call
  3039   __ profile_virtual_call(rax, r14, rdx);
  3040   __ profile_virtual_call(rax, r14, rdx);
  3040 
  3041 
  3041   // get target Method* & entry point
  3042   // get target Method* & entry point
  3042   __ lookup_virtual_method(rax, index, method);
  3043   __ lookup_virtual_method(rax, index, method);
       
  3044   __ profile_arguments_type(rdx, method, r13, true);
  3043   __ jump_from_interpreted(method, rdx);
  3045   __ jump_from_interpreted(method, rdx);
  3044 }
  3046 }
  3045 
  3047 
  3046 
  3048 
  3047 void TemplateTable::invokevirtual(int byte_no) {
  3049 void TemplateTable::invokevirtual(int byte_no) {
  3067                  rcx);  // get receiver also for null check
  3069                  rcx);  // get receiver also for null check
  3068   __ verify_oop(rcx);
  3070   __ verify_oop(rcx);
  3069   __ null_check(rcx);
  3071   __ null_check(rcx);
  3070   // do the call
  3072   // do the call
  3071   __ profile_call(rax);
  3073   __ profile_call(rax);
       
  3074   __ profile_arguments_type(rax, rbx, r13, false);
  3072   __ jump_from_interpreted(rbx, rax);
  3075   __ jump_from_interpreted(rbx, rax);
  3073 }
  3076 }
  3074 
  3077 
  3075 
  3078 
  3076 void TemplateTable::invokestatic(int byte_no) {
  3079 void TemplateTable::invokestatic(int byte_no) {
  3077   transition(vtos, vtos);
  3080   transition(vtos, vtos);
  3078   assert(byte_no == f1_byte, "use this argument");
  3081   assert(byte_no == f1_byte, "use this argument");
  3079   prepare_invoke(byte_no, rbx);  // get f1 Method*
  3082   prepare_invoke(byte_no, rbx);  // get f1 Method*
  3080   // do the call
  3083   // do the call
  3081   __ profile_call(rax);
  3084   __ profile_call(rax);
       
  3085   __ profile_arguments_type(rax, rbx, r13, false);
  3082   __ jump_from_interpreted(rbx, rax);
  3086   __ jump_from_interpreted(rbx, rax);
  3083 }
  3087 }
  3084 
  3088 
  3085 void TemplateTable::fast_invokevfinal(int byte_no) {
  3089 void TemplateTable::fast_invokevfinal(int byte_no) {
  3086   transition(vtos, vtos);
  3090   transition(vtos, vtos);
  3133   // Note: This should be done more efficiently via a throw_abstract_method_error
  3137   // Note: This should be done more efficiently via a throw_abstract_method_error
  3134   //       interpreter entry point and a conditional jump to it in case of a null
  3138   //       interpreter entry point and a conditional jump to it in case of a null
  3135   //       method.
  3139   //       method.
  3136   __ testptr(rbx, rbx);
  3140   __ testptr(rbx, rbx);
  3137   __ jcc(Assembler::zero, no_such_method);
  3141   __ jcc(Assembler::zero, no_such_method);
       
  3142 
       
  3143   __ profile_arguments_type(rdx, rbx, r13, true);
  3138 
  3144 
  3139   // do the call
  3145   // do the call
  3140   // rcx: receiver
  3146   // rcx: receiver
  3141   // rbx,: Method*
  3147   // rbx,: Method*
  3142   __ jump_from_interpreted(rbx, rdx);
  3148   __ jump_from_interpreted(rbx, rdx);
  3191 
  3197 
  3192   // Note:  rax_mtype is already pushed (if necessary) by prepare_invoke
  3198   // Note:  rax_mtype is already pushed (if necessary) by prepare_invoke
  3193 
  3199 
  3194   // FIXME: profile the LambdaForm also
  3200   // FIXME: profile the LambdaForm also
  3195   __ profile_final_call(rax);
  3201   __ profile_final_call(rax);
       
  3202   __ profile_arguments_type(rdx, rbx_method, r13, true);
  3196 
  3203 
  3197   __ jump_from_interpreted(rbx_method, rdx);
  3204   __ jump_from_interpreted(rbx_method, rdx);
  3198 }
  3205 }
  3199 
  3206 
  3200 
  3207 
  3224   // Note:  rax_callsite is already pushed by prepare_invoke
  3231   // Note:  rax_callsite is already pushed by prepare_invoke
  3225 
  3232 
  3226   // %%% should make a type profile for any invokedynamic that takes a ref argument
  3233   // %%% should make a type profile for any invokedynamic that takes a ref argument
  3227   // profile this call
  3234   // profile this call
  3228   __ profile_call(r13);
  3235   __ profile_call(r13);
       
  3236   __ profile_arguments_type(rdx, rbx_method, r13, false);
  3229 
  3237 
  3230   __ verify_oop(rax_callsite);
  3238   __ verify_oop(rax_callsite);
  3231 
  3239 
  3232   __ jump_from_interpreted(rbx_method, rdx);
  3240   __ jump_from_interpreted(rbx_method, rdx);
  3233 }
  3241 }