mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-23 20:44:41 +02:00
7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
Use shorter instruction sequences for atomic add and atomic exchange when possible. Reviewed-by: kvn, jrose
This commit is contained in:
parent
25f18c20d9
commit
302540691b
38 changed files with 880 additions and 124 deletions
|
@ -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) : LoadStoreNode(c, mem, adr, val, ex) { }
|
||||
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:
|
||||
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;
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue