Chromium Code Reviews| Index: src/IceIntrinsics.cpp |
| diff --git a/src/IceIntrinsics.cpp b/src/IceIntrinsics.cpp |
| index 26a81dea7eaa10b5836e1aac95d29011c9396db9..5269f8f24aaa17f63d898da64a64a8b1948664c9 100644 |
| --- a/src/IceIntrinsics.cpp |
| +++ b/src/IceIntrinsics.cpp |
| @@ -233,9 +233,62 @@ const Intrinsics::FullIntrinsicInfo *Intrinsics::find(const IceString &Name, |
| return &it->second; |
| } |
| -bool Intrinsics::VerifyMemoryOrder(uint64_t Order) { |
| - // There is only one memory ordering for atomics allowed right now. |
| - return Order == Intrinsics::MemoryOrderSequentiallyConsistent; |
| +bool Intrinsics::isMemoryOrderValid(IntrinsicID ID, uint64_t Order, |
| + uint64_t OrderOther) { |
| + // Reject orderings not allowed in PNaCl. |
| + switch (Order) { |
| + case Intrinsics::MemoryOrderAcquire: |
| + case Intrinsics::MemoryOrderRelease: |
| + case Intrinsics::MemoryOrderAcquireRelease: |
| + case Intrinsics::MemoryOrderSequentiallyConsistent: |
| + break; |
| + default: |
| + return false; |
| + } |
| + // Reject orderings not allowed by C++11. |
| + switch (ID) { |
| + default: |
| + llvm_unreachable("isMemoryOrderValid: Unknown IntrinsicID"); |
| + return false; |
| + case AtomicFence: |
| + case AtomicFenceAll: |
| + case AtomicRMW: |
| + return true; |
| + case AtomicCmpxchg: |
| + switch (OrderOther) { |
| + case Intrinsics::MemoryOrderInvalid: |
|
jvoung (off chromium)
2015/03/17 19:05:21
Maybe call out
case Intrinsics::MemoryOrderInvali
Jim Stichnoth
2015/03/17 21:05:11
Done.
|
| + case Intrinsics::MemoryOrderNum: |
| + case Intrinsics::MemoryOrderRelease: |
| + case Intrinsics::MemoryOrderAcquireRelease: |
| + case Intrinsics::MemoryOrderRelaxed: |
| + case Intrinsics::MemoryOrderConsume: |
| + return false; |
| + default: |
| + if (OrderOther > Order) |
| + return false; |
| + if (Order == Intrinsics::MemoryOrderRelease && |
| + OrderOther != Intrinsics::MemoryOrderRelaxed) |
| + return false; |
| + return true; |
| + } |
| + case AtomicLoad: |
| + switch (Order) { |
| + case Intrinsics::MemoryOrderRelease: |
| + case Intrinsics::MemoryOrderAcquireRelease: |
| + return false; |
| + default: |
| + return true; |
| + } |
| + case AtomicStore: |
| + switch (Order) { |
| + case Intrinsics::MemoryOrderConsume: |
| + case Intrinsics::MemoryOrderAcquire: |
| + case Intrinsics::MemoryOrderAcquireRelease: |
| + return false; |
| + default: |
| + return true; |
| + } |
| + } |
| } |
| Intrinsics::ValidateCallValue |