599 case PhiLocationDifferToInputLocation: 600 return "PhiLocationDifferToInputLocationSpillCopy"; 601 case BasePointerToMem: 602 return "BasePointerToMemSpillCopy"; 603 case InputToRematerialization: 604 return "InputToRematerializationSpillCopy"; 605 case CallUse: 606 return "CallUseSpillCopy"; 607 case Bound: 608 return "BoundSpillCopy"; 609 default: 610 assert(false, "Must have valid spill type"); 611 return "MachSpillCopy"; 612 } 613 } 614 615 virtual void format( PhaseRegAlloc *, outputStream *st ) const; 616 #endif 617 }; 618 619 //------------------------------MachBranchNode-------------------------------- 620 // Abstract machine branch Node 621 class MachBranchNode : public MachIdealNode { 622 public: 623 MachBranchNode() : MachIdealNode() { 624 init_class_id(Class_MachBranch); 625 } 626 virtual void label_set(Label* label, uint block_num) = 0; 627 virtual void save_label(Label** label, uint* block_num) = 0; 628 629 // Support for short branches 630 virtual MachNode *short_branch_version() { return NULL; } 631 632 virtual bool pinned() const { return true; }; 633 }; 634 635 //------------------------------MachNullChkNode-------------------------------- 636 // Machine-dependent null-pointer-check Node. Points a real MachNode that is 637 // also some kind of memory op. Turns the indicated MachNode into a 638 // conditional branch with good latency on the ptr-not-null path and awful | 599 case PhiLocationDifferToInputLocation: 600 return "PhiLocationDifferToInputLocationSpillCopy"; 601 case BasePointerToMem: 602 return "BasePointerToMemSpillCopy"; 603 case InputToRematerialization: 604 return "InputToRematerializationSpillCopy"; 605 case CallUse: 606 return "CallUseSpillCopy"; 607 case Bound: 608 return "BoundSpillCopy"; 609 default: 610 assert(false, "Must have valid spill type"); 611 return "MachSpillCopy"; 612 } 613 } 614 615 virtual void format( PhaseRegAlloc *, outputStream *st ) const; 616 #endif 617 }; 618 619 // MachMergeNode is similar to a PhiNode in a sense it merges multiple values, 620 // however it doesn't have a control input and is more like a MergeMem. 621 // It is inserted after the register allocation is done to ensure that nodes use single 622 // definition of a multidef lrg in a block. 623 class MachMergeNode : public MachIdealNode { 624 public: 625 MachMergeNode(Node *n1) { 626 init_class_id(Class_MachMerge); 627 add_req(NULL); 628 add_req(n1); 629 } 630 virtual const RegMask &out_RegMask() const { return in(1)->out_RegMask(); } 631 virtual const RegMask &in_RegMask(uint idx) const { return in(1)->in_RegMask(idx); } 632 virtual const class Type *bottom_type() const { return in(1)->bottom_type(); } 633 virtual uint ideal_reg() const { return bottom_type()->ideal_reg(); } 634 virtual uint oper_input_base() const { return 1; } 635 virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const { } 636 virtual uint size(PhaseRegAlloc *ra_) const { return 0; } 637 #ifndef PRODUCT 638 virtual const char *Name() const { return "MachMerge"; } 639 #endif 640 }; 641 642 //------------------------------MachBranchNode-------------------------------- 643 // Abstract machine branch Node 644 class MachBranchNode : public MachIdealNode { 645 public: 646 MachBranchNode() : MachIdealNode() { 647 init_class_id(Class_MachBranch); 648 } 649 virtual void label_set(Label* label, uint block_num) = 0; 650 virtual void save_label(Label** label, uint* block_num) = 0; 651 652 // Support for short branches 653 virtual MachNode *short_branch_version() { return NULL; } 654 655 virtual bool pinned() const { return true; }; 656 }; 657 658 //------------------------------MachNullChkNode-------------------------------- 659 // Machine-dependent null-pointer-check Node. Points a real MachNode that is 660 // also some kind of memory op. Turns the indicated MachNode into a 661 // conditional branch with good latency on the ptr-not-null path and awful |