diff options
Diffstat (limited to 'src/share/vm/opto/memnode.hpp')
-rw-r--r-- | src/share/vm/opto/memnode.hpp | 94 |
1 files changed, 75 insertions, 19 deletions
diff --git a/src/share/vm/opto/memnode.hpp b/src/share/vm/opto/memnode.hpp index f79f615d1..6f722f938 100644 --- a/src/share/vm/opto/memnode.hpp +++ b/src/share/vm/opto/memnode.hpp @@ -657,23 +657,36 @@ public: //------------------------------LoadStoreNode--------------------------- // Note: is_Mem() method returns 'true' for this class. class LoadStoreNode : public Node { +private: + const Type* const _type; // What kind of value is loaded? + const TypePtr* _adr_type; // What kind of memory is being addressed? + virtual uint size_of() const; // Size is bigger +public: + LoadStoreNode( Node *c, Node *mem, Node *adr, Node *val, const TypePtr* at, const Type* rt, uint required ); + virtual bool depends_only_on_test() const { return false; } + virtual uint match_edge(uint idx) const { return idx == MemNode::Address || idx == MemNode::ValueIn; } + + virtual const Type *bottom_type() const { return _type; } + virtual uint ideal_reg() const; + virtual const class TypePtr *adr_type() const { return _adr_type; } // returns bottom_type of address + + bool result_not_used() const; +}; + +class LoadStoreConditionalNode : public LoadStoreNode { public: enum { ExpectedIn = MemNode::ValueIn+1 // One more input than MemNode }; - LoadStoreNode( Node *c, Node *mem, Node *adr, Node *val, Node *ex); - virtual bool depends_only_on_test() const { return false; } - virtual const Type *bottom_type() const { return TypeInt::BOOL; } - virtual uint ideal_reg() const { return Op_RegI; } - virtual uint match_edge(uint idx) const { return idx == MemNode::Address || idx == MemNode::ValueIn; } + LoadStoreConditionalNode(Node *c, Node *mem, Node *adr, Node *val, Node *ex); }; //------------------------------StorePConditionalNode--------------------------- // Conditionally store pointer to memory, if no change since prior // load-locked. Sets flags for success or failure of the store. -class StorePConditionalNode : public LoadStoreNode { +class StorePConditionalNode : public LoadStoreConditionalNode { public: - StorePConditionalNode( Node *c, Node *mem, Node *adr, Node *val, Node *ll ) : LoadStoreNode(c, mem, adr, val, ll) { } + StorePConditionalNode( Node *c, Node *mem, Node *adr, Node *val, Node *ll ) : LoadStoreConditionalNode(c, mem, adr, val, ll) { } virtual int Opcode() const; // Produces flags virtual uint ideal_reg() const { return Op_RegFlags; } @@ -682,9 +695,9 @@ public: //------------------------------StoreIConditionalNode--------------------------- // Conditionally store int to memory, if no change since prior // load-locked. Sets flags for success or failure of the store. -class StoreIConditionalNode : public LoadStoreNode { +class StoreIConditionalNode : public LoadStoreConditionalNode { public: - StoreIConditionalNode( Node *c, Node *mem, Node *adr, Node *val, Node *ii ) : LoadStoreNode(c, mem, adr, val, ii) { } + StoreIConditionalNode( Node *c, Node *mem, Node *adr, Node *val, Node *ii ) : LoadStoreConditionalNode(c, mem, adr, val, ii) { } virtual int Opcode() const; // Produces flags virtual uint ideal_reg() const { return Op_RegFlags; } @@ -693,9 +706,9 @@ public: //------------------------------StoreLConditionalNode--------------------------- // Conditionally store long to memory, if no change since prior // load-locked. Sets flags for success or failure of the store. -class StoreLConditionalNode : public LoadStoreNode { +class StoreLConditionalNode : public LoadStoreConditionalNode { public: - StoreLConditionalNode( Node *c, Node *mem, Node *adr, Node *val, Node *ll ) : LoadStoreNode(c, mem, adr, val, ll) { } + StoreLConditionalNode( Node *c, Node *mem, Node *adr, Node *val, Node *ll ) : LoadStoreConditionalNode(c, mem, adr, val, ll) { } virtual int Opcode() const; // Produces flags virtual uint ideal_reg() const { return Op_RegFlags; } @@ -703,32 +716,75 @@ public: //------------------------------CompareAndSwapLNode--------------------------- -class CompareAndSwapLNode : public LoadStoreNode { +class CompareAndSwapLNode : public LoadStoreConditionalNode { public: - CompareAndSwapLNode( Node *c, Node *mem, Node *adr, Node *val, Node *ex) : LoadStoreNode(c, mem, adr, val, ex) { } + CompareAndSwapLNode( Node *c, Node *mem, Node *adr, Node *val, Node *ex) : LoadStoreConditionalNode(c, mem, adr, val, ex) { } virtual int Opcode() const; }; //------------------------------CompareAndSwapINode--------------------------- -class CompareAndSwapINode : public LoadStoreNode { +class CompareAndSwapINode : public LoadStoreConditionalNode { public: - CompareAndSwapINode( Node *c, Node *mem, Node *adr, Node *val, Node *ex) : LoadStoreNode(c, mem, adr, val, ex) { } + CompareAndSwapINode( Node *c, Node *mem, Node *adr, Node *val, Node *ex) : LoadStoreConditionalNode(c, mem, adr, val, ex) { } virtual int Opcode() const; }; //------------------------------CompareAndSwapPNode--------------------------- -class CompareAndSwapPNode : public LoadStoreNode { +class CompareAndSwapPNode : public LoadStoreConditionalNode { public: - CompareAndSwapPNode( Node *c, Node *mem, Node *adr, Node *val, Node *ex) : LoadStoreNode(c, mem, adr, val, ex) { } + CompareAndSwapPNode( Node *c, Node *mem, Node *adr, Node *val, Node *ex) : LoadStoreConditionalNode(c, mem, adr, val, ex) { } virtual int Opcode() const; }; //------------------------------CompareAndSwapNNode--------------------------- -class CompareAndSwapNNode : public LoadStoreNode { +class CompareAndSwapNNode : public LoadStoreConditionalNode { +public: + CompareAndSwapNNode( Node *c, Node *mem, Node *adr, Node *val, Node *ex) : LoadStoreConditionalNode(c, mem, adr, val, ex) { } + virtual int Opcode() const; +}; + +//------------------------------GetAndAddINode--------------------------- +class GetAndAddINode : public LoadStoreNode { +public: + GetAndAddINode( Node *c, Node *mem, Node *adr, Node *val, const TypePtr* at ) : LoadStoreNode(c, mem, adr, val, at, TypeInt::INT, 4) { } + virtual int Opcode() const; +}; + +//------------------------------GetAndAddLNode--------------------------- +class GetAndAddLNode : public LoadStoreNode { +public: + GetAndAddLNode( Node *c, Node *mem, Node *adr, Node *val, const TypePtr* at ) : LoadStoreNode(c, mem, adr, val, at, TypeLong::LONG, 4) { } + virtual int Opcode() const; +}; + + +//------------------------------GetAndSetINode--------------------------- +class GetAndSetINode : public LoadStoreNode { +public: + GetAndSetINode( Node *c, Node *mem, Node *adr, Node *val, const TypePtr* at ) : LoadStoreNode(c, mem, adr, val, at, TypeInt::INT, 4) { } + virtual int Opcode() const; +}; + +//------------------------------GetAndSetINode--------------------------- +class GetAndSetLNode : public LoadStoreNode { +public: + GetAndSetLNode( Node *c, Node *mem, Node *adr, Node *val, const TypePtr* at ) : LoadStoreNode(c, mem, adr, val, at, TypeLong::LONG, 4) { } + virtual int Opcode() const; +}; + +//------------------------------GetAndSetPNode--------------------------- +class GetAndSetPNode : public LoadStoreNode { +public: + GetAndSetPNode( Node *c, Node *mem, Node *adr, Node *val, const TypePtr* at, const Type* t ) : LoadStoreNode(c, mem, adr, val, at, t, 4) { } + virtual int Opcode() const; +}; + +//------------------------------GetAndSetNNode--------------------------- +class GetAndSetNNode : public LoadStoreNode { public: - CompareAndSwapNNode( Node *c, Node *mem, Node *adr, Node *val, Node *ex) : LoadStoreNode(c, mem, adr, val, ex) { } + GetAndSetNNode( Node *c, Node *mem, Node *adr, Node *val, const TypePtr* at, const Type* t ) : LoadStoreNode(c, mem, adr, val, at, t, 4) { } virtual int Opcode() const; }; |