diff options
| author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2014-01-24 06:23:31 +0000 |
|---|---|---|
| committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2014-01-24 06:23:31 +0000 |
| commit | 05ae2d671549d080ec81627299ccd61809355c29 (patch) | |
| tree | 09793b2c67f6a57cb7d4e16d70cfc3a914e52b90 /llvm/test/CodeGen/SPARC | |
| parent | 98aa7fab7edf836434c77d79d048fba66f5748b0 (diff) | |
| download | bcm5719-llvm-05ae2d671549d080ec81627299ccd61809355c29.tar.gz bcm5719-llvm-05ae2d671549d080ec81627299ccd61809355c29.zip | |
Implement atomicrmw operations in 32 and 64 bits for SPARCv9.
These all use the compare-and-swap CASA/CASXA instructions.
llvm-svn: 199975
Diffstat (limited to 'llvm/test/CodeGen/SPARC')
| -rw-r--r-- | llvm/test/CodeGen/SPARC/atomics.ll | 83 |
1 files changed, 82 insertions, 1 deletions
diff --git a/llvm/test/CodeGen/SPARC/atomics.ll b/llvm/test/CodeGen/SPARC/atomics.ll index c4a9411f46a..3d0be28accd 100644 --- a/llvm/test/CodeGen/SPARC/atomics.ll +++ b/llvm/test/CodeGen/SPARC/atomics.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -march=sparcv9 | FileCheck %s +; RUN: llc < %s -march=sparcv9 -verify-machineinstrs | FileCheck %s ; CHECK-LABEL: test_atomic_i32 ; CHECK: ld [%o0] @@ -61,3 +61,84 @@ entry: %b = atomicrmw xchg i32* %ptr, i32 42 monotonic ret i32 %b } + +; CHECK-LABEL: test_load_add_32 +; CHECK: membar +; CHECK: add +; CHECK: cas [%o0] +; CHECK: membar +define zeroext i32 @test_load_add_32(i32* %p, i32 zeroext %v) { +entry: + %0 = atomicrmw add i32* %p, i32 %v seq_cst + ret i32 %0 +} + +; CHECK-LABEL: test_load_sub_64 +; CHECK: membar +; CHECK: sub +; CHECK: casx [%o0] +; CHECK: membar +define zeroext i64 @test_load_sub_64(i64* %p, i64 zeroext %v) { +entry: + %0 = atomicrmw sub i64* %p, i64 %v seq_cst + ret i64 %0 +} + +; CHECK-LABEL: test_load_xor_32 +; CHECK: membar +; CHECK: xor +; CHECK: cas [%o0] +; CHECK: membar +define zeroext i32 @test_load_xor_32(i32* %p, i32 zeroext %v) { +entry: + %0 = atomicrmw xor i32* %p, i32 %v seq_cst + ret i32 %0 +} + +; CHECK-LABEL: test_load_and_32 +; CHECK: membar +; CHECK: and +; CHECK-NOT: xor +; CHECK: cas [%o0] +; CHECK: membar +define zeroext i32 @test_load_and_32(i32* %p, i32 zeroext %v) { +entry: + %0 = atomicrmw and i32* %p, i32 %v seq_cst + ret i32 %0 +} + +; CHECK-LABEL: test_load_nand_32 +; CHECK: membar +; CHECK: and +; CHECK: xor +; CHECK: cas [%o0] +; CHECK: membar +define zeroext i32 @test_load_nand_32(i32* %p, i32 zeroext %v) { +entry: + %0 = atomicrmw nand i32* %p, i32 %v seq_cst + ret i32 %0 +} + +; CHECK-LABEL: test_load_max_64 +; CHECK: membar +; CHECK: cmp +; CHECK: movg %xcc +; CHECK: casx [%o0] +; CHECK: membar +define zeroext i64 @test_load_max_64(i64* %p, i64 zeroext %v) { +entry: + %0 = atomicrmw max i64* %p, i64 %v seq_cst + ret i64 %0 +} + +; CHECK-LABEL: test_load_umin_32 +; CHECK: membar +; CHECK: cmp +; CHECK: movleu %icc +; CHECK: cas [%o0] +; CHECK: membar +define zeroext i32 @test_load_umin_32(i32* %p, i32 zeroext %v) { +entry: + %0 = atomicrmw umin i32* %p, i32 %v seq_cst + ret i32 %0 +} |

