549 __ dispatch_next(state, step);
550 } else {
551 __ jump_to_entry(continuation);
552 }
553 return entry;
554 }
555
556 address TemplateInterpreterGenerator::generate_result_handler_for(
557 BasicType type) {
558 address entry = __ pc();
559 switch (type) {
560 case T_BOOLEAN: __ c2bool(r0); break;
561 case T_CHAR : __ uxth(r0, r0); break;
562 case T_BYTE : __ sxtb(r0, r0); break;
563 case T_SHORT : __ sxth(r0, r0); break;
564 case T_INT : __ uxtw(r0, r0); break; // FIXME: We almost certainly don't need this
565 case T_LONG : /* nothing to do */ break;
566 case T_VOID : /* nothing to do */ break;
567 case T_FLOAT : /* nothing to do */ break;
568 case T_DOUBLE : /* nothing to do */ break;
569 case T_OBJECT :
570 // retrieve result from frame
571 __ ldr(r0, Address(rfp, frame::interpreter_frame_oop_temp_offset*wordSize));
572 // and verify it
573 __ verify_oop(r0);
574 break;
575 default : ShouldNotReachHere();
576 }
577 __ ret(lr); // return from result handler
578 return entry;
579 }
580
581 address TemplateInterpreterGenerator::generate_safept_entry_for(
582 TosState state,
583 address runtime_entry) {
584 address entry = __ pc();
585 __ push(state);
586 __ call_VM(noreg, runtime_entry);
587 __ membar(Assembler::AnyAny);
588 __ dispatch_via(vtos, Interpreter::_normal_table.table_for(vtos));
|
549 __ dispatch_next(state, step);
550 } else {
551 __ jump_to_entry(continuation);
552 }
553 return entry;
554 }
555
556 address TemplateInterpreterGenerator::generate_result_handler_for(
557 BasicType type) {
558 address entry = __ pc();
559 switch (type) {
560 case T_BOOLEAN: __ c2bool(r0); break;
561 case T_CHAR : __ uxth(r0, r0); break;
562 case T_BYTE : __ sxtb(r0, r0); break;
563 case T_SHORT : __ sxth(r0, r0); break;
564 case T_INT : __ uxtw(r0, r0); break; // FIXME: We almost certainly don't need this
565 case T_LONG : /* nothing to do */ break;
566 case T_VOID : /* nothing to do */ break;
567 case T_FLOAT : /* nothing to do */ break;
568 case T_DOUBLE : /* nothing to do */ break;
569 case T_VALUETYPE: // fall through (value types are handled with oops)
570 case T_OBJECT :
571 // retrieve result from frame
572 __ ldr(r0, Address(rfp, frame::interpreter_frame_oop_temp_offset*wordSize));
573 // and verify it
574 __ verify_oop(r0);
575 break;
576 default : ShouldNotReachHere();
577 }
578 __ ret(lr); // return from result handler
579 return entry;
580 }
581
582 address TemplateInterpreterGenerator::generate_safept_entry_for(
583 TosState state,
584 address runtime_entry) {
585 address entry = __ pc();
586 __ push(state);
587 __ call_VM(noreg, runtime_entry);
588 __ membar(Assembler::AnyAny);
589 __ dispatch_via(vtos, Interpreter::_normal_table.table_for(vtos));
|