Mercurial > hg > truffle
comparison src/cpu/x86/vm/templateTable_x86_32.cpp @ 6822:f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
Reviewed-by: jrose, kvn
author | twisti |
---|---|
date | Mon, 01 Oct 2012 14:50:10 -0700 |
parents | 75f33eecc1b3 |
children | 6e5a59a8e4a7 |
comparison
equal
deleted
inserted
replaced
6811:1b582b1bf7cb | 6822:f6b0eb4e44cf |
---|---|
2137 ConstantPoolCacheEntry::flags_offset()); | 2137 ConstantPoolCacheEntry::flags_offset()); |
2138 // access constant pool cache fields | 2138 // access constant pool cache fields |
2139 const int index_offset = in_bytes(ConstantPoolCache::base_offset() + | 2139 const int index_offset = in_bytes(ConstantPoolCache::base_offset() + |
2140 ConstantPoolCacheEntry::f2_offset()); | 2140 ConstantPoolCacheEntry::f2_offset()); |
2141 | 2141 |
2142 size_t index_size = (is_invokedynamic ? sizeof(u4) : sizeof(u2)); | 2142 size_t index_size = (is_invokedynamic ? sizeof(u4) : sizeof(u2)); |
2143 resolve_cache_and_index(byte_no, cache, index, index_size); | 2143 resolve_cache_and_index(byte_no, cache, index, index_size); |
2144 __ movptr(method, Address(cache, index, Address::times_ptr, method_offset)); | 2144 __ movptr(method, Address(cache, index, Address::times_ptr, method_offset)); |
2145 | 2145 |
2146 if (itable_index != noreg) { | 2146 if (itable_index != noreg) { |
2147 __ movptr(itable_index, Address(cache, index, Address::times_ptr, index_offset)); | 2147 __ movptr(itable_index, Address(cache, index, Address::times_ptr, index_offset)); |
2874 // Push the appendix as a trailing parameter. | 2874 // Push the appendix as a trailing parameter. |
2875 // This must be done before we get the receiver, | 2875 // This must be done before we get the receiver, |
2876 // since the parameter_size includes it. | 2876 // since the parameter_size includes it. |
2877 __ push(rbx); | 2877 __ push(rbx); |
2878 __ mov(rbx, index); | 2878 __ mov(rbx, index); |
2879 assert(ConstantPoolCacheEntry::_indy_resolved_references_appendix_offset == 0, "appendix expected at index+0"); | |
2879 __ load_resolved_reference_at_index(index, rbx); | 2880 __ load_resolved_reference_at_index(index, rbx); |
2880 __ pop(rbx); | 2881 __ pop(rbx); |
2881 __ push(index); // push appendix (MethodType, CallSite, etc.) | 2882 __ push(index); // push appendix (MethodType, CallSite, etc.) |
2882 __ bind(L_no_push); | 2883 __ bind(L_no_push); |
2883 } | 2884 } |
3091 } | 3092 } |
3092 | 3093 |
3093 void TemplateTable::invokehandle(int byte_no) { | 3094 void TemplateTable::invokehandle(int byte_no) { |
3094 transition(vtos, vtos); | 3095 transition(vtos, vtos); |
3095 assert(byte_no == f1_byte, "use this argument"); | 3096 assert(byte_no == f1_byte, "use this argument"); |
3096 const Register rbx_method = rbx; // (from f2) | 3097 const Register rbx_method = rbx; |
3097 const Register rax_mtype = rax; // (from f1) | 3098 const Register rax_mtype = rax; |
3098 const Register rcx_recv = rcx; | 3099 const Register rcx_recv = rcx; |
3099 const Register rdx_flags = rdx; | 3100 const Register rdx_flags = rdx; |
3100 | 3101 |
3101 if (!EnableInvokeDynamic) { | 3102 if (!EnableInvokeDynamic) { |
3102 // rewriter does not generate this bytecode | 3103 // rewriter does not generate this bytecode |
3103 __ should_not_reach_here(); | 3104 __ should_not_reach_here(); |
3104 return; | 3105 return; |
3105 } | 3106 } |
3106 | 3107 |
3107 prepare_invoke(byte_no, | 3108 prepare_invoke(byte_no, rbx_method, rax_mtype, rcx_recv); |
3108 rbx_method, rax_mtype, // get f2 Method*, f1 MethodType | |
3109 rcx_recv); | |
3110 __ verify_method_ptr(rbx_method); | 3109 __ verify_method_ptr(rbx_method); |
3111 __ verify_oop(rcx_recv); | 3110 __ verify_oop(rcx_recv); |
3112 __ null_check(rcx_recv); | 3111 __ null_check(rcx_recv); |
3112 | |
3113 // rax: MethodType object (from cpool->resolved_references[f1], if necessary) | |
3114 // rbx: MH.invokeExact_MT method (from f2) | |
3113 | 3115 |
3114 // Note: rax_mtype is already pushed (if necessary) by prepare_invoke | 3116 // Note: rax_mtype is already pushed (if necessary) by prepare_invoke |
3115 | 3117 |
3116 // FIXME: profile the LambdaForm also | 3118 // FIXME: profile the LambdaForm also |
3117 __ profile_final_call(rax); | 3119 __ profile_final_call(rax); |
3138 const Register rbx_method = rbx; | 3140 const Register rbx_method = rbx; |
3139 const Register rax_callsite = rax; | 3141 const Register rax_callsite = rax; |
3140 | 3142 |
3141 prepare_invoke(byte_no, rbx_method, rax_callsite); | 3143 prepare_invoke(byte_no, rbx_method, rax_callsite); |
3142 | 3144 |
3143 // rax: CallSite object (from cpool->resolved_references[]) | 3145 // rax: CallSite object (from cpool->resolved_references[f1]) |
3144 // rbx: MH.linkToCallSite method (from f2) | 3146 // rbx: MH.linkToCallSite method (from f2) |
3145 | 3147 |
3146 // Note: rax_callsite is already pushed by prepare_invoke | 3148 // Note: rax_callsite is already pushed by prepare_invoke |
3147 | 3149 |
3148 // %%% should make a type profile for any invokedynamic that takes a ref argument | 3150 // %%% should make a type profile for any invokedynamic that takes a ref argument |