196 __ ldrh(rscratch1, Address(rscratch1, ConstMethod::max_stack_offset())); 197 __ add(rscratch1, rscratch1, frame::interpreter_frame_monitor_size() + 2); 198 __ ldr(rscratch2, 199 Address(rfp, frame::interpreter_frame_initial_sp_offset * wordSize)); 200 __ sub(rscratch1, rscratch2, rscratch1, ext::uxtw, 3); 201 __ andr(sp, rscratch1, -16); 202 203 __ get_dispatch(); 204 __ dispatch_next(state, step); 205 206 return entry; 207 } 208 209 address TemplateInterpreterGenerator::generate_deopt_entry_for(TosState state, 210 int step) { 211 address entry = __ pc(); 212 __ restore_bcp(); 213 __ restore_locals(); 214 __ restore_constant_pool_cache(); 215 __ get_method(rmethod); 216 217 // handle exceptions 218 { 219 Label L; 220 __ ldr(rscratch1, Address(rthread, Thread::pending_exception_offset())); 221 __ cbz(rscratch1, L); 222 __ call_VM(noreg, 223 CAST_FROM_FN_PTR(address, 224 InterpreterRuntime::throw_pending_exception)); 225 __ should_not_reach_here(); 226 __ bind(L); 227 } 228 229 __ get_dispatch(); 230 231 // Calculate stack limit 232 __ ldr(rscratch1, Address(rmethod, Method::const_offset())); 233 __ ldrh(rscratch1, Address(rscratch1, ConstMethod::max_stack_offset())); 234 __ add(rscratch1, rscratch1, frame::interpreter_frame_monitor_size() 235 + (EnableInvokeDynamic ? 2 : 0)); 236 __ ldr(rscratch2, 237 Address(rfp, frame::interpreter_frame_initial_sp_offset * wordSize)); 238 __ sub(rscratch1, rscratch2, rscratch1, ext::uxtx, 3); 239 __ andr(sp, rscratch1, -16); 240 241 // Restore expression stack pointer 242 __ ldr(esp, Address(rfp, frame::interpreter_frame_last_sp_offset * wordSize)); 243 // NULL last_sp until next java call 244 __ str(zr, Address(rfp, frame::interpreter_frame_last_sp_offset * wordSize)); 245 246 __ dispatch_next(state, step); 247 return entry; 248 } 249 250 251 int AbstractInterpreter::BasicType_as_index(BasicType type) { 252 int i = 0; 253 switch (type) { 254 case T_BOOLEAN: i = 0; break; 255 case T_CHAR : i = 1; break; 256 case T_BYTE : i = 2; break; 257 case T_SHORT : i = 3; break; 258 case T_INT : i = 4; break; 259 case T_LONG : i = 5; break; 260 case T_VOID : i = 6; break; 261 case T_FLOAT : i = 7; break; 262 case T_DOUBLE : i = 8; break; 263 case T_OBJECT : i = 9; break; 264 case T_ARRAY : i = 9; break; | 196 __ ldrh(rscratch1, Address(rscratch1, ConstMethod::max_stack_offset())); 197 __ add(rscratch1, rscratch1, frame::interpreter_frame_monitor_size() + 2); 198 __ ldr(rscratch2, 199 Address(rfp, frame::interpreter_frame_initial_sp_offset * wordSize)); 200 __ sub(rscratch1, rscratch2, rscratch1, ext::uxtw, 3); 201 __ andr(sp, rscratch1, -16); 202 203 __ get_dispatch(); 204 __ dispatch_next(state, step); 205 206 return entry; 207 } 208 209 address TemplateInterpreterGenerator::generate_deopt_entry_for(TosState state, 210 int step) { 211 address entry = __ pc(); 212 __ restore_bcp(); 213 __ restore_locals(); 214 __ restore_constant_pool_cache(); 215 __ get_method(rmethod); 216 __ get_dispatch(); 217 218 // Calculate stack limit 219 __ ldr(rscratch1, Address(rmethod, Method::const_offset())); 220 __ ldrh(rscratch1, Address(rscratch1, ConstMethod::max_stack_offset())); 221 __ add(rscratch1, rscratch1, frame::interpreter_frame_monitor_size() 222 + (EnableInvokeDynamic ? 2 : 0)); 223 __ ldr(rscratch2, 224 Address(rfp, frame::interpreter_frame_initial_sp_offset * wordSize)); 225 __ sub(rscratch1, rscratch2, rscratch1, ext::uxtx, 3); 226 __ andr(sp, rscratch1, -16); 227 228 // Restore expression stack pointer 229 __ ldr(esp, Address(rfp, frame::interpreter_frame_last_sp_offset * wordSize)); 230 // NULL last_sp until next java call 231 __ str(zr, Address(rfp, frame::interpreter_frame_last_sp_offset * wordSize)); 232 233 // handle exceptions 234 { 235 Label L; 236 __ ldr(rscratch1, Address(rthread, Thread::pending_exception_offset())); 237 __ cbz(rscratch1, L); 238 __ call_VM(noreg, 239 CAST_FROM_FN_PTR(address, 240 InterpreterRuntime::throw_pending_exception)); 241 __ should_not_reach_here(); 242 __ bind(L); 243 } 244 245 __ dispatch_next(state, step); 246 return entry; 247 } 248 249 250 int AbstractInterpreter::BasicType_as_index(BasicType type) { 251 int i = 0; 252 switch (type) { 253 case T_BOOLEAN: i = 0; break; 254 case T_CHAR : i = 1; break; 255 case T_BYTE : i = 2; break; 256 case T_SHORT : i = 3; break; 257 case T_INT : i = 4; break; 258 case T_LONG : i = 5; break; 259 case T_VOID : i = 6; break; 260 case T_FLOAT : i = 7; break; 261 case T_DOUBLE : i = 8; break; 262 case T_OBJECT : i = 9; break; 263 case T_ARRAY : i = 9; break; |