xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/atomic-64bit.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=armv7-apple-ios | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-LE
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbv7-none-linux-gnueabihf | FileCheck %s --check-prefix=CHECK-THUMB --check-prefix=CHECK-THUMB-LE
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=armebv7 -target-abi apcs | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-BE
4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbebv7-none-linux-gnueabihf | FileCheck %s --check-prefix=CHECK-THUMB --check-prefix=CHECK-THUMB-BE
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Workerdefine i64 @test1(i64* %ptr, i64 %val) {
7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1:
8*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}}
9*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
10*9880d681SAndroid Build Coastguard Worker; CHECK-LE: adds [[REG3:(r[0-9]?[02468])]], [[REG1]]
11*9880d681SAndroid Build Coastguard Worker; CHECK-LE: adc [[REG4:(r[0-9]?[13579])]], [[REG2]]
12*9880d681SAndroid Build Coastguard Worker; CHECK-BE: adds [[REG4:(r[0-9]?[13579])]], [[REG2]]
13*9880d681SAndroid Build Coastguard Worker; CHECK-BE: adc [[REG3:(r[0-9]?[02468])]], [[REG1]]
14*9880d681SAndroid Build Coastguard Worker; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
15*9880d681SAndroid Build Coastguard Worker; CHECK: cmp
16*9880d681SAndroid Build Coastguard Worker; CHECK: bne
17*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}}
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LABEL: test1:
20*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}}
21*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
22*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE: adds.w [[REG3:[a-z0-9]+]], [[REG1]]
23*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE: adc.w [[REG4:[a-z0-9]+]], [[REG2]]
24*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE: adds.w [[REG4:[a-z0-9]+]], [[REG2]]
25*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE: adc.w [[REG3:[a-z0-9]+]], [[REG1]]
26*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
27*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp
28*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: bne
29*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}}
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker  %r = atomicrmw add i64* %ptr, i64 %val seq_cst
32*9880d681SAndroid Build Coastguard Worker  ret i64 %r
33*9880d681SAndroid Build Coastguard Worker}
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Workerdefine i64 @test2(i64* %ptr, i64 %val) {
36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2:
37*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}}
38*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
39*9880d681SAndroid Build Coastguard Worker; CHECK-LE: subs [[REG3:(r[0-9]?[02468])]], [[REG1]]
40*9880d681SAndroid Build Coastguard Worker; CHECK-LE: sbc [[REG4:(r[0-9]?[13579])]], [[REG2]]
41*9880d681SAndroid Build Coastguard Worker; CHECK-BE: subs [[REG4:(r[0-9]?[13579])]], [[REG2]]
42*9880d681SAndroid Build Coastguard Worker; CHECK-BE: sbc [[REG3:(r[0-9]?[02468])]], [[REG1]]
43*9880d681SAndroid Build Coastguard Worker; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
44*9880d681SAndroid Build Coastguard Worker; CHECK: cmp
45*9880d681SAndroid Build Coastguard Worker; CHECK: bne
46*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}}
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LABEL: test2:
49*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}}
50*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
51*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE: subs.w [[REG3:[a-z0-9]+]], [[REG1]]
52*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE: sbc.w [[REG4:[a-z0-9]+]], [[REG2]]
53*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE: subs.w [[REG4:[a-z0-9]+]], [[REG2]]
54*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE: sbc.w [[REG3:[a-z0-9]+]], [[REG1]]
55*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
56*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp
57*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: bne
58*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}}
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Worker  %r = atomicrmw sub i64* %ptr, i64 %val seq_cst
61*9880d681SAndroid Build Coastguard Worker  ret i64 %r
62*9880d681SAndroid Build Coastguard Worker}
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Workerdefine i64 @test3(i64* %ptr, i64 %val) {
65*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3:
66*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}}
67*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
68*9880d681SAndroid Build Coastguard Worker; CHECK-LE-DAG: and [[REG3:(r[0-9]?[02468])]], [[REG1]]
69*9880d681SAndroid Build Coastguard Worker; CHECK-LE-DAG: and [[REG4:(r[0-9]?[13579])]], [[REG2]]
70*9880d681SAndroid Build Coastguard Worker; CHECK-BE-DAG: and [[REG4:(r[0-9]?[13579])]], [[REG2]]
71*9880d681SAndroid Build Coastguard Worker; CHECK-BE-DAG: and [[REG3:(r[0-9]?[02468])]], [[REG1]]
72*9880d681SAndroid Build Coastguard Worker; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
73*9880d681SAndroid Build Coastguard Worker; CHECK: cmp
74*9880d681SAndroid Build Coastguard Worker; CHECK: bne
75*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}}
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LABEL: test3:
78*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}}
79*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
80*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE-DAG: and.w [[REG3:[a-z0-9]+]], [[REG1]]
81*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE-DAG: and.w [[REG4:[a-z0-9]+]], [[REG2]]
82*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE-DAG: and.w [[REG4:[a-z0-9]+]], [[REG2]]
83*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE-DAG: and.w [[REG3:[a-z0-9]+]], [[REG1]]
84*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
85*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp
86*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: bne
87*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}}
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Worker  %r = atomicrmw and i64* %ptr, i64 %val seq_cst
90*9880d681SAndroid Build Coastguard Worker  ret i64 %r
91*9880d681SAndroid Build Coastguard Worker}
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Workerdefine i64 @test4(i64* %ptr, i64 %val) {
94*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test4:
95*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}}
96*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
97*9880d681SAndroid Build Coastguard Worker; CHECK-LE-DAG: orr [[REG3:(r[0-9]?[02468])]], [[REG1]]
98*9880d681SAndroid Build Coastguard Worker; CHECK-LE-DAG: orr [[REG4:(r[0-9]?[13579])]], [[REG2]]
99*9880d681SAndroid Build Coastguard Worker; CHECK-BE-DAG: orr [[REG4:(r[0-9]?[13579])]], [[REG2]]
100*9880d681SAndroid Build Coastguard Worker; CHECK-BE-DAG: orr [[REG3:(r[0-9]?[02468])]], [[REG1]]
101*9880d681SAndroid Build Coastguard Worker; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
102*9880d681SAndroid Build Coastguard Worker; CHECK: cmp
103*9880d681SAndroid Build Coastguard Worker; CHECK: bne
104*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}}
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LABEL: test4:
107*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}}
108*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
109*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE-DAG: orr.w [[REG3:[a-z0-9]+]], [[REG1]]
110*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE-DAG: orr.w [[REG4:[a-z0-9]+]], [[REG2]]
111*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE-DAG: orr.w [[REG4:[a-z0-9]+]], [[REG2]]
112*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE-DAG: orr.w [[REG3:[a-z0-9]+]], [[REG1]]
113*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
114*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp
115*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: bne
116*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}}
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Worker  %r = atomicrmw or i64* %ptr, i64 %val seq_cst
119*9880d681SAndroid Build Coastguard Worker  ret i64 %r
120*9880d681SAndroid Build Coastguard Worker}
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Workerdefine i64 @test5(i64* %ptr, i64 %val) {
123*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test5:
124*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}}
125*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
126*9880d681SAndroid Build Coastguard Worker; CHECK-LE-DAG: eor [[REG3:(r[0-9]?[02468])]], [[REG1]]
127*9880d681SAndroid Build Coastguard Worker; CHECK-LE-DAG: eor [[REG4:(r[0-9]?[13579])]], [[REG2]]
128*9880d681SAndroid Build Coastguard Worker; CHECK-BE-DAG: eor [[REG4:(r[0-9]?[13579])]], [[REG2]]
129*9880d681SAndroid Build Coastguard Worker; CHECK-BE-DAG: eor [[REG3:(r[0-9]?[02468])]], [[REG1]]
130*9880d681SAndroid Build Coastguard Worker; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
131*9880d681SAndroid Build Coastguard Worker; CHECK: cmp
132*9880d681SAndroid Build Coastguard Worker; CHECK: bne
133*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}}
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LABEL: test5:
136*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}}
137*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
138*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE-DAG: eor.w [[REG3:[a-z0-9]+]], [[REG1]]
139*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE-DAG: eor.w [[REG4:[a-z0-9]+]], [[REG2]]
140*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE-DAG: eor.w [[REG4:[a-z0-9]+]], [[REG2]]
141*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE-DAG: eor.w [[REG3:[a-z0-9]+]], [[REG1]]
142*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
143*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp
144*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: bne
145*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}}
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker  %r = atomicrmw xor i64* %ptr, i64 %val seq_cst
148*9880d681SAndroid Build Coastguard Worker  ret i64 %r
149*9880d681SAndroid Build Coastguard Worker}
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Workerdefine i64 @test6(i64* %ptr, i64 %val) {
152*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test6:
153*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}}
154*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
155*9880d681SAndroid Build Coastguard Worker; CHECK: strexd {{[a-z0-9]+}}, {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}
156*9880d681SAndroid Build Coastguard Worker; CHECK: cmp
157*9880d681SAndroid Build Coastguard Worker; CHECK: bne
158*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}}
159*9880d681SAndroid Build Coastguard Worker
160*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LABEL: test6:
161*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}}
162*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
163*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: strexd {{[a-z0-9]+}}, {{[a-z0-9]+}}, {{[a-z0-9]+}}
164*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp
165*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: bne
166*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}}
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Worker  %r = atomicrmw xchg i64* %ptr, i64 %val seq_cst
169*9880d681SAndroid Build Coastguard Worker  ret i64 %r
170*9880d681SAndroid Build Coastguard Worker}
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Workerdefine i64 @test7(i64* %ptr, i64 %val1, i64 %val2) {
173*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test7:
174*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: mov [[VAL1LO:r[0-9]+]], r1
175*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
176*9880d681SAndroid Build Coastguard Worker; CHECK-LE-DAG: eor     [[MISMATCH_LO:.*]], [[REG1]], [[VAL1LO]]
177*9880d681SAndroid Build Coastguard Worker; CHECK-LE-DAG: eor     [[MISMATCH_HI:.*]], [[REG2]], r2
178*9880d681SAndroid Build Coastguard Worker; CHECK-BE-DAG: eor     [[MISMATCH_LO:.*]], [[REG2]], r2
179*9880d681SAndroid Build Coastguard Worker; CHECK-BE-DAG: eor     [[MISMATCH_HI:.*]], [[REG1]], r1
180*9880d681SAndroid Build Coastguard Worker; CHECK: orrs    {{r[0-9]+}}, [[MISMATCH_LO]], [[MISMATCH_HI]]
181*9880d681SAndroid Build Coastguard Worker; CHECK: bne
182*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: dmb {{ish$}}
183*9880d681SAndroid Build Coastguard Worker; CHECK: strexd {{[a-z0-9]+}}, {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}
184*9880d681SAndroid Build Coastguard Worker; CHECK: cmp
185*9880d681SAndroid Build Coastguard Worker; CHECK: beq
186*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}}
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LABEL: test7:
189*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
190*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE-DAG: eor.w     [[MISMATCH_LO:[a-z0-9]+]], [[REG1]], r2
191*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE-DAG: eor.w     [[MISMATCH_HI:[a-z0-9]+]], [[REG2]], r3
192*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE-DAG: eor.w     [[MISMATCH_HI:[a-z0-9]+]], [[REG1]], r2
193*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE-DAG: eor.w     [[MISMATCH_LO:[a-z0-9]+]], [[REG2]], r3
194*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE: orrs.w    {{.*}}, [[MISMATCH_LO]], [[MISMATCH_HI]]
195*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: bne
196*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}}
197*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: strexd {{[a-z0-9]+}}, {{[a-z0-9]+}}, {{[a-z0-9]+}}
198*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp
199*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: beq
200*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}}
201*9880d681SAndroid Build Coastguard Worker
202*9880d681SAndroid Build Coastguard Worker  %pair = cmpxchg i64* %ptr, i64 %val1, i64 %val2 seq_cst seq_cst
203*9880d681SAndroid Build Coastguard Worker  %r = extractvalue { i64, i1 } %pair, 0
204*9880d681SAndroid Build Coastguard Worker  ret i64 %r
205*9880d681SAndroid Build Coastguard Worker}
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Worker; Compiles down to a single ldrexd
208*9880d681SAndroid Build Coastguard Workerdefine i64 @test8(i64* %ptr) {
209*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test8:
210*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
211*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: strexd
212*9880d681SAndroid Build Coastguard Worker; CHECK: clrex
213*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: strexd
214*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}}
215*9880d681SAndroid Build Coastguard Worker
216*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LABEL: test8:
217*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
218*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-NOT: strexd
219*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: clrex
220*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-NOT: strexd
221*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}}
222*9880d681SAndroid Build Coastguard Worker
223*9880d681SAndroid Build Coastguard Worker  %r = load atomic i64, i64* %ptr seq_cst, align 8
224*9880d681SAndroid Build Coastguard Worker  ret i64 %r
225*9880d681SAndroid Build Coastguard Worker}
226*9880d681SAndroid Build Coastguard Worker
227*9880d681SAndroid Build Coastguard Worker; Compiles down to atomicrmw xchg; there really isn't any more efficient
228*9880d681SAndroid Build Coastguard Worker; way to write it.
229*9880d681SAndroid Build Coastguard Workerdefine void @test9(i64* %ptr, i64 %val) {
230*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test9:
231*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}}
232*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
233*9880d681SAndroid Build Coastguard Worker; CHECK: strexd {{[a-z0-9]+}}, {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}
234*9880d681SAndroid Build Coastguard Worker; CHECK: cmp
235*9880d681SAndroid Build Coastguard Worker; CHECK: bne
236*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}}
237*9880d681SAndroid Build Coastguard Worker
238*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LABEL: test9:
239*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}}
240*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
241*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: strexd {{[a-z0-9]+}}, {{[a-z0-9]+}}, {{[a-z0-9]+}}
242*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp
243*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: bne
244*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}}
245*9880d681SAndroid Build Coastguard Worker
246*9880d681SAndroid Build Coastguard Worker  store atomic i64 %val, i64* %ptr seq_cst, align 8
247*9880d681SAndroid Build Coastguard Worker  ret void
248*9880d681SAndroid Build Coastguard Worker}
249*9880d681SAndroid Build Coastguard Worker
250*9880d681SAndroid Build Coastguard Workerdefine i64 @test10(i64* %ptr, i64 %val) {
251*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test10:
252*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}}
253*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
254*9880d681SAndroid Build Coastguard Worker; CHECK: mov     [[OUT_HI:[a-z0-9]+]], r2
255*9880d681SAndroid Build Coastguard Worker; CHECK-LE: subs {{[^,]+}}, r1, [[REG1]]
256*9880d681SAndroid Build Coastguard Worker; CHECK-BE: subs {{[^,]+}}, r2, [[REG2]]
257*9880d681SAndroid Build Coastguard Worker; CHECK-LE: sbcs {{[^,]+}}, r2, [[REG2]]
258*9880d681SAndroid Build Coastguard Worker; CHECK-BE: sbcs {{[^,]+}}, r1, [[REG1]]
259*9880d681SAndroid Build Coastguard Worker; CHECK: mov     [[CMP:[a-z0-9]+]], #0
260*9880d681SAndroid Build Coastguard Worker; CHECK: movwge  [[CMP]], #1
261*9880d681SAndroid Build Coastguard Worker; CHECK: cmp     [[CMP]], #0
262*9880d681SAndroid Build Coastguard Worker; CHECK: movne   [[OUT_HI]], [[REG2]]
263*9880d681SAndroid Build Coastguard Worker; CHECK: mov     [[OUT_LO:[a-z0-9]+]], r1
264*9880d681SAndroid Build Coastguard Worker; CHECK: movne   [[OUT_LO]], [[REG1]]
265*9880d681SAndroid Build Coastguard Worker; CHECK: strexd {{[a-z0-9]+}}, [[OUT_LO]], [[OUT_HI]]
266*9880d681SAndroid Build Coastguard Worker; CHECK: cmp
267*9880d681SAndroid Build Coastguard Worker; CHECK: bne
268*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}}
269*9880d681SAndroid Build Coastguard Worker
270*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LABEL: test10:
271*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}}
272*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
273*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: mov      [[OUT_LO:[a-z0-9]+]], r2
274*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE: subs.w {{[^,]+}}, r2, [[REG1]]
275*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE: subs.w {{[^,]+}}, r3, [[REG2]]
276*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE: sbcs.w {{[^,]+}}, r3, [[REG2]]
277*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE: sbcs.w {{[^,]+}}, r2, [[REG1]]
278*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: mov.w     [[CMP:[a-z0-9]+]], #0
279*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movge.w   [[CMP]], #1
280*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp.w     [[CMP]], #0
281*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: mov       [[OUT_HI:[a-z0-9]+]], r3
282*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movne   [[OUT_HI]], [[REG2]]
283*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movne   [[OUT_LO]], [[REG1]]
284*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[OUT_LO]], [[OUT_HI]]
285*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp
286*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: bne
287*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}}
288*9880d681SAndroid Build Coastguard Worker
289*9880d681SAndroid Build Coastguard Worker  %r = atomicrmw min i64* %ptr, i64 %val seq_cst
290*9880d681SAndroid Build Coastguard Worker  ret i64 %r
291*9880d681SAndroid Build Coastguard Worker}
292*9880d681SAndroid Build Coastguard Worker
293*9880d681SAndroid Build Coastguard Workerdefine i64 @test11(i64* %ptr, i64 %val) {
294*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test11:
295*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}}
296*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
297*9880d681SAndroid Build Coastguard Worker; CHECK: mov     [[OUT_HI:[a-z0-9]+]], r2
298*9880d681SAndroid Build Coastguard Worker; CHECK-LE: subs    {{[^,]+}}, r1, [[REG1]]
299*9880d681SAndroid Build Coastguard Worker; CHECK-BE: subs    {{[^,]+}}, r2, [[REG2]]
300*9880d681SAndroid Build Coastguard Worker; CHECK-LE: sbcs    {{[^,]+}}, r2, [[REG2]]
301*9880d681SAndroid Build Coastguard Worker; CHECK-BE: sbcs    {{[^,]+}}, r1, [[REG1]]
302*9880d681SAndroid Build Coastguard Worker; CHECK: mov     [[CMP:[a-z0-9]+]], #0
303*9880d681SAndroid Build Coastguard Worker; CHECK: movwhs  [[CMP]], #1
304*9880d681SAndroid Build Coastguard Worker; CHECK: cmp     [[CMP]], #0
305*9880d681SAndroid Build Coastguard Worker; CHECK: movne   [[OUT_HI]], [[REG2]]
306*9880d681SAndroid Build Coastguard Worker; CHECK: mov     [[OUT_LO:[a-z0-9]+]], r1
307*9880d681SAndroid Build Coastguard Worker; CHECK: movne   [[OUT_LO]], [[REG1]]
308*9880d681SAndroid Build Coastguard Worker; CHECK: strexd {{[a-z0-9]+}}, [[OUT_LO]], [[OUT_HI]]
309*9880d681SAndroid Build Coastguard Worker; CHECK: cmp
310*9880d681SAndroid Build Coastguard Worker; CHECK: bne
311*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}}
312*9880d681SAndroid Build Coastguard Worker
313*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LABEL: test11:
314*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}}
315*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
316*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: mov      [[OUT_LO:[a-z0-9]+]], r2
317*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE: subs.w {{[^,]+}}, r2, [[REG1]]
318*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE: subs.w {{[^,]+}}, r3, [[REG2]]
319*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE: sbcs.w {{[^,]+}}, r3, [[REG2]]
320*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE: sbcs.w {{[^,]+}}, r2, [[REG1]]
321*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: mov.w     [[CMP:[a-z0-9]+]], #0
322*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movhs.w   [[CMP]], #1
323*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp.w     [[CMP]], #0
324*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: mov       [[OUT_HI:[a-z0-9]+]], r3
325*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movne   [[OUT_HI]], [[REG2]]
326*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movne   [[OUT_LO]], [[REG1]]
327*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[OUT_LO]], [[OUT_HI]]
328*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp
329*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: bne
330*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}}
331*9880d681SAndroid Build Coastguard Worker
332*9880d681SAndroid Build Coastguard Worker  %r = atomicrmw umin i64* %ptr, i64 %val seq_cst
333*9880d681SAndroid Build Coastguard Worker  ret i64 %r
334*9880d681SAndroid Build Coastguard Worker}
335*9880d681SAndroid Build Coastguard Worker
336*9880d681SAndroid Build Coastguard Workerdefine i64 @test12(i64* %ptr, i64 %val) {
337*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test12:
338*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}}
339*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
340*9880d681SAndroid Build Coastguard Worker; CHECK: mov     [[OUT_HI:[a-z0-9]+]], r2
341*9880d681SAndroid Build Coastguard Worker; CHECK-LE: subs    {{[^,]+}}, r1, [[REG1]]
342*9880d681SAndroid Build Coastguard Worker; CHECK-BE: subs    {{[^,]+}}, r2, [[REG2]]
343*9880d681SAndroid Build Coastguard Worker; CHECK-LE: sbcs    {{[^,]+}}, r2, [[REG2]]
344*9880d681SAndroid Build Coastguard Worker; CHECK-BE: sbcs    {{[^,]+}}, r1, [[REG1]]
345*9880d681SAndroid Build Coastguard Worker; CHECK: mov     [[CMP:[a-z0-9]+]], #0
346*9880d681SAndroid Build Coastguard Worker; CHECK: movwlt  [[CMP]], #1
347*9880d681SAndroid Build Coastguard Worker; CHECK: cmp     [[CMP]], #0
348*9880d681SAndroid Build Coastguard Worker; CHECK: movne   [[OUT_HI]], [[REG2]]
349*9880d681SAndroid Build Coastguard Worker; CHECK: mov     [[OUT_LO:[a-z0-9]+]], r1
350*9880d681SAndroid Build Coastguard Worker; CHECK: movne   [[OUT_LO]], [[REG1]]
351*9880d681SAndroid Build Coastguard Worker; CHECK: strexd {{[a-z0-9]+}}, [[OUT_LO]], [[OUT_HI]]
352*9880d681SAndroid Build Coastguard Worker; CHECK: cmp
353*9880d681SAndroid Build Coastguard Worker; CHECK: bne
354*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}}
355*9880d681SAndroid Build Coastguard Worker
356*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LABEL: test12:
357*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}}
358*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
359*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: mov      [[OUT_LO:[a-z0-9]+]], r2
360*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE: subs.w {{[^,]+}}, r2, [[REG1]]
361*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE: subs.w {{[^,]+}}, r3, [[REG2]]
362*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE: sbcs.w {{[^,]+}}, r3, [[REG2]]
363*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE: sbcs.w {{[^,]+}}, r2, [[REG1]]
364*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: mov.w     [[CMP:[a-z0-9]+]], #0
365*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movlt.w   [[CMP]], #1
366*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp.w     [[CMP]], #0
367*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: mov       [[OUT_HI:[a-z0-9]+]], r3
368*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movne   [[OUT_HI]], [[REG2]]
369*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movne   [[OUT_LO]], [[REG1]]
370*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[OUT_LO]], [[OUT_HI]]
371*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp
372*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: bne
373*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}}
374*9880d681SAndroid Build Coastguard Worker
375*9880d681SAndroid Build Coastguard Worker  %r = atomicrmw max i64* %ptr, i64 %val seq_cst
376*9880d681SAndroid Build Coastguard Worker  ret i64 %r
377*9880d681SAndroid Build Coastguard Worker}
378*9880d681SAndroid Build Coastguard Worker
379*9880d681SAndroid Build Coastguard Workerdefine i64 @test13(i64* %ptr, i64 %val) {
380*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test13:
381*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}}
382*9880d681SAndroid Build Coastguard Worker; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
383*9880d681SAndroid Build Coastguard Worker; CHECK: mov     [[OUT_HI:[a-z0-9]+]], r2
384*9880d681SAndroid Build Coastguard Worker; CHECK-LE: subs    {{[^,]+}}, r1, [[REG1]]
385*9880d681SAndroid Build Coastguard Worker; CHECK-BE: subs    {{[^,]+}}, r2, [[REG2]]
386*9880d681SAndroid Build Coastguard Worker; CHECK-LE: sbcs    {{[^,]+}}, r2, [[REG2]]
387*9880d681SAndroid Build Coastguard Worker; CHECK-BE: sbcs    {{[^,]+}}, r1, [[REG1]]
388*9880d681SAndroid Build Coastguard Worker; CHECK: mov     [[CMP:[a-z0-9]+]], #0
389*9880d681SAndroid Build Coastguard Worker; CHECK: movwlo  [[CMP]], #1
390*9880d681SAndroid Build Coastguard Worker; CHECK: cmp     [[CMP]], #0
391*9880d681SAndroid Build Coastguard Worker; CHECK: movne   [[OUT_HI]], [[REG2]]
392*9880d681SAndroid Build Coastguard Worker; CHECK: mov     [[OUT_LO:[a-z0-9]+]], r1
393*9880d681SAndroid Build Coastguard Worker; CHECK: movne   [[OUT_LO]], [[REG1]]
394*9880d681SAndroid Build Coastguard Worker; CHECK: strexd {{[a-z0-9]+}}, [[OUT_LO]], [[OUT_HI]]
395*9880d681SAndroid Build Coastguard Worker; CHECK: cmp
396*9880d681SAndroid Build Coastguard Worker; CHECK: bne
397*9880d681SAndroid Build Coastguard Worker; CHECK: dmb {{ish$}}
398*9880d681SAndroid Build Coastguard Worker
399*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LABEL: test13:
400*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}}
401*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
402*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: mov      [[OUT_LO:[a-z0-9]+]], r2
403*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE: subs.w {{[^,]+}}, r2, [[REG1]]
404*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE: subs.w {{[^,]+}}, r3, [[REG2]]
405*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-LE: sbcs.w {{[^,]+}}, r3, [[REG2]]
406*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB-BE: sbcs.w {{[^,]+}}, r2, [[REG1]]
407*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: mov.w     [[CMP:[a-z0-9]+]], #0
408*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movlo.w   [[CMP]], #1
409*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp.w     [[CMP]], #0
410*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: mov       [[OUT_HI:[a-z0-9]+]], r3
411*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movne   [[OUT_HI]], [[REG2]]
412*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: movne   [[OUT_LO]], [[REG1]]
413*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[OUT_LO]], [[OUT_HI]]
414*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: cmp
415*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: bne
416*9880d681SAndroid Build Coastguard Worker; CHECK-THUMB: dmb {{ish$}}
417*9880d681SAndroid Build Coastguard Worker  %r = atomicrmw umax i64* %ptr, i64 %val seq_cst
418*9880d681SAndroid Build Coastguard Worker  ret i64 %r
419*9880d681SAndroid Build Coastguard Worker}
420*9880d681SAndroid Build Coastguard Worker
421