blob: 8ec829c8f6b14c79f9d5c707e26525f12fbc114a [file] [log] [blame]
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +00001; RUN: llc < %s -mtriple=armv7-apple-ios | FileCheck %s
Tim Northovera0edd3e2013-01-29 09:06:13 +00002; RUN: llc < %s -mtriple=thumbv7-none-linux-gnueabihf | FileCheck %s --check-prefix=CHECK-THUMB
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +00003
4define i64 @test1(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +00005; CHECK-LABEL: test1:
Tim Northover36b24172013-07-03 09:20:36 +00006; CHECK: dmb {{ish$}}
Weiming Zhao8f56f882012-11-16 21:55:34 +00007; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
8; CHECK: adds [[REG3:(r[0-9]?[02468])]], [[REG1]]
9; CHECK: adc [[REG4:(r[0-9]?[13579])]], [[REG2]]
10; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +000011; CHECK: cmp
12; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +000013; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000014
Stephen Lind24ab202013-07-14 06:24:09 +000015; CHECK-THUMB-LABEL: test1:
Tim Northover36b24172013-07-03 09:20:36 +000016; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000017; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
18; CHECK-THUMB: adds.w [[REG3:[a-z0-9]+]], [[REG1]]
19; CHECK-THUMB: adc.w [[REG4:[a-z0-9]+]], [[REG2]]
20; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
21; CHECK-THUMB: cmp
22; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +000023; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000024
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +000025 %r = atomicrmw add i64* %ptr, i64 %val seq_cst
26 ret i64 %r
27}
28
29define i64 @test2(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +000030; CHECK-LABEL: test2:
Tim Northover36b24172013-07-03 09:20:36 +000031; CHECK: dmb {{ish$}}
Weiming Zhao8f56f882012-11-16 21:55:34 +000032; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
33; CHECK: subs [[REG3:(r[0-9]?[02468])]], [[REG1]]
34; CHECK: sbc [[REG4:(r[0-9]?[13579])]], [[REG2]]
35; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +000036; CHECK: cmp
37; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +000038; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000039
Stephen Lind24ab202013-07-14 06:24:09 +000040; CHECK-THUMB-LABEL: test2:
Tim Northover36b24172013-07-03 09:20:36 +000041; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000042; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
43; CHECK-THUMB: subs.w [[REG3:[a-z0-9]+]], [[REG1]]
44; CHECK-THUMB: sbc.w [[REG4:[a-z0-9]+]], [[REG2]]
45; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
46; CHECK-THUMB: cmp
47; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +000048; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000049
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +000050 %r = atomicrmw sub i64* %ptr, i64 %val seq_cst
51 ret i64 %r
52}
53
54define i64 @test3(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +000055; CHECK-LABEL: test3:
Tim Northover36b24172013-07-03 09:20:36 +000056; CHECK: dmb {{ish$}}
Weiming Zhao8f56f882012-11-16 21:55:34 +000057; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
58; CHECK: and [[REG3:(r[0-9]?[02468])]], [[REG1]]
59; CHECK: and [[REG4:(r[0-9]?[13579])]], [[REG2]]
60; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +000061; CHECK: cmp
62; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +000063; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000064
Stephen Lind24ab202013-07-14 06:24:09 +000065; CHECK-THUMB-LABEL: test3:
Tim Northover36b24172013-07-03 09:20:36 +000066; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000067; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
68; CHECK-THUMB: and.w [[REG3:[a-z0-9]+]], [[REG1]]
69; CHECK-THUMB: and.w [[REG4:[a-z0-9]+]], [[REG2]]
70; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
71; CHECK-THUMB: cmp
72; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +000073; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000074
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +000075 %r = atomicrmw and i64* %ptr, i64 %val seq_cst
76 ret i64 %r
77}
78
79define i64 @test4(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +000080; CHECK-LABEL: test4:
Tim Northover36b24172013-07-03 09:20:36 +000081; CHECK: dmb {{ish$}}
Weiming Zhao8f56f882012-11-16 21:55:34 +000082; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
83; CHECK: orr [[REG3:(r[0-9]?[02468])]], [[REG1]]
84; CHECK: orr [[REG4:(r[0-9]?[13579])]], [[REG2]]
85; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +000086; CHECK: cmp
87; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +000088; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000089
Stephen Lind24ab202013-07-14 06:24:09 +000090; CHECK-THUMB-LABEL: test4:
Tim Northover36b24172013-07-03 09:20:36 +000091; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000092; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
93; CHECK-THUMB: orr.w [[REG3:[a-z0-9]+]], [[REG1]]
94; CHECK-THUMB: orr.w [[REG4:[a-z0-9]+]], [[REG2]]
95; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
96; CHECK-THUMB: cmp
97; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +000098; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000099
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +0000100 %r = atomicrmw or i64* %ptr, i64 %val seq_cst
101 ret i64 %r
102}
103
104define i64 @test5(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000105; CHECK-LABEL: test5:
Tim Northover36b24172013-07-03 09:20:36 +0000106; CHECK: dmb {{ish$}}
Weiming Zhao8f56f882012-11-16 21:55:34 +0000107; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
108; CHECK: eor [[REG3:(r[0-9]?[02468])]], [[REG1]]
109; CHECK: eor [[REG4:(r[0-9]?[13579])]], [[REG2]]
110; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +0000111; CHECK: cmp
112; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000113; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000114
Stephen Lind24ab202013-07-14 06:24:09 +0000115; CHECK-THUMB-LABEL: test5:
Tim Northover36b24172013-07-03 09:20:36 +0000116; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000117; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
118; CHECK-THUMB: eor.w [[REG3:[a-z0-9]+]], [[REG1]]
119; CHECK-THUMB: eor.w [[REG4:[a-z0-9]+]], [[REG2]]
120; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
121; CHECK-THUMB: cmp
122; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000123; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000124
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +0000125 %r = atomicrmw xor i64* %ptr, i64 %val seq_cst
126 ret i64 %r
127}
128
129define i64 @test6(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000130; CHECK-LABEL: test6:
Tim Northover36b24172013-07-03 09:20:36 +0000131; CHECK: dmb {{ish$}}
Weiming Zhao8f56f882012-11-16 21:55:34 +0000132; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
133; CHECK: strexd {{[a-z0-9]+}}, {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +0000134; CHECK: cmp
135; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000136; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000137
Stephen Lind24ab202013-07-14 06:24:09 +0000138; CHECK-THUMB-LABEL: test6:
Tim Northover36b24172013-07-03 09:20:36 +0000139; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000140; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
141; CHECK-THUMB: strexd {{[a-z0-9]+}}, {{[a-z0-9]+}}, {{[a-z0-9]+}}
142; CHECK-THUMB: cmp
143; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000144; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000145
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +0000146 %r = atomicrmw xchg i64* %ptr, i64 %val seq_cst
147 ret i64 %r
Eli Friedman2c7bb522011-08-31 00:41:05 +0000148}
Eli Friedman1ccecbb2011-08-31 17:52:22 +0000149
150define i64 @test7(i64* %ptr, i64 %val1, i64 %val2) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000151; CHECK-LABEL: test7:
Tim Northover36b24172013-07-03 09:20:36 +0000152; CHECK: dmb {{ish$}}
Weiming Zhao8f56f882012-11-16 21:55:34 +0000153; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
154; CHECK: cmp [[REG1]]
155; CHECK: cmpeq [[REG2]]
Eli Friedman1ccecbb2011-08-31 17:52:22 +0000156; CHECK: bne
Weiming Zhao8f56f882012-11-16 21:55:34 +0000157; CHECK: strexd {{[a-z0-9]+}}, {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}
Eli Friedman1ccecbb2011-08-31 17:52:22 +0000158; CHECK: cmp
159; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000160; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000161
Stephen Lind24ab202013-07-14 06:24:09 +0000162; CHECK-THUMB-LABEL: test7:
Tim Northover36b24172013-07-03 09:20:36 +0000163; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000164; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
165; CHECK-THUMB: cmp [[REG1]]
166; CHECK-THUMB: it eq
167; CHECK-THUMB: cmpeq [[REG2]]
168; CHECK-THUMB: bne
169; CHECK-THUMB: strexd {{[a-z0-9]+}}, {{[a-z0-9]+}}, {{[a-z0-9]+}}
170; CHECK-THUMB: cmp
171; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000172; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000173
Eli Friedman1ccecbb2011-08-31 17:52:22 +0000174 %r = cmpxchg i64* %ptr, i64 %val1, i64 %val2 seq_cst
175 ret i64 %r
176}
Eli Friedman7c3bded2011-08-31 18:26:09 +0000177
178; Compiles down to cmpxchg
179; FIXME: Should compile to a single ldrexd
180define i64 @test8(i64* %ptr) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000181; CHECK-LABEL: test8:
Weiming Zhao8f56f882012-11-16 21:55:34 +0000182; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
183; CHECK: cmp [[REG1]]
184; CHECK: cmpeq [[REG2]]
Eli Friedman7c3bded2011-08-31 18:26:09 +0000185; CHECK: bne
Weiming Zhao8f56f882012-11-16 21:55:34 +0000186; CHECK: strexd {{[a-z0-9]+}}, {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}
Eli Friedman7c3bded2011-08-31 18:26:09 +0000187; CHECK: cmp
188; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000189; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000190
Stephen Lind24ab202013-07-14 06:24:09 +0000191; CHECK-THUMB-LABEL: test8:
Tim Northovera0edd3e2013-01-29 09:06:13 +0000192; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
193; CHECK-THUMB: cmp [[REG1]]
194; CHECK-THUMB: it eq
195; CHECK-THUMB: cmpeq [[REG2]]
196; CHECK-THUMB: bne
197; CHECK-THUMB: strexd {{[a-z0-9]+}}, {{[a-z0-9]+}}, {{[a-z0-9]+}}
198; CHECK-THUMB: cmp
199; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000200; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000201
Eli Friedman7c3bded2011-08-31 18:26:09 +0000202 %r = load atomic i64* %ptr seq_cst, align 8
203 ret i64 %r
204}
205
206; Compiles down to atomicrmw xchg; there really isn't any more efficient
207; way to write it.
208define void @test9(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000209; CHECK-LABEL: test9:
Tim Northover36b24172013-07-03 09:20:36 +0000210; CHECK: dmb {{ish$}}
Weiming Zhao8f56f882012-11-16 21:55:34 +0000211; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
212; CHECK: strexd {{[a-z0-9]+}}, {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}
Eli Friedman7c3bded2011-08-31 18:26:09 +0000213; CHECK: cmp
214; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000215; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000216
Stephen Lind24ab202013-07-14 06:24:09 +0000217; CHECK-THUMB-LABEL: test9:
Tim Northover36b24172013-07-03 09:20:36 +0000218; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000219; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
220; CHECK-THUMB: strexd {{[a-z0-9]+}}, {{[a-z0-9]+}}, {{[a-z0-9]+}}
221; CHECK-THUMB: cmp
222; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000223; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000224
Eli Friedman7c3bded2011-08-31 18:26:09 +0000225 store atomic i64 %val, i64* %ptr seq_cst, align 8
226 ret void
227}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000228
229define i64 @test10(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000230; CHECK-LABEL: test10:
Tim Northover36b24172013-07-03 09:20:36 +0000231; CHECK: dmb {{ish$}}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000232; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
233; CHECK: subs {{[a-z0-9]+}}, [[REG1]], [[REG3:(r[0-9]?[02468])]]
234; CHECK: sbcs {{[a-z0-9]+}}, [[REG2]], [[REG4:(r[0-9]?[13579])]]
Silviu Baranga3eb45a02013-01-25 10:39:49 +0000235; CHECK: blt
Silviu Baranga93aefa52012-11-29 14:41:25 +0000236; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
237; CHECK: cmp
238; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000239; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000240
Stephen Lind24ab202013-07-14 06:24:09 +0000241; CHECK-THUMB-LABEL: test10:
Tim Northover36b24172013-07-03 09:20:36 +0000242; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000243; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
244; CHECK-THUMB: subs.w {{[a-z0-9]+}}, [[REG1]], [[REG3:[a-z0-9]+]]
245; CHECK-THUMB: sbcs.w {{[a-z0-9]+}}, [[REG2]], [[REG4:[a-z0-9]+]]
246; CHECK-THUMB: blt
247; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
248; CHECK-THUMB: cmp
249; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000250; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000251
Silviu Baranga93aefa52012-11-29 14:41:25 +0000252 %r = atomicrmw min i64* %ptr, i64 %val seq_cst
253 ret i64 %r
254}
255
256define i64 @test11(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000257; CHECK-LABEL: test11:
Tim Northover36b24172013-07-03 09:20:36 +0000258; CHECK: dmb {{ish$}}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000259; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
260; CHECK: subs {{[a-z0-9]+}}, [[REG1]], [[REG3:(r[0-9]?[02468])]]
261; CHECK: sbcs {{[a-z0-9]+}}, [[REG2]], [[REG4:(r[0-9]?[13579])]]
Silviu Baranga3eb45a02013-01-25 10:39:49 +0000262; CHECK: blo
Silviu Baranga93aefa52012-11-29 14:41:25 +0000263; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
264; CHECK: cmp
265; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000266; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000267
268
Stephen Lind24ab202013-07-14 06:24:09 +0000269; CHECK-THUMB-LABEL: test11:
Tim Northover36b24172013-07-03 09:20:36 +0000270; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000271; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
272; CHECK-THUMB: subs.w {{[a-z0-9]+}}, [[REG1]], [[REG3:[a-z0-9]+]]
273; CHECK-THUMB: sbcs.w {{[a-z0-9]+}}, [[REG2]], [[REG4:[a-z0-9]+]]
274; CHECK-THUMB: blo
275; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
276; CHECK-THUMB: cmp
277; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000278; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000279
Silviu Baranga93aefa52012-11-29 14:41:25 +0000280 %r = atomicrmw umin i64* %ptr, i64 %val seq_cst
281 ret i64 %r
282}
283
284define i64 @test12(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000285; CHECK-LABEL: test12:
Tim Northover36b24172013-07-03 09:20:36 +0000286; CHECK: dmb {{ish$}}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000287; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
288; CHECK: subs {{[a-z0-9]+}}, [[REG1]], [[REG3:(r[0-9]?[02468])]]
289; CHECK: sbcs {{[a-z0-9]+}}, [[REG2]], [[REG4:(r[0-9]?[13579])]]
290; CHECK: bge
291; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
292; CHECK: cmp
293; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000294; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000295
Stephen Lind24ab202013-07-14 06:24:09 +0000296; CHECK-THUMB-LABEL: test12:
Tim Northover36b24172013-07-03 09:20:36 +0000297; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000298; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
299; CHECK-THUMB: subs.w {{[a-z0-9]+}}, [[REG1]], [[REG3:[a-z0-9]+]]
300; CHECK-THUMB: sbcs.w {{[a-z0-9]+}}, [[REG2]], [[REG4:[a-z0-9]+]]
301; CHECK-THUMB: bge
302; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
303; CHECK-THUMB: cmp
304; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000305; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000306
Silviu Baranga93aefa52012-11-29 14:41:25 +0000307 %r = atomicrmw max i64* %ptr, i64 %val seq_cst
308 ret i64 %r
309}
310
311define i64 @test13(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000312; CHECK-LABEL: test13:
Tim Northover36b24172013-07-03 09:20:36 +0000313; CHECK: dmb {{ish$}}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000314; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
315; CHECK: subs {{[a-z0-9]+}}, [[REG1]], [[REG3:(r[0-9]?[02468])]]
316; CHECK: sbcs {{[a-z0-9]+}}, [[REG2]], [[REG4:(r[0-9]?[13579])]]
317; CHECK: bhs
318; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
319; CHECK: cmp
320; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000321; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000322
Stephen Lind24ab202013-07-14 06:24:09 +0000323; CHECK-THUMB-LABEL: test13:
Tim Northover36b24172013-07-03 09:20:36 +0000324; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000325; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
326; CHECK-THUMB: subs.w {{[a-z0-9]+}}, [[REG1]], [[REG3:[a-z0-9]+]]
327; CHECK-THUMB: sbcs.w {{[a-z0-9]+}}, [[REG2]], [[REG4:[a-z0-9]+]]
328; CHECK-THUMB: bhs
329; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
330; CHECK-THUMB: cmp
331; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000332; CHECK-THUMB: dmb {{ish$}}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000333 %r = atomicrmw umax i64* %ptr, i64 %val seq_cst
334 ret i64 %r
335}
336