996 GetAndSetLNode( Node *c, Node *mem, Node *adr, Node *val, const TypePtr* at ) : LoadStoreNode(c, mem, adr, val, at, TypeLong::LONG, 4) { } 997 virtual int Opcode() const; 998 }; 999 1000 //------------------------------GetAndSetPNode--------------------------- 1001 class GetAndSetPNode : public LoadStoreNode { 1002 public: 1003 GetAndSetPNode( Node *c, Node *mem, Node *adr, Node *val, const TypePtr* at, const Type* t ) : LoadStoreNode(c, mem, adr, val, at, t, 4) { } 1004 virtual int Opcode() const; 1005 }; 1006 1007 //------------------------------GetAndSetNNode--------------------------- 1008 class GetAndSetNNode : public LoadStoreNode { 1009 public: 1010 GetAndSetNNode( Node *c, Node *mem, Node *adr, Node *val, const TypePtr* at, const Type* t ) : LoadStoreNode(c, mem, adr, val, at, t, 4) { } 1011 virtual int Opcode() const; 1012 }; 1013 1014 //------------------------------ClearArray------------------------------------- 1015 class ClearArrayNode: public Node { 1016 public: 1017 ClearArrayNode( Node *ctrl, Node *arymem, Node *word_cnt, Node *base ) 1018 : Node(ctrl,arymem,word_cnt,base) { 1019 init_class_id(Class_ClearArray); 1020 } 1021 virtual int Opcode() const; 1022 virtual const Type *bottom_type() const { return Type::MEMORY; } 1023 // ClearArray modifies array elements, and so affects only the 1024 // array memory addressed by the bottom_type of its base address. 1025 virtual const class TypePtr *adr_type() const; 1026 virtual Node* Identity(PhaseGVN* phase); 1027 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); 1028 virtual uint match_edge(uint idx) const; 1029 1030 // Clear the given area of an object or array. 1031 // The start offset must always be aligned mod BytesPerInt. 1032 // The end offset must always be aligned mod BytesPerLong. 1033 // Return the new memory. 1034 static Node* clear_memory(Node* control, Node* mem, Node* dest, 1035 intptr_t start_offset, 1036 intptr_t end_offset, 1037 PhaseGVN* phase); 1038 static Node* clear_memory(Node* control, Node* mem, Node* dest, 1039 intptr_t start_offset, 1040 Node* end_offset, 1041 PhaseGVN* phase); 1042 static Node* clear_memory(Node* control, Node* mem, Node* dest, 1043 Node* start_offset, 1044 Node* end_offset, 1045 PhaseGVN* phase); 1046 // Return allocation input memory edge if it is different instance 1047 // or itself if it is the one we are looking for. 1048 static bool step_through(Node** np, uint instance_id, PhaseTransform* phase); | 996 GetAndSetLNode( Node *c, Node *mem, Node *adr, Node *val, const TypePtr* at ) : LoadStoreNode(c, mem, adr, val, at, TypeLong::LONG, 4) { } 997 virtual int Opcode() const; 998 }; 999 1000 //------------------------------GetAndSetPNode--------------------------- 1001 class GetAndSetPNode : public LoadStoreNode { 1002 public: 1003 GetAndSetPNode( Node *c, Node *mem, Node *adr, Node *val, const TypePtr* at, const Type* t ) : LoadStoreNode(c, mem, adr, val, at, t, 4) { } 1004 virtual int Opcode() const; 1005 }; 1006 1007 //------------------------------GetAndSetNNode--------------------------- 1008 class GetAndSetNNode : public LoadStoreNode { 1009 public: 1010 GetAndSetNNode( Node *c, Node *mem, Node *adr, Node *val, const TypePtr* at, const Type* t ) : LoadStoreNode(c, mem, adr, val, at, t, 4) { } 1011 virtual int Opcode() const; 1012 }; 1013 1014 //------------------------------ClearArray------------------------------------- 1015 class ClearArrayNode: public Node { 1016 private: 1017 bool _is_large; 1018 public: 1019 ClearArrayNode( Node *ctrl, Node *arymem, Node *word_cnt, Node *base, bool is_large = false) 1020 : Node(ctrl,arymem,word_cnt,base), _is_large(is_large) { 1021 init_class_id(Class_ClearArray); 1022 } 1023 virtual int Opcode() const; 1024 virtual const Type *bottom_type() const { return Type::MEMORY; } 1025 // ClearArray modifies array elements, and so affects only the 1026 // array memory addressed by the bottom_type of its base address. 1027 virtual const class TypePtr *adr_type() const; 1028 virtual Node* Identity(PhaseGVN* phase); 1029 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); 1030 virtual uint match_edge(uint idx) const; 1031 bool is_large() const { return _is_large; } 1032 1033 // Clear the given area of an object or array. 1034 // The start offset must always be aligned mod BytesPerInt. 1035 // The end offset must always be aligned mod BytesPerLong. 1036 // Return the new memory. 1037 static Node* clear_memory(Node* control, Node* mem, Node* dest, 1038 intptr_t start_offset, 1039 intptr_t end_offset, 1040 PhaseGVN* phase); 1041 static Node* clear_memory(Node* control, Node* mem, Node* dest, 1042 intptr_t start_offset, 1043 Node* end_offset, 1044 PhaseGVN* phase); 1045 static Node* clear_memory(Node* control, Node* mem, Node* dest, 1046 Node* start_offset, 1047 Node* end_offset, 1048 PhaseGVN* phase); 1049 // Return allocation input memory edge if it is different instance 1050 // or itself if it is the one we are looking for. 1051 static bool step_through(Node** np, uint instance_id, PhaseTransform* phase); |