525 case Op_CallStaticJava:
526 case Op_CallDynamicJava:
527 // Calling Java code so use Java calling convention
528 save_policy = matcher._register_save_policy;
529 break;
530
531 default:
532 ShouldNotReachHere();
533 }
534
535 // When using CallRuntime mark SOE registers as killed by the call
536 // so values that could show up in the RegisterMap aren't live in a
537 // callee saved register since the register wouldn't know where to
538 // find them. CallLeaf and CallLeafNoFP are ok because they can't
539 // have debug info on them. Strictly speaking this only needs to be
540 // done for oops since idealreg2debugmask takes care of debug info
541 // references but there no way to handle oops differently than other
542 // pointers as far as the kill mask goes.
543 bool exclude_soe = op == Op_CallRuntime;
544
545 // Fill in the kill mask for the call
546 for( OptoReg::Name r = OptoReg::Name(0); r < _last_Mach_Reg; r=OptoReg::add(r,1) ) {
547 if( !regs.Member(r) ) { // Not already defined by the call
548 // Save-on-call register?
549 if ((save_policy[r] == 'C') ||
550 (save_policy[r] == 'A') ||
551 ((save_policy[r] == 'E') && exclude_soe)) {
552 proj->_rout.Insert(r);
553 }
554 }
555 }
556
557 return node_cnt;
558 }
559
560
561 //------------------------------schedule_local---------------------------------
562 // Topological sort within a block. Someday become a real scheduler.
563 bool Block::schedule_local(PhaseCFG *cfg, Matcher &matcher, int *ready_cnt, VectorSet &next_call) {
564 // Already "sorted" are the block start Node (as the first entry), and
|
525 case Op_CallStaticJava:
526 case Op_CallDynamicJava:
527 // Calling Java code so use Java calling convention
528 save_policy = matcher._register_save_policy;
529 break;
530
531 default:
532 ShouldNotReachHere();
533 }
534
535 // When using CallRuntime mark SOE registers as killed by the call
536 // so values that could show up in the RegisterMap aren't live in a
537 // callee saved register since the register wouldn't know where to
538 // find them. CallLeaf and CallLeafNoFP are ok because they can't
539 // have debug info on them. Strictly speaking this only needs to be
540 // done for oops since idealreg2debugmask takes care of debug info
541 // references but there no way to handle oops differently than other
542 // pointers as far as the kill mask goes.
543 bool exclude_soe = op == Op_CallRuntime;
544
545 proj->_rout.OR(Matcher::method_handle_invoke_SP_save_mask());
546
547 // Fill in the kill mask for the call
548 for( OptoReg::Name r = OptoReg::Name(0); r < _last_Mach_Reg; r=OptoReg::add(r,1) ) {
549 if( !regs.Member(r) ) { // Not already defined by the call
550 // Save-on-call register?
551 if ((save_policy[r] == 'C') ||
552 (save_policy[r] == 'A') ||
553 ((save_policy[r] == 'E') && exclude_soe)) {
554 proj->_rout.Insert(r);
555 }
556 }
557 }
558
559 return node_cnt;
560 }
561
562
563 //------------------------------schedule_local---------------------------------
564 // Topological sort within a block. Someday become a real scheduler.
565 bool Block::schedule_local(PhaseCFG *cfg, Matcher &matcher, int *ready_cnt, VectorSet &next_call) {
566 // Already "sorted" are the block start Node (as the first entry), and
|