blob: de84ff46ec3b9ed8c178192eaaf9cdc2784218aa [file] [log] [blame]
Tim Northovere3d42362013-02-01 11:40:47 +00001; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs < %s | FileCheck %s
Tim Northovere0e3aef2013-01-31 12:12:40 +00002
3@var8 = global i8 0
4@var16 = global i16 0
5@var32 = global i32 0
6@var64 = global i64 0
7
8define i8 @test_atomic_load_add_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00009; CHECK-LABEL: test_atomic_load_add_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +000010 %old = atomicrmw add i8* @var8, i8 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +000011; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000012; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
13; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
14
15; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +000016; CHECK-NEXT: ldaxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +000017 ; w0 below is a reasonable guess but could change: it certainly comes into the
18 ; function there.
19; CHECK-NEXT: add [[NEW:w[0-9]+]], w[[OLD]], w0
Tim Northover15410e92013-04-08 08:40:41 +000020; CHECK-NEXT: stlxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +000021; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +000022; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000023
24; CHECK: mov x0, x[[OLD]]
25 ret i8 %old
26}
27
28define i16 @test_atomic_load_add_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +000029; CHECK-LABEL: test_atomic_load_add_i16:
Tim Northover15410e92013-04-08 08:40:41 +000030 %old = atomicrmw add i16* @var16, i16 %offset acquire
31; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000032; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
33; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
34
35; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +000036; CHECK-NEXT: ldaxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +000037 ; w0 below is a reasonable guess but could change: it certainly comes into the
38 ; function there.
39; CHECK-NEXT: add [[NEW:w[0-9]+]], w[[OLD]], w0
40; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +000041; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +000042; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000043
44; CHECK: mov x0, x[[OLD]]
45 ret i16 %old
46}
47
48define i32 @test_atomic_load_add_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +000049; CHECK-LABEL: test_atomic_load_add_i32:
Tim Northover15410e92013-04-08 08:40:41 +000050 %old = atomicrmw add i32* @var32, i32 %offset release
51; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000052; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
53; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
54
55; CHECK: .LBB{{[0-9]+}}_1:
56; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
57 ; w0 below is a reasonable guess but could change: it certainly comes into the
58 ; function there.
59; CHECK-NEXT: add [[NEW:w[0-9]+]], w[[OLD]], w0
Tim Northover15410e92013-04-08 08:40:41 +000060; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +000061; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +000062; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000063
64; CHECK: mov x0, x[[OLD]]
65 ret i32 %old
66}
67
68define i64 @test_atomic_load_add_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +000069; CHECK-LABEL: test_atomic_load_add_i64:
Tim Northover15410e92013-04-08 08:40:41 +000070 %old = atomicrmw add i64* @var64, i64 %offset monotonic
71; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000072; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
73; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
74
75; CHECK: .LBB{{[0-9]+}}_1:
76; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
77 ; x0 below is a reasonable guess but could change: it certainly comes into the
78 ; function there.
79; CHECK-NEXT: add [[NEW:x[0-9]+]], x[[OLD]], x0
80; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +000081; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +000082; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000083
84; CHECK: mov x0, x[[OLD]]
85 ret i64 %old
86}
87
88define i8 @test_atomic_load_sub_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +000089; CHECK-LABEL: test_atomic_load_sub_i8:
Tim Northover15410e92013-04-08 08:40:41 +000090 %old = atomicrmw sub i8* @var8, i8 %offset monotonic
91; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000092; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
93; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
94
95; CHECK: .LBB{{[0-9]+}}_1:
96; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
97 ; w0 below is a reasonable guess but could change: it certainly comes into the
98 ; function there.
99; CHECK-NEXT: sub [[NEW:w[0-9]+]], w[[OLD]], w0
100; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000101; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000102; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000103
104; CHECK: mov x0, x[[OLD]]
105 ret i8 %old
106}
107
108define i16 @test_atomic_load_sub_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000109; CHECK-LABEL: test_atomic_load_sub_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000110 %old = atomicrmw sub i16* @var16, i16 %offset release
111; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000112; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
113; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
114
115; CHECK: .LBB{{[0-9]+}}_1:
116; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
117 ; w0 below is a reasonable guess but could change: it certainly comes into the
118 ; function there.
119; CHECK-NEXT: sub [[NEW:w[0-9]+]], w[[OLD]], w0
Tim Northover15410e92013-04-08 08:40:41 +0000120; CHECK-NEXT: stlxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000121; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000122; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000123
124; CHECK: mov x0, x[[OLD]]
125 ret i16 %old
126}
127
128define i32 @test_atomic_load_sub_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000129; CHECK-LABEL: test_atomic_load_sub_i32:
Tim Northover15410e92013-04-08 08:40:41 +0000130 %old = atomicrmw sub i32* @var32, i32 %offset acquire
131; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000132; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
133; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
134
135; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000136; CHECK-NEXT: ldaxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000137 ; w0 below is a reasonable guess but could change: it certainly comes into the
138 ; function there.
139; CHECK-NEXT: sub [[NEW:w[0-9]+]], w[[OLD]], w0
140; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000141; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000142; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000143
144; CHECK: mov x0, x[[OLD]]
145 ret i32 %old
146}
147
148define i64 @test_atomic_load_sub_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000149; CHECK-LABEL: test_atomic_load_sub_i64:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000150 %old = atomicrmw sub i64* @var64, i64 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000151; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000152; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
153; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
154
155; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000156; CHECK-NEXT: ldaxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000157 ; x0 below is a reasonable guess but could change: it certainly comes into the
158 ; function there.
159; CHECK-NEXT: sub [[NEW:x[0-9]+]], x[[OLD]], x0
Tim Northover15410e92013-04-08 08:40:41 +0000160; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000161; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000162; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000163
164; CHECK: mov x0, x[[OLD]]
165 ret i64 %old
166}
167
168define i8 @test_atomic_load_and_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000169; CHECK-LABEL: test_atomic_load_and_i8:
Tim Northover15410e92013-04-08 08:40:41 +0000170 %old = atomicrmw and i8* @var8, i8 %offset release
171; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000172; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
173; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
174
175; CHECK: .LBB{{[0-9]+}}_1:
176; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
177 ; w0 below is a reasonable guess but could change: it certainly comes into the
178 ; function there.
179; CHECK-NEXT: and [[NEW:w[0-9]+]], w[[OLD]], w0
Tim Northover15410e92013-04-08 08:40:41 +0000180; CHECK-NEXT: stlxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000181; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000182; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000183
184; CHECK: mov x0, x[[OLD]]
185 ret i8 %old
186}
187
188define i16 @test_atomic_load_and_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000189; CHECK-LABEL: test_atomic_load_and_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000190 %old = atomicrmw and i16* @var16, i16 %offset monotonic
191; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000192; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
193; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
194
195; CHECK: .LBB{{[0-9]+}}_1:
196; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
197 ; w0 below is a reasonable guess but could change: it certainly comes into the
198 ; function there.
199; CHECK-NEXT: and [[NEW:w[0-9]+]], w[[OLD]], w0
200; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000201; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000202; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000203
204; CHECK: mov x0, x[[OLD]]
205 ret i16 %old
206}
207
208define i32 @test_atomic_load_and_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000209; CHECK-LABEL: test_atomic_load_and_i32:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000210 %old = atomicrmw and i32* @var32, i32 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000211; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000212; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
213; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
214
215; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000216; CHECK-NEXT: ldaxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000217 ; w0 below is a reasonable guess but could change: it certainly comes into the
218 ; function there.
219; CHECK-NEXT: and [[NEW:w[0-9]+]], w[[OLD]], w0
Tim Northover15410e92013-04-08 08:40:41 +0000220; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000221; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000222; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000223
224; CHECK: mov x0, x[[OLD]]
225 ret i32 %old
226}
227
228define i64 @test_atomic_load_and_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000229; CHECK-LABEL: test_atomic_load_and_i64:
Tim Northover15410e92013-04-08 08:40:41 +0000230 %old = atomicrmw and i64* @var64, i64 %offset acquire
231; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000232; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
233; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
234
235; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000236; CHECK-NEXT: ldaxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000237 ; x0 below is a reasonable guess but could change: it certainly comes into the
238 ; function there.
239; CHECK-NEXT: and [[NEW:x[0-9]+]], x[[OLD]], x0
240; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000241; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000242; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000243
244; CHECK: mov x0, x[[OLD]]
245 ret i64 %old
246}
247
248define i8 @test_atomic_load_or_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000249; CHECK-LABEL: test_atomic_load_or_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000250 %old = atomicrmw or i8* @var8, i8 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000251; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000252; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
253; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
254
255; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000256; CHECK-NEXT: ldaxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000257 ; w0 below is a reasonable guess but could change: it certainly comes into the
258 ; function there.
259; CHECK-NEXT: orr [[NEW:w[0-9]+]], w[[OLD]], w0
Tim Northover15410e92013-04-08 08:40:41 +0000260; CHECK-NEXT: stlxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000261; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000262; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000263
264; CHECK: mov x0, x[[OLD]]
265 ret i8 %old
266}
267
268define i16 @test_atomic_load_or_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000269; CHECK-LABEL: test_atomic_load_or_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000270 %old = atomicrmw or i16* @var16, i16 %offset monotonic
271; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000272; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
273; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
274
275; CHECK: .LBB{{[0-9]+}}_1:
276; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
277 ; w0 below is a reasonable guess but could change: it certainly comes into the
278 ; function there.
279; CHECK-NEXT: orr [[NEW:w[0-9]+]], w[[OLD]], w0
280; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000281; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000282; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000283
284; CHECK: mov x0, x[[OLD]]
285 ret i16 %old
286}
287
288define i32 @test_atomic_load_or_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000289; CHECK-LABEL: test_atomic_load_or_i32:
Tim Northover15410e92013-04-08 08:40:41 +0000290 %old = atomicrmw or i32* @var32, i32 %offset acquire
291; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000292; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
293; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
294
295; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000296; CHECK-NEXT: ldaxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000297 ; w0 below is a reasonable guess but could change: it certainly comes into the
298 ; function there.
299; CHECK-NEXT: orr [[NEW:w[0-9]+]], w[[OLD]], w0
300; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000301; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000302; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000303
304; CHECK: mov x0, x[[OLD]]
305 ret i32 %old
306}
307
308define i64 @test_atomic_load_or_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000309; CHECK-LABEL: test_atomic_load_or_i64:
Tim Northover15410e92013-04-08 08:40:41 +0000310 %old = atomicrmw or i64* @var64, i64 %offset release
311; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000312; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
313; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
314
315; CHECK: .LBB{{[0-9]+}}_1:
316; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
317 ; x0 below is a reasonable guess but could change: it certainly comes into the
318 ; function there.
319; CHECK-NEXT: orr [[NEW:x[0-9]+]], x[[OLD]], x0
Tim Northover15410e92013-04-08 08:40:41 +0000320; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000321; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000322; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000323
324; CHECK: mov x0, x[[OLD]]
325 ret i64 %old
326}
327
328define i8 @test_atomic_load_xor_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000329; CHECK-LABEL: test_atomic_load_xor_i8:
Tim Northover15410e92013-04-08 08:40:41 +0000330 %old = atomicrmw xor i8* @var8, i8 %offset acquire
331; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000332; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
333; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
334
335; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000336; CHECK-NEXT: ldaxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000337 ; w0 below is a reasonable guess but could change: it certainly comes into the
338 ; function there.
339; CHECK-NEXT: eor [[NEW:w[0-9]+]], w[[OLD]], w0
340; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000341; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000342; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000343
344; CHECK: mov x0, x[[OLD]]
345 ret i8 %old
346}
347
348define i16 @test_atomic_load_xor_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000349; CHECK-LABEL: test_atomic_load_xor_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000350 %old = atomicrmw xor i16* @var16, i16 %offset release
351; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000352; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
353; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
354
355; CHECK: .LBB{{[0-9]+}}_1:
356; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
357 ; w0 below is a reasonable guess but could change: it certainly comes into the
358 ; function there.
359; CHECK-NEXT: eor [[NEW:w[0-9]+]], w[[OLD]], w0
Tim Northover15410e92013-04-08 08:40:41 +0000360; CHECK-NEXT: stlxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000361; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000362; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000363
364; CHECK: mov x0, x[[OLD]]
365 ret i16 %old
366}
367
368define i32 @test_atomic_load_xor_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000369; CHECK-LABEL: test_atomic_load_xor_i32:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000370 %old = atomicrmw xor i32* @var32, i32 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000371; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000372; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
373; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
374
375; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000376; CHECK-NEXT: ldaxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000377 ; w0 below is a reasonable guess but could change: it certainly comes into the
378 ; function there.
379; CHECK-NEXT: eor [[NEW:w[0-9]+]], w[[OLD]], w0
Tim Northover15410e92013-04-08 08:40:41 +0000380; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000381; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000382; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000383
384; CHECK: mov x0, x[[OLD]]
385 ret i32 %old
386}
387
388define i64 @test_atomic_load_xor_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000389; CHECK-LABEL: test_atomic_load_xor_i64:
Tim Northover15410e92013-04-08 08:40:41 +0000390 %old = atomicrmw xor i64* @var64, i64 %offset monotonic
391; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000392; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
393; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
394
395; CHECK: .LBB{{[0-9]+}}_1:
396; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
397 ; x0 below is a reasonable guess but could change: it certainly comes into the
398 ; function there.
399; CHECK-NEXT: eor [[NEW:x[0-9]+]], x[[OLD]], x0
400; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000401; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000402; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000403
404; CHECK: mov x0, x[[OLD]]
405 ret i64 %old
406}
407
408define i8 @test_atomic_load_xchg_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000409; CHECK-LABEL: test_atomic_load_xchg_i8:
Tim Northover15410e92013-04-08 08:40:41 +0000410 %old = atomicrmw xchg i8* @var8, i8 %offset monotonic
411; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000412; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
413; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
414
415; CHECK: .LBB{{[0-9]+}}_1:
416; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
417 ; w0 below is a reasonable guess but could change: it certainly comes into the
418 ; function there.
419; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], w0, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000420; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000421; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000422
423; CHECK: mov x0, x[[OLD]]
424 ret i8 %old
425}
426
427define i16 @test_atomic_load_xchg_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000428; CHECK-LABEL: test_atomic_load_xchg_i16:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000429 %old = atomicrmw xchg i16* @var16, i16 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000430; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000431; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
432; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
433
434; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000435; CHECK-NEXT: ldaxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000436 ; w0 below is a reasonable guess but could change: it certainly comes into the
437 ; function there.
Tim Northover15410e92013-04-08 08:40:41 +0000438; CHECK-NEXT: stlxrh [[STATUS:w[0-9]+]], w0, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000439; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000440; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000441
442; CHECK: mov x0, x[[OLD]]
443 ret i16 %old
444}
445
446define i32 @test_atomic_load_xchg_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000447; CHECK-LABEL: test_atomic_load_xchg_i32:
Tim Northover15410e92013-04-08 08:40:41 +0000448 %old = atomicrmw xchg i32* @var32, i32 %offset release
449; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000450; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
451; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
452
453; CHECK: .LBB{{[0-9]+}}_1:
454; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
455 ; w0 below is a reasonable guess but could change: it certainly comes into the
456 ; function there.
Tim Northover15410e92013-04-08 08:40:41 +0000457; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], w0, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000458; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000459; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000460
461; CHECK: mov x0, x[[OLD]]
462 ret i32 %old
463}
464
465define i64 @test_atomic_load_xchg_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000466; CHECK-LABEL: test_atomic_load_xchg_i64:
Tim Northover15410e92013-04-08 08:40:41 +0000467 %old = atomicrmw xchg i64* @var64, i64 %offset acquire
468; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000469; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
470; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
471
472; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000473; CHECK-NEXT: ldaxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000474 ; x0 below is a reasonable guess but could change: it certainly comes into the
475 ; function there.
476; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], x0, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000477; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000478; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000479
480; CHECK: mov x0, x[[OLD]]
481 ret i64 %old
482}
483
484
485define i8 @test_atomic_load_min_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000486; CHECK-LABEL: test_atomic_load_min_i8:
Tim Northover15410e92013-04-08 08:40:41 +0000487 %old = atomicrmw min i8* @var8, i8 %offset acquire
488; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000489; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
490; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
491
492; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000493; CHECK-NEXT: ldaxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000494 ; w0 below is a reasonable guess but could change: it certainly comes into the
495 ; function there.
496; CHECK-NEXT: cmp w0, w[[OLD]], sxtb
497; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, gt
498; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000499; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000500; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000501
502; CHECK: mov x0, x[[OLD]]
503 ret i8 %old
504}
505
506define i16 @test_atomic_load_min_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000507; CHECK-LABEL: test_atomic_load_min_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000508 %old = atomicrmw min i16* @var16, i16 %offset release
509; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000510; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
511; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
512
513; CHECK: .LBB{{[0-9]+}}_1:
514; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
515 ; w0 below is a reasonable guess but could change: it certainly comes into the
516 ; function there.
517; CHECK-NEXT: cmp w0, w[[OLD]], sxth
518; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, gt
Tim Northover15410e92013-04-08 08:40:41 +0000519; CHECK-NEXT: stlxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000520; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000521; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000522
523; CHECK: mov x0, x[[OLD]]
524 ret i16 %old
525}
526
527define i32 @test_atomic_load_min_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000528; CHECK-LABEL: test_atomic_load_min_i32:
Tim Northover15410e92013-04-08 08:40:41 +0000529 %old = atomicrmw min i32* @var32, i32 %offset monotonic
530; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000531; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
532; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
533
534; CHECK: .LBB{{[0-9]+}}_1:
535; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
536 ; w0 below is a reasonable guess but could change: it certainly comes into the
537 ; function there.
538; CHECK-NEXT: cmp w0, w[[OLD]]
539; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, gt
540; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000541; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000542; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000543
544; CHECK: mov x0, x[[OLD]]
545 ret i32 %old
546}
547
548define i64 @test_atomic_load_min_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000549; CHECK-LABEL: test_atomic_load_min_i64:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000550 %old = atomicrmw min i64* @var64, i64 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000551; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000552; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
553; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
554
555; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000556; CHECK-NEXT: ldaxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000557 ; x0 below is a reasonable guess but could change: it certainly comes into the
558 ; function there.
559; CHECK-NEXT: cmp x0, x[[OLD]]
560; CHECK-NEXT: csel [[NEW:x[0-9]+]], x[[OLD]], x0, gt
Tim Northover15410e92013-04-08 08:40:41 +0000561; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000562; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000563; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000564
565; CHECK: mov x0, x[[OLD]]
566 ret i64 %old
567}
568
569define i8 @test_atomic_load_max_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000570; CHECK-LABEL: test_atomic_load_max_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000571 %old = atomicrmw max i8* @var8, i8 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000572; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000573; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
574; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
575
576; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000577; CHECK-NEXT: ldaxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000578 ; w0 below is a reasonable guess but could change: it certainly comes into the
579 ; function there.
580; CHECK-NEXT: cmp w0, w[[OLD]], sxtb
581; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lt
Tim Northover15410e92013-04-08 08:40:41 +0000582; CHECK-NEXT: stlxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000583; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000584; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000585
586; CHECK: mov x0, x[[OLD]]
587 ret i8 %old
588}
589
590define i16 @test_atomic_load_max_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000591; CHECK-LABEL: test_atomic_load_max_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000592 %old = atomicrmw max i16* @var16, i16 %offset acquire
593; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000594; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
595; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
596
597; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000598; CHECK-NEXT: ldaxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000599 ; w0 below is a reasonable guess but could change: it certainly comes into the
600 ; function there.
601; CHECK-NEXT: cmp w0, w[[OLD]], sxth
602; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lt
603; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000604; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000605; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000606
607; CHECK: mov x0, x[[OLD]]
608 ret i16 %old
609}
610
611define i32 @test_atomic_load_max_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000612; CHECK-LABEL: test_atomic_load_max_i32:
Tim Northover15410e92013-04-08 08:40:41 +0000613 %old = atomicrmw max i32* @var32, i32 %offset release
614; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000615; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
616; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
617
618; CHECK: .LBB{{[0-9]+}}_1:
619; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
620 ; w0 below is a reasonable guess but could change: it certainly comes into the
621 ; function there.
622; CHECK-NEXT: cmp w0, w[[OLD]]
623; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lt
Tim Northover15410e92013-04-08 08:40:41 +0000624; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000625; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000626; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000627
628; CHECK: mov x0, x[[OLD]]
629 ret i32 %old
630}
631
632define i64 @test_atomic_load_max_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000633; CHECK-LABEL: test_atomic_load_max_i64:
Tim Northover15410e92013-04-08 08:40:41 +0000634 %old = atomicrmw max i64* @var64, i64 %offset monotonic
635; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000636; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
637; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
638
639; CHECK: .LBB{{[0-9]+}}_1:
640; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
641 ; x0 below is a reasonable guess but could change: it certainly comes into the
642 ; function there.
643; CHECK-NEXT: cmp x0, x[[OLD]]
644; CHECK-NEXT: csel [[NEW:x[0-9]+]], x[[OLD]], x0, lt
645; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000646; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000647; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000648
649; CHECK: mov x0, x[[OLD]]
650 ret i64 %old
651}
652
653define i8 @test_atomic_load_umin_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000654; CHECK-LABEL: test_atomic_load_umin_i8:
Tim Northover15410e92013-04-08 08:40:41 +0000655 %old = atomicrmw umin i8* @var8, i8 %offset monotonic
656; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000657; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
658; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
659
660; CHECK: .LBB{{[0-9]+}}_1:
661; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
662 ; w0 below is a reasonable guess but could change: it certainly comes into the
663 ; function there.
664; CHECK-NEXT: cmp w0, w[[OLD]], uxtb
665; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, hi
666; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000667; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000668; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000669
670; CHECK: mov x0, x[[OLD]]
671 ret i8 %old
672}
673
674define i16 @test_atomic_load_umin_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000675; CHECK-LABEL: test_atomic_load_umin_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000676 %old = atomicrmw umin i16* @var16, i16 %offset acquire
677; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000678; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
679; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
680
681; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000682; CHECK-NEXT: ldaxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000683 ; w0 below is a reasonable guess but could change: it certainly comes into the
684 ; function there.
685; CHECK-NEXT: cmp w0, w[[OLD]], uxth
686; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, hi
687; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000688; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000689; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000690
691; CHECK: mov x0, x[[OLD]]
692 ret i16 %old
693}
694
695define i32 @test_atomic_load_umin_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000696; CHECK-LABEL: test_atomic_load_umin_i32:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000697 %old = atomicrmw umin i32* @var32, i32 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000698; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000699; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
700; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
701
702; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000703; CHECK-NEXT: ldaxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000704 ; w0 below is a reasonable guess but could change: it certainly comes into the
705 ; function there.
706; CHECK-NEXT: cmp w0, w[[OLD]]
707; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, hi
Tim Northover15410e92013-04-08 08:40:41 +0000708; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000709; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000710; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000711
712; CHECK: mov x0, x[[OLD]]
713 ret i32 %old
714}
715
716define i64 @test_atomic_load_umin_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000717; CHECK-LABEL: test_atomic_load_umin_i64:
Tim Northover15410e92013-04-08 08:40:41 +0000718 %old = atomicrmw umin i64* @var64, i64 %offset acq_rel
719; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000720; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
721; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
722
723; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000724; CHECK-NEXT: ldaxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000725 ; x0 below is a reasonable guess but could change: it certainly comes into the
726 ; function there.
727; CHECK-NEXT: cmp x0, x[[OLD]]
728; CHECK-NEXT: csel [[NEW:x[0-9]+]], x[[OLD]], x0, hi
Tim Northover15410e92013-04-08 08:40:41 +0000729; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000730; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000731; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000732
733; CHECK: mov x0, x[[OLD]]
734 ret i64 %old
735}
736
737define i8 @test_atomic_load_umax_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000738; CHECK-LABEL: test_atomic_load_umax_i8:
Tim Northover15410e92013-04-08 08:40:41 +0000739 %old = atomicrmw umax i8* @var8, i8 %offset acq_rel
740; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000741; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
742; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
743
744; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000745; CHECK-NEXT: ldaxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000746 ; w0 below is a reasonable guess but could change: it certainly comes into the
747 ; function there.
748; CHECK-NEXT: cmp w0, w[[OLD]], uxtb
749; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lo
Tim Northover15410e92013-04-08 08:40:41 +0000750; CHECK-NEXT: stlxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000751; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000752; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000753
754; CHECK: mov x0, x[[OLD]]
755 ret i8 %old
756}
757
758define i16 @test_atomic_load_umax_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000759; CHECK-LABEL: test_atomic_load_umax_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000760 %old = atomicrmw umax i16* @var16, i16 %offset monotonic
761; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000762; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
763; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
764
765; CHECK: .LBB{{[0-9]+}}_1:
766; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
767 ; w0 below is a reasonable guess but could change: it certainly comes into the
768 ; function there.
769; CHECK-NEXT: cmp w0, w[[OLD]], uxth
770; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lo
771; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000772; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000773; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000774
775; CHECK: mov x0, x[[OLD]]
776 ret i16 %old
777}
778
779define i32 @test_atomic_load_umax_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000780; CHECK-LABEL: test_atomic_load_umax_i32:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000781 %old = atomicrmw umax i32* @var32, i32 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000782; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000783; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
784; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
785
786; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000787; CHECK-NEXT: ldaxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000788 ; w0 below is a reasonable guess but could change: it certainly comes into the
789 ; function there.
790; CHECK-NEXT: cmp w0, w[[OLD]]
791; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lo
Tim Northover15410e92013-04-08 08:40:41 +0000792; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000793; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000794; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000795
796; CHECK: mov x0, x[[OLD]]
797 ret i32 %old
798}
799
800define i64 @test_atomic_load_umax_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000801; CHECK-LABEL: test_atomic_load_umax_i64:
Tim Northover15410e92013-04-08 08:40:41 +0000802 %old = atomicrmw umax i64* @var64, i64 %offset release
803; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000804; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
805; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
806
807; CHECK: .LBB{{[0-9]+}}_1:
808; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
809 ; x0 below is a reasonable guess but could change: it certainly comes into the
810 ; function there.
811; CHECK-NEXT: cmp x0, x[[OLD]]
812; CHECK-NEXT: csel [[NEW:x[0-9]+]], x[[OLD]], x0, lo
Tim Northover15410e92013-04-08 08:40:41 +0000813; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000814; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000815; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000816
817; CHECK: mov x0, x[[OLD]]
818 ret i64 %old
819}
820
821define i8 @test_atomic_cmpxchg_i8(i8 %wanted, i8 %new) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000822; CHECK-LABEL: test_atomic_cmpxchg_i8:
Tim Northover15410e92013-04-08 08:40:41 +0000823 %old = cmpxchg i8* @var8, i8 %wanted, i8 %new acquire
824; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000825; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
826; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
827
828; CHECK: [[STARTAGAIN:.LBB[0-9]+_[0-9]+]]:
Tim Northover15410e92013-04-08 08:40:41 +0000829; CHECK-NEXT: ldaxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000830 ; w0 below is a reasonable guess but could change: it certainly comes into the
831 ; function there.
832; CHECK-NEXT: cmp w[[OLD]], w0
833; CHECK-NEXT: b.ne [[GET_OUT:.LBB[0-9]+_[0-9]+]]
834 ; As above, w1 is a reasonable guess.
835; CHECK: stxrb [[STATUS:w[0-9]+]], w1, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000836; CHECK-NEXT: cbnz [[STATUS]], [[STARTAGAIN]]
Tim Northover15410e92013-04-08 08:40:41 +0000837; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000838
839; CHECK: mov x0, x[[OLD]]
840 ret i8 %old
841}
842
843define i16 @test_atomic_cmpxchg_i16(i16 %wanted, i16 %new) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000844; CHECK-LABEL: test_atomic_cmpxchg_i16:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000845 %old = cmpxchg i16* @var16, i16 %wanted, i16 %new seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000846; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000847; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
848; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
849
850; CHECK: [[STARTAGAIN:.LBB[0-9]+_[0-9]+]]:
Tim Northover15410e92013-04-08 08:40:41 +0000851; CHECK-NEXT: ldaxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000852 ; w0 below is a reasonable guess but could change: it certainly comes into the
853 ; function there.
854; CHECK-NEXT: cmp w[[OLD]], w0
855; CHECK-NEXT: b.ne [[GET_OUT:.LBB[0-9]+_[0-9]+]]
856 ; As above, w1 is a reasonable guess.
Tim Northover15410e92013-04-08 08:40:41 +0000857; CHECK: stlxrh [[STATUS:w[0-9]+]], w1, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000858; CHECK-NEXT: cbnz [[STATUS]], [[STARTAGAIN]]
Tim Northover15410e92013-04-08 08:40:41 +0000859; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000860
861; CHECK: mov x0, x[[OLD]]
862 ret i16 %old
863}
864
865define i32 @test_atomic_cmpxchg_i32(i32 %wanted, i32 %new) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000866; CHECK-LABEL: test_atomic_cmpxchg_i32:
Tim Northover15410e92013-04-08 08:40:41 +0000867 %old = cmpxchg i32* @var32, i32 %wanted, i32 %new release
868; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000869; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
870; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
871
872; CHECK: [[STARTAGAIN:.LBB[0-9]+_[0-9]+]]:
873; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
874 ; w0 below is a reasonable guess but could change: it certainly comes into the
875 ; function there.
876; CHECK-NEXT: cmp w[[OLD]], w0
877; CHECK-NEXT: b.ne [[GET_OUT:.LBB[0-9]+_[0-9]+]]
878 ; As above, w1 is a reasonable guess.
Tim Northover15410e92013-04-08 08:40:41 +0000879; CHECK: stlxr [[STATUS:w[0-9]+]], w1, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000880; CHECK-NEXT: cbnz [[STATUS]], [[STARTAGAIN]]
Tim Northover15410e92013-04-08 08:40:41 +0000881; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000882
883; CHECK: mov x0, x[[OLD]]
884 ret i32 %old
885}
886
887define i64 @test_atomic_cmpxchg_i64(i64 %wanted, i64 %new) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000888; CHECK-LABEL: test_atomic_cmpxchg_i64:
Tim Northover15410e92013-04-08 08:40:41 +0000889 %old = cmpxchg i64* @var64, i64 %wanted, i64 %new monotonic
890; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000891; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
892; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
893
894; CHECK: [[STARTAGAIN:.LBB[0-9]+_[0-9]+]]:
895; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
896 ; w0 below is a reasonable guess but could change: it certainly comes into the
897 ; function there.
898; CHECK-NEXT: cmp x[[OLD]], x0
899; CHECK-NEXT: b.ne [[GET_OUT:.LBB[0-9]+_[0-9]+]]
900 ; As above, w1 is a reasonable guess.
901; CHECK: stxr [[STATUS:w[0-9]+]], x1, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000902; CHECK-NEXT: cbnz [[STATUS]], [[STARTAGAIN]]
Tim Northover15410e92013-04-08 08:40:41 +0000903; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000904
905; CHECK: mov x0, x[[OLD]]
906 ret i64 %old
907}
908
909define i8 @test_atomic_load_monotonic_i8() nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000910; CHECK-LABEL: test_atomic_load_monotonic_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000911 %val = load atomic i8* @var8 monotonic, align 1
912; CHECK-NOT: dmb
913; CHECK: adrp x[[HIADDR:[0-9]+]], var8
914; CHECK: ldrb w0, [x[[HIADDR]], #:lo12:var8]
915; CHECK-NOT: dmb
916
917 ret i8 %val
918}
919
920define i8 @test_atomic_load_monotonic_regoff_i8(i64 %base, i64 %off) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000921; CHECK-LABEL: test_atomic_load_monotonic_regoff_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000922 %addr_int = add i64 %base, %off
923 %addr = inttoptr i64 %addr_int to i8*
924
925 %val = load atomic i8* %addr monotonic, align 1
926; CHECK-NOT: dmb
927; CHECK: ldrb w0, [x0, x1]
928; CHECK-NOT: dmb
929
930 ret i8 %val
931}
932
933define i8 @test_atomic_load_acquire_i8() nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000934; CHECK-LABEL: test_atomic_load_acquire_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000935 %val = load atomic i8* @var8 acquire, align 1
Tim Northover15410e92013-04-08 08:40:41 +0000936; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000937; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
Tim Northover15410e92013-04-08 08:40:41 +0000938; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000939; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
Tim Northover15410e92013-04-08 08:40:41 +0000940; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000941; CHECK: ldarb w0, [x[[ADDR]]]
Tim Northover15410e92013-04-08 08:40:41 +0000942; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000943 ret i8 %val
944}
945
946define i8 @test_atomic_load_seq_cst_i8() nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000947; CHECK-LABEL: test_atomic_load_seq_cst_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000948 %val = load atomic i8* @var8 seq_cst, align 1
Tim Northover15410e92013-04-08 08:40:41 +0000949; CHECK-NOT: dmb
950; CHECK: adrp [[HIADDR:x[0-9]+]], var8
951; CHECK-NOT: dmb
952; CHECK: add x[[ADDR:[0-9]+]], [[HIADDR]], #:lo12:var8
953; CHECK-NOT: dmb
954; CHECK: ldarb w0, [x[[ADDR]]]
955; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000956 ret i8 %val
957}
958
959define i16 @test_atomic_load_monotonic_i16() nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000960; CHECK-LABEL: test_atomic_load_monotonic_i16:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000961 %val = load atomic i16* @var16 monotonic, align 2
962; CHECK-NOT: dmb
963; CHECK: adrp x[[HIADDR:[0-9]+]], var16
Tim Northover15410e92013-04-08 08:40:41 +0000964; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000965; CHECK: ldrh w0, [x[[HIADDR]], #:lo12:var16]
966; CHECK-NOT: dmb
967
968 ret i16 %val
969}
970
971define i32 @test_atomic_load_monotonic_regoff_i32(i64 %base, i64 %off) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000972; CHECK-LABEL: test_atomic_load_monotonic_regoff_i32:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000973 %addr_int = add i64 %base, %off
974 %addr = inttoptr i64 %addr_int to i32*
975
976 %val = load atomic i32* %addr monotonic, align 4
977; CHECK-NOT: dmb
978; CHECK: ldr w0, [x0, x1]
979; CHECK-NOT: dmb
980
981 ret i32 %val
982}
983
984define i64 @test_atomic_load_seq_cst_i64() nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000985; CHECK-LABEL: test_atomic_load_seq_cst_i64:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000986 %val = load atomic i64* @var64 seq_cst, align 8
Tim Northover15410e92013-04-08 08:40:41 +0000987; CHECK-NOT: dmb
988; CHECK: adrp [[HIADDR:x[0-9]+]], var64
989; CHECK-NOT: dmb
990; CHECK: add x[[ADDR:[0-9]+]], [[HIADDR]], #:lo12:var64
991; CHECK-NOT: dmb
992; CHECK: ldar x0, [x[[ADDR]]]
993; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000994 ret i64 %val
995}
996
997define void @test_atomic_store_monotonic_i8(i8 %val) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000998; CHECK-LABEL: test_atomic_store_monotonic_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000999 store atomic i8 %val, i8* @var8 monotonic, align 1
1000; CHECK: adrp x[[HIADDR:[0-9]+]], var8
1001; CHECK: strb w0, [x[[HIADDR]], #:lo12:var8]
1002
1003 ret void
1004}
1005
1006define void @test_atomic_store_monotonic_regoff_i8(i64 %base, i64 %off, i8 %val) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001007; CHECK-LABEL: test_atomic_store_monotonic_regoff_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001008
1009 %addr_int = add i64 %base, %off
1010 %addr = inttoptr i64 %addr_int to i8*
1011
1012 store atomic i8 %val, i8* %addr monotonic, align 1
1013; CHECK: strb w2, [x0, x1]
1014
1015 ret void
1016}
1017define void @test_atomic_store_release_i8(i8 %val) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001018; CHECK-LABEL: test_atomic_store_release_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001019 store atomic i8 %val, i8* @var8 release, align 1
Tim Northover15410e92013-04-08 08:40:41 +00001020; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001021; CHECK: adrp [[HIADDR:x[0-9]+]], var8
Tim Northover15410e92013-04-08 08:40:41 +00001022; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001023; CHECK: add x[[ADDR:[0-9]+]], [[HIADDR]], #:lo12:var8
Tim Northover15410e92013-04-08 08:40:41 +00001024; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001025; CHECK: stlrb w0, [x[[ADDR]]]
Tim Northover15410e92013-04-08 08:40:41 +00001026; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001027 ret void
1028}
1029
1030define void @test_atomic_store_seq_cst_i8(i8 %val) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001031; CHECK-LABEL: test_atomic_store_seq_cst_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001032 store atomic i8 %val, i8* @var8 seq_cst, align 1
Tim Northover15410e92013-04-08 08:40:41 +00001033; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001034; CHECK: adrp [[HIADDR:x[0-9]+]], var8
Tim Northover15410e92013-04-08 08:40:41 +00001035; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001036; CHECK: add x[[ADDR:[0-9]+]], [[HIADDR]], #:lo12:var8
Tim Northover15410e92013-04-08 08:40:41 +00001037; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001038; CHECK: stlrb w0, [x[[ADDR]]]
Tim Northover15410e92013-04-08 08:40:41 +00001039; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001040
1041 ret void
1042}
1043
1044define void @test_atomic_store_monotonic_i16(i16 %val) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001045; CHECK-LABEL: test_atomic_store_monotonic_i16:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001046 store atomic i16 %val, i16* @var16 monotonic, align 2
Tim Northover15410e92013-04-08 08:40:41 +00001047; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001048; CHECK: adrp x[[HIADDR:[0-9]+]], var16
Tim Northover15410e92013-04-08 08:40:41 +00001049; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001050; CHECK: strh w0, [x[[HIADDR]], #:lo12:var16]
Tim Northover15410e92013-04-08 08:40:41 +00001051; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001052 ret void
1053}
1054
1055define void @test_atomic_store_monotonic_regoff_i32(i64 %base, i64 %off, i32 %val) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001056; CHECK-LABEL: test_atomic_store_monotonic_regoff_i32:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001057
1058 %addr_int = add i64 %base, %off
1059 %addr = inttoptr i64 %addr_int to i32*
1060
1061 store atomic i32 %val, i32* %addr monotonic, align 4
Tim Northover15410e92013-04-08 08:40:41 +00001062; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001063; CHECK: str w2, [x0, x1]
Tim Northover15410e92013-04-08 08:40:41 +00001064; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001065
1066 ret void
1067}
1068
1069define void @test_atomic_store_release_i64(i64 %val) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001070; CHECK-LABEL: test_atomic_store_release_i64:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001071 store atomic i64 %val, i64* @var64 release, align 8
Tim Northover15410e92013-04-08 08:40:41 +00001072; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001073; CHECK: adrp [[HIADDR:x[0-9]+]], var64
Tim Northover15410e92013-04-08 08:40:41 +00001074; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001075; CHECK: add x[[ADDR:[0-9]+]], [[HIADDR]], #:lo12:var64
Tim Northover15410e92013-04-08 08:40:41 +00001076; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001077; CHECK: stlr x0, [x[[ADDR]]]
Tim Northover15410e92013-04-08 08:40:41 +00001078; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001079 ret void
1080}