blob: 5fe29364ee38705e2d9356808276663357771435 [file] [log] [blame]
Tim Northovere3d42362013-02-01 11:40:47 +00001; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs < %s | FileCheck %s
Kevin Qin07334d32014-02-21 07:45:48 +00002; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs < %s | FileCheck --check-prefix=CHECK-REG %s
Tim Northovere0e3aef2013-01-31 12:12:40 +00003
4@var8 = global i8 0
5@var16 = global i16 0
6@var32 = global i32 0
7@var64 = global i64 0
8
9define i8 @test_atomic_load_add_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +000010; CHECK-LABEL: test_atomic_load_add_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +000011 %old = atomicrmw add i8* @var8, i8 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +000012; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000013; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
14; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
15
16; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +000017; CHECK-NEXT: ldaxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +000018 ; w0 below is a reasonable guess but could change: it certainly comes into the
19 ; function there.
20; CHECK-NEXT: add [[NEW:w[0-9]+]], w[[OLD]], w0
Kevin Qin07334d32014-02-21 07:45:48 +000021; CHECK-REG: add w[[NEW:[0-9]+]], w{{[0-9]+}}, w0
22; CHECK-REG-NOT: stlxrb w[[NEW]], w[[NEW]], [x{{[0-9]+}}]
Tim Northover15410e92013-04-08 08:40:41 +000023; CHECK-NEXT: stlxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +000024; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +000025; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000026
27; CHECK: mov x0, x[[OLD]]
28 ret i8 %old
29}
30
31define i16 @test_atomic_load_add_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +000032; CHECK-LABEL: test_atomic_load_add_i16:
Tim Northover15410e92013-04-08 08:40:41 +000033 %old = atomicrmw add i16* @var16, i16 %offset acquire
34; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000035; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
36; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
37
38; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +000039; CHECK-NEXT: ldaxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +000040 ; w0 below is a reasonable guess but could change: it certainly comes into the
41 ; function there.
42; CHECK-NEXT: add [[NEW:w[0-9]+]], w[[OLD]], w0
Kevin Qin07334d32014-02-21 07:45:48 +000043; CHECK-REG: add w[[NEW:[0-9]+]], w{{[0-9]+}}, w0
44; CHECK-REG-NOT: stxrh w[[NEW]], w[[NEW]], [x{{[0-9]+}}]
Tim Northovere0e3aef2013-01-31 12:12:40 +000045; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +000046; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +000047; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000048
49; CHECK: mov x0, x[[OLD]]
50 ret i16 %old
51}
52
53define i32 @test_atomic_load_add_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +000054; CHECK-LABEL: test_atomic_load_add_i32:
Tim Northover15410e92013-04-08 08:40:41 +000055 %old = atomicrmw add i32* @var32, i32 %offset release
56; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000057; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
58; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
59
60; CHECK: .LBB{{[0-9]+}}_1:
61; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
62 ; w0 below is a reasonable guess but could change: it certainly comes into the
63 ; function there.
64; CHECK-NEXT: add [[NEW:w[0-9]+]], w[[OLD]], w0
Kevin Qin07334d32014-02-21 07:45:48 +000065; CHECK-REG: add w[[NEW:[0-9]+]], w{{[0-9]+}}, w0
66; CHECK-REG-NOT: stlxr w[[NEW]], w[[NEW]], [x{{[0-9]+}}]
Tim Northover15410e92013-04-08 08:40:41 +000067; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +000068; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +000069; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000070
71; CHECK: mov x0, x[[OLD]]
72 ret i32 %old
73}
74
75define i64 @test_atomic_load_add_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +000076; CHECK-LABEL: test_atomic_load_add_i64:
Tim Northover15410e92013-04-08 08:40:41 +000077 %old = atomicrmw add i64* @var64, i64 %offset monotonic
78; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000079; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
80; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
81
82; CHECK: .LBB{{[0-9]+}}_1:
83; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
84 ; x0 below is a reasonable guess but could change: it certainly comes into the
85 ; function there.
86; CHECK-NEXT: add [[NEW:x[0-9]+]], x[[OLD]], x0
Kevin Qin07334d32014-02-21 07:45:48 +000087; CHECK-REG: add x[[NEW:[0-9]+]], x{{[0-9]+}}, x0
88; CHECK-REG-NOT: stxr w[[NEW]], x[[NEW]], [x{{[0-9]+}}]
Tim Northovere0e3aef2013-01-31 12:12:40 +000089; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +000090; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +000091; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000092
93; CHECK: mov x0, x[[OLD]]
94 ret i64 %old
95}
96
97define i8 @test_atomic_load_sub_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +000098; CHECK-LABEL: test_atomic_load_sub_i8:
Tim Northover15410e92013-04-08 08:40:41 +000099 %old = atomicrmw sub i8* @var8, i8 %offset monotonic
100; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000101; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
102; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
103
104; CHECK: .LBB{{[0-9]+}}_1:
105; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
106 ; w0 below is a reasonable guess but could change: it certainly comes into the
107 ; function there.
108; CHECK-NEXT: sub [[NEW:w[0-9]+]], w[[OLD]], w0
Kevin Qin07334d32014-02-21 07:45:48 +0000109; CHECK-REG: sub w[[NEW:[0-9]+]], w{{[0-9]+}}, w0
110; CHECK-REG-NOT: stxrb w[[NEW]], w[[NEW]], [x{{[0-9]+}}]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000111; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000112; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000113; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000114
115; CHECK: mov x0, x[[OLD]]
116 ret i8 %old
117}
118
119define i16 @test_atomic_load_sub_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000120; CHECK-LABEL: test_atomic_load_sub_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000121 %old = atomicrmw sub i16* @var16, i16 %offset release
122; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000123; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
124; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
125
126; CHECK: .LBB{{[0-9]+}}_1:
127; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
128 ; w0 below is a reasonable guess but could change: it certainly comes into the
129 ; function there.
130; CHECK-NEXT: sub [[NEW:w[0-9]+]], w[[OLD]], w0
Kevin Qin07334d32014-02-21 07:45:48 +0000131; CHECK-REG: sub w[[NEW:[0-9]+]], w{{[0-9]+}}, w0
132; CHECK-REG-NOT: stlxrh w[[NEW]], w[[NEW]], [x{{[0-9]+}}]
Tim Northover15410e92013-04-08 08:40:41 +0000133; CHECK-NEXT: stlxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000134; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000135; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000136
137; CHECK: mov x0, x[[OLD]]
138 ret i16 %old
139}
140
141define i32 @test_atomic_load_sub_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000142; CHECK-LABEL: test_atomic_load_sub_i32:
Tim Northover15410e92013-04-08 08:40:41 +0000143 %old = atomicrmw sub i32* @var32, i32 %offset acquire
144; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000145; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
146; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
147
148; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000149; CHECK-NEXT: ldaxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000150 ; w0 below is a reasonable guess but could change: it certainly comes into the
151 ; function there.
152; CHECK-NEXT: sub [[NEW:w[0-9]+]], w[[OLD]], w0
Kevin Qin07334d32014-02-21 07:45:48 +0000153; CHECK-REG: sub w[[NEW:[0-9]+]], w{{[0-9]+}}, w0
154; CHECK-REG-NOT: stxr w[[NEW]], w[[NEW]], [x{{[0-9]+}}]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000155; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000156; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000157; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000158
159; CHECK: mov x0, x[[OLD]]
160 ret i32 %old
161}
162
163define i64 @test_atomic_load_sub_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000164; CHECK-LABEL: test_atomic_load_sub_i64:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000165 %old = atomicrmw sub i64* @var64, i64 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000166; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000167; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
168; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
169
170; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000171; CHECK-NEXT: ldaxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000172 ; x0 below is a reasonable guess but could change: it certainly comes into the
173 ; function there.
174; CHECK-NEXT: sub [[NEW:x[0-9]+]], x[[OLD]], x0
Kevin Qin07334d32014-02-21 07:45:48 +0000175; CHECK-REG: sub x[[NEW:[0-9]+]], x{{[0-9]+}}, x0
176; CHECK-REG-NOT: stlxr w[[NEW]], x[[NEW]], [x{{[0-9]+}}]
Tim Northover15410e92013-04-08 08:40:41 +0000177; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000178; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000179; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000180
181; CHECK: mov x0, x[[OLD]]
182 ret i64 %old
183}
184
185define i8 @test_atomic_load_and_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000186; CHECK-LABEL: test_atomic_load_and_i8:
Tim Northover15410e92013-04-08 08:40:41 +0000187 %old = atomicrmw and i8* @var8, i8 %offset release
188; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000189; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
190; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
191
192; CHECK: .LBB{{[0-9]+}}_1:
193; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
194 ; w0 below is a reasonable guess but could change: it certainly comes into the
195 ; function there.
196; CHECK-NEXT: and [[NEW:w[0-9]+]], w[[OLD]], w0
Kevin Qin07334d32014-02-21 07:45:48 +0000197; CHECK-REG: and w[[NEW:[0-9]+]], w{{[0-9]+}}, w0
198; CHECK-REG-NOT: stlxrb w[[NEW]], w[[NEW]], [x{{[0-9]+}}]
Tim Northover15410e92013-04-08 08:40:41 +0000199; CHECK-NEXT: stlxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000200; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000201; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000202
203; CHECK: mov x0, x[[OLD]]
204 ret i8 %old
205}
206
207define i16 @test_atomic_load_and_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000208; CHECK-LABEL: test_atomic_load_and_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000209 %old = atomicrmw and i16* @var16, i16 %offset monotonic
210; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000211; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
212; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
213
214; CHECK: .LBB{{[0-9]+}}_1:
215; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
216 ; w0 below is a reasonable guess but could change: it certainly comes into the
217 ; function there.
218; CHECK-NEXT: and [[NEW:w[0-9]+]], w[[OLD]], w0
Kevin Qin07334d32014-02-21 07:45:48 +0000219; CHECK-REG: and w[[NEW:[0-9]+]], w{{[0-9]+}}, w0
220; CHECK-REG-NOT: stxrh w[[NEW]], w[[NEW]], [x{{[0-9]+}}]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000221; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000222; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000223; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000224
225; CHECK: mov x0, x[[OLD]]
226 ret i16 %old
227}
228
229define i32 @test_atomic_load_and_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000230; CHECK-LABEL: test_atomic_load_and_i32:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000231 %old = atomicrmw and i32* @var32, i32 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000232; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000233; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
234; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
235
236; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000237; CHECK-NEXT: ldaxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000238 ; w0 below is a reasonable guess but could change: it certainly comes into the
239 ; function there.
240; CHECK-NEXT: and [[NEW:w[0-9]+]], w[[OLD]], w0
Kevin Qin07334d32014-02-21 07:45:48 +0000241; CHECK-REG: and w[[NEW:[0-9]+]], w{{[0-9]+}}, w0
242; CHECK-REG-NOT: stlxr w[[NEW]], w[[NEW]], [x{{[0-9]+}}]
Tim Northover15410e92013-04-08 08:40:41 +0000243; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000244; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000245; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000246
247; CHECK: mov x0, x[[OLD]]
248 ret i32 %old
249}
250
251define i64 @test_atomic_load_and_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000252; CHECK-LABEL: test_atomic_load_and_i64:
Tim Northover15410e92013-04-08 08:40:41 +0000253 %old = atomicrmw and i64* @var64, i64 %offset acquire
254; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000255; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
256; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
257
258; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000259; CHECK-NEXT: ldaxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000260 ; x0 below is a reasonable guess but could change: it certainly comes into the
261 ; function there.
262; CHECK-NEXT: and [[NEW:x[0-9]+]], x[[OLD]], x0
Kevin Qin07334d32014-02-21 07:45:48 +0000263; CHECK-REG: and x[[NEW:[0-9]+]], x{{[0-9]+}}, x0
264; CHECK-REG-NOT: stxr w[[NEW]], x[[NEW]], [x{{[0-9]+}}]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000265; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000266; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000267; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000268
269; CHECK: mov x0, x[[OLD]]
270 ret i64 %old
271}
272
273define i8 @test_atomic_load_or_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000274; CHECK-LABEL: test_atomic_load_or_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000275 %old = atomicrmw or i8* @var8, i8 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000276; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000277; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
278; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
279
280; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000281; CHECK-NEXT: ldaxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000282 ; w0 below is a reasonable guess but could change: it certainly comes into the
283 ; function there.
284; CHECK-NEXT: orr [[NEW:w[0-9]+]], w[[OLD]], w0
Kevin Qin07334d32014-02-21 07:45:48 +0000285; CHECK-REG: orr w[[NEW:[0-9]+]], w{{[0-9]+}}, w0
286; CHECK-REG-NOT: stlxrb w[[NEW]], w[[NEW]], [x{{[0-9]+}}]
Tim Northover15410e92013-04-08 08:40:41 +0000287; CHECK-NEXT: stlxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000288; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000289; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000290
291; CHECK: mov x0, x[[OLD]]
292 ret i8 %old
293}
294
295define i16 @test_atomic_load_or_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000296; CHECK-LABEL: test_atomic_load_or_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000297 %old = atomicrmw or i16* @var16, i16 %offset monotonic
298; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000299; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
300; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
301
302; CHECK: .LBB{{[0-9]+}}_1:
303; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
304 ; w0 below is a reasonable guess but could change: it certainly comes into the
305 ; function there.
306; CHECK-NEXT: orr [[NEW:w[0-9]+]], w[[OLD]], w0
Kevin Qin07334d32014-02-21 07:45:48 +0000307; CHECK-REG: orr w[[NEW:[0-9]+]], w{{[0-9]+}}, w0
308; CHECK-REG-NOT: stxrh w[[NEW]], w[[NEW]], [x{{[0-9]+}}]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000309; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000310; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000311; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000312
313; CHECK: mov x0, x[[OLD]]
314 ret i16 %old
315}
316
317define i32 @test_atomic_load_or_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000318; CHECK-LABEL: test_atomic_load_or_i32:
Tim Northover15410e92013-04-08 08:40:41 +0000319 %old = atomicrmw or i32* @var32, i32 %offset acquire
320; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000321; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
322; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
323
324; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000325; CHECK-NEXT: ldaxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000326 ; w0 below is a reasonable guess but could change: it certainly comes into the
327 ; function there.
328; CHECK-NEXT: orr [[NEW:w[0-9]+]], w[[OLD]], w0
Kevin Qin07334d32014-02-21 07:45:48 +0000329; CHECK-REG: orr w[[NEW:[0-9]+]], w{{[0-9]+}}, w0
330; CHECK-REG-NOT: stxr w[[NEW]], w[[NEW]], [x{{[0-9]+}}]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000331; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000332; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000333; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000334
335; CHECK: mov x0, x[[OLD]]
336 ret i32 %old
337}
338
339define i64 @test_atomic_load_or_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000340; CHECK-LABEL: test_atomic_load_or_i64:
Tim Northover15410e92013-04-08 08:40:41 +0000341 %old = atomicrmw or i64* @var64, i64 %offset release
342; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000343; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
344; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
345
346; CHECK: .LBB{{[0-9]+}}_1:
347; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
348 ; x0 below is a reasonable guess but could change: it certainly comes into the
349 ; function there.
350; CHECK-NEXT: orr [[NEW:x[0-9]+]], x[[OLD]], x0
Kevin Qin07334d32014-02-21 07:45:48 +0000351; CHECK-REG: orr x[[NEW:[0-9]+]], x{{[0-9]+}}, x0
352; CHECK-REG-NOT: stlxr w[[NEW]], x[[NEW]], [x{{[0-9]+}}]
Tim Northover15410e92013-04-08 08:40:41 +0000353; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000354; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000355; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000356
357; CHECK: mov x0, x[[OLD]]
358 ret i64 %old
359}
360
361define i8 @test_atomic_load_xor_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000362; CHECK-LABEL: test_atomic_load_xor_i8:
Tim Northover15410e92013-04-08 08:40:41 +0000363 %old = atomicrmw xor i8* @var8, i8 %offset acquire
364; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000365; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
366; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
367
368; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000369; CHECK-NEXT: ldaxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000370 ; w0 below is a reasonable guess but could change: it certainly comes into the
371 ; function there.
372; CHECK-NEXT: eor [[NEW:w[0-9]+]], w[[OLD]], w0
Kevin Qin07334d32014-02-21 07:45:48 +0000373; CHECK-REG: eor w[[NEW:[0-9]+]], w{{[0-9]+}}, w0
374; CHECK-REG-NOT: stxrb w[[NEW]], w[[NEW]], [x{{[0-9]+}}]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000375; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000376; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000377; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000378
379; CHECK: mov x0, x[[OLD]]
380 ret i8 %old
381}
382
383define i16 @test_atomic_load_xor_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000384; CHECK-LABEL: test_atomic_load_xor_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000385 %old = atomicrmw xor i16* @var16, i16 %offset release
386; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000387; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
388; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
389
390; CHECK: .LBB{{[0-9]+}}_1:
391; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
392 ; w0 below is a reasonable guess but could change: it certainly comes into the
393 ; function there.
394; CHECK-NEXT: eor [[NEW:w[0-9]+]], w[[OLD]], w0
Kevin Qin07334d32014-02-21 07:45:48 +0000395; CHECK-REG: eor w[[NEW:[0-9]+]], w{{[0-9]+}}, w0
396; CHECK-REG-NOT: stxrh w[[NEW]], w[[NEW]], [x{{[0-9]+}}]
Tim Northover15410e92013-04-08 08:40:41 +0000397; CHECK-NEXT: stlxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000398; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000399; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000400
401; CHECK: mov x0, x[[OLD]]
402 ret i16 %old
403}
404
405define i32 @test_atomic_load_xor_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000406; CHECK-LABEL: test_atomic_load_xor_i32:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000407 %old = atomicrmw xor i32* @var32, i32 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000408; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000409; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
410; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
411
412; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000413; CHECK-NEXT: ldaxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000414 ; w0 below is a reasonable guess but could change: it certainly comes into the
415 ; function there.
416; CHECK-NEXT: eor [[NEW:w[0-9]+]], w[[OLD]], w0
Kevin Qin07334d32014-02-21 07:45:48 +0000417; CHECK-REG: eor w[[NEW:[0-9]+]], w{{[0-9]+}}, w0
418; CHECK-REG-NOT: stlxr w[[NEW]], w[[NEW]], [x{{[0-9]+}}]
Tim Northover15410e92013-04-08 08:40:41 +0000419; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [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 i32 %old
425}
426
427define i64 @test_atomic_load_xor_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000428; CHECK-LABEL: test_atomic_load_xor_i64:
Tim Northover15410e92013-04-08 08:40:41 +0000429 %old = atomicrmw xor i64* @var64, i64 %offset monotonic
430; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000431; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
432; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
433
434; CHECK: .LBB{{[0-9]+}}_1:
435; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
436 ; x0 below is a reasonable guess but could change: it certainly comes into the
437 ; function there.
438; CHECK-NEXT: eor [[NEW:x[0-9]+]], x[[OLD]], x0
Kevin Qin07334d32014-02-21 07:45:48 +0000439; CHECK-REG: eor x[[NEW:[0-9]+]], x{{[0-9]+}}, x0
440; CHECK-REG-NOT: stxr w[[NEW]], x[[NEW]], [x{{[0-9]+}}]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000441; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000442; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000443; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000444
445; CHECK: mov x0, x[[OLD]]
446 ret i64 %old
447}
448
449define i8 @test_atomic_load_xchg_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000450; CHECK-LABEL: test_atomic_load_xchg_i8:
Tim Northover15410e92013-04-08 08:40:41 +0000451 %old = atomicrmw xchg i8* @var8, i8 %offset monotonic
452; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000453; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
454; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
455
456; CHECK: .LBB{{[0-9]+}}_1:
457; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
458 ; w0 below is a reasonable guess but could change: it certainly comes into the
459 ; function there.
Kevin Qin07334d32014-02-21 07:45:48 +0000460; CHECK-REG-NOT: stxrb w0, w0, [x{{[0-9]+}}]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000461; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], w0, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000462; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000463; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000464
465; CHECK: mov x0, x[[OLD]]
466 ret i8 %old
467}
468
469define i16 @test_atomic_load_xchg_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000470; CHECK-LABEL: test_atomic_load_xchg_i16:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000471 %old = atomicrmw xchg i16* @var16, i16 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000472; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000473; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
474; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
475
476; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000477; CHECK-NEXT: ldaxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000478 ; w0 below is a reasonable guess but could change: it certainly comes into the
479 ; function there.
Kevin Qin07334d32014-02-21 07:45:48 +0000480; CHECK-REG-NOT: stlxrh w0, w0, [x{{[0-9]+}}]
Tim Northover15410e92013-04-08 08:40:41 +0000481; CHECK-NEXT: stlxrh [[STATUS:w[0-9]+]], w0, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000482; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000483; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000484
485; CHECK: mov x0, x[[OLD]]
486 ret i16 %old
487}
488
489define i32 @test_atomic_load_xchg_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000490; CHECK-LABEL: test_atomic_load_xchg_i32:
Tim Northover15410e92013-04-08 08:40:41 +0000491 %old = atomicrmw xchg i32* @var32, i32 %offset release
492; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000493; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
494; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
495
496; CHECK: .LBB{{[0-9]+}}_1:
497; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
498 ; w0 below is a reasonable guess but could change: it certainly comes into the
499 ; function there.
Kevin Qin07334d32014-02-21 07:45:48 +0000500; CHECK-REG-NOT: stlxr w0, w0, [x{{[0-9]+}}]
Tim Northover15410e92013-04-08 08:40:41 +0000501; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], w0, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000502; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000503; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000504
505; CHECK: mov x0, x[[OLD]]
506 ret i32 %old
507}
508
509define i64 @test_atomic_load_xchg_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000510; CHECK-LABEL: test_atomic_load_xchg_i64:
Tim Northover15410e92013-04-08 08:40:41 +0000511 %old = atomicrmw xchg i64* @var64, i64 %offset acquire
512; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000513; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
514; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
515
516; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000517; CHECK-NEXT: ldaxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000518 ; x0 below is a reasonable guess but could change: it certainly comes into the
519 ; function there.
Kevin Qin07334d32014-02-21 07:45:48 +0000520; CHECK-REG-NOT: stxr w0, x0, [x{{[0-9]+}}]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000521; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], x0, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000522; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000523; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000524
525; CHECK: mov x0, x[[OLD]]
526 ret i64 %old
527}
528
529
530define i8 @test_atomic_load_min_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000531; CHECK-LABEL: test_atomic_load_min_i8:
Tim Northover15410e92013-04-08 08:40:41 +0000532 %old = atomicrmw min i8* @var8, i8 %offset acquire
533; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000534; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
535; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
536
537; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000538; CHECK-NEXT: ldaxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000539 ; w0 below is a reasonable guess but could change: it certainly comes into the
540 ; function there.
541; CHECK-NEXT: cmp w0, w[[OLD]], sxtb
542; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, gt
Kevin Qin07334d32014-02-21 07:45:48 +0000543; CHECK-REG: csel w[[NEW:[0-9]+]], w{{[0-9]+}}, w0, gt
544; CHECK-REG-NOT: stxrb w[[NEW]], w[[NEW]], [x{{[0-9]+}}]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000545; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000546; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000547; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000548
549; CHECK: mov x0, x[[OLD]]
550 ret i8 %old
551}
552
553define i16 @test_atomic_load_min_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000554; CHECK-LABEL: test_atomic_load_min_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000555 %old = atomicrmw min i16* @var16, i16 %offset release
556; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000557; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
558; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
559
560; CHECK: .LBB{{[0-9]+}}_1:
561; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
562 ; w0 below is a reasonable guess but could change: it certainly comes into the
563 ; function there.
564; CHECK-NEXT: cmp w0, w[[OLD]], sxth
565; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, gt
Kevin Qin07334d32014-02-21 07:45:48 +0000566; CHECK-REG: csel w[[NEW:[0-9]+]], w{{[0-9]+}}, w0, gt
567; CHECK-REG-NOT: stlxrh w[[NEW]], w[[NEW]], [x{{[0-9]+}}]
Tim Northover15410e92013-04-08 08:40:41 +0000568; CHECK-NEXT: stlxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000569; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000570; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000571
572; CHECK: mov x0, x[[OLD]]
573 ret i16 %old
574}
575
576define i32 @test_atomic_load_min_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000577; CHECK-LABEL: test_atomic_load_min_i32:
Tim Northover15410e92013-04-08 08:40:41 +0000578 %old = atomicrmw min i32* @var32, i32 %offset monotonic
579; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000580; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
581; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
582
583; CHECK: .LBB{{[0-9]+}}_1:
584; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
585 ; w0 below is a reasonable guess but could change: it certainly comes into the
586 ; function there.
587; CHECK-NEXT: cmp w0, w[[OLD]]
588; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, gt
Kevin Qin07334d32014-02-21 07:45:48 +0000589; CHECK-REG: csel w[[NEW:[0-9]+]], w{{[0-9]+}}, w0, gt
590; CHECK-REG-NOT: stxr w[[NEW]], w[[NEW]], [x{{[0-9]+}}]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000591; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000592; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000593; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000594
595; CHECK: mov x0, x[[OLD]]
596 ret i32 %old
597}
598
599define i64 @test_atomic_load_min_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000600; CHECK-LABEL: test_atomic_load_min_i64:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000601 %old = atomicrmw min i64* @var64, i64 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000602; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000603; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
604; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
605
606; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000607; CHECK-NEXT: ldaxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000608 ; x0 below is a reasonable guess but could change: it certainly comes into the
609 ; function there.
610; CHECK-NEXT: cmp x0, x[[OLD]]
611; CHECK-NEXT: csel [[NEW:x[0-9]+]], x[[OLD]], x0, gt
Kevin Qin07334d32014-02-21 07:45:48 +0000612; CHECK-REG: csel x[[NEW:[0-9]+]], x{{[0-9]+}}, x0, gt
613; CHECK-REG-NOT: stlxr w[[NEW]], x[[NEW]], [x{{[0-9]+}}]
Tim Northover15410e92013-04-08 08:40:41 +0000614; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000615; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000616; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000617
618; CHECK: mov x0, x[[OLD]]
619 ret i64 %old
620}
621
622define i8 @test_atomic_load_max_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000623; CHECK-LABEL: test_atomic_load_max_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000624 %old = atomicrmw max i8* @var8, i8 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000625; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000626; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
627; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
628
629; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000630; CHECK-NEXT: ldaxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000631 ; w0 below is a reasonable guess but could change: it certainly comes into the
632 ; function there.
633; CHECK-NEXT: cmp w0, w[[OLD]], sxtb
634; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lt
Kevin Qin07334d32014-02-21 07:45:48 +0000635; CHECK-REG: csel w[[NEW:[0-9]+]], w{{[0-9]+}}, w0, lt
636; CHECK-REG-NOT: stlxrb w[[NEW]], w[[NEW]], [x{{[0-9]+}}]
Tim Northover15410e92013-04-08 08:40:41 +0000637; CHECK-NEXT: stlxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000638; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000639; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000640
641; CHECK: mov x0, x[[OLD]]
642 ret i8 %old
643}
644
645define i16 @test_atomic_load_max_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000646; CHECK-LABEL: test_atomic_load_max_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000647 %old = atomicrmw max i16* @var16, i16 %offset acquire
648; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000649; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
650; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
651
652; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000653; CHECK-NEXT: ldaxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000654 ; w0 below is a reasonable guess but could change: it certainly comes into the
655 ; function there.
656; CHECK-NEXT: cmp w0, w[[OLD]], sxth
657; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lt
Kevin Qin07334d32014-02-21 07:45:48 +0000658; CHECK-REG: csel w[[NEW:[0-9]+]], w{{[0-9]+}}, w0, lt
659; CHECK-REG-NOT: stxrh w[[NEW]], w[[NEW]], [x{{[0-9]+}}]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000660; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000661; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000662; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000663
664; CHECK: mov x0, x[[OLD]]
665 ret i16 %old
666}
667
668define i32 @test_atomic_load_max_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000669; CHECK-LABEL: test_atomic_load_max_i32:
Tim Northover15410e92013-04-08 08:40:41 +0000670 %old = atomicrmw max i32* @var32, i32 %offset release
671; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000672; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
673; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
674
675; CHECK: .LBB{{[0-9]+}}_1:
676; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
677 ; w0 below is a reasonable guess but could change: it certainly comes into the
678 ; function there.
679; CHECK-NEXT: cmp w0, w[[OLD]]
680; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lt
Kevin Qin07334d32014-02-21 07:45:48 +0000681; CHECK-REG: csel w[[NEW:[0-9]+]], w{{[0-9]+}}, w0, lt
682; CHECK-REG-NOT: stlxr w[[NEW]], w[[NEW]], [x{{[0-9]+}}]
Tim Northover15410e92013-04-08 08:40:41 +0000683; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000684; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000685; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000686
687; CHECK: mov x0, x[[OLD]]
688 ret i32 %old
689}
690
691define i64 @test_atomic_load_max_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000692; CHECK-LABEL: test_atomic_load_max_i64:
Tim Northover15410e92013-04-08 08:40:41 +0000693 %old = atomicrmw max i64* @var64, i64 %offset monotonic
694; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000695; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
696; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
697
698; CHECK: .LBB{{[0-9]+}}_1:
699; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
700 ; x0 below is a reasonable guess but could change: it certainly comes into the
701 ; function there.
702; CHECK-NEXT: cmp x0, x[[OLD]]
703; CHECK-NEXT: csel [[NEW:x[0-9]+]], x[[OLD]], x0, lt
Kevin Qin07334d32014-02-21 07:45:48 +0000704; CHECK-REG: csel x[[NEW:[0-9]+]], x{{[0-9]+}}, x0, lt
705; CHECK-REG-NOT: stlxr w[[NEW]], x[[NEW]], [x{{[0-9]+}}]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000706; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000707; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000708; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000709
710; CHECK: mov x0, x[[OLD]]
711 ret i64 %old
712}
713
714define i8 @test_atomic_load_umin_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000715; CHECK-LABEL: test_atomic_load_umin_i8:
Tim Northover15410e92013-04-08 08:40:41 +0000716 %old = atomicrmw umin i8* @var8, i8 %offset monotonic
717; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000718; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
719; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
720
721; CHECK: .LBB{{[0-9]+}}_1:
722; CHECK-NEXT: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
723 ; w0 below is a reasonable guess but could change: it certainly comes into the
724 ; function there.
725; CHECK-NEXT: cmp w0, w[[OLD]], uxtb
726; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, hi
Kevin Qin07334d32014-02-21 07:45:48 +0000727; CHECK-REG: csel w[[NEW:[0-9]+]], w{{[0-9]+}}, w0, hi
728; CHECK-REG-NOT: stlxr w[[NEW]], w[[NEW]], [x{{[0-9]+}}]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000729; CHECK-NEXT: stxrb [[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 i8 %old
735}
736
737define i16 @test_atomic_load_umin_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000738; CHECK-LABEL: test_atomic_load_umin_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000739 %old = atomicrmw umin i16* @var16, i16 %offset acquire
740; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000741; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
742; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
743
744; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000745; CHECK-NEXT: ldaxrh 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]], uxth
749; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, hi
Kevin Qin07334d32014-02-21 07:45:48 +0000750; CHECK-REG: csel w[[NEW:[0-9]+]], w{{[0-9]+}}, w0, hi
751; CHECK-REG-NOT: stxrh w[[NEW]], w[[NEW]], [x{{[0-9]+}}]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000752; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000753; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000754; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000755
756; CHECK: mov x0, x[[OLD]]
757 ret i16 %old
758}
759
760define i32 @test_atomic_load_umin_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000761; CHECK-LABEL: test_atomic_load_umin_i32:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000762 %old = atomicrmw umin i32* @var32, i32 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000763; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000764; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
765; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
766
767; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000768; CHECK-NEXT: ldaxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000769 ; w0 below is a reasonable guess but could change: it certainly comes into the
770 ; function there.
771; CHECK-NEXT: cmp w0, w[[OLD]]
772; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, hi
Kevin Qin07334d32014-02-21 07:45:48 +0000773; CHECK-REG: csel w[[NEW:[0-9]+]], w{{[0-9]+}}, w0, hi
774; CHECK-REG-NOT: stlxr w[[NEW]], w[[NEW]], [x{{[0-9]+}}]
Tim Northover15410e92013-04-08 08:40:41 +0000775; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000776; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000777; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000778
779; CHECK: mov x0, x[[OLD]]
780 ret i32 %old
781}
782
783define i64 @test_atomic_load_umin_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000784; CHECK-LABEL: test_atomic_load_umin_i64:
Tim Northover15410e92013-04-08 08:40:41 +0000785 %old = atomicrmw umin i64* @var64, i64 %offset acq_rel
786; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000787; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
788; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
789
790; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000791; CHECK-NEXT: ldaxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000792 ; x0 below is a reasonable guess but could change: it certainly comes into the
793 ; function there.
794; CHECK-NEXT: cmp x0, x[[OLD]]
795; CHECK-NEXT: csel [[NEW:x[0-9]+]], x[[OLD]], x0, hi
Kevin Qin07334d32014-02-21 07:45:48 +0000796; CHECK-REG: csel x[[NEW:[0-9]+]], x{{[0-9]+}}, x0, hi
797; CHECK-REG-NOT: stlxr w[[NEW]], x[[NEW]], [x{{[0-9]+}}]
Tim Northover15410e92013-04-08 08:40:41 +0000798; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000799; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000800; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000801
802; CHECK: mov x0, x[[OLD]]
803 ret i64 %old
804}
805
806define i8 @test_atomic_load_umax_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000807; CHECK-LABEL: test_atomic_load_umax_i8:
Tim Northover15410e92013-04-08 08:40:41 +0000808 %old = atomicrmw umax i8* @var8, i8 %offset acq_rel
809; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000810; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
811; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
812
813; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000814; CHECK-NEXT: ldaxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000815 ; w0 below is a reasonable guess but could change: it certainly comes into the
816 ; function there.
817; CHECK-NEXT: cmp w0, w[[OLD]], uxtb
818; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lo
Kevin Qin07334d32014-02-21 07:45:48 +0000819; CHECK-REG: csel w[[NEW:[0-9]+]], w{{[0-9]+}}, w0, lo
820; CHECK-REG-NOT: stlxrb w[[NEW]], w[[NEW]], [x{{[0-9]+}}]
Tim Northover15410e92013-04-08 08:40:41 +0000821; CHECK-NEXT: stlxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000822; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000823; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000824
825; CHECK: mov x0, x[[OLD]]
826 ret i8 %old
827}
828
829define i16 @test_atomic_load_umax_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000830; CHECK-LABEL: test_atomic_load_umax_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000831 %old = atomicrmw umax i16* @var16, i16 %offset monotonic
832; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000833; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
834; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
835
836; CHECK: .LBB{{[0-9]+}}_1:
837; CHECK-NEXT: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
838 ; w0 below is a reasonable guess but could change: it certainly comes into the
839 ; function there.
840; CHECK-NEXT: cmp w0, w[[OLD]], uxth
841; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lo
Kevin Qin07334d32014-02-21 07:45:48 +0000842; CHECK-REG: csel w[[NEW:[0-9]+]], w{{[0-9]+}}, w0, lo
843; CHECK-REG-NOT: stxrh w[[NEW]], w[[NEW]], [x{{[0-9]+}}]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000844; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000845; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000846; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000847
848; CHECK: mov x0, x[[OLD]]
849 ret i16 %old
850}
851
852define i32 @test_atomic_load_umax_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000853; CHECK-LABEL: test_atomic_load_umax_i32:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000854 %old = atomicrmw umax i32* @var32, i32 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000855; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000856; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
857; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
858
859; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover15410e92013-04-08 08:40:41 +0000860; CHECK-NEXT: ldaxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000861 ; w0 below is a reasonable guess but could change: it certainly comes into the
862 ; function there.
863; CHECK-NEXT: cmp w0, w[[OLD]]
864; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lo
Kevin Qin07334d32014-02-21 07:45:48 +0000865; CHECK-REG: csel w[[NEW:[0-9]+]], w{{[0-9]+}}, w0, lo
866; CHECK-REG-NOT: stlxr w[[NEW]], w[[NEW]], [x{{[0-9]+}}]
Tim Northover15410e92013-04-08 08:40:41 +0000867; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000868; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000869; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000870
871; CHECK: mov x0, x[[OLD]]
872 ret i32 %old
873}
874
875define i64 @test_atomic_load_umax_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000876; CHECK-LABEL: test_atomic_load_umax_i64:
Tim Northover15410e92013-04-08 08:40:41 +0000877 %old = atomicrmw umax i64* @var64, i64 %offset release
878; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000879; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
880; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
881
882; CHECK: .LBB{{[0-9]+}}_1:
883; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
884 ; x0 below is a reasonable guess but could change: it certainly comes into the
885 ; function there.
886; CHECK-NEXT: cmp x0, x[[OLD]]
887; CHECK-NEXT: csel [[NEW:x[0-9]+]], x[[OLD]], x0, lo
Kevin Qin07334d32014-02-21 07:45:48 +0000888; CHECK-REG: csel x[[NEW:[0-9]+]], x{{[0-9]+}}, x0, lo
889; CHECK-REG-NOT: stlxr w[[NEW]], x[[NEW]], [x{{[0-9]+}}]
Tim Northover15410e92013-04-08 08:40:41 +0000890; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000891; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000892; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000893
894; CHECK: mov x0, x[[OLD]]
895 ret i64 %old
896}
897
898define i8 @test_atomic_cmpxchg_i8(i8 %wanted, i8 %new) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000899; CHECK-LABEL: test_atomic_cmpxchg_i8:
Tim Northovere94a5182014-03-11 10:48:52 +0000900 %old = cmpxchg i8* @var8, i8 %wanted, i8 %new acquire acquire
Tim Northover15410e92013-04-08 08:40:41 +0000901; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000902; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
903; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
904
905; CHECK: [[STARTAGAIN:.LBB[0-9]+_[0-9]+]]:
Tim Northover15410e92013-04-08 08:40:41 +0000906; CHECK-NEXT: ldaxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000907 ; w0 below is a reasonable guess but could change: it certainly comes into the
908 ; function there.
909; CHECK-NEXT: cmp w[[OLD]], w0
910; CHECK-NEXT: b.ne [[GET_OUT:.LBB[0-9]+_[0-9]+]]
911 ; As above, w1 is a reasonable guess.
Kevin Qin07334d32014-02-21 07:45:48 +0000912; CHECK-REG-NOT: stxrb w1, w1, [x{{[0-9]+}}]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000913; CHECK: stxrb [[STATUS:w[0-9]+]], w1, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000914; CHECK-NEXT: cbnz [[STATUS]], [[STARTAGAIN]]
Tim Northover15410e92013-04-08 08:40:41 +0000915; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000916
917; CHECK: mov x0, x[[OLD]]
918 ret i8 %old
919}
920
921define i16 @test_atomic_cmpxchg_i16(i16 %wanted, i16 %new) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000922; CHECK-LABEL: test_atomic_cmpxchg_i16:
Tim Northovere94a5182014-03-11 10:48:52 +0000923 %old = cmpxchg i16* @var16, i16 %wanted, i16 %new seq_cst seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000924; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000925; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
926; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var16
927
928; CHECK: [[STARTAGAIN:.LBB[0-9]+_[0-9]+]]:
Tim Northover15410e92013-04-08 08:40:41 +0000929; CHECK-NEXT: ldaxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000930 ; w0 below is a reasonable guess but could change: it certainly comes into the
931 ; function there.
932; CHECK-NEXT: cmp w[[OLD]], w0
933; CHECK-NEXT: b.ne [[GET_OUT:.LBB[0-9]+_[0-9]+]]
934 ; As above, w1 is a reasonable guess.
Kevin Qin07334d32014-02-21 07:45:48 +0000935; CHECK-REG-NOT: stlxrh w1, w1, [x{{[0-9]+}}]
Tim Northover15410e92013-04-08 08:40:41 +0000936; CHECK: stlxrh [[STATUS:w[0-9]+]], w1, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000937; CHECK-NEXT: cbnz [[STATUS]], [[STARTAGAIN]]
Tim Northover15410e92013-04-08 08:40:41 +0000938; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000939
940; CHECK: mov x0, x[[OLD]]
941 ret i16 %old
942}
943
944define i32 @test_atomic_cmpxchg_i32(i32 %wanted, i32 %new) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000945; CHECK-LABEL: test_atomic_cmpxchg_i32:
Tim Northovere94a5182014-03-11 10:48:52 +0000946 %old = cmpxchg i32* @var32, i32 %wanted, i32 %new release monotonic
Tim Northover15410e92013-04-08 08:40:41 +0000947; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000948; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
949; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var32
950
951; CHECK: [[STARTAGAIN:.LBB[0-9]+_[0-9]+]]:
952; CHECK-NEXT: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
953 ; w0 below is a reasonable guess but could change: it certainly comes into the
954 ; function there.
955; CHECK-NEXT: cmp w[[OLD]], w0
956; CHECK-NEXT: b.ne [[GET_OUT:.LBB[0-9]+_[0-9]+]]
957 ; As above, w1 is a reasonable guess.
Kevin Qin07334d32014-02-21 07:45:48 +0000958; CHECK-REG-NOT: stlxr w1, w1, [x{{[0-9]+}}]
Tim Northover15410e92013-04-08 08:40:41 +0000959; CHECK: stlxr [[STATUS:w[0-9]+]], w1, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000960; CHECK-NEXT: cbnz [[STATUS]], [[STARTAGAIN]]
Tim Northover15410e92013-04-08 08:40:41 +0000961; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000962
963; CHECK: mov x0, x[[OLD]]
964 ret i32 %old
965}
966
967define i64 @test_atomic_cmpxchg_i64(i64 %wanted, i64 %new) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000968; CHECK-LABEL: test_atomic_cmpxchg_i64:
Tim Northovere94a5182014-03-11 10:48:52 +0000969 %old = cmpxchg i64* @var64, i64 %wanted, i64 %new monotonic monotonic
Tim Northover15410e92013-04-08 08:40:41 +0000970; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000971; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
972; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var64
973
974; CHECK: [[STARTAGAIN:.LBB[0-9]+_[0-9]+]]:
975; CHECK-NEXT: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
976 ; w0 below is a reasonable guess but could change: it certainly comes into the
977 ; function there.
978; CHECK-NEXT: cmp x[[OLD]], x0
979; CHECK-NEXT: b.ne [[GET_OUT:.LBB[0-9]+_[0-9]+]]
980 ; As above, w1 is a reasonable guess.
Kevin Qin07334d32014-02-21 07:45:48 +0000981; CHECK-REG-NOT: stxr w1, x1, [x{{[0-9]+}}]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000982; CHECK: stxr [[STATUS:w[0-9]+]], x1, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000983; CHECK-NEXT: cbnz [[STATUS]], [[STARTAGAIN]]
Tim Northover15410e92013-04-08 08:40:41 +0000984; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000985
986; CHECK: mov x0, x[[OLD]]
987 ret i64 %old
988}
989
990define i8 @test_atomic_load_monotonic_i8() nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000991; CHECK-LABEL: test_atomic_load_monotonic_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000992 %val = load atomic i8* @var8 monotonic, align 1
993; CHECK-NOT: dmb
994; CHECK: adrp x[[HIADDR:[0-9]+]], var8
995; CHECK: ldrb w0, [x[[HIADDR]], #:lo12:var8]
996; CHECK-NOT: dmb
997
998 ret i8 %val
999}
1000
1001define i8 @test_atomic_load_monotonic_regoff_i8(i64 %base, i64 %off) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001002; CHECK-LABEL: test_atomic_load_monotonic_regoff_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001003 %addr_int = add i64 %base, %off
1004 %addr = inttoptr i64 %addr_int to i8*
1005
1006 %val = load atomic i8* %addr monotonic, align 1
1007; CHECK-NOT: dmb
1008; CHECK: ldrb w0, [x0, x1]
1009; CHECK-NOT: dmb
1010
1011 ret i8 %val
1012}
1013
1014define i8 @test_atomic_load_acquire_i8() nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001015; CHECK-LABEL: test_atomic_load_acquire_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001016 %val = load atomic i8* @var8 acquire, align 1
Tim Northover15410e92013-04-08 08:40:41 +00001017; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001018; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
Tim Northover15410e92013-04-08 08:40:41 +00001019; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001020; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], #:lo12:var8
Tim Northover15410e92013-04-08 08:40:41 +00001021; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001022; CHECK: ldarb w0, [x[[ADDR]]]
Tim Northover15410e92013-04-08 08:40:41 +00001023; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001024 ret i8 %val
1025}
1026
1027define i8 @test_atomic_load_seq_cst_i8() nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001028; CHECK-LABEL: test_atomic_load_seq_cst_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001029 %val = load atomic i8* @var8 seq_cst, align 1
Tim Northover15410e92013-04-08 08:40:41 +00001030; CHECK-NOT: dmb
1031; CHECK: adrp [[HIADDR:x[0-9]+]], var8
1032; CHECK-NOT: dmb
1033; CHECK: add x[[ADDR:[0-9]+]], [[HIADDR]], #:lo12:var8
1034; CHECK-NOT: dmb
1035; CHECK: ldarb w0, [x[[ADDR]]]
1036; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001037 ret i8 %val
1038}
1039
1040define i16 @test_atomic_load_monotonic_i16() nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001041; CHECK-LABEL: test_atomic_load_monotonic_i16:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001042 %val = load atomic i16* @var16 monotonic, align 2
1043; CHECK-NOT: dmb
1044; CHECK: adrp x[[HIADDR:[0-9]+]], var16
Tim Northover15410e92013-04-08 08:40:41 +00001045; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001046; CHECK: ldrh w0, [x[[HIADDR]], #:lo12:var16]
1047; CHECK-NOT: dmb
1048
1049 ret i16 %val
1050}
1051
1052define i32 @test_atomic_load_monotonic_regoff_i32(i64 %base, i64 %off) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001053; CHECK-LABEL: test_atomic_load_monotonic_regoff_i32:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001054 %addr_int = add i64 %base, %off
1055 %addr = inttoptr i64 %addr_int to i32*
1056
1057 %val = load atomic i32* %addr monotonic, align 4
1058; CHECK-NOT: dmb
1059; CHECK: ldr w0, [x0, x1]
1060; CHECK-NOT: dmb
1061
1062 ret i32 %val
1063}
1064
1065define i64 @test_atomic_load_seq_cst_i64() nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001066; CHECK-LABEL: test_atomic_load_seq_cst_i64:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001067 %val = load atomic i64* @var64 seq_cst, align 8
Tim Northover15410e92013-04-08 08:40:41 +00001068; CHECK-NOT: dmb
1069; CHECK: adrp [[HIADDR:x[0-9]+]], var64
1070; CHECK-NOT: dmb
1071; CHECK: add x[[ADDR:[0-9]+]], [[HIADDR]], #:lo12:var64
1072; CHECK-NOT: dmb
1073; CHECK: ldar x0, [x[[ADDR]]]
1074; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001075 ret i64 %val
1076}
1077
1078define void @test_atomic_store_monotonic_i8(i8 %val) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001079; CHECK-LABEL: test_atomic_store_monotonic_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001080 store atomic i8 %val, i8* @var8 monotonic, align 1
1081; CHECK: adrp x[[HIADDR:[0-9]+]], var8
1082; CHECK: strb w0, [x[[HIADDR]], #:lo12:var8]
1083
1084 ret void
1085}
1086
1087define void @test_atomic_store_monotonic_regoff_i8(i64 %base, i64 %off, i8 %val) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001088; CHECK-LABEL: test_atomic_store_monotonic_regoff_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001089
1090 %addr_int = add i64 %base, %off
1091 %addr = inttoptr i64 %addr_int to i8*
1092
1093 store atomic i8 %val, i8* %addr monotonic, align 1
1094; CHECK: strb w2, [x0, x1]
1095
1096 ret void
1097}
1098define void @test_atomic_store_release_i8(i8 %val) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001099; CHECK-LABEL: test_atomic_store_release_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001100 store atomic i8 %val, i8* @var8 release, align 1
Tim Northover15410e92013-04-08 08:40:41 +00001101; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001102; CHECK: adrp [[HIADDR:x[0-9]+]], var8
Tim Northover15410e92013-04-08 08:40:41 +00001103; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001104; CHECK: add x[[ADDR:[0-9]+]], [[HIADDR]], #:lo12:var8
Tim Northover15410e92013-04-08 08:40:41 +00001105; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001106; CHECK: stlrb w0, [x[[ADDR]]]
Tim Northover15410e92013-04-08 08:40:41 +00001107; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001108 ret void
1109}
1110
1111define void @test_atomic_store_seq_cst_i8(i8 %val) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001112; CHECK-LABEL: test_atomic_store_seq_cst_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001113 store atomic i8 %val, i8* @var8 seq_cst, align 1
Tim Northover15410e92013-04-08 08:40:41 +00001114; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001115; CHECK: adrp [[HIADDR:x[0-9]+]], var8
Tim Northover15410e92013-04-08 08:40:41 +00001116; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001117; CHECK: add x[[ADDR:[0-9]+]], [[HIADDR]], #:lo12:var8
Tim Northover15410e92013-04-08 08:40:41 +00001118; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001119; CHECK: stlrb w0, [x[[ADDR]]]
Tim Northover15410e92013-04-08 08:40:41 +00001120; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001121
1122 ret void
1123}
1124
1125define void @test_atomic_store_monotonic_i16(i16 %val) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001126; CHECK-LABEL: test_atomic_store_monotonic_i16:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001127 store atomic i16 %val, i16* @var16 monotonic, align 2
Tim Northover15410e92013-04-08 08:40:41 +00001128; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001129; CHECK: adrp x[[HIADDR:[0-9]+]], var16
Tim Northover15410e92013-04-08 08:40:41 +00001130; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001131; CHECK: strh w0, [x[[HIADDR]], #:lo12:var16]
Tim Northover15410e92013-04-08 08:40:41 +00001132; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001133 ret void
1134}
1135
1136define void @test_atomic_store_monotonic_regoff_i32(i64 %base, i64 %off, i32 %val) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001137; CHECK-LABEL: test_atomic_store_monotonic_regoff_i32:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001138
1139 %addr_int = add i64 %base, %off
1140 %addr = inttoptr i64 %addr_int to i32*
1141
1142 store atomic i32 %val, i32* %addr monotonic, align 4
Tim Northover15410e92013-04-08 08:40:41 +00001143; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001144; CHECK: str w2, [x0, x1]
Tim Northover15410e92013-04-08 08:40:41 +00001145; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001146
1147 ret void
1148}
1149
1150define void @test_atomic_store_release_i64(i64 %val) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001151; CHECK-LABEL: test_atomic_store_release_i64:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001152 store atomic i64 %val, i64* @var64 release, align 8
Tim Northover15410e92013-04-08 08:40:41 +00001153; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001154; CHECK: adrp [[HIADDR:x[0-9]+]], var64
Tim Northover15410e92013-04-08 08:40:41 +00001155; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001156; CHECK: add x[[ADDR:[0-9]+]], [[HIADDR]], #:lo12:var64
Tim Northover15410e92013-04-08 08:40:41 +00001157; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001158; CHECK: stlr x0, [x[[ADDR]]]
Tim Northover15410e92013-04-08 08:40:41 +00001159; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001160 ret void
1161}