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