c4a9411f46a74fef0db21634ea2169bcfb9de1a9
[oota-llvm.git] / test / CodeGen / SPARC / atomics.ll
1 ; RUN: llc < %s -march=sparcv9 | FileCheck %s
2
3 ; CHECK-LABEL: test_atomic_i32
4 ; CHECK:       ld [%o0]
5 ; CHECK:       membar
6 ; CHECK:       ld [%o1]
7 ; CHECK:       membar
8 ; CHECK:       membar
9 ; CHECK:       st {{.+}}, [%o2]
10 define i32 @test_atomic_i32(i32* %ptr1, i32* %ptr2, i32* %ptr3) {
11 entry:
12   %0 = load atomic i32* %ptr1 acquire, align 8
13   %1 = load atomic i32* %ptr2 acquire, align 8
14   %2 = add i32 %0, %1
15   store atomic i32 %2, i32* %ptr3 release, align 8
16   ret i32 %2
17 }
18
19 ; CHECK-LABEL: test_atomic_i64
20 ; CHECK:       ldx [%o0]
21 ; CHECK:       membar
22 ; CHECK:       ldx [%o1]
23 ; CHECK:       membar
24 ; CHECK:       membar
25 ; CHECK:       stx {{.+}}, [%o2]
26 define i64 @test_atomic_i64(i64* %ptr1, i64* %ptr2, i64* %ptr3) {
27 entry:
28   %0 = load atomic i64* %ptr1 acquire, align 8
29   %1 = load atomic i64* %ptr2 acquire, align 8
30   %2 = add i64 %0, %1
31   store atomic i64 %2, i64* %ptr3 release, align 8
32   ret i64 %2
33 }
34
35 ; CHECK-LABEL: test_cmpxchg_i32
36 ; CHECK:       or  %g0, 123, [[R:%[gilo][0-7]]]
37 ; CHECK:       cas [%o1], %o0, [[R]]
38
39 define i32 @test_cmpxchg_i32(i32 %a, i32* %ptr) {
40 entry:
41   %b = cmpxchg i32* %ptr, i32 %a, i32 123 monotonic
42   ret i32 %b
43 }
44
45 ; CHECK-LABEL: test_cmpxchg_i64
46 ; CHECK:       or  %g0, 123, [[R:%[gilo][0-7]]]
47 ; CHECK:       casx [%o1], %o0, [[R]]
48
49 define i64 @test_cmpxchg_i64(i64 %a, i64* %ptr) {
50 entry:
51   %b = cmpxchg i64* %ptr, i64 %a, i64 123 monotonic
52   ret i64 %b
53 }
54
55 ; CHECK-LABEL: test_swap_i32
56 ; CHECK:       or  %g0, 42, [[R:%[gilo][0-7]]]
57 ; CHECK:       swap [%o1], [[R]]
58
59 define i32 @test_swap_i32(i32 %a, i32* %ptr) {
60 entry:
61   %b = atomicrmw xchg i32* %ptr, i32 42 monotonic
62   ret i32 %b
63 }