diff options
| author | Tim Northover <tnorthover@apple.com> | 2015-12-02 18:12:57 +0000 |
|---|---|---|
| committer | Tim Northover <tnorthover@apple.com> | 2015-12-02 18:12:57 +0000 |
| commit | f520eff7827912ab1f9aa2dd08fcd2b0bfa4f945 (patch) | |
| tree | 34caa0a7a53260c2d71ff91ae7ad0db1031464ec /llvm/test/CodeGen | |
| parent | 53d13997925027af4e1d70d314d6bcb0b159672b (diff) | |
| download | bcm5719-llvm-f520eff7827912ab1f9aa2dd08fcd2b0bfa4f945.tar.gz bcm5719-llvm-f520eff7827912ab1f9aa2dd08fcd2b0bfa4f945.zip | |
AArch64: use ldxp/stxp pair to implement 128-bit atomic loads.
The ARM ARM is clear that 128-bit loads are only guaranteed to have been atomic
if there has been a corresponding successful stxp. It's less clear for AArch32, so
I'm leaving that alone for now.
llvm-svn: 254524
Diffstat (limited to 'llvm/test/CodeGen')
| -rw-r--r-- | llvm/test/CodeGen/AArch64/arm64-atomic-128.ll | 7 | ||||
| -rw-r--r-- | llvm/test/CodeGen/ARM/atomic-64bit.ll | 6 |
2 files changed, 11 insertions, 2 deletions
diff --git a/llvm/test/CodeGen/AArch64/arm64-atomic-128.ll b/llvm/test/CodeGen/AArch64/arm64-atomic-128.ll index a76cf74a6d0..44c24c51f0d 100644 --- a/llvm/test/CodeGen/AArch64/arm64-atomic-128.ll +++ b/llvm/test/CodeGen/AArch64/arm64-atomic-128.ll @@ -173,10 +173,13 @@ define i128 @atomic_load_seq_cst(i128* %p) { ret i128 %r } -define i128 @atomic_load_relaxed(i128* %p) { +define i128 @atomic_load_relaxed(i64, i64, i128* %p) { ; CHECK-LABEL: atomic_load_relaxed: ; CHECK-NOT: dmb -; CHECK: ldxp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x0] +; CHECK: [[LABEL:.?LBB[0-9]+_[0-9]+]]: +; CHECK: ldxp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x2] +; CHECK-NEXT: stxp [[SUCCESS:w[0-9]+]], [[LO]], [[HI]], [x2] +; CHECK: cbnz [[SUCCESS]], [[LABEL]] ; CHECK-NOT: dmb %r = load atomic i128, i128* %p monotonic, align 16 ret i128 %r diff --git a/llvm/test/CodeGen/ARM/atomic-64bit.ll b/llvm/test/CodeGen/ARM/atomic-64bit.ll index 7510d6ccdc3..573cd45c082 100644 --- a/llvm/test/CodeGen/ARM/atomic-64bit.ll +++ b/llvm/test/CodeGen/ARM/atomic-64bit.ll @@ -208,10 +208,16 @@ define i64 @test7(i64* %ptr, i64 %val1, i64 %val2) { define i64 @test8(i64* %ptr) { ; CHECK-LABEL: test8: ; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]] +; CHECK-NOT: strexd +; CHECK: clrex +; CHECK-NOT: strexd ; CHECK: dmb {{ish$}} ; CHECK-THUMB-LABEL: test8: ; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]] +; CHECK-THUMB-NOT: strexd +; CHECK-THUMB: clrex +; CHECK-THUMB-NOT: strexd ; CHECK-THUMB: dmb {{ish$}} %r = load atomic i64, i64* %ptr seq_cst, align 8 |

