877 Node* precedent = NULL); |
877 Node* precedent = NULL); |
878 }; |
878 }; |
879 |
879 |
880 // "Acquire" - no following ref can move before (but earlier refs can |
880 // "Acquire" - no following ref can move before (but earlier refs can |
881 // follow, like an early Load stalled in cache). Requires multi-cpu |
881 // follow, like an early Load stalled in cache). Requires multi-cpu |
882 // visibility. Inserted after a volatile load or FastLock. |
882 // visibility. Inserted after a volatile load. |
883 class MemBarAcquireNode: public MemBarNode { |
883 class MemBarAcquireNode: public MemBarNode { |
884 public: |
884 public: |
885 MemBarAcquireNode(Compile* C, int alias_idx, Node* precedent) |
885 MemBarAcquireNode(Compile* C, int alias_idx, Node* precedent) |
886 : MemBarNode(C, alias_idx, precedent) {} |
886 : MemBarNode(C, alias_idx, precedent) {} |
887 virtual int Opcode() const; |
887 virtual int Opcode() const; |
888 }; |
888 }; |
889 |
889 |
890 // "Release" - no earlier ref can move after (but later refs can move |
890 // "Release" - no earlier ref can move after (but later refs can move |
891 // up, like a speculative pipelined cache-hitting Load). Requires |
891 // up, like a speculative pipelined cache-hitting Load). Requires |
892 // multi-cpu visibility. Inserted before a volatile store or FastUnLock. |
892 // multi-cpu visibility. Inserted before a volatile store. |
893 class MemBarReleaseNode: public MemBarNode { |
893 class MemBarReleaseNode: public MemBarNode { |
894 public: |
894 public: |
895 MemBarReleaseNode(Compile* C, int alias_idx, Node* precedent) |
895 MemBarReleaseNode(Compile* C, int alias_idx, Node* precedent) |
|
896 : MemBarNode(C, alias_idx, precedent) {} |
|
897 virtual int Opcode() const; |
|
898 }; |
|
899 |
|
900 // "Acquire" - no following ref can move before (but earlier refs can |
|
901 // follow, like an early Load stalled in cache). Requires multi-cpu |
|
902 // visibility. Inserted after a FastLock. |
|
903 class MemBarAcquireLockNode: public MemBarNode { |
|
904 public: |
|
905 MemBarAcquireLockNode(Compile* C, int alias_idx, Node* precedent) |
|
906 : MemBarNode(C, alias_idx, precedent) {} |
|
907 virtual int Opcode() const; |
|
908 }; |
|
909 |
|
910 // "Release" - no earlier ref can move after (but later refs can move |
|
911 // up, like a speculative pipelined cache-hitting Load). Requires |
|
912 // multi-cpu visibility. Inserted before a FastUnLock. |
|
913 class MemBarReleaseLockNode: public MemBarNode { |
|
914 public: |
|
915 MemBarReleaseLockNode(Compile* C, int alias_idx, Node* precedent) |
896 : MemBarNode(C, alias_idx, precedent) {} |
916 : MemBarNode(C, alias_idx, precedent) {} |
897 virtual int Opcode() const; |
917 virtual int Opcode() const; |
898 }; |
918 }; |
899 |
919 |
900 // Ordering between a volatile store and a following volatile load. |
920 // Ordering between a volatile store and a following volatile load. |