Mercurial > hg > graal-compiler
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 } |