541 } 542 virtual uint size_of() const { return sizeof(*this); } 543 void set_out_RegMask(const RegMask &out) { _out = &out; } 544 void set_in_RegMask(const RegMask &in) { _in = ∈ } 545 virtual const RegMask &out_RegMask() const { return *_out; } 546 virtual const RegMask &in_RegMask(uint) const { return *_in; } 547 virtual const class Type *bottom_type() const { return _type; } 548 virtual uint ideal_reg() const { return _type->ideal_reg(); } 549 virtual uint oper_input_base() const { return 1; } 550 uint implementation( CodeBuffer *cbuf, PhaseRegAlloc *ra_, bool do_size, outputStream* st ) const; 551 552 virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const; 553 virtual uint size(PhaseRegAlloc *ra_) const; 554 555 #ifndef PRODUCT 556 virtual const char *Name() const { return "MachSpillCopy"; } 557 virtual void format( PhaseRegAlloc *, outputStream *st ) const; 558 #endif 559 }; 560 561 //------------------------------MachBranchNode-------------------------------- 562 // Abstract machine branch Node 563 class MachBranchNode : public MachIdealNode { 564 public: 565 MachBranchNode() : MachIdealNode() { 566 init_class_id(Class_MachBranch); 567 } 568 virtual void label_set(Label* label, uint block_num) = 0; 569 virtual void save_label(Label** label, uint* block_num) = 0; 570 571 // Support for short branches 572 virtual MachNode *short_branch_version(Compile* C) { return NULL; } 573 574 virtual bool pinned() const { return true; }; 575 }; 576 577 //------------------------------MachNullChkNode-------------------------------- 578 // Machine-dependent null-pointer-check Node. Points a real MachNode that is 579 // also some kind of memory op. Turns the indicated MachNode into a 580 // conditional branch with good latency on the ptr-not-null path and awful | 541 } 542 virtual uint size_of() const { return sizeof(*this); } 543 void set_out_RegMask(const RegMask &out) { _out = &out; } 544 void set_in_RegMask(const RegMask &in) { _in = ∈ } 545 virtual const RegMask &out_RegMask() const { return *_out; } 546 virtual const RegMask &in_RegMask(uint) const { return *_in; } 547 virtual const class Type *bottom_type() const { return _type; } 548 virtual uint ideal_reg() const { return _type->ideal_reg(); } 549 virtual uint oper_input_base() const { return 1; } 550 uint implementation( CodeBuffer *cbuf, PhaseRegAlloc *ra_, bool do_size, outputStream* st ) const; 551 552 virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const; 553 virtual uint size(PhaseRegAlloc *ra_) const; 554 555 #ifndef PRODUCT 556 virtual const char *Name() const { return "MachSpillCopy"; } 557 virtual void format( PhaseRegAlloc *, outputStream *st ) const; 558 #endif 559 }; 560 561 // MachMergeNode is similar to a PhiNode in a sense it merges multiple values, 562 // however it doesn't have a control input and is more like a MergeMem. 563 // It is inserted after the register allocation is done to ensure that nodes use single 564 // definition of a multidef lrg in a block. 565 class MachMergeNode : public MachIdealNode { 566 public: 567 MachMergeNode(Node *n1) { 568 init_class_id(Class_MachMerge); 569 add_req(NULL); 570 add_req(n1); 571 } 572 virtual const RegMask &out_RegMask() const { return in(1)->out_RegMask(); } 573 virtual const RegMask &in_RegMask(uint idx) const { return in(1)->in_RegMask(idx); } 574 virtual const class Type *bottom_type() const { return in(1)->bottom_type(); } 575 virtual uint ideal_reg() const { return bottom_type()->ideal_reg(); } 576 virtual uint oper_input_base() const { return 1; } 577 virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const { } 578 virtual uint size(PhaseRegAlloc *ra_) const { return 0; } 579 #ifndef PRODUCT 580 virtual const char *Name() const { return "MachMerge"; } 581 #endif 582 }; 583 584 //------------------------------MachBranchNode-------------------------------- 585 // Abstract machine branch Node 586 class MachBranchNode : public MachIdealNode { 587 public: 588 MachBranchNode() : MachIdealNode() { 589 init_class_id(Class_MachBranch); 590 } 591 virtual void label_set(Label* label, uint block_num) = 0; 592 virtual void save_label(Label** label, uint* block_num) = 0; 593 594 // Support for short branches 595 virtual MachNode *short_branch_version(Compile* C) { return NULL; } 596 597 virtual bool pinned() const { return true; }; 598 }; 599 600 //------------------------------MachNullChkNode-------------------------------- 601 // Machine-dependent null-pointer-check Node. Points a real MachNode that is 602 // also some kind of memory op. Turns the indicated MachNode into a 603 // conditional branch with good latency on the ptr-not-null path and awful |