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)
|