351 case btos:
352 case ztos:
353 case ctos:
354 case stos:
355 ShouldNotReachHere(); // btos/ctos/stos should use itos.
356 break;
357 case atos: vep = __ pc(); __ pop(atos); aep = __ pc(); generate_and_dispatch(t); break;
358 case itos: vep = __ pc(); __ pop(itos); iep = __ pc(); generate_and_dispatch(t); break;
359 case ltos: vep = __ pc(); __ pop(ltos); lep = __ pc(); generate_and_dispatch(t); break;
360 case ftos: vep = __ pc(); __ pop(ftos); fep = __ pc(); generate_and_dispatch(t); break;
361 case dtos: vep = __ pc(); __ pop(dtos); dep = __ pc(); generate_and_dispatch(t); break;
362 case vtos: set_vtos_entry_points(t, bep, cep, sep, aep, iep, lep, fep, dep, vep); break;
363 default : ShouldNotReachHere(); break;
364 }
365 }
366
367
368 //------------------------------------------------------------------------------------------------------------------------
369
370 void TemplateInterpreterGenerator::generate_and_dispatch(Template* t, TosState tos_out) {
371 #ifndef PRODUCT
372 // debugging code
373 if (CountBytecodes || TraceBytecodes || StopInterpreterAt > 0) count_bytecode();
374 if (PrintBytecodeHistogram) histogram_bytecode(t);
375 if (PrintBytecodePairHistogram) histogram_bytecode_pair(t);
376 if (TraceBytecodes) trace_bytecode(t);
377 if (StopInterpreterAt > 0) stop_interpreter_at();
378 __ verify_FPU(1, t->tos_in());
379 #endif // !PRODUCT
380 int step = 0;
381 if (!t->does_dispatch()) {
382 step = t->is_wide() ? Bytecodes::wide_length_for(t->bytecode()) : Bytecodes::length_for(t->bytecode());
383 if (tos_out == ilgl) tos_out = t->tos_out();
384 // compute bytecode size
385 assert(step > 0, "just checkin'");
386 // setup stuff for dispatching next bytecode
387 if (ProfileInterpreter && VerifyDataPointer
388 && MethodData::bytecode_has_profile(t->bytecode())) {
389 __ verify_method_data_pointer();
390 }
391 __ dispatch_prolog(tos_out, step);
392 }
393 // generate template
394 t->generate(_masm);
|
351 case btos:
352 case ztos:
353 case ctos:
354 case stos:
355 ShouldNotReachHere(); // btos/ctos/stos should use itos.
356 break;
357 case atos: vep = __ pc(); __ pop(atos); aep = __ pc(); generate_and_dispatch(t); break;
358 case itos: vep = __ pc(); __ pop(itos); iep = __ pc(); generate_and_dispatch(t); break;
359 case ltos: vep = __ pc(); __ pop(ltos); lep = __ pc(); generate_and_dispatch(t); break;
360 case ftos: vep = __ pc(); __ pop(ftos); fep = __ pc(); generate_and_dispatch(t); break;
361 case dtos: vep = __ pc(); __ pop(dtos); dep = __ pc(); generate_and_dispatch(t); break;
362 case vtos: set_vtos_entry_points(t, bep, cep, sep, aep, iep, lep, fep, dep, vep); break;
363 default : ShouldNotReachHere(); break;
364 }
365 }
366
367
368 //------------------------------------------------------------------------------------------------------------------------
369
370 void TemplateInterpreterGenerator::generate_and_dispatch(Template* t, TosState tos_out) {
371 if (CountBytecodes || CountBytecodesPerThread || TraceBytecodes || StopInterpreterAt > 0) {
372 count_bytecode();
373 }
374 if (PrintBytecodeHistogram) histogram_bytecode(t);
375 #ifndef PRODUCT
376 // debugging code
377 if (PrintBytecodePairHistogram) histogram_bytecode_pair(t);
378 if (TraceBytecodes) trace_bytecode(t);
379 if (StopInterpreterAt > 0) stop_interpreter_at();
380 __ verify_FPU(1, t->tos_in());
381 #endif // !PRODUCT
382 int step = 0;
383 if (!t->does_dispatch()) {
384 step = t->is_wide() ? Bytecodes::wide_length_for(t->bytecode()) : Bytecodes::length_for(t->bytecode());
385 if (tos_out == ilgl) tos_out = t->tos_out();
386 // compute bytecode size
387 assert(step > 0, "just checkin'");
388 // setup stuff for dispatching next bytecode
389 if (ProfileInterpreter && VerifyDataPointer
390 && MethodData::bytecode_has_profile(t->bytecode())) {
391 __ verify_method_data_pointer();
392 }
393 __ dispatch_prolog(tos_out, step);
394 }
395 // generate template
396 t->generate(_masm);
|