comparison src/cpu/x86/vm/templateTable_x86_64.cpp @ 12875:d13d7aba8c12

8023657: New type profiling points: arguments to call Summary: x86 interpreter and c1 type profiling for arguments at calls Reviewed-by: kvn, twisti
author roland
date Wed, 09 Oct 2013 16:32:21 +0200
parents 9500809ceead
children bd3237e0e18d ea79ab313e98
comparison
equal deleted inserted replaced
12874:46ef27bcacb3 12875:d13d7aba8c12
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 }