blob: 26301b92f9fe1e2e599e1ece9fbd9cb6388002fa [file] [log] [blame]
Tim Northover3b0846e2014-05-24 12:50:23 +00001; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs < %s | FileCheck %s --check-prefix=CHECK
2; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs < %s | FileCheck %s --check-prefix=CHECK-REG
Tim Northover66c36b82014-04-18 09:31:31 +00003
4
5; Point of CHECK-REG is to make sure UNPREDICTABLE instructions aren't created
6; (i.e. reusing a register for status & data in store exclusive).
7; CHECK-REG-NOT: stlxrb w[[NEW:[0-9]+]], w[[NEW]], [x{{[0-9]+}}]
8; CHECK-REG-NOT: stlxrb w[[NEW:[0-9]+]], x[[NEW]], [x{{[0-9]+}}]
Tim Northovere0e3aef2013-01-31 12:12:40 +00009
10@var8 = global i8 0
11@var16 = global i16 0
12@var32 = global i32 0
13@var64 = global i64 0
14
15define i8 @test_atomic_load_add_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +000016; CHECK-LABEL: test_atomic_load_add_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +000017 %old = atomicrmw add i8* @var8, i8 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +000018; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000019; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
Tim Northover66c36b82014-04-18 09:31:31 +000020; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var8
Tim Northovere0e3aef2013-01-31 12:12:40 +000021
22; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +000023; CHECK: ldaxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +000024 ; w0 below is a reasonable guess but could change: it certainly comes into the
25 ; function there.
26; CHECK-NEXT: add [[NEW:w[0-9]+]], w[[OLD]], w0
Tim Northover15410e92013-04-08 08:40:41 +000027; CHECK-NEXT: stlxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +000028; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +000029; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000030
Tim Northover66c36b82014-04-18 09:31:31 +000031; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +000032 ret i8 %old
33}
34
35define i16 @test_atomic_load_add_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +000036; CHECK-LABEL: test_atomic_load_add_i16:
Tim Northover15410e92013-04-08 08:40:41 +000037 %old = atomicrmw add i16* @var16, i16 %offset acquire
38; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000039; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
Tim Northover66c36b82014-04-18 09:31:31 +000040; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var16
Tim Northovere0e3aef2013-01-31 12:12:40 +000041
42; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +000043; ; CHECK: ldaxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +000044 ; w0 below is a reasonable guess but could change: it certainly comes into the
45 ; function there.
46; CHECK-NEXT: add [[NEW:w[0-9]+]], w[[OLD]], w0
47; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +000048; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +000049; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000050
Tim Northover66c36b82014-04-18 09:31:31 +000051; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +000052 ret i16 %old
53}
54
55define i32 @test_atomic_load_add_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +000056; CHECK-LABEL: test_atomic_load_add_i32:
Tim Northover15410e92013-04-08 08:40:41 +000057 %old = atomicrmw add i32* @var32, i32 %offset release
58; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000059; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
Tim Northover66c36b82014-04-18 09:31:31 +000060; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var32
Tim Northovere0e3aef2013-01-31 12:12:40 +000061
62; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +000063; ; CHECK: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +000064 ; w0 below is a reasonable guess but could change: it certainly comes into the
65 ; function there.
66; CHECK-NEXT: add [[NEW:w[0-9]+]], w[[OLD]], w0
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
Tim Northover66c36b82014-04-18 09:31:31 +000071; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +000072 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
Tim Northover66c36b82014-04-18 09:31:31 +000080; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var64
Tim Northovere0e3aef2013-01-31 12:12:40 +000081
82; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +000083; ; CHECK: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +000084 ; 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
87; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +000088; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +000089; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000090
91; CHECK: mov x0, x[[OLD]]
92 ret i64 %old
93}
94
95define i8 @test_atomic_load_sub_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +000096; CHECK-LABEL: test_atomic_load_sub_i8:
Tim Northover15410e92013-04-08 08:40:41 +000097 %old = atomicrmw sub i8* @var8, i8 %offset monotonic
98; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000099; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
Tim Northover66c36b82014-04-18 09:31:31 +0000100; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var8
Tim Northovere0e3aef2013-01-31 12:12:40 +0000101
102; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000103; ; CHECK: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000104 ; w0 below is a reasonable guess but could change: it certainly comes into the
105 ; function there.
106; CHECK-NEXT: sub [[NEW:w[0-9]+]], w[[OLD]], w0
107; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000108; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000109; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000110
Tim Northover66c36b82014-04-18 09:31:31 +0000111; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000112 ret i8 %old
113}
114
115define i16 @test_atomic_load_sub_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000116; CHECK-LABEL: test_atomic_load_sub_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000117 %old = atomicrmw sub i16* @var16, i16 %offset release
118; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000119; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
Tim Northover66c36b82014-04-18 09:31:31 +0000120; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var16
Tim Northovere0e3aef2013-01-31 12:12:40 +0000121
122; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000123; ; CHECK: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000124 ; w0 below is a reasonable guess but could change: it certainly comes into the
125 ; function there.
126; CHECK-NEXT: sub [[NEW:w[0-9]+]], w[[OLD]], w0
Tim Northover15410e92013-04-08 08:40:41 +0000127; CHECK-NEXT: stlxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000128; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000129; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000130
Tim Northover66c36b82014-04-18 09:31:31 +0000131; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000132 ret i16 %old
133}
134
135define i32 @test_atomic_load_sub_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000136; CHECK-LABEL: test_atomic_load_sub_i32:
Tim Northover15410e92013-04-08 08:40:41 +0000137 %old = atomicrmw sub i32* @var32, i32 %offset acquire
138; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000139; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
Tim Northover66c36b82014-04-18 09:31:31 +0000140; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var32
Tim Northovere0e3aef2013-01-31 12:12:40 +0000141
142; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000143; ; CHECK: ldaxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000144 ; w0 below is a reasonable guess but could change: it certainly comes into the
145 ; function there.
146; CHECK-NEXT: sub [[NEW:w[0-9]+]], w[[OLD]], w0
147; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000148; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000149; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000150
Tim Northover66c36b82014-04-18 09:31:31 +0000151; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000152 ret i32 %old
153}
154
155define i64 @test_atomic_load_sub_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000156; CHECK-LABEL: test_atomic_load_sub_i64:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000157 %old = atomicrmw sub i64* @var64, i64 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000158; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000159; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
Tim Northover66c36b82014-04-18 09:31:31 +0000160; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var64
Tim Northovere0e3aef2013-01-31 12:12:40 +0000161
162; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000163; ; CHECK: ldaxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000164 ; x0 below is a reasonable guess but could change: it certainly comes into the
165 ; function there.
166; CHECK-NEXT: sub [[NEW:x[0-9]+]], x[[OLD]], x0
Tim Northover15410e92013-04-08 08:40:41 +0000167; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000168; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000169; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000170
171; CHECK: mov x0, x[[OLD]]
172 ret i64 %old
173}
174
175define i8 @test_atomic_load_and_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000176; CHECK-LABEL: test_atomic_load_and_i8:
Tim Northover15410e92013-04-08 08:40:41 +0000177 %old = atomicrmw and i8* @var8, i8 %offset release
178; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000179; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
Tim Northover66c36b82014-04-18 09:31:31 +0000180; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var8
Tim Northovere0e3aef2013-01-31 12:12:40 +0000181
182; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000183; ; CHECK: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000184 ; w0 below is a reasonable guess but could change: it certainly comes into the
185 ; function there.
186; CHECK-NEXT: and [[NEW:w[0-9]+]], w[[OLD]], w0
Tim Northover15410e92013-04-08 08:40:41 +0000187; CHECK-NEXT: stlxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000188; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000189; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000190
Tim Northover66c36b82014-04-18 09:31:31 +0000191; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000192 ret i8 %old
193}
194
195define i16 @test_atomic_load_and_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000196; CHECK-LABEL: test_atomic_load_and_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000197 %old = atomicrmw and i16* @var16, i16 %offset monotonic
198; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000199; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
Tim Northover66c36b82014-04-18 09:31:31 +0000200; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var16
Tim Northovere0e3aef2013-01-31 12:12:40 +0000201
202; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000203; ; CHECK: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000204 ; w0 below is a reasonable guess but could change: it certainly comes into the
205 ; function there.
206; CHECK-NEXT: and [[NEW:w[0-9]+]], w[[OLD]], w0
207; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000208; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000209; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000210
Tim Northover66c36b82014-04-18 09:31:31 +0000211; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000212 ret i16 %old
213}
214
215define i32 @test_atomic_load_and_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000216; CHECK-LABEL: test_atomic_load_and_i32:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000217 %old = atomicrmw and i32* @var32, i32 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000218; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000219; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
Tim Northover66c36b82014-04-18 09:31:31 +0000220; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var32
Tim Northovere0e3aef2013-01-31 12:12:40 +0000221
222; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000223; ; CHECK: ldaxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000224 ; w0 below is a reasonable guess but could change: it certainly comes into the
225 ; function there.
226; CHECK-NEXT: and [[NEW:w[0-9]+]], w[[OLD]], w0
Tim Northover15410e92013-04-08 08:40:41 +0000227; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000228; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000229; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000230
Tim Northover66c36b82014-04-18 09:31:31 +0000231; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000232 ret i32 %old
233}
234
235define i64 @test_atomic_load_and_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000236; CHECK-LABEL: test_atomic_load_and_i64:
Tim Northover15410e92013-04-08 08:40:41 +0000237 %old = atomicrmw and i64* @var64, i64 %offset acquire
238; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000239; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
Tim Northover66c36b82014-04-18 09:31:31 +0000240; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var64
Tim Northovere0e3aef2013-01-31 12:12:40 +0000241
242; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000243; ; CHECK: ldaxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000244 ; x0 below is a reasonable guess but could change: it certainly comes into the
245 ; function there.
246; CHECK-NEXT: and [[NEW:x[0-9]+]], x[[OLD]], x0
247; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000248; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000249; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000250
251; CHECK: mov x0, x[[OLD]]
252 ret i64 %old
253}
254
255define i8 @test_atomic_load_or_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000256; CHECK-LABEL: test_atomic_load_or_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000257 %old = atomicrmw or i8* @var8, i8 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000258; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000259; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
Tim Northover66c36b82014-04-18 09:31:31 +0000260; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var8
Tim Northovere0e3aef2013-01-31 12:12:40 +0000261
262; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000263; ; CHECK: ldaxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000264 ; w0 below is a reasonable guess but could change: it certainly comes into the
265 ; function there.
266; CHECK-NEXT: orr [[NEW:w[0-9]+]], w[[OLD]], w0
Tim Northover15410e92013-04-08 08:40:41 +0000267; CHECK-NEXT: stlxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000268; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000269; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000270
Tim Northover66c36b82014-04-18 09:31:31 +0000271; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000272 ret i8 %old
273}
274
275define i16 @test_atomic_load_or_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000276; CHECK-LABEL: test_atomic_load_or_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000277 %old = atomicrmw or i16* @var16, i16 %offset monotonic
278; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000279; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
Tim Northover66c36b82014-04-18 09:31:31 +0000280; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var16
Tim Northovere0e3aef2013-01-31 12:12:40 +0000281
282; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000283; ; CHECK: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000284 ; w0 below is a reasonable guess but could change: it certainly comes into the
285 ; function there.
286; CHECK-NEXT: orr [[NEW:w[0-9]+]], w[[OLD]], w0
287; CHECK-NEXT: stxrh [[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
Tim Northover66c36b82014-04-18 09:31:31 +0000291; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000292 ret i16 %old
293}
294
295define i32 @test_atomic_load_or_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000296; CHECK-LABEL: test_atomic_load_or_i32:
Tim Northover15410e92013-04-08 08:40:41 +0000297 %old = atomicrmw or i32* @var32, i32 %offset acquire
298; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000299; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
Tim Northover66c36b82014-04-18 09:31:31 +0000300; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var32
Tim Northovere0e3aef2013-01-31 12:12:40 +0000301
302; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000303; ; CHECK: ldaxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000304 ; 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
307; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000308; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000309; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000310
Tim Northover66c36b82014-04-18 09:31:31 +0000311; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000312 ret i32 %old
313}
314
315define i64 @test_atomic_load_or_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000316; CHECK-LABEL: test_atomic_load_or_i64:
Tim Northover15410e92013-04-08 08:40:41 +0000317 %old = atomicrmw or i64* @var64, i64 %offset release
318; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000319; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
Tim Northover66c36b82014-04-18 09:31:31 +0000320; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var64
Tim Northovere0e3aef2013-01-31 12:12:40 +0000321
322; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000323; ; CHECK: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000324 ; x0 below is a reasonable guess but could change: it certainly comes into the
325 ; function there.
326; CHECK-NEXT: orr [[NEW:x[0-9]+]], x[[OLD]], x0
Tim Northover15410e92013-04-08 08:40:41 +0000327; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000328; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000329; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000330
331; CHECK: mov x0, x[[OLD]]
332 ret i64 %old
333}
334
335define i8 @test_atomic_load_xor_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000336; CHECK-LABEL: test_atomic_load_xor_i8:
Tim Northover15410e92013-04-08 08:40:41 +0000337 %old = atomicrmw xor i8* @var8, i8 %offset acquire
338; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000339; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
Tim Northover66c36b82014-04-18 09:31:31 +0000340; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var8
Tim Northovere0e3aef2013-01-31 12:12:40 +0000341
342; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000343; ; CHECK: ldaxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000344 ; w0 below is a reasonable guess but could change: it certainly comes into the
345 ; function there.
346; CHECK-NEXT: eor [[NEW:w[0-9]+]], w[[OLD]], w0
347; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000348; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000349; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000350
Tim Northover66c36b82014-04-18 09:31:31 +0000351; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000352 ret i8 %old
353}
354
355define i16 @test_atomic_load_xor_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000356; CHECK-LABEL: test_atomic_load_xor_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000357 %old = atomicrmw xor i16* @var16, i16 %offset release
358; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000359; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
Tim Northover66c36b82014-04-18 09:31:31 +0000360; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var16
Tim Northovere0e3aef2013-01-31 12:12:40 +0000361
362; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000363; ; CHECK: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000364 ; w0 below is a reasonable guess but could change: it certainly comes into the
365 ; function there.
366; CHECK-NEXT: eor [[NEW:w[0-9]+]], w[[OLD]], w0
Tim Northover15410e92013-04-08 08:40:41 +0000367; CHECK-NEXT: stlxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000368; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000369; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000370
Tim Northover66c36b82014-04-18 09:31:31 +0000371; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000372 ret i16 %old
373}
374
375define i32 @test_atomic_load_xor_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000376; CHECK-LABEL: test_atomic_load_xor_i32:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000377 %old = atomicrmw xor i32* @var32, i32 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000378; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000379; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
Tim Northover66c36b82014-04-18 09:31:31 +0000380; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var32
Tim Northovere0e3aef2013-01-31 12:12:40 +0000381
382; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000383; ; CHECK: ldaxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000384 ; w0 below is a reasonable guess but could change: it certainly comes into the
385 ; function there.
386; CHECK-NEXT: eor [[NEW:w[0-9]+]], w[[OLD]], w0
Tim Northover15410e92013-04-08 08:40:41 +0000387; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000388; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000389; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000390
Tim Northover66c36b82014-04-18 09:31:31 +0000391; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000392 ret i32 %old
393}
394
395define i64 @test_atomic_load_xor_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000396; CHECK-LABEL: test_atomic_load_xor_i64:
Tim Northover15410e92013-04-08 08:40:41 +0000397 %old = atomicrmw xor i64* @var64, i64 %offset monotonic
398; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000399; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
Tim Northover66c36b82014-04-18 09:31:31 +0000400; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var64
Tim Northovere0e3aef2013-01-31 12:12:40 +0000401
402; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000403; ; CHECK: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000404 ; x0 below is a reasonable guess but could change: it certainly comes into the
405 ; function there.
406; CHECK-NEXT: eor [[NEW:x[0-9]+]], x[[OLD]], x0
407; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000408; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000409; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000410
411; CHECK: mov x0, x[[OLD]]
412 ret i64 %old
413}
414
415define i8 @test_atomic_load_xchg_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000416; CHECK-LABEL: test_atomic_load_xchg_i8:
Tim Northover15410e92013-04-08 08:40:41 +0000417 %old = atomicrmw xchg i8* @var8, i8 %offset monotonic
418; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000419; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
Tim Northover66c36b82014-04-18 09:31:31 +0000420; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var8
Tim Northovere0e3aef2013-01-31 12:12:40 +0000421
422; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000423; ; CHECK: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000424 ; w0 below is a reasonable guess but could change: it certainly comes into the
425 ; function there.
426; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], w0, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000427; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000428; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000429
Tim Northover66c36b82014-04-18 09:31:31 +0000430; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000431 ret i8 %old
432}
433
434define i16 @test_atomic_load_xchg_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000435; CHECK-LABEL: test_atomic_load_xchg_i16:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000436 %old = atomicrmw xchg i16* @var16, i16 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000437; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000438; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
Tim Northover66c36b82014-04-18 09:31:31 +0000439; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var16
Tim Northovere0e3aef2013-01-31 12:12:40 +0000440
441; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000442; ; CHECK: ldaxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000443 ; w0 below is a reasonable guess but could change: it certainly comes into the
444 ; function there.
Tim Northover15410e92013-04-08 08:40:41 +0000445; CHECK-NEXT: stlxrh [[STATUS:w[0-9]+]], w0, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000446; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000447; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000448
Tim Northover66c36b82014-04-18 09:31:31 +0000449; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000450 ret i16 %old
451}
452
453define i32 @test_atomic_load_xchg_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000454; CHECK-LABEL: test_atomic_load_xchg_i32:
Tim Northover15410e92013-04-08 08:40:41 +0000455 %old = atomicrmw xchg i32* @var32, i32 %offset release
456; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000457; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
Tim Northover66c36b82014-04-18 09:31:31 +0000458; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var32
Tim Northovere0e3aef2013-01-31 12:12:40 +0000459
460; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000461; ; CHECK: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000462 ; w0 below is a reasonable guess but could change: it certainly comes into the
463 ; function there.
Tim Northover15410e92013-04-08 08:40:41 +0000464; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], w0, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000465; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000466; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000467
Tim Northover66c36b82014-04-18 09:31:31 +0000468; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000469 ret i32 %old
470}
471
472define i64 @test_atomic_load_xchg_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000473; CHECK-LABEL: test_atomic_load_xchg_i64:
Tim Northover15410e92013-04-08 08:40:41 +0000474 %old = atomicrmw xchg i64* @var64, i64 %offset acquire
475; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000476; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
Tim Northover66c36b82014-04-18 09:31:31 +0000477; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var64
Tim Northovere0e3aef2013-01-31 12:12:40 +0000478
479; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000480; ; CHECK: ldaxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000481 ; x0 below is a reasonable guess but could change: it certainly comes into the
482 ; function there.
483; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], x0, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000484; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000485; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000486
487; CHECK: mov x0, x[[OLD]]
488 ret i64 %old
489}
490
491
492define i8 @test_atomic_load_min_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000493; CHECK-LABEL: test_atomic_load_min_i8:
Tim Northover15410e92013-04-08 08:40:41 +0000494 %old = atomicrmw min i8* @var8, i8 %offset acquire
495; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000496; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
Tim Northover66c36b82014-04-18 09:31:31 +0000497; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var8
Tim Northovere0e3aef2013-01-31 12:12:40 +0000498
499; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000500; CHECK: ldaxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000501 ; w0 below is a reasonable guess but could change: it certainly comes into the
502 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000503
Tim Northover3b0846e2014-05-24 12:50:23 +0000504; CHECK-NEXT: sxtb w[[OLD_EXT:[0-9]+]], w[[OLD]]
505; CHECK-NEXT: cmp w[[OLD_EXT]], w0, sxtb
506; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, le
Tim Northover66c36b82014-04-18 09:31:31 +0000507
Tim Northovere0e3aef2013-01-31 12:12:40 +0000508; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000509; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000510; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000511
Tim Northover66c36b82014-04-18 09:31:31 +0000512; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000513 ret i8 %old
514}
515
516define i16 @test_atomic_load_min_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000517; CHECK-LABEL: test_atomic_load_min_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000518 %old = atomicrmw min i16* @var16, i16 %offset release
519; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000520; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
Tim Northover66c36b82014-04-18 09:31:31 +0000521; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var16
Tim Northovere0e3aef2013-01-31 12:12:40 +0000522
523; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000524; CHECK: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000525 ; w0 below is a reasonable guess but could change: it certainly comes into the
526 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000527
Tim Northover3b0846e2014-05-24 12:50:23 +0000528; CHECK-NEXT: sxth w[[OLD_EXT:[0-9]+]], w[[OLD]]
529; CHECK-NEXT: cmp w[[OLD_EXT]], w0, sxth
530; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, le
Tim Northover66c36b82014-04-18 09:31:31 +0000531
532
Tim Northover15410e92013-04-08 08:40:41 +0000533; CHECK-NEXT: stlxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000534; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000535; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000536
Tim Northover66c36b82014-04-18 09:31:31 +0000537; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000538 ret i16 %old
539}
540
541define i32 @test_atomic_load_min_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000542; CHECK-LABEL: test_atomic_load_min_i32:
Tim Northover15410e92013-04-08 08:40:41 +0000543 %old = atomicrmw min i32* @var32, i32 %offset monotonic
544; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000545; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
Tim Northover66c36b82014-04-18 09:31:31 +0000546; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var32
Tim Northovere0e3aef2013-01-31 12:12:40 +0000547
548; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000549; CHECK: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000550 ; w0 below is a reasonable guess but could change: it certainly comes into the
551 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000552
Tim Northover3b0846e2014-05-24 12:50:23 +0000553; CHECK-NEXT: cmp w[[OLD]], w0
554; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, le
Tim Northover66c36b82014-04-18 09:31:31 +0000555
556
Tim Northovere0e3aef2013-01-31 12:12:40 +0000557; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000558; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000559; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000560
Tim Northover66c36b82014-04-18 09:31:31 +0000561; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000562 ret i32 %old
563}
564
565define i64 @test_atomic_load_min_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000566; CHECK-LABEL: test_atomic_load_min_i64:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000567 %old = atomicrmw min i64* @var64, i64 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000568; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000569; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
Tim Northover66c36b82014-04-18 09:31:31 +0000570; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var64
Tim Northovere0e3aef2013-01-31 12:12:40 +0000571
572; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000573; CHECK: ldaxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000574 ; x0 below is a reasonable guess but could change: it certainly comes into the
575 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000576
Tim Northover3b0846e2014-05-24 12:50:23 +0000577; CHECK-NEXT: cmp x[[OLD]], x0
578; CHECK-NEXT: csel [[NEW:x[0-9]+]], x[[OLD]], x0, le
Tim Northover66c36b82014-04-18 09:31:31 +0000579
580
Tim Northover15410e92013-04-08 08:40:41 +0000581; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000582; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000583; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000584
585; CHECK: mov x0, x[[OLD]]
586 ret i64 %old
587}
588
589define i8 @test_atomic_load_max_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000590; CHECK-LABEL: test_atomic_load_max_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000591 %old = atomicrmw max i8* @var8, i8 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000592; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000593; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
Tim Northover66c36b82014-04-18 09:31:31 +0000594; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var8
Tim Northovere0e3aef2013-01-31 12:12:40 +0000595
596; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000597; CHECK: ldaxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000598 ; w0 below is a reasonable guess but could change: it certainly comes into the
599 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000600
Tim Northover3b0846e2014-05-24 12:50:23 +0000601; CHECK-NEXT: sxtb w[[OLD_EXT:[0-9]+]], w[[OLD]]
602; CHECK-NEXT: cmp w[[OLD_EXT]], w0, sxtb
603; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, gt
Tim Northover66c36b82014-04-18 09:31:31 +0000604
605
Tim Northover15410e92013-04-08 08:40:41 +0000606; CHECK-NEXT: stlxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000607; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000608; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000609
Tim Northover66c36b82014-04-18 09:31:31 +0000610; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000611 ret i8 %old
612}
613
614define i16 @test_atomic_load_max_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000615; CHECK-LABEL: test_atomic_load_max_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000616 %old = atomicrmw max i16* @var16, i16 %offset acquire
617; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000618; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
Tim Northover66c36b82014-04-18 09:31:31 +0000619; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var16
Tim Northovere0e3aef2013-01-31 12:12:40 +0000620
621; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000622; CHECK: ldaxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000623 ; w0 below is a reasonable guess but could change: it certainly comes into the
624 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000625
Tim Northover3b0846e2014-05-24 12:50:23 +0000626; CHECK-NEXT: sxth w[[OLD_EXT:[0-9]+]], w[[OLD]]
627; CHECK-NEXT: cmp w[[OLD_EXT]], w0, sxth
628; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, gt
Tim Northover66c36b82014-04-18 09:31:31 +0000629
630
Tim Northovere0e3aef2013-01-31 12:12:40 +0000631; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000632; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000633; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000634
Tim Northover66c36b82014-04-18 09:31:31 +0000635; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000636 ret i16 %old
637}
638
639define i32 @test_atomic_load_max_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000640; CHECK-LABEL: test_atomic_load_max_i32:
Tim Northover15410e92013-04-08 08:40:41 +0000641 %old = atomicrmw max i32* @var32, i32 %offset release
642; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000643; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
Tim Northover66c36b82014-04-18 09:31:31 +0000644; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var32
Tim Northovere0e3aef2013-01-31 12:12:40 +0000645
646; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000647; CHECK: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000648 ; w0 below is a reasonable guess but could change: it certainly comes into the
649 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000650
Tim Northover3b0846e2014-05-24 12:50:23 +0000651; CHECK-NEXT: cmp w[[OLD]], w0
652; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, gt
Tim Northover66c36b82014-04-18 09:31:31 +0000653
654
Tim Northover15410e92013-04-08 08:40:41 +0000655; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000656; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000657; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000658
Tim Northover66c36b82014-04-18 09:31:31 +0000659; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000660 ret i32 %old
661}
662
663define i64 @test_atomic_load_max_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000664; CHECK-LABEL: test_atomic_load_max_i64:
Tim Northover15410e92013-04-08 08:40:41 +0000665 %old = atomicrmw max i64* @var64, i64 %offset monotonic
666; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000667; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
Tim Northover66c36b82014-04-18 09:31:31 +0000668; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var64
Tim Northovere0e3aef2013-01-31 12:12:40 +0000669
670; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000671; CHECK: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000672 ; x0 below is a reasonable guess but could change: it certainly comes into the
673 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000674
Tim Northover3b0846e2014-05-24 12:50:23 +0000675; CHECK-NEXT: cmp x[[OLD]], x0
676; CHECK-NEXT: csel [[NEW:x[0-9]+]], x[[OLD]], x0, gt
Tim Northover66c36b82014-04-18 09:31:31 +0000677
678
Tim Northovere0e3aef2013-01-31 12:12:40 +0000679; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000680; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000681; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000682
683; CHECK: mov x0, x[[OLD]]
684 ret i64 %old
685}
686
687define i8 @test_atomic_load_umin_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000688; CHECK-LABEL: test_atomic_load_umin_i8:
Tim Northover15410e92013-04-08 08:40:41 +0000689 %old = atomicrmw umin i8* @var8, i8 %offset monotonic
690; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000691; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
Tim Northover66c36b82014-04-18 09:31:31 +0000692; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var8
Tim Northovere0e3aef2013-01-31 12:12:40 +0000693
694; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000695; CHECK: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000696 ; w0 below is a reasonable guess but could change: it certainly comes into the
697 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000698
Tim Northover3b0846e2014-05-24 12:50:23 +0000699; CHECK-NEXT: cmp w[[OLD]], w0, uxtb
700; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, ls
Tim Northover66c36b82014-04-18 09:31:31 +0000701
702
Tim Northovere0e3aef2013-01-31 12:12:40 +0000703; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000704; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000705; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000706
Tim Northover66c36b82014-04-18 09:31:31 +0000707; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000708 ret i8 %old
709}
710
711define i16 @test_atomic_load_umin_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000712; CHECK-LABEL: test_atomic_load_umin_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000713 %old = atomicrmw umin i16* @var16, i16 %offset acquire
714; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000715; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
Tim Northover66c36b82014-04-18 09:31:31 +0000716; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var16
Tim Northovere0e3aef2013-01-31 12:12:40 +0000717
718; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000719; CHECK: ldaxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000720 ; w0 below is a reasonable guess but could change: it certainly comes into the
721 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000722
Tim Northover3b0846e2014-05-24 12:50:23 +0000723; CHECK-NEXT: cmp w[[OLD]], w0, uxth
724; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, ls
Tim Northover66c36b82014-04-18 09:31:31 +0000725
726
Tim Northovere0e3aef2013-01-31 12:12:40 +0000727; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000728; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000729; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000730
Tim Northover66c36b82014-04-18 09:31:31 +0000731; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000732 ret i16 %old
733}
734
735define i32 @test_atomic_load_umin_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000736; CHECK-LABEL: test_atomic_load_umin_i32:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000737 %old = atomicrmw umin i32* @var32, i32 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000738; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000739; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
Tim Northover66c36b82014-04-18 09:31:31 +0000740; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var32
Tim Northovere0e3aef2013-01-31 12:12:40 +0000741
742; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000743; CHECK: ldaxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000744 ; w0 below is a reasonable guess but could change: it certainly comes into the
745 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000746
Tim Northover3b0846e2014-05-24 12:50:23 +0000747; CHECK-NEXT: cmp w[[OLD]], w0
748; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, ls
Tim Northover66c36b82014-04-18 09:31:31 +0000749
750
Tim Northover15410e92013-04-08 08:40:41 +0000751; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000752; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000753; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000754
Tim Northover66c36b82014-04-18 09:31:31 +0000755; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000756 ret i32 %old
757}
758
759define i64 @test_atomic_load_umin_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000760; CHECK-LABEL: test_atomic_load_umin_i64:
Tim Northover15410e92013-04-08 08:40:41 +0000761 %old = atomicrmw umin i64* @var64, i64 %offset acq_rel
762; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000763; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
Tim Northover66c36b82014-04-18 09:31:31 +0000764; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var64
Tim Northovere0e3aef2013-01-31 12:12:40 +0000765
766; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000767; CHECK: ldaxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000768 ; x0 below is a reasonable guess but could change: it certainly comes into the
769 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000770
Tim Northover3b0846e2014-05-24 12:50:23 +0000771; CHECK-NEXT: cmp x[[OLD]], x0
772; CHECK-NEXT: csel [[NEW:x[0-9]+]], x[[OLD]], x0, ls
Tim Northover66c36b82014-04-18 09:31:31 +0000773
774
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 i64 %old
781}
782
783define i8 @test_atomic_load_umax_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000784; CHECK-LABEL: test_atomic_load_umax_i8:
Tim Northover15410e92013-04-08 08:40:41 +0000785 %old = atomicrmw umax i8* @var8, i8 %offset acq_rel
786; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000787; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
Tim Northover66c36b82014-04-18 09:31:31 +0000788; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var8
Tim Northovere0e3aef2013-01-31 12:12:40 +0000789
790; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000791; CHECK: ldaxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000792 ; w0 below is a reasonable guess but could change: it certainly comes into the
793 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000794
Tim Northover3b0846e2014-05-24 12:50:23 +0000795; CHECK-NEXT: cmp w[[OLD]], w0, uxtb
796; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, hi
Tim Northover66c36b82014-04-18 09:31:31 +0000797
798
Tim Northover15410e92013-04-08 08:40:41 +0000799; CHECK-NEXT: stlxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000800; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000801; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000802
Tim Northover66c36b82014-04-18 09:31:31 +0000803; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000804 ret i8 %old
805}
806
807define i16 @test_atomic_load_umax_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000808; CHECK-LABEL: test_atomic_load_umax_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000809 %old = atomicrmw umax i16* @var16, i16 %offset monotonic
810; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000811; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
Tim Northover66c36b82014-04-18 09:31:31 +0000812; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var16
Tim Northovere0e3aef2013-01-31 12:12:40 +0000813
814; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000815; CHECK: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000816 ; w0 below is a reasonable guess but could change: it certainly comes into the
817 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000818
Tim Northover3b0846e2014-05-24 12:50:23 +0000819; CHECK-NEXT: cmp w[[OLD]], w0, uxth
820; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, hi
Tim Northover66c36b82014-04-18 09:31:31 +0000821
822
Tim Northovere0e3aef2013-01-31 12:12:40 +0000823; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000824; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000825; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000826
Tim Northover66c36b82014-04-18 09:31:31 +0000827; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000828 ret i16 %old
829}
830
831define i32 @test_atomic_load_umax_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000832; CHECK-LABEL: test_atomic_load_umax_i32:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000833 %old = atomicrmw umax i32* @var32, i32 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000834; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000835; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
Tim Northover66c36b82014-04-18 09:31:31 +0000836; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var32
Tim Northovere0e3aef2013-01-31 12:12:40 +0000837
838; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000839; CHECK: ldaxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000840 ; w0 below is a reasonable guess but could change: it certainly comes into the
841 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000842
Tim Northover3b0846e2014-05-24 12:50:23 +0000843; CHECK-NEXT: cmp w[[OLD]], w0
844; CHECK-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, hi
Tim Northover66c36b82014-04-18 09:31:31 +0000845
846
Tim Northover15410e92013-04-08 08:40:41 +0000847; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000848; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000849; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000850
Tim Northover66c36b82014-04-18 09:31:31 +0000851; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000852 ret i32 %old
853}
854
855define i64 @test_atomic_load_umax_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000856; CHECK-LABEL: test_atomic_load_umax_i64:
Tim Northover15410e92013-04-08 08:40:41 +0000857 %old = atomicrmw umax i64* @var64, i64 %offset release
858; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000859; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
Tim Northover66c36b82014-04-18 09:31:31 +0000860; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var64
Tim Northovere0e3aef2013-01-31 12:12:40 +0000861
862; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000863; CHECK: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000864 ; x0 below is a reasonable guess but could change: it certainly comes into the
865 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000866
Tim Northover3b0846e2014-05-24 12:50:23 +0000867; CHECK-NEXT: cmp x[[OLD]], x0
868; CHECK-NEXT: csel [[NEW:x[0-9]+]], x[[OLD]], x0, hi
Tim Northover66c36b82014-04-18 09:31:31 +0000869
870
Tim Northover15410e92013-04-08 08:40:41 +0000871; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000872; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000873; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000874
875; CHECK: mov x0, x[[OLD]]
876 ret i64 %old
877}
878
879define i8 @test_atomic_cmpxchg_i8(i8 %wanted, i8 %new) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000880; CHECK-LABEL: test_atomic_cmpxchg_i8:
Tim Northover420a2162014-06-13 14:24:07 +0000881 %pair = cmpxchg i8* @var8, i8 %wanted, i8 %new acquire acquire
882 %old = extractvalue { i8, i1 } %pair, 0
883
Tim Northover15410e92013-04-08 08:40:41 +0000884; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000885; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
Tim Northover66c36b82014-04-18 09:31:31 +0000886; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var8
Tim Northovere0e3aef2013-01-31 12:12:40 +0000887
888; CHECK: [[STARTAGAIN:.LBB[0-9]+_[0-9]+]]:
Tim Northover66c36b82014-04-18 09:31:31 +0000889; CHECK: ldaxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000890 ; w0 below is a reasonable guess but could change: it certainly comes into the
891 ; function there.
892; CHECK-NEXT: cmp w[[OLD]], w0
893; CHECK-NEXT: b.ne [[GET_OUT:.LBB[0-9]+_[0-9]+]]
Tim Northoverb4ddc082014-05-30 10:09:59 +0000894; CHECK: stxrb [[STATUS:w[0-9]+]], {{w[0-9]+}}, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000895; CHECK-NEXT: cbnz [[STATUS]], [[STARTAGAIN]]
Tim Northover15410e92013-04-08 08:40:41 +0000896; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000897
Tim Northover66c36b82014-04-18 09:31:31 +0000898; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000899 ret i8 %old
900}
901
902define i16 @test_atomic_cmpxchg_i16(i16 %wanted, i16 %new) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000903; CHECK-LABEL: test_atomic_cmpxchg_i16:
Tim Northover420a2162014-06-13 14:24:07 +0000904 %pair = cmpxchg i16* @var16, i16 %wanted, i16 %new seq_cst seq_cst
905 %old = extractvalue { i16, i1 } %pair, 0
906
Tim Northover15410e92013-04-08 08:40:41 +0000907; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000908; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
Tim Northover66c36b82014-04-18 09:31:31 +0000909; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var16
Tim Northovere0e3aef2013-01-31 12:12:40 +0000910
911; CHECK: [[STARTAGAIN:.LBB[0-9]+_[0-9]+]]:
Tim Northover66c36b82014-04-18 09:31:31 +0000912; CHECK: ldaxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000913 ; w0 below is a reasonable guess but could change: it certainly comes into the
914 ; function there.
915; CHECK-NEXT: cmp w[[OLD]], w0
916; CHECK-NEXT: b.ne [[GET_OUT:.LBB[0-9]+_[0-9]+]]
Tim Northoverb4ddc082014-05-30 10:09:59 +0000917; CHECK: stlxrh [[STATUS:w[0-9]+]], {{w[0-9]+}}, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000918; CHECK-NEXT: cbnz [[STATUS]], [[STARTAGAIN]]
Tim Northover15410e92013-04-08 08:40:41 +0000919; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000920
Tim Northover66c36b82014-04-18 09:31:31 +0000921; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000922 ret i16 %old
923}
924
925define i32 @test_atomic_cmpxchg_i32(i32 %wanted, i32 %new) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000926; CHECK-LABEL: test_atomic_cmpxchg_i32:
Tim Northover420a2162014-06-13 14:24:07 +0000927 %pair = cmpxchg i32* @var32, i32 %wanted, i32 %new release monotonic
928 %old = extractvalue { i32, i1 } %pair, 0
929
Tim Northover15410e92013-04-08 08:40:41 +0000930; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000931; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
Tim Northover66c36b82014-04-18 09:31:31 +0000932; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var32
Tim Northovere0e3aef2013-01-31 12:12:40 +0000933
934; CHECK: [[STARTAGAIN:.LBB[0-9]+_[0-9]+]]:
Tim Northover66c36b82014-04-18 09:31:31 +0000935; CHECK: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000936 ; w0 below is a reasonable guess but could change: it certainly comes into the
937 ; function there.
938; CHECK-NEXT: cmp w[[OLD]], w0
939; CHECK-NEXT: b.ne [[GET_OUT:.LBB[0-9]+_[0-9]+]]
Tim Northoverb4ddc082014-05-30 10:09:59 +0000940; CHECK: stlxr [[STATUS:w[0-9]+]], {{w[0-9]+}}, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000941; CHECK-NEXT: cbnz [[STATUS]], [[STARTAGAIN]]
Tim Northover15410e92013-04-08 08:40:41 +0000942; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000943
Tim Northover66c36b82014-04-18 09:31:31 +0000944; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000945 ret i32 %old
946}
947
Tim Northover66c36b82014-04-18 09:31:31 +0000948define void @test_atomic_cmpxchg_i64(i64 %wanted, i64 %new) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000949; CHECK-LABEL: test_atomic_cmpxchg_i64:
Tim Northover420a2162014-06-13 14:24:07 +0000950 %pair = cmpxchg i64* @var64, i64 %wanted, i64 %new monotonic monotonic
951 %old = extractvalue { i64, i1 } %pair, 0
952
Tim Northover15410e92013-04-08 08:40:41 +0000953; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000954; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
Tim Northover66c36b82014-04-18 09:31:31 +0000955; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var64
Tim Northovere0e3aef2013-01-31 12:12:40 +0000956
957; CHECK: [[STARTAGAIN:.LBB[0-9]+_[0-9]+]]:
Tim Northover66c36b82014-04-18 09:31:31 +0000958; CHECK: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000959 ; w0 below is a reasonable guess but could change: it certainly comes into the
960 ; function there.
961; CHECK-NEXT: cmp x[[OLD]], x0
962; CHECK-NEXT: b.ne [[GET_OUT:.LBB[0-9]+_[0-9]+]]
963 ; As above, w1 is a reasonable guess.
964; CHECK: stxr [[STATUS:w[0-9]+]], x1, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000965; CHECK-NEXT: cbnz [[STATUS]], [[STARTAGAIN]]
Tim Northover15410e92013-04-08 08:40:41 +0000966; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000967
Tim Northover66c36b82014-04-18 09:31:31 +0000968; CHECK: str x[[OLD]],
969 store i64 %old, i64* @var64
970 ret void
Tim Northovere0e3aef2013-01-31 12:12:40 +0000971}
972
973define i8 @test_atomic_load_monotonic_i8() nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000974; CHECK-LABEL: test_atomic_load_monotonic_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000975 %val = load atomic i8* @var8 monotonic, align 1
976; CHECK-NOT: dmb
977; CHECK: adrp x[[HIADDR:[0-9]+]], var8
Tim Northover66c36b82014-04-18 09:31:31 +0000978; CHECK: ldrb w0, [x[[HIADDR]], {{#?}}:lo12:var8]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000979; CHECK-NOT: dmb
980
981 ret i8 %val
982}
983
984define i8 @test_atomic_load_monotonic_regoff_i8(i64 %base, i64 %off) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000985; CHECK-LABEL: test_atomic_load_monotonic_regoff_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000986 %addr_int = add i64 %base, %off
987 %addr = inttoptr i64 %addr_int to i8*
988
989 %val = load atomic i8* %addr monotonic, align 1
990; CHECK-NOT: dmb
991; CHECK: ldrb w0, [x0, x1]
992; CHECK-NOT: dmb
993
994 ret i8 %val
995}
996
997define i8 @test_atomic_load_acquire_i8() nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000998; CHECK-LABEL: test_atomic_load_acquire_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000999 %val = load atomic i8* @var8 acquire, align 1
Tim Northover15410e92013-04-08 08:40:41 +00001000; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001001; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
Tim Northover15410e92013-04-08 08:40:41 +00001002; CHECK-NOT: dmb
Tim Northover66c36b82014-04-18 09:31:31 +00001003; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var8
Tim Northover15410e92013-04-08 08:40:41 +00001004; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001005; CHECK: ldarb w0, [x[[ADDR]]]
Tim Northover15410e92013-04-08 08:40:41 +00001006; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001007 ret i8 %val
1008}
1009
1010define i8 @test_atomic_load_seq_cst_i8() nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001011; CHECK-LABEL: test_atomic_load_seq_cst_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001012 %val = load atomic i8* @var8 seq_cst, align 1
Tim Northover15410e92013-04-08 08:40:41 +00001013; CHECK-NOT: dmb
1014; CHECK: adrp [[HIADDR:x[0-9]+]], var8
1015; CHECK-NOT: dmb
Tim Northover66c36b82014-04-18 09:31:31 +00001016; CHECK: add x[[ADDR:[0-9]+]], [[HIADDR]], {{#?}}:lo12:var8
Tim Northover15410e92013-04-08 08:40:41 +00001017; CHECK-NOT: dmb
1018; CHECK: ldarb w0, [x[[ADDR]]]
1019; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001020 ret i8 %val
1021}
1022
1023define i16 @test_atomic_load_monotonic_i16() nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001024; CHECK-LABEL: test_atomic_load_monotonic_i16:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001025 %val = load atomic i16* @var16 monotonic, align 2
1026; CHECK-NOT: dmb
1027; CHECK: adrp x[[HIADDR:[0-9]+]], var16
Tim Northover15410e92013-04-08 08:40:41 +00001028; CHECK-NOT: dmb
Tim Northover66c36b82014-04-18 09:31:31 +00001029; CHECK: ldrh w0, [x[[HIADDR]], {{#?}}:lo12:var16]
Tim Northovere0e3aef2013-01-31 12:12:40 +00001030; CHECK-NOT: dmb
1031
1032 ret i16 %val
1033}
1034
1035define i32 @test_atomic_load_monotonic_regoff_i32(i64 %base, i64 %off) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001036; CHECK-LABEL: test_atomic_load_monotonic_regoff_i32:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001037 %addr_int = add i64 %base, %off
1038 %addr = inttoptr i64 %addr_int to i32*
1039
1040 %val = load atomic i32* %addr monotonic, align 4
1041; CHECK-NOT: dmb
1042; CHECK: ldr w0, [x0, x1]
1043; CHECK-NOT: dmb
1044
1045 ret i32 %val
1046}
1047
1048define i64 @test_atomic_load_seq_cst_i64() nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001049; CHECK-LABEL: test_atomic_load_seq_cst_i64:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001050 %val = load atomic i64* @var64 seq_cst, align 8
Tim Northover15410e92013-04-08 08:40:41 +00001051; CHECK-NOT: dmb
1052; CHECK: adrp [[HIADDR:x[0-9]+]], var64
1053; CHECK-NOT: dmb
Tim Northover66c36b82014-04-18 09:31:31 +00001054; CHECK: add x[[ADDR:[0-9]+]], [[HIADDR]], {{#?}}:lo12:var64
Tim Northover15410e92013-04-08 08:40:41 +00001055; CHECK-NOT: dmb
1056; CHECK: ldar x0, [x[[ADDR]]]
1057; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001058 ret i64 %val
1059}
1060
1061define void @test_atomic_store_monotonic_i8(i8 %val) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001062; CHECK-LABEL: test_atomic_store_monotonic_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001063 store atomic i8 %val, i8* @var8 monotonic, align 1
1064; CHECK: adrp x[[HIADDR:[0-9]+]], var8
Tim Northover66c36b82014-04-18 09:31:31 +00001065; CHECK: strb w0, [x[[HIADDR]], {{#?}}:lo12:var8]
Tim Northovere0e3aef2013-01-31 12:12:40 +00001066
1067 ret void
1068}
1069
1070define void @test_atomic_store_monotonic_regoff_i8(i64 %base, i64 %off, i8 %val) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001071; CHECK-LABEL: test_atomic_store_monotonic_regoff_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001072
1073 %addr_int = add i64 %base, %off
1074 %addr = inttoptr i64 %addr_int to i8*
1075
1076 store atomic i8 %val, i8* %addr monotonic, align 1
1077; CHECK: strb w2, [x0, x1]
1078
1079 ret void
1080}
1081define void @test_atomic_store_release_i8(i8 %val) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001082; CHECK-LABEL: test_atomic_store_release_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001083 store atomic i8 %val, i8* @var8 release, align 1
Tim Northover15410e92013-04-08 08:40:41 +00001084; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001085; CHECK: adrp [[HIADDR:x[0-9]+]], var8
Tim Northover15410e92013-04-08 08:40:41 +00001086; CHECK-NOT: dmb
Tim Northover66c36b82014-04-18 09:31:31 +00001087; CHECK: add x[[ADDR:[0-9]+]], [[HIADDR]], {{#?}}:lo12:var8
Tim Northover15410e92013-04-08 08:40:41 +00001088; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001089; CHECK: stlrb w0, [x[[ADDR]]]
Tim Northover15410e92013-04-08 08:40:41 +00001090; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001091 ret void
1092}
1093
1094define void @test_atomic_store_seq_cst_i8(i8 %val) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001095; CHECK-LABEL: test_atomic_store_seq_cst_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001096 store atomic i8 %val, i8* @var8 seq_cst, align 1
Tim Northover15410e92013-04-08 08:40:41 +00001097; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001098; CHECK: adrp [[HIADDR:x[0-9]+]], var8
Tim Northover15410e92013-04-08 08:40:41 +00001099; CHECK-NOT: dmb
Tim Northover66c36b82014-04-18 09:31:31 +00001100; CHECK: add x[[ADDR:[0-9]+]], [[HIADDR]], {{#?}}:lo12:var8
Tim Northover15410e92013-04-08 08:40:41 +00001101; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001102; CHECK: stlrb w0, [x[[ADDR]]]
Tim Northover15410e92013-04-08 08:40:41 +00001103; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001104
1105 ret void
1106}
1107
1108define void @test_atomic_store_monotonic_i16(i16 %val) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001109; CHECK-LABEL: test_atomic_store_monotonic_i16:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001110 store atomic i16 %val, i16* @var16 monotonic, align 2
Tim Northover15410e92013-04-08 08:40:41 +00001111; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001112; CHECK: adrp x[[HIADDR:[0-9]+]], var16
Tim Northover15410e92013-04-08 08:40:41 +00001113; CHECK-NOT: dmb
Tim Northover66c36b82014-04-18 09:31:31 +00001114; CHECK: strh w0, [x[[HIADDR]], {{#?}}:lo12:var16]
Tim Northover15410e92013-04-08 08:40:41 +00001115; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001116 ret void
1117}
1118
1119define void @test_atomic_store_monotonic_regoff_i32(i64 %base, i64 %off, i32 %val) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001120; CHECK-LABEL: test_atomic_store_monotonic_regoff_i32:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001121
1122 %addr_int = add i64 %base, %off
1123 %addr = inttoptr i64 %addr_int to i32*
1124
1125 store atomic i32 %val, i32* %addr monotonic, align 4
Tim Northover15410e92013-04-08 08:40:41 +00001126; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001127; CHECK: str w2, [x0, x1]
Tim Northover15410e92013-04-08 08:40:41 +00001128; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001129
1130 ret void
1131}
1132
1133define void @test_atomic_store_release_i64(i64 %val) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001134; CHECK-LABEL: test_atomic_store_release_i64:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001135 store atomic i64 %val, i64* @var64 release, align 8
Tim Northover15410e92013-04-08 08:40:41 +00001136; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001137; CHECK: adrp [[HIADDR:x[0-9]+]], var64
Tim Northover15410e92013-04-08 08:40:41 +00001138; CHECK-NOT: dmb
Tim Northover66c36b82014-04-18 09:31:31 +00001139; CHECK: add x[[ADDR:[0-9]+]], [[HIADDR]], {{#?}}:lo12:var64
Tim Northover15410e92013-04-08 08:40:41 +00001140; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001141; CHECK: stlr x0, [x[[ADDR]]]
Tim Northover15410e92013-04-08 08:40:41 +00001142; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001143 ret void
1144}