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