183 virtual MachNode *cisc_version(int offset, Compile* C); |
183 virtual MachNode *cisc_version(int offset, Compile* C); |
184 // Modify this instruction's register mask to use stack version for cisc_operand |
184 // Modify this instruction's register mask to use stack version for cisc_operand |
185 virtual void use_cisc_RegMask(); |
185 virtual void use_cisc_RegMask(); |
186 |
186 |
187 // Support for short branches |
187 // Support for short branches |
188 virtual MachNode *short_branch_version(Compile* C) { return NULL; } |
|
189 bool may_be_short_branch() const { return (flags() & Flag_may_be_short_branch) != 0; } |
188 bool may_be_short_branch() const { return (flags() & Flag_may_be_short_branch) != 0; } |
190 |
189 |
191 // Avoid back to back some instructions on some CPUs. |
190 // Avoid back to back some instructions on some CPUs. |
192 bool avoid_back_to_back() const { return (flags() & Flag_avoid_back_to_back) != 0; } |
191 bool avoid_back_to_back() const { return (flags() & Flag_avoid_back_to_back) != 0; } |
193 |
192 |
270 virtual const MachOper* memory_operand() const { return NULL; } |
269 virtual const MachOper* memory_operand() const { return NULL; } |
271 |
270 |
272 // Call "get_base_and_disp" to decide which category of memory is used here. |
271 // Call "get_base_and_disp" to decide which category of memory is used here. |
273 virtual const class TypePtr *adr_type() const; |
272 virtual const class TypePtr *adr_type() const; |
274 |
273 |
275 // Negate conditional branches. Error for non-branch Nodes |
|
276 virtual void negate(); |
|
277 |
|
278 // Apply peephole rule(s) to this instruction |
274 // Apply peephole rule(s) to this instruction |
279 virtual MachNode *peephole( Block *block, int block_index, PhaseRegAlloc *ra_, int &deleted, Compile* C ); |
275 virtual MachNode *peephole( Block *block, int block_index, PhaseRegAlloc *ra_, int &deleted, Compile* C ); |
280 |
276 |
281 // Top-level ideal Opcode matched |
277 // Top-level ideal Opcode matched |
282 virtual int ideal_Opcode() const { return Op_Node; } |
278 virtual int ideal_Opcode() const { return Op_Node; } |
283 |
|
284 // Set the branch inside jump MachNodes. Error for non-branch Nodes. |
|
285 virtual void label_set( Label* label, uint block_num ); |
|
286 |
279 |
287 // Adds the label for the case |
280 // Adds the label for the case |
288 virtual void add_case_label( int switch_val, Label* blockLabel); |
281 virtual void add_case_label( int switch_val, Label* blockLabel); |
289 |
282 |
290 // Set the absolute address for methods |
283 // Set the absolute address for methods |
512 virtual const char *Name() const { return "MachSpillCopy"; } |
505 virtual const char *Name() const { return "MachSpillCopy"; } |
513 virtual void format( PhaseRegAlloc *, outputStream *st ) const; |
506 virtual void format( PhaseRegAlloc *, outputStream *st ) const; |
514 #endif |
507 #endif |
515 }; |
508 }; |
516 |
509 |
|
510 //------------------------------MachBranchNode-------------------------------- |
|
511 // Abstract machine branch Node |
|
512 class MachBranchNode : public MachIdealNode { |
|
513 public: |
|
514 MachBranchNode() : MachIdealNode() { |
|
515 init_class_id(Class_MachBranch); |
|
516 } |
|
517 virtual void label_set(Label* label, uint block_num) = 0; |
|
518 virtual void save_label(Label** label, uint* block_num) = 0; |
|
519 |
|
520 // Support for short branches |
|
521 virtual MachNode *short_branch_version(Compile* C) { return NULL; } |
|
522 |
|
523 virtual bool pinned() const { return true; }; |
|
524 }; |
|
525 |
517 //------------------------------MachNullChkNode-------------------------------- |
526 //------------------------------MachNullChkNode-------------------------------- |
518 // Machine-dependent null-pointer-check Node. Points a real MachNode that is |
527 // Machine-dependent null-pointer-check Node. Points a real MachNode that is |
519 // also some kind of memory op. Turns the indicated MachNode into a |
528 // also some kind of memory op. Turns the indicated MachNode into a |
520 // conditional branch with good latency on the ptr-not-null path and awful |
529 // conditional branch with good latency on the ptr-not-null path and awful |
521 // latency on the pointer-is-null path. |
530 // latency on the pointer-is-null path. |
522 |
531 |
523 class MachNullCheckNode : public MachIdealNode { |
532 class MachNullCheckNode : public MachBranchNode { |
524 public: |
533 public: |
525 const uint _vidx; // Index of memop being tested |
534 const uint _vidx; // Index of memop being tested |
526 MachNullCheckNode( Node *ctrl, Node *memop, uint vidx ) : MachIdealNode(), _vidx(vidx) { |
535 MachNullCheckNode( Node *ctrl, Node *memop, uint vidx ) : MachBranchNode(), _vidx(vidx) { |
527 init_class_id(Class_MachNullCheck); |
536 init_class_id(Class_MachNullCheck); |
528 init_flags(Flag_is_Branch); |
|
529 add_req(ctrl); |
537 add_req(ctrl); |
530 add_req(memop); |
538 add_req(memop); |
531 } |
539 } |
|
540 virtual uint size_of() const { return sizeof(*this); } |
532 |
541 |
533 virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const; |
542 virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const; |
534 virtual void label_set(Label* label, uint block_num); |
543 virtual void label_set(Label* label, uint block_num); |
535 virtual bool pinned() const { return true; }; |
544 virtual void save_label(Label** label, uint* block_num); |
536 virtual void negate() { } |
545 virtual void negate() { } |
537 virtual const class Type *bottom_type() const { return TypeTuple::IFBOTH; } |
546 virtual const class Type *bottom_type() const { return TypeTuple::IFBOTH; } |
538 virtual uint ideal_reg() const { return NotAMachineReg; } |
547 virtual uint ideal_reg() const { return NotAMachineReg; } |
539 virtual const RegMask &in_RegMask(uint) const; |
548 virtual const RegMask &in_RegMask(uint) const; |
540 virtual const RegMask &out_RegMask() const { return RegMask::Empty; } |
549 virtual const RegMask &out_RegMask() const { return RegMask::Empty; } |
576 #endif |
585 #endif |
577 }; |
586 }; |
578 |
587 |
579 //------------------------------MachIfNode------------------------------------- |
588 //------------------------------MachIfNode------------------------------------- |
580 // Machine-specific versions of IfNodes |
589 // Machine-specific versions of IfNodes |
581 class MachIfNode : public MachNode { |
590 class MachIfNode : public MachBranchNode { |
582 virtual uint size_of() const { return sizeof(*this); } // Size is bigger |
591 virtual uint size_of() const { return sizeof(*this); } // Size is bigger |
583 public: |
592 public: |
584 float _prob; // Probability branch goes either way |
593 float _prob; // Probability branch goes either way |
585 float _fcnt; // Frequency counter |
594 float _fcnt; // Frequency counter |
586 MachIfNode() : MachNode() { |
595 MachIfNode() : MachBranchNode() { |
587 init_class_id(Class_MachIf); |
596 init_class_id(Class_MachIf); |
588 } |
597 } |
|
598 // Negate conditional branches. |
|
599 virtual void negate() = 0; |
589 #ifndef PRODUCT |
600 #ifndef PRODUCT |
590 virtual void dump_spec(outputStream *st) const; |
601 virtual void dump_spec(outputStream *st) const; |
591 #endif |
602 #endif |
592 }; |
603 }; |
593 |
604 |
594 //------------------------------MachGotoNode----------------------------------- |
605 //------------------------------MachGotoNode----------------------------------- |
595 // Machine-specific versions of GotoNodes |
606 // Machine-specific versions of GotoNodes |
596 class MachGotoNode : public MachNode { |
607 class MachGotoNode : public MachBranchNode { |
597 public: |
608 public: |
598 MachGotoNode() : MachNode() { |
609 MachGotoNode() : MachBranchNode() { |
599 init_class_id(Class_MachGoto); |
610 init_class_id(Class_MachGoto); |
600 } |
611 } |
601 }; |
612 }; |
602 |
613 |
603 //------------------------------MachFastLockNode------------------------------------- |
614 //------------------------------MachFastLockNode------------------------------------- |