64-bit atomic cmpxchg for ARM.
[oota-llvm.git] / test / CodeGen / ARM / atomic-64bit.ll
1 ; RUN: llc < %s -mtriple=armv7-apple-ios | FileCheck %s
2
3 define i64 @test1(i64* %ptr, i64 %val) {
4 ; CHECK: test1
5 ; CHECK: dmb ish
6 ; CHECK: ldrexd r2, r3
7 ; CHECK: adds r0, r2
8 ; CHECK: adc r1, r3
9 ; CHECK: strexd {{r[0-9]+}}, r0, r1
10 ; CHECK: cmp
11 ; CHECK: bne
12 ; CHECK: dmb ish
13   %r = atomicrmw add i64* %ptr, i64 %val seq_cst
14   ret i64 %r
15 }
16
17 define i64 @test2(i64* %ptr, i64 %val) {
18 ; CHECK: test2
19 ; CHECK: dmb ish
20 ; CHECK: ldrexd r2, r3
21 ; CHECK: subs r0, r2
22 ; CHECK: sbc r1, r3
23 ; CHECK: strexd {{r[0-9]+}}, r0, r1
24 ; CHECK: cmp
25 ; CHECK: bne
26 ; CHECK: dmb ish
27   %r = atomicrmw sub i64* %ptr, i64 %val seq_cst
28   ret i64 %r
29 }
30
31 define i64 @test3(i64* %ptr, i64 %val) {
32 ; CHECK: test3
33 ; CHECK: dmb ish
34 ; CHECK: ldrexd r2, r3
35 ; CHECK: and r0, r2
36 ; CHECK: and r1, r3
37 ; CHECK: strexd {{r[0-9]+}}, r0, r1
38 ; CHECK: cmp
39 ; CHECK: bne
40 ; CHECK: dmb ish
41   %r = atomicrmw and i64* %ptr, i64 %val seq_cst
42   ret i64 %r
43 }
44
45 define i64 @test4(i64* %ptr, i64 %val) {
46 ; CHECK: test4
47 ; CHECK: dmb ish
48 ; CHECK: ldrexd r2, r3
49 ; CHECK: orr r0, r2
50 ; CHECK: orr r1, r3
51 ; CHECK: strexd {{r[0-9]+}}, r0, r1
52 ; CHECK: cmp
53 ; CHECK: bne
54 ; CHECK: dmb ish
55   %r = atomicrmw or i64* %ptr, i64 %val seq_cst
56   ret i64 %r
57 }
58
59 define i64 @test5(i64* %ptr, i64 %val) {
60 ; CHECK: test5
61 ; CHECK: dmb ish
62 ; CHECK: ldrexd r2, r3
63 ; CHECK: eor r0, r2
64 ; CHECK: eor r1, r3
65 ; CHECK: strexd {{r[0-9]+}}, r0, r1
66 ; CHECK: cmp
67 ; CHECK: bne
68 ; CHECK: dmb ish
69   %r = atomicrmw xor i64* %ptr, i64 %val seq_cst
70   ret i64 %r
71 }
72
73 define i64 @test6(i64* %ptr, i64 %val) {
74 ; CHECK: test6
75 ; CHECK: dmb ish
76 ; CHECK: ldrexd r2, r3
77 ; CHECK: strexd {{r[0-9]+}}, r0, r1
78 ; CHECK: cmp
79 ; CHECK: bne
80 ; CHECK: dmb ish
81   %r = atomicrmw xchg i64* %ptr, i64 %val seq_cst
82   ret i64 %r
83 }
84
85 define i64 @test7(i64* %ptr, i64 %val1, i64 %val2) {
86 ; CHECK: test7
87 ; CHECK: dmb ish
88 ; CHECK: ldrexd r2, r3
89 ; CHECK: cmp r2
90 ; CHECK: cmpeq r3
91 ; CHECK: bne
92 ; CHECK: strexd {{r[0-9]+}}, r0, r1
93 ; CHECK: cmp
94 ; CHECK: bne
95 ; CHECK: dmb ish
96   %r = cmpxchg i64* %ptr, i64 %val1, i64 %val2 seq_cst
97   ret i64 %r
98 }