src/cpu/x86/vm/templateInterpreter_x86_32.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot Sdiff src/cpu/x86/vm

src/cpu/x86/vm/templateInterpreter_x86_32.cpp

Print this page
rev 5404 : 8026054: New type profiling points: type of return values at calls
Summary: x86 interpreter and c1 type profiling for return values at calls
Reviewed-by:
rev 5407 : imported patch fixreturn


 177     __ movflt(Address(rsp, 0), xmm0);
 178     __ fld_s(Address(rsp, 0));
 179     __ addptr(rsp, wordSize);
 180   } else if (incoming_state == dtos && UseSSE >= 2) {
 181     __ subptr(rsp, 2*wordSize);
 182     __ movdbl(Address(rsp, 0), xmm0);
 183     __ fld_d(Address(rsp, 0));
 184     __ addptr(rsp, 2*wordSize);
 185   }
 186 
 187   __ MacroAssembler::verify_FPU(state == ftos || state == dtos ? 1 : 0, "generate_return_entry_for in interpreter");
 188 
 189   // Restore stack bottom in case i2c adjusted stack
 190   __ movptr(rsp, Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize));
 191   // and NULL it as marker that rsp is now tos until next java call
 192   __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), NULL_WORD);
 193 
 194   __ restore_bcp();
 195   __ restore_locals();
 196 






 197   Label L_got_cache, L_giant_index;
 198   if (EnableInvokeDynamic) {
 199     __ cmpb(Address(rsi, 0), Bytecodes::_invokedynamic);
 200     __ jcc(Assembler::equal, L_giant_index);
 201   }
 202   __ get_cache_and_index_at_bcp(rbx, rcx, 1, sizeof(u2));
 203   __ bind(L_got_cache);
 204   __ movl(rbx, Address(rbx, rcx,
 205                     Address::times_ptr, ConstantPoolCache::base_offset() +
 206                     ConstantPoolCacheEntry::flags_offset()));
 207   __ andptr(rbx, 0xFF);
 208   __ lea(rsp, Address(rsp, rbx, Interpreter::stackElementScale()));
 209   __ dispatch_next(state, step);
 210 
 211   // out of the main line of code...
 212   if (EnableInvokeDynamic) {
 213     __ bind(L_giant_index);
 214     __ get_cache_and_index_at_bcp(rbx, rcx, 1, sizeof(u4));
 215     __ jmp(L_got_cache);
 216   }




 177     __ movflt(Address(rsp, 0), xmm0);
 178     __ fld_s(Address(rsp, 0));
 179     __ addptr(rsp, wordSize);
 180   } else if (incoming_state == dtos && UseSSE >= 2) {
 181     __ subptr(rsp, 2*wordSize);
 182     __ movdbl(Address(rsp, 0), xmm0);
 183     __ fld_d(Address(rsp, 0));
 184     __ addptr(rsp, 2*wordSize);
 185   }
 186 
 187   __ MacroAssembler::verify_FPU(state == ftos || state == dtos ? 1 : 0, "generate_return_entry_for in interpreter");
 188 
 189   // Restore stack bottom in case i2c adjusted stack
 190   __ movptr(rsp, Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize));
 191   // and NULL it as marker that rsp is now tos until next java call
 192   __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), NULL_WORD);
 193 
 194   __ restore_bcp();
 195   __ restore_locals();
 196 
 197   if (incoming_state == atos) {
 198     Register mdp = rbx;
 199     Register tmp = rcx;
 200     __ profile_return_type(mdp, rax, tmp);
 201   }
 202 
 203   Label L_got_cache, L_giant_index;
 204   if (EnableInvokeDynamic) {
 205     __ cmpb(Address(rsi, 0), Bytecodes::_invokedynamic);
 206     __ jcc(Assembler::equal, L_giant_index);
 207   }
 208   __ get_cache_and_index_at_bcp(rbx, rcx, 1, sizeof(u2));
 209   __ bind(L_got_cache);
 210   __ movl(rbx, Address(rbx, rcx,
 211                     Address::times_ptr, ConstantPoolCache::base_offset() +
 212                     ConstantPoolCacheEntry::flags_offset()));
 213   __ andptr(rbx, 0xFF);
 214   __ lea(rsp, Address(rsp, rbx, Interpreter::stackElementScale()));
 215   __ dispatch_next(state, step);
 216 
 217   // out of the main line of code...
 218   if (EnableInvokeDynamic) {
 219     __ bind(L_giant_index);
 220     __ get_cache_and_index_at_bcp(rbx, rcx, 1, sizeof(u4));
 221     __ jmp(L_got_cache);
 222   }


src/cpu/x86/vm/templateInterpreter_x86_32.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File