1058 // Ordering between a volatile store and a following volatile load. 1059 // Requires multi-CPU visibility? 1060 class MemBarVolatileNode: public MemBarNode { 1061 public: 1062 MemBarVolatileNode(Compile* C, int alias_idx, Node* precedent) 1063 : MemBarNode(C, alias_idx, precedent) {} 1064 virtual int Opcode() const; 1065 }; 1066 1067 // Ordering within the same CPU. Used to order unsafe memory references 1068 // inside the compiler when we lack alias info. Not needed "outside" the 1069 // compiler because the CPU does all the ordering for us. 1070 class MemBarCPUOrderNode: public MemBarNode { 1071 public: 1072 MemBarCPUOrderNode(Compile* C, int alias_idx, Node* precedent) 1073 : MemBarNode(C, alias_idx, precedent) {} 1074 virtual int Opcode() const; 1075 virtual uint ideal_reg() const { return 0; } // not matched in the AD file 1076 }; 1077 1078 // Isolation of object setup after an AllocateNode and before next safepoint. 1079 // (See comment in memnode.cpp near InitializeNode::InitializeNode for semantics.) 1080 class InitializeNode: public MemBarNode { 1081 friend class AllocateNode; 1082 1083 enum { 1084 Incomplete = 0, 1085 Complete = 1, 1086 WithArraycopy = 2 1087 }; 1088 int _is_complete; 1089 1090 bool _does_not_escape; 1091 1092 public: 1093 enum { 1094 Control = TypeFunc::Control, 1095 Memory = TypeFunc::Memory, // MergeMem for states affected by this op 1096 RawAddress = TypeFunc::Parms+0, // the newly-allocated raw address 1097 RawStores = TypeFunc::Parms+1 // zero or more stores (or TOP) | 1058 // Ordering between a volatile store and a following volatile load. 1059 // Requires multi-CPU visibility? 1060 class MemBarVolatileNode: public MemBarNode { 1061 public: 1062 MemBarVolatileNode(Compile* C, int alias_idx, Node* precedent) 1063 : MemBarNode(C, alias_idx, precedent) {} 1064 virtual int Opcode() const; 1065 }; 1066 1067 // Ordering within the same CPU. Used to order unsafe memory references 1068 // inside the compiler when we lack alias info. Not needed "outside" the 1069 // compiler because the CPU does all the ordering for us. 1070 class MemBarCPUOrderNode: public MemBarNode { 1071 public: 1072 MemBarCPUOrderNode(Compile* C, int alias_idx, Node* precedent) 1073 : MemBarNode(C, alias_idx, precedent) {} 1074 virtual int Opcode() const; 1075 virtual uint ideal_reg() const { return 0; } // not matched in the AD file 1076 }; 1077 1078 class OnSpinWaitNode: public MemBarNode { 1079 public: 1080 OnSpinWaitNode(Compile* C, int alias_idx, Node* precedent) 1081 : MemBarNode(C, alias_idx, precedent) {} 1082 virtual int Opcode() const; 1083 }; 1084 1085 // Isolation of object setup after an AllocateNode and before next safepoint. 1086 // (See comment in memnode.cpp near InitializeNode::InitializeNode for semantics.) 1087 class InitializeNode: public MemBarNode { 1088 friend class AllocateNode; 1089 1090 enum { 1091 Incomplete = 0, 1092 Complete = 1, 1093 WithArraycopy = 2 1094 }; 1095 int _is_complete; 1096 1097 bool _does_not_escape; 1098 1099 public: 1100 enum { 1101 Control = TypeFunc::Control, 1102 Memory = TypeFunc::Memory, // MergeMem for states affected by this op 1103 RawAddress = TypeFunc::Parms+0, // the newly-allocated raw address 1104 RawStores = TypeFunc::Parms+1 // zero or more stores (or TOP) |