blob: 0477d4f40160069104fed7fb24f206032402b9c7 [file] [log] [blame]
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +00001; RUN: llc < %s -mtriple=armv7-apple-ios | FileCheck %s
Joey Goulye1de9e92013-08-22 12:19:24 +00002; RUN: llc < %s -mtriple=thumbv7-none-linux-gnueabihf -verify-machineinstrs | 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
Amara Emersonb4ad2f32013-09-26 12:22:36 +0000178; Compiles down to a single ldrexd
Eli Friedman7c3bded2011-08-31 18:26:09 +0000179define i64 @test8(i64* %ptr) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000180; CHECK-LABEL: test8:
Weiming Zhao8f56f882012-11-16 21:55:34 +0000181; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
Tim Northover36b24172013-07-03 09:20:36 +0000182; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000183
Stephen Lind24ab202013-07-14 06:24:09 +0000184; CHECK-THUMB-LABEL: test8:
Tim Northovera0edd3e2013-01-29 09:06:13 +0000185; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
Tim Northover36b24172013-07-03 09:20:36 +0000186; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000187
Eli Friedman7c3bded2011-08-31 18:26:09 +0000188 %r = load atomic i64* %ptr seq_cst, align 8
189 ret i64 %r
190}
191
192; Compiles down to atomicrmw xchg; there really isn't any more efficient
193; way to write it.
194define void @test9(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000195; CHECK-LABEL: test9:
Tim Northover36b24172013-07-03 09:20:36 +0000196; CHECK: dmb {{ish$}}
Weiming Zhao8f56f882012-11-16 21:55:34 +0000197; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
198; CHECK: strexd {{[a-z0-9]+}}, {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}
Eli Friedman7c3bded2011-08-31 18:26:09 +0000199; CHECK: cmp
200; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000201; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000202
Stephen Lind24ab202013-07-14 06:24:09 +0000203; CHECK-THUMB-LABEL: test9:
Tim Northover36b24172013-07-03 09:20:36 +0000204; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000205; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
206; CHECK-THUMB: strexd {{[a-z0-9]+}}, {{[a-z0-9]+}}, {{[a-z0-9]+}}
207; CHECK-THUMB: cmp
208; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000209; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000210
Eli Friedman7c3bded2011-08-31 18:26:09 +0000211 store atomic i64 %val, i64* %ptr seq_cst, align 8
212 ret void
213}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000214
215define i64 @test10(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000216; CHECK-LABEL: test10:
Tim Northover36b24172013-07-03 09:20:36 +0000217; CHECK: dmb {{ish$}}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000218; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
219; CHECK: subs {{[a-z0-9]+}}, [[REG1]], [[REG3:(r[0-9]?[02468])]]
220; CHECK: sbcs {{[a-z0-9]+}}, [[REG2]], [[REG4:(r[0-9]?[13579])]]
Silviu Baranga3eb45a02013-01-25 10:39:49 +0000221; CHECK: blt
Silviu Baranga93aefa52012-11-29 14:41:25 +0000222; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
223; CHECK: cmp
224; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000225; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000226
Stephen Lind24ab202013-07-14 06:24:09 +0000227; CHECK-THUMB-LABEL: test10:
Tim Northover36b24172013-07-03 09:20:36 +0000228; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000229; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
230; CHECK-THUMB: subs.w {{[a-z0-9]+}}, [[REG1]], [[REG3:[a-z0-9]+]]
231; CHECK-THUMB: sbcs.w {{[a-z0-9]+}}, [[REG2]], [[REG4:[a-z0-9]+]]
232; CHECK-THUMB: blt
233; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
234; CHECK-THUMB: cmp
235; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000236; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000237
Silviu Baranga93aefa52012-11-29 14:41:25 +0000238 %r = atomicrmw min i64* %ptr, i64 %val seq_cst
239 ret i64 %r
240}
241
242define i64 @test11(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000243; CHECK-LABEL: test11:
Tim Northover36b24172013-07-03 09:20:36 +0000244; CHECK: dmb {{ish$}}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000245; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
246; CHECK: subs {{[a-z0-9]+}}, [[REG1]], [[REG3:(r[0-9]?[02468])]]
247; CHECK: sbcs {{[a-z0-9]+}}, [[REG2]], [[REG4:(r[0-9]?[13579])]]
Silviu Baranga3eb45a02013-01-25 10:39:49 +0000248; CHECK: blo
Silviu Baranga93aefa52012-11-29 14:41:25 +0000249; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
250; CHECK: cmp
251; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000252; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000253
254
Stephen Lind24ab202013-07-14 06:24:09 +0000255; CHECK-THUMB-LABEL: test11:
Tim Northover36b24172013-07-03 09:20:36 +0000256; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000257; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
258; CHECK-THUMB: subs.w {{[a-z0-9]+}}, [[REG1]], [[REG3:[a-z0-9]+]]
259; CHECK-THUMB: sbcs.w {{[a-z0-9]+}}, [[REG2]], [[REG4:[a-z0-9]+]]
260; CHECK-THUMB: blo
261; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
262; CHECK-THUMB: cmp
263; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000264; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000265
Silviu Baranga93aefa52012-11-29 14:41:25 +0000266 %r = atomicrmw umin i64* %ptr, i64 %val seq_cst
267 ret i64 %r
268}
269
270define i64 @test12(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000271; CHECK-LABEL: test12:
Tim Northover36b24172013-07-03 09:20:36 +0000272; CHECK: dmb {{ish$}}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000273; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
274; CHECK: subs {{[a-z0-9]+}}, [[REG1]], [[REG3:(r[0-9]?[02468])]]
275; CHECK: sbcs {{[a-z0-9]+}}, [[REG2]], [[REG4:(r[0-9]?[13579])]]
276; CHECK: bge
277; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
278; CHECK: cmp
279; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000280; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000281
Stephen Lind24ab202013-07-14 06:24:09 +0000282; CHECK-THUMB-LABEL: test12:
Tim Northover36b24172013-07-03 09:20:36 +0000283; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000284; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
285; CHECK-THUMB: subs.w {{[a-z0-9]+}}, [[REG1]], [[REG3:[a-z0-9]+]]
286; CHECK-THUMB: sbcs.w {{[a-z0-9]+}}, [[REG2]], [[REG4:[a-z0-9]+]]
287; CHECK-THUMB: bge
288; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
289; CHECK-THUMB: cmp
290; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000291; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000292
Silviu Baranga93aefa52012-11-29 14:41:25 +0000293 %r = atomicrmw max i64* %ptr, i64 %val seq_cst
294 ret i64 %r
295}
296
297define i64 @test13(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000298; CHECK-LABEL: test13:
Tim Northover36b24172013-07-03 09:20:36 +0000299; CHECK: dmb {{ish$}}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000300; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
301; CHECK: subs {{[a-z0-9]+}}, [[REG1]], [[REG3:(r[0-9]?[02468])]]
302; CHECK: sbcs {{[a-z0-9]+}}, [[REG2]], [[REG4:(r[0-9]?[13579])]]
303; CHECK: bhs
304; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
305; CHECK: cmp
306; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000307; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000308
Stephen Lind24ab202013-07-14 06:24:09 +0000309; CHECK-THUMB-LABEL: test13:
Tim Northover36b24172013-07-03 09:20:36 +0000310; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000311; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
312; CHECK-THUMB: subs.w {{[a-z0-9]+}}, [[REG1]], [[REG3:[a-z0-9]+]]
313; CHECK-THUMB: sbcs.w {{[a-z0-9]+}}, [[REG2]], [[REG4:[a-z0-9]+]]
314; CHECK-THUMB: bhs
315; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
316; CHECK-THUMB: cmp
317; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000318; CHECK-THUMB: dmb {{ish$}}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000319 %r = atomicrmw umax i64* %ptr, i64 %val seq_cst
320 ret i64 %r
321}
322