mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-16 05:41:45 +00:00
Make use of isAtLeastRelease/Acquire in the ARM/AArch64 backends
Summary: Make use of isAtLeastRelease/Acquire in the ARM/AArch64 backends These helper functions are introduced in D4844. Depends D4844 Test Plan: make check-all passes Reviewers: jfb Subscribers: aemerson, llvm-commits, mcrosier, reames Differential Revision: http://reviews.llvm.org/D4937 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@215902 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
71493b7d7c
commit
af2fa71a64
lib/Target
@ -8153,8 +8153,7 @@ Value *AArch64TargetLowering::emitLoadLinked(IRBuilder<> &Builder, Value *Addr,
|
||||
AtomicOrdering Ord) const {
|
||||
Module *M = Builder.GetInsertBlock()->getParent()->getParent();
|
||||
Type *ValTy = cast<PointerType>(Addr->getType())->getElementType();
|
||||
bool IsAcquire =
|
||||
Ord == Acquire || Ord == AcquireRelease || Ord == SequentiallyConsistent;
|
||||
bool IsAcquire = isAtLeastAcquire(Ord);
|
||||
|
||||
// Since i128 isn't legal and intrinsics don't get type-lowered, the ldrexd
|
||||
// intrinsic must return {i64, i64} and we have to recombine them into a
|
||||
@ -8189,8 +8188,7 @@ Value *AArch64TargetLowering::emitStoreConditional(IRBuilder<> &Builder,
|
||||
Value *Val, Value *Addr,
|
||||
AtomicOrdering Ord) const {
|
||||
Module *M = Builder.GetInsertBlock()->getParent()->getParent();
|
||||
bool IsRelease =
|
||||
Ord == Release || Ord == AcquireRelease || Ord == SequentiallyConsistent;
|
||||
bool IsRelease = isAtLeastRelease(Ord);
|
||||
|
||||
// Since the intrinsics must have legal type, the i128 intrinsics take two
|
||||
// parameters: "i64, i64". We must marshal Val into the appropriate form
|
||||
|
@ -29,8 +29,7 @@ def : Pat<(atomic_fence (imm), (imm)), (DMB (i32 0xb))>;
|
||||
class acquiring_load<PatFrag base>
|
||||
: PatFrag<(ops node:$ptr), (base node:$ptr), [{
|
||||
AtomicOrdering Ordering = cast<AtomicSDNode>(N)->getOrdering();
|
||||
assert(Ordering != AcquireRelease && "unexpected load ordering");
|
||||
return Ordering == Acquire || Ordering == SequentiallyConsistent;
|
||||
return isAtLeastAcquire(Ordering);
|
||||
}]>;
|
||||
|
||||
// An atomic load operation that does not need either acquire or release
|
||||
@ -38,7 +37,7 @@ class acquiring_load<PatFrag base>
|
||||
class relaxed_load<PatFrag base>
|
||||
: PatFrag<(ops node:$ptr), (base node:$ptr), [{
|
||||
AtomicOrdering Ordering = cast<AtomicSDNode>(N)->getOrdering();
|
||||
return Ordering == Monotonic || Ordering == Unordered;
|
||||
return !isAtLeastAcquire(Ordering);
|
||||
}]>;
|
||||
|
||||
// 8-bit loads
|
||||
@ -114,14 +113,14 @@ class releasing_store<PatFrag base>
|
||||
: PatFrag<(ops node:$ptr, node:$val), (base node:$ptr, node:$val), [{
|
||||
AtomicOrdering Ordering = cast<AtomicSDNode>(N)->getOrdering();
|
||||
assert(Ordering != AcquireRelease && "unexpected store ordering");
|
||||
return Ordering == Release || Ordering == SequentiallyConsistent;
|
||||
return isAtLeastRelease(Ordering);
|
||||
}]>;
|
||||
|
||||
// An atomic store operation that doesn't actually need to be atomic on AArch64.
|
||||
class relaxed_store<PatFrag base>
|
||||
: PatFrag<(ops node:$ptr, node:$val), (base node:$ptr, node:$val), [{
|
||||
AtomicOrdering Ordering = cast<AtomicSDNode>(N)->getOrdering();
|
||||
return Ordering == Monotonic || Ordering == Unordered;
|
||||
return !isAtLeastRelease(Ordering);
|
||||
}]>;
|
||||
|
||||
// 8-bit stores
|
||||
|
@ -10885,8 +10885,7 @@ Value *ARMTargetLowering::emitLoadLinked(IRBuilder<> &Builder, Value *Addr,
|
||||
AtomicOrdering Ord) const {
|
||||
Module *M = Builder.GetInsertBlock()->getParent()->getParent();
|
||||
Type *ValTy = cast<PointerType>(Addr->getType())->getElementType();
|
||||
bool IsAcquire =
|
||||
Ord == Acquire || Ord == AcquireRelease || Ord == SequentiallyConsistent;
|
||||
bool IsAcquire = isAtLeastAcquire(Ord);
|
||||
|
||||
// Since i64 isn't legal and intrinsics don't get type-lowered, the ldrexd
|
||||
// intrinsic must return {i32, i32} and we have to recombine them into a
|
||||
@ -10922,8 +10921,7 @@ Value *ARMTargetLowering::emitStoreConditional(IRBuilder<> &Builder, Value *Val,
|
||||
Value *Addr,
|
||||
AtomicOrdering Ord) const {
|
||||
Module *M = Builder.GetInsertBlock()->getParent()->getParent();
|
||||
bool IsRelease =
|
||||
Ord == Release || Ord == AcquireRelease || Ord == SequentiallyConsistent;
|
||||
bool IsRelease = isAtLeastRelease(Ord);
|
||||
|
||||
// Since the intrinsics must have legal type, the i64 intrinsics take two
|
||||
// parameters: "i32, i32". We must marshal Val into the appropriate form
|
||||
|
@ -4638,7 +4638,7 @@ def : ARMPat<(stlex_2 (and GPR:$Rt, 0xffff), addr_offset_none:$addr),
|
||||
class acquiring_load<PatFrag base>
|
||||
: PatFrag<(ops node:$ptr), (base node:$ptr), [{
|
||||
AtomicOrdering Ordering = cast<AtomicSDNode>(N)->getOrdering();
|
||||
return Ordering == Acquire || Ordering == SequentiallyConsistent;
|
||||
return isAtLeastAcquire(Ordering);
|
||||
}]>;
|
||||
|
||||
def atomic_load_acquire_8 : acquiring_load<atomic_load_8>;
|
||||
@ -4648,7 +4648,7 @@ def atomic_load_acquire_32 : acquiring_load<atomic_load_32>;
|
||||
class releasing_store<PatFrag base>
|
||||
: PatFrag<(ops node:$ptr, node:$val), (base node:$ptr, node:$val), [{
|
||||
AtomicOrdering Ordering = cast<AtomicSDNode>(N)->getOrdering();
|
||||
return Ordering == Release || Ordering == SequentiallyConsistent;
|
||||
return isAtLeastRelease(Ordering);
|
||||
}]>;
|
||||
|
||||
def atomic_store_release_8 : releasing_store<atomic_store_8>;
|
||||
|
Loading…
x
Reference in New Issue
Block a user