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 } |