blob: f8db05fd416ea557a4a89f72c180ff5019382374 [file] [log] [blame]
Tim Northover66c36b82014-04-18 09:31:31 +00001; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs < %s | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-AARCH64
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 Northover66c36b82014-04-18 09:31:31 +00003; RUN: llc -mtriple=arm64-none-linux-gnu -verify-machineinstrs < %s | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-ARM64
4; RUN: llc -mtriple=arm64-none-linux-gnu -verify-machineinstrs < %s | FileCheck %s --check-prefix=CHECK-REG
5
6
7; Point of CHECK-REG is to make sure UNPREDICTABLE instructions aren't created
8; (i.e. reusing a register for status & data in store exclusive).
9; CHECK-REG-NOT: stlxrb w[[NEW:[0-9]+]], w[[NEW]], [x{{[0-9]+}}]
10; CHECK-REG-NOT: stlxrb w[[NEW:[0-9]+]], x[[NEW]], [x{{[0-9]+}}]
Tim Northovere0e3aef2013-01-31 12:12:40 +000011
12@var8 = global i8 0
13@var16 = global i16 0
14@var32 = global i32 0
15@var64 = global i64 0
16
17define i8 @test_atomic_load_add_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +000018; CHECK-LABEL: test_atomic_load_add_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +000019 %old = atomicrmw add i8* @var8, i8 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +000020; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000021; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
Tim Northover66c36b82014-04-18 09:31:31 +000022; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var8
Tim Northovere0e3aef2013-01-31 12:12:40 +000023
24; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +000025; CHECK: ldaxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +000026 ; w0 below is a reasonable guess but could change: it certainly comes into the
27 ; function there.
28; CHECK-NEXT: add [[NEW:w[0-9]+]], w[[OLD]], w0
Tim Northover15410e92013-04-08 08:40:41 +000029; CHECK-NEXT: stlxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +000030; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +000031; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000032
Tim Northover66c36b82014-04-18 09:31:31 +000033; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +000034 ret i8 %old
35}
36
37define i16 @test_atomic_load_add_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +000038; CHECK-LABEL: test_atomic_load_add_i16:
Tim Northover15410e92013-04-08 08:40:41 +000039 %old = atomicrmw add i16* @var16, i16 %offset acquire
40; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000041; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
Tim Northover66c36b82014-04-18 09:31:31 +000042; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var16
Tim Northovere0e3aef2013-01-31 12:12:40 +000043
44; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +000045; ; CHECK: ldaxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +000046 ; w0 below is a reasonable guess but could change: it certainly comes into the
47 ; function there.
48; CHECK-NEXT: add [[NEW:w[0-9]+]], w[[OLD]], w0
49; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +000050; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +000051; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000052
Tim Northover66c36b82014-04-18 09:31:31 +000053; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +000054 ret i16 %old
55}
56
57define i32 @test_atomic_load_add_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +000058; CHECK-LABEL: test_atomic_load_add_i32:
Tim Northover15410e92013-04-08 08:40:41 +000059 %old = atomicrmw add i32* @var32, i32 %offset release
60; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000061; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
Tim Northover66c36b82014-04-18 09:31:31 +000062; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var32
Tim Northovere0e3aef2013-01-31 12:12:40 +000063
64; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +000065; ; CHECK: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +000066 ; w0 below is a reasonable guess but could change: it certainly comes into the
67 ; function there.
68; CHECK-NEXT: add [[NEW:w[0-9]+]], w[[OLD]], w0
Tim Northover15410e92013-04-08 08:40:41 +000069; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +000070; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +000071; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000072
Tim Northover66c36b82014-04-18 09:31:31 +000073; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +000074 ret i32 %old
75}
76
77define i64 @test_atomic_load_add_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +000078; CHECK-LABEL: test_atomic_load_add_i64:
Tim Northover15410e92013-04-08 08:40:41 +000079 %old = atomicrmw add i64* @var64, i64 %offset monotonic
80; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +000081; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
Tim Northover66c36b82014-04-18 09:31:31 +000082; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var64
Tim Northovere0e3aef2013-01-31 12:12:40 +000083
84; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +000085; ; CHECK: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +000086 ; x0 below is a reasonable guess but could change: it certainly comes into the
87 ; function there.
88; CHECK-NEXT: add [[NEW:x[0-9]+]], x[[OLD]], x0
89; 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
Tim Northover66c36b82014-04-18 09:31:31 +0000102; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var8
Tim Northovere0e3aef2013-01-31 12:12:40 +0000103
104; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000105; ; CHECK: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000106 ; 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
109; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000110; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000111; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000112
Tim Northover66c36b82014-04-18 09:31:31 +0000113; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000114 ret i8 %old
115}
116
117define i16 @test_atomic_load_sub_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000118; CHECK-LABEL: test_atomic_load_sub_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000119 %old = atomicrmw sub i16* @var16, i16 %offset release
120; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000121; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
Tim Northover66c36b82014-04-18 09:31:31 +0000122; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var16
Tim Northovere0e3aef2013-01-31 12:12:40 +0000123
124; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000125; ; CHECK: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000126 ; w0 below is a reasonable guess but could change: it certainly comes into the
127 ; function there.
128; CHECK-NEXT: sub [[NEW:w[0-9]+]], w[[OLD]], w0
Tim Northover15410e92013-04-08 08:40:41 +0000129; CHECK-NEXT: stlxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000130; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000131; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000132
Tim Northover66c36b82014-04-18 09:31:31 +0000133; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000134 ret i16 %old
135}
136
137define i32 @test_atomic_load_sub_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000138; CHECK-LABEL: test_atomic_load_sub_i32:
Tim Northover15410e92013-04-08 08:40:41 +0000139 %old = atomicrmw sub i32* @var32, i32 %offset acquire
140; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000141; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
Tim Northover66c36b82014-04-18 09:31:31 +0000142; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var32
Tim Northovere0e3aef2013-01-31 12:12:40 +0000143
144; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000145; ; CHECK: ldaxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000146 ; w0 below is a reasonable guess but could change: it certainly comes into the
147 ; function there.
148; CHECK-NEXT: sub [[NEW:w[0-9]+]], w[[OLD]], w0
149; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000150; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000151; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000152
Tim Northover66c36b82014-04-18 09:31:31 +0000153; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000154 ret i32 %old
155}
156
157define i64 @test_atomic_load_sub_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000158; CHECK-LABEL: test_atomic_load_sub_i64:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000159 %old = atomicrmw sub i64* @var64, i64 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000160; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000161; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
Tim Northover66c36b82014-04-18 09:31:31 +0000162; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var64
Tim Northovere0e3aef2013-01-31 12:12:40 +0000163
164; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000165; ; CHECK: ldaxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000166 ; x0 below is a reasonable guess but could change: it certainly comes into the
167 ; function there.
168; CHECK-NEXT: sub [[NEW:x[0-9]+]], x[[OLD]], x0
Tim Northover15410e92013-04-08 08:40:41 +0000169; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000170; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000171; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000172
173; CHECK: mov x0, x[[OLD]]
174 ret i64 %old
175}
176
177define i8 @test_atomic_load_and_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000178; CHECK-LABEL: test_atomic_load_and_i8:
Tim Northover15410e92013-04-08 08:40:41 +0000179 %old = atomicrmw and i8* @var8, i8 %offset release
180; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000181; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
Tim Northover66c36b82014-04-18 09:31:31 +0000182; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var8
Tim Northovere0e3aef2013-01-31 12:12:40 +0000183
184; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000185; ; CHECK: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000186 ; w0 below is a reasonable guess but could change: it certainly comes into the
187 ; function there.
188; CHECK-NEXT: and [[NEW:w[0-9]+]], w[[OLD]], w0
Tim Northover15410e92013-04-08 08:40:41 +0000189; CHECK-NEXT: stlxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000190; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000191; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000192
Tim Northover66c36b82014-04-18 09:31:31 +0000193; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000194 ret i8 %old
195}
196
197define i16 @test_atomic_load_and_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000198; CHECK-LABEL: test_atomic_load_and_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000199 %old = atomicrmw and i16* @var16, i16 %offset monotonic
200; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000201; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
Tim Northover66c36b82014-04-18 09:31:31 +0000202; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var16
Tim Northovere0e3aef2013-01-31 12:12:40 +0000203
204; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000205; ; CHECK: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000206 ; w0 below is a reasonable guess but could change: it certainly comes into the
207 ; function there.
208; CHECK-NEXT: and [[NEW:w[0-9]+]], w[[OLD]], w0
209; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000210; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000211; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000212
Tim Northover66c36b82014-04-18 09:31:31 +0000213; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000214 ret i16 %old
215}
216
217define i32 @test_atomic_load_and_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000218; CHECK-LABEL: test_atomic_load_and_i32:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000219 %old = atomicrmw and i32* @var32, i32 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000220; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000221; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
Tim Northover66c36b82014-04-18 09:31:31 +0000222; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var32
Tim Northovere0e3aef2013-01-31 12:12:40 +0000223
224; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000225; ; CHECK: ldaxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000226 ; w0 below is a reasonable guess but could change: it certainly comes into the
227 ; function there.
228; CHECK-NEXT: and [[NEW:w[0-9]+]], w[[OLD]], w0
Tim Northover15410e92013-04-08 08:40:41 +0000229; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000230; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000231; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000232
Tim Northover66c36b82014-04-18 09:31:31 +0000233; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000234 ret i32 %old
235}
236
237define i64 @test_atomic_load_and_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000238; CHECK-LABEL: test_atomic_load_and_i64:
Tim Northover15410e92013-04-08 08:40:41 +0000239 %old = atomicrmw and i64* @var64, i64 %offset acquire
240; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000241; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
Tim Northover66c36b82014-04-18 09:31:31 +0000242; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var64
Tim Northovere0e3aef2013-01-31 12:12:40 +0000243
244; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000245; ; CHECK: ldaxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000246 ; x0 below is a reasonable guess but could change: it certainly comes into the
247 ; function there.
248; CHECK-NEXT: and [[NEW:x[0-9]+]], x[[OLD]], x0
249; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000250; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000251; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000252
253; CHECK: mov x0, x[[OLD]]
254 ret i64 %old
255}
256
257define i8 @test_atomic_load_or_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000258; CHECK-LABEL: test_atomic_load_or_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000259 %old = atomicrmw or i8* @var8, i8 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000260; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000261; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
Tim Northover66c36b82014-04-18 09:31:31 +0000262; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var8
Tim Northovere0e3aef2013-01-31 12:12:40 +0000263
264; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000265; ; CHECK: ldaxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000266 ; w0 below is a reasonable guess but could change: it certainly comes into the
267 ; function there.
268; CHECK-NEXT: orr [[NEW:w[0-9]+]], w[[OLD]], w0
Tim Northover15410e92013-04-08 08:40:41 +0000269; CHECK-NEXT: stlxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000270; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000271; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000272
Tim Northover66c36b82014-04-18 09:31:31 +0000273; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000274 ret i8 %old
275}
276
277define i16 @test_atomic_load_or_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000278; CHECK-LABEL: test_atomic_load_or_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000279 %old = atomicrmw or i16* @var16, i16 %offset monotonic
280; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000281; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
Tim Northover66c36b82014-04-18 09:31:31 +0000282; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var16
Tim Northovere0e3aef2013-01-31 12:12:40 +0000283
284; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000285; ; CHECK: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000286 ; w0 below is a reasonable guess but could change: it certainly comes into the
287 ; function there.
288; CHECK-NEXT: orr [[NEW:w[0-9]+]], w[[OLD]], w0
289; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000290; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000291; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000292
Tim Northover66c36b82014-04-18 09:31:31 +0000293; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000294 ret i16 %old
295}
296
297define i32 @test_atomic_load_or_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000298; CHECK-LABEL: test_atomic_load_or_i32:
Tim Northover15410e92013-04-08 08:40:41 +0000299 %old = atomicrmw or i32* @var32, i32 %offset acquire
300; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000301; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
Tim Northover66c36b82014-04-18 09:31:31 +0000302; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var32
Tim Northovere0e3aef2013-01-31 12:12:40 +0000303
304; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000305; ; CHECK: ldaxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000306 ; w0 below is a reasonable guess but could change: it certainly comes into the
307 ; function there.
308; CHECK-NEXT: orr [[NEW:w[0-9]+]], w[[OLD]], w0
309; CHECK-NEXT: stxr [[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
Tim Northover66c36b82014-04-18 09:31:31 +0000313; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000314 ret i32 %old
315}
316
317define i64 @test_atomic_load_or_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000318; CHECK-LABEL: test_atomic_load_or_i64:
Tim Northover15410e92013-04-08 08:40:41 +0000319 %old = atomicrmw or i64* @var64, i64 %offset release
320; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000321; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
Tim Northover66c36b82014-04-18 09:31:31 +0000322; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var64
Tim Northovere0e3aef2013-01-31 12:12:40 +0000323
324; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000325; ; CHECK: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000326 ; x0 below is a reasonable guess but could change: it certainly comes into the
327 ; function there.
328; CHECK-NEXT: orr [[NEW:x[0-9]+]], x[[OLD]], x0
Tim Northover15410e92013-04-08 08:40:41 +0000329; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000330; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000331; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000332
333; CHECK: mov x0, x[[OLD]]
334 ret i64 %old
335}
336
337define i8 @test_atomic_load_xor_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000338; CHECK-LABEL: test_atomic_load_xor_i8:
Tim Northover15410e92013-04-08 08:40:41 +0000339 %old = atomicrmw xor i8* @var8, i8 %offset acquire
340; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000341; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
Tim Northover66c36b82014-04-18 09:31:31 +0000342; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var8
Tim Northovere0e3aef2013-01-31 12:12:40 +0000343
344; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000345; ; CHECK: ldaxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000346 ; w0 below is a reasonable guess but could change: it certainly comes into the
347 ; function there.
348; CHECK-NEXT: eor [[NEW:w[0-9]+]], w[[OLD]], w0
349; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000350; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000351; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000352
Tim Northover66c36b82014-04-18 09:31:31 +0000353; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000354 ret i8 %old
355}
356
357define i16 @test_atomic_load_xor_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000358; CHECK-LABEL: test_atomic_load_xor_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000359 %old = atomicrmw xor i16* @var16, i16 %offset release
360; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000361; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
Tim Northover66c36b82014-04-18 09:31:31 +0000362; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var16
Tim Northovere0e3aef2013-01-31 12:12:40 +0000363
364; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000365; ; CHECK: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000366 ; w0 below is a reasonable guess but could change: it certainly comes into the
367 ; function there.
368; CHECK-NEXT: eor [[NEW:w[0-9]+]], w[[OLD]], w0
Tim Northover15410e92013-04-08 08:40:41 +0000369; CHECK-NEXT: stlxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000370; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000371; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000372
Tim Northover66c36b82014-04-18 09:31:31 +0000373; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000374 ret i16 %old
375}
376
377define i32 @test_atomic_load_xor_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000378; CHECK-LABEL: test_atomic_load_xor_i32:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000379 %old = atomicrmw xor i32* @var32, i32 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000380; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000381; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
Tim Northover66c36b82014-04-18 09:31:31 +0000382; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var32
Tim Northovere0e3aef2013-01-31 12:12:40 +0000383
384; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000385; ; CHECK: ldaxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000386 ; w0 below is a reasonable guess but could change: it certainly comes into the
387 ; function there.
388; CHECK-NEXT: eor [[NEW:w[0-9]+]], w[[OLD]], w0
Tim Northover15410e92013-04-08 08:40:41 +0000389; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000390; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000391; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000392
Tim Northover66c36b82014-04-18 09:31:31 +0000393; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000394 ret i32 %old
395}
396
397define i64 @test_atomic_load_xor_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000398; CHECK-LABEL: test_atomic_load_xor_i64:
Tim Northover15410e92013-04-08 08:40:41 +0000399 %old = atomicrmw xor i64* @var64, i64 %offset monotonic
400; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000401; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
Tim Northover66c36b82014-04-18 09:31:31 +0000402; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var64
Tim Northovere0e3aef2013-01-31 12:12:40 +0000403
404; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000405; ; CHECK: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000406 ; x0 below is a reasonable guess but could change: it certainly comes into the
407 ; function there.
408; CHECK-NEXT: eor [[NEW:x[0-9]+]], x[[OLD]], x0
409; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000410; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000411; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000412
413; CHECK: mov x0, x[[OLD]]
414 ret i64 %old
415}
416
417define i8 @test_atomic_load_xchg_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000418; CHECK-LABEL: test_atomic_load_xchg_i8:
Tim Northover15410e92013-04-08 08:40:41 +0000419 %old = atomicrmw xchg i8* @var8, i8 %offset monotonic
420; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000421; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
Tim Northover66c36b82014-04-18 09:31:31 +0000422; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var8
Tim Northovere0e3aef2013-01-31 12:12:40 +0000423
424; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000425; ; CHECK: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000426 ; w0 below is a reasonable guess but could change: it certainly comes into the
427 ; function there.
428; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], w0, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000429; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000430; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000431
Tim Northover66c36b82014-04-18 09:31:31 +0000432; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000433 ret i8 %old
434}
435
436define i16 @test_atomic_load_xchg_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000437; CHECK-LABEL: test_atomic_load_xchg_i16:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000438 %old = atomicrmw xchg i16* @var16, i16 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000439; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000440; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
Tim Northover66c36b82014-04-18 09:31:31 +0000441; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var16
Tim Northovere0e3aef2013-01-31 12:12:40 +0000442
443; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000444; ; CHECK: ldaxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000445 ; w0 below is a reasonable guess but could change: it certainly comes into the
446 ; function there.
Tim Northover15410e92013-04-08 08:40:41 +0000447; CHECK-NEXT: stlxrh [[STATUS:w[0-9]+]], w0, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000448; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000449; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000450
Tim Northover66c36b82014-04-18 09:31:31 +0000451; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000452 ret i16 %old
453}
454
455define i32 @test_atomic_load_xchg_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000456; CHECK-LABEL: test_atomic_load_xchg_i32:
Tim Northover15410e92013-04-08 08:40:41 +0000457 %old = atomicrmw xchg i32* @var32, i32 %offset release
458; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000459; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
Tim Northover66c36b82014-04-18 09:31:31 +0000460; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var32
Tim Northovere0e3aef2013-01-31 12:12:40 +0000461
462; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000463; ; CHECK: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000464 ; w0 below is a reasonable guess but could change: it certainly comes into the
465 ; function there.
Tim Northover15410e92013-04-08 08:40:41 +0000466; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], w0, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000467; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000468; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000469
Tim Northover66c36b82014-04-18 09:31:31 +0000470; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000471 ret i32 %old
472}
473
474define i64 @test_atomic_load_xchg_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000475; CHECK-LABEL: test_atomic_load_xchg_i64:
Tim Northover15410e92013-04-08 08:40:41 +0000476 %old = atomicrmw xchg i64* @var64, i64 %offset acquire
477; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000478; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
Tim Northover66c36b82014-04-18 09:31:31 +0000479; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var64
Tim Northovere0e3aef2013-01-31 12:12:40 +0000480
481; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000482; ; CHECK: ldaxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000483 ; x0 below is a reasonable guess but could change: it certainly comes into the
484 ; function there.
485; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], x0, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000486; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000487; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000488
489; CHECK: mov x0, x[[OLD]]
490 ret i64 %old
491}
492
493
494define i8 @test_atomic_load_min_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000495; CHECK-LABEL: test_atomic_load_min_i8:
Tim Northover15410e92013-04-08 08:40:41 +0000496 %old = atomicrmw min i8* @var8, i8 %offset acquire
497; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000498; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
Tim Northover66c36b82014-04-18 09:31:31 +0000499; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var8
Tim Northovere0e3aef2013-01-31 12:12:40 +0000500
501; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000502; CHECK: ldaxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000503 ; w0 below is a reasonable guess but could change: it certainly comes into the
504 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000505; CHECK-AARCH64-NEXT: cmp w0, w[[OLD]], sxtb
506; CHECK-AARCH64-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, gt
507
508; CHECK-ARM64-NEXT: sxtb w[[OLD_EXT:[0-9]+]], w[[OLD]]
509; CHECK-ARM64-NEXT: cmp w[[OLD_EXT]], w0, sxtb
510; CHECK-ARM64-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, le
511
Tim Northovere0e3aef2013-01-31 12:12:40 +0000512; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000513; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000514; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000515
Tim Northover66c36b82014-04-18 09:31:31 +0000516; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000517 ret i8 %old
518}
519
520define i16 @test_atomic_load_min_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000521; CHECK-LABEL: test_atomic_load_min_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000522 %old = atomicrmw min i16* @var16, i16 %offset release
523; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000524; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
Tim Northover66c36b82014-04-18 09:31:31 +0000525; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var16
Tim Northovere0e3aef2013-01-31 12:12:40 +0000526
527; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000528; CHECK: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000529 ; w0 below is a reasonable guess but could change: it certainly comes into the
530 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000531; CHECK-AARCH64-NEXT: cmp w0, w[[OLD]], sxth
532; CHECK-AARCH64-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, gt
533
534; CHECK-ARM64-NEXT: sxth w[[OLD_EXT:[0-9]+]], w[[OLD]]
535; CHECK-ARM64-NEXT: cmp w[[OLD_EXT]], w0, sxth
536; CHECK-ARM64-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, le
537
538
Tim Northover15410e92013-04-08 08:40:41 +0000539; CHECK-NEXT: stlxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000540; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000541; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000542
Tim Northover66c36b82014-04-18 09:31:31 +0000543; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000544 ret i16 %old
545}
546
547define i32 @test_atomic_load_min_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000548; CHECK-LABEL: test_atomic_load_min_i32:
Tim Northover15410e92013-04-08 08:40:41 +0000549 %old = atomicrmw min i32* @var32, i32 %offset monotonic
550; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000551; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
Tim Northover66c36b82014-04-18 09:31:31 +0000552; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var32
Tim Northovere0e3aef2013-01-31 12:12:40 +0000553
554; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000555; CHECK: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000556 ; w0 below is a reasonable guess but could change: it certainly comes into the
557 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000558; CHECK-AARCH64-NEXT: cmp w0, w[[OLD]]
559; CHECK-AARCH64-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, gt
560
561; CHECK-ARM64-NEXT: cmp w[[OLD]], w0
562; CHECK-ARM64-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, le
563
564
Tim Northovere0e3aef2013-01-31 12:12:40 +0000565; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000566; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000567; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000568
Tim Northover66c36b82014-04-18 09:31:31 +0000569; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000570 ret i32 %old
571}
572
573define i64 @test_atomic_load_min_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000574; CHECK-LABEL: test_atomic_load_min_i64:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000575 %old = atomicrmw min i64* @var64, i64 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000576; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000577; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
Tim Northover66c36b82014-04-18 09:31:31 +0000578; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var64
Tim Northovere0e3aef2013-01-31 12:12:40 +0000579
580; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000581; CHECK: ldaxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000582 ; x0 below is a reasonable guess but could change: it certainly comes into the
583 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000584; CHECK-AARCH64-NEXT: cmp x0, x[[OLD]]
585; CHECK-AARCH64-NEXT: csel [[NEW:x[0-9]+]], x[[OLD]], x0, gt
586
587; CHECK-ARM64-NEXT: cmp x[[OLD]], x0
588; CHECK-ARM64-NEXT: csel [[NEW:x[0-9]+]], x[[OLD]], x0, le
589
590
Tim Northover15410e92013-04-08 08:40:41 +0000591; CHECK-NEXT: stlxr [[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 i64 %old
597}
598
599define i8 @test_atomic_load_max_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000600; CHECK-LABEL: test_atomic_load_max_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000601 %old = atomicrmw max i8* @var8, i8 %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]+]], var8
Tim Northover66c36b82014-04-18 09:31:31 +0000604; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var8
Tim Northovere0e3aef2013-01-31 12:12:40 +0000605
606; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000607; CHECK: ldaxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000608 ; w0 below is a reasonable guess but could change: it certainly comes into the
609 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000610; CHECK-AARCH64-NEXT: cmp w0, w[[OLD]], sxtb
611; CHECK-AARCH64-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lt
612
613; CHECK-ARM64-NEXT: sxtb w[[OLD_EXT:[0-9]+]], w[[OLD]]
614; CHECK-ARM64-NEXT: cmp w[[OLD_EXT]], w0, sxtb
615; CHECK-ARM64-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, gt
616
617
Tim Northover15410e92013-04-08 08:40:41 +0000618; CHECK-NEXT: stlxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000619; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000620; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000621
Tim Northover66c36b82014-04-18 09:31:31 +0000622; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000623 ret i8 %old
624}
625
626define i16 @test_atomic_load_max_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000627; CHECK-LABEL: test_atomic_load_max_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000628 %old = atomicrmw max i16* @var16, i16 %offset acquire
629; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000630; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
Tim Northover66c36b82014-04-18 09:31:31 +0000631; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var16
Tim Northovere0e3aef2013-01-31 12:12:40 +0000632
633; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000634; CHECK: ldaxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000635 ; w0 below is a reasonable guess but could change: it certainly comes into the
636 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000637; CHECK-AARCH64-NEXT: cmp w0, w[[OLD]], sxth
638; CHECK-AARCH64-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lt
639
640; CHECK-ARM64-NEXT: sxth w[[OLD_EXT:[0-9]+]], w[[OLD]]
641; CHECK-ARM64-NEXT: cmp w[[OLD_EXT]], w0, sxth
642; CHECK-ARM64-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, gt
643
644
Tim Northovere0e3aef2013-01-31 12:12:40 +0000645; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000646; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000647; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000648
Tim Northover66c36b82014-04-18 09:31:31 +0000649; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000650 ret i16 %old
651}
652
653define i32 @test_atomic_load_max_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000654; CHECK-LABEL: test_atomic_load_max_i32:
Tim Northover15410e92013-04-08 08:40:41 +0000655 %old = atomicrmw max i32* @var32, i32 %offset release
656; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000657; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
Tim Northover66c36b82014-04-18 09:31:31 +0000658; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var32
Tim Northovere0e3aef2013-01-31 12:12:40 +0000659
660; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000661; CHECK: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000662 ; w0 below is a reasonable guess but could change: it certainly comes into the
663 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000664; CHECK-AARCH64-NEXT: cmp w0, w[[OLD]]
665; CHECK-AARCH64-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lt
666
667; CHECK-ARM64-NEXT: cmp w[[OLD]], w0
668; CHECK-ARM64-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, gt
669
670
Tim Northover15410e92013-04-08 08:40:41 +0000671; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000672; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000673; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000674
Tim Northover66c36b82014-04-18 09:31:31 +0000675; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000676 ret i32 %old
677}
678
679define i64 @test_atomic_load_max_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000680; CHECK-LABEL: test_atomic_load_max_i64:
Tim Northover15410e92013-04-08 08:40:41 +0000681 %old = atomicrmw max i64* @var64, i64 %offset monotonic
682; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000683; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
Tim Northover66c36b82014-04-18 09:31:31 +0000684; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var64
Tim Northovere0e3aef2013-01-31 12:12:40 +0000685
686; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000687; CHECK: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000688 ; x0 below is a reasonable guess but could change: it certainly comes into the
689 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000690; CHECK-AARCH64-NEXT: cmp x0, x[[OLD]]
691; CHECK-AARCH64-NEXT: csel [[NEW:x[0-9]+]], x[[OLD]], x0, lt
692
693; CHECK-ARM64-NEXT: cmp x[[OLD]], x0
694; CHECK-ARM64-NEXT: csel [[NEW:x[0-9]+]], x[[OLD]], x0, gt
695
696
Tim Northovere0e3aef2013-01-31 12:12:40 +0000697; CHECK-NEXT: stxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000698; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000699; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000700
701; CHECK: mov x0, x[[OLD]]
702 ret i64 %old
703}
704
705define i8 @test_atomic_load_umin_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000706; CHECK-LABEL: test_atomic_load_umin_i8:
Tim Northover15410e92013-04-08 08:40:41 +0000707 %old = atomicrmw umin i8* @var8, i8 %offset monotonic
708; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000709; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
Tim Northover66c36b82014-04-18 09:31:31 +0000710; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var8
Tim Northovere0e3aef2013-01-31 12:12:40 +0000711
712; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000713; CHECK: ldxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000714 ; w0 below is a reasonable guess but could change: it certainly comes into the
715 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000716; CHECK-AARCH64-NEXT: cmp w0, w[[OLD]], uxtb
717; CHECK-AARCH64-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, hi
718
719; CHECK-ARM64-NEXT: cmp w[[OLD]], w0, uxtb
720; CHECK-ARM64-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, ls
721
722
Tim Northovere0e3aef2013-01-31 12:12:40 +0000723; CHECK-NEXT: stxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000724; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000725; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000726
Tim Northover66c36b82014-04-18 09:31:31 +0000727; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000728 ret i8 %old
729}
730
731define i16 @test_atomic_load_umin_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000732; CHECK-LABEL: test_atomic_load_umin_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000733 %old = atomicrmw umin i16* @var16, i16 %offset acquire
734; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000735; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
Tim Northover66c36b82014-04-18 09:31:31 +0000736; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var16
Tim Northovere0e3aef2013-01-31 12:12:40 +0000737
738; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000739; CHECK: ldaxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000740 ; w0 below is a reasonable guess but could change: it certainly comes into the
741 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000742; CHECK-AARCH64-NEXT: cmp w0, w[[OLD]], uxth
743; CHECK-AARCH64-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, hi
744
745; CHECK-ARM64-NEXT: cmp w[[OLD]], w0, uxth
746; CHECK-ARM64-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, ls
747
748
Tim Northovere0e3aef2013-01-31 12:12:40 +0000749; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000750; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000751; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000752
Tim Northover66c36b82014-04-18 09:31:31 +0000753; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000754 ret i16 %old
755}
756
757define i32 @test_atomic_load_umin_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000758; CHECK-LABEL: test_atomic_load_umin_i32:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000759 %old = atomicrmw umin i32* @var32, i32 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000760; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000761; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
Tim Northover66c36b82014-04-18 09:31:31 +0000762; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var32
Tim Northovere0e3aef2013-01-31 12:12:40 +0000763
764; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000765; CHECK: ldaxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000766 ; w0 below is a reasonable guess but could change: it certainly comes into the
767 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000768; CHECK-AARCH64-NEXT: cmp w0, w[[OLD]]
769; CHECK-AARCH64-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, hi
770
771; CHECK-ARM64-NEXT: cmp w[[OLD]], w0
772; CHECK-ARM64-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, ls
773
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
Tim Northover66c36b82014-04-18 09:31:31 +0000779; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000780 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
Tim Northover66c36b82014-04-18 09:31:31 +0000788; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var64
Tim Northovere0e3aef2013-01-31 12:12:40 +0000789
790; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000791; CHECK: 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.
Tim Northover66c36b82014-04-18 09:31:31 +0000794; CHECK-AARCH64-NEXT: cmp x0, x[[OLD]]
795; CHECK-AARCH64-NEXT: csel [[NEW:x[0-9]+]], x[[OLD]], x0, hi
796
797; CHECK-ARM64-NEXT: cmp x[[OLD]], x0
798; CHECK-ARM64-NEXT: csel [[NEW:x[0-9]+]], x[[OLD]], x0, ls
799
800
Tim Northover15410e92013-04-08 08:40:41 +0000801; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000802; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000803; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000804
805; CHECK: mov x0, x[[OLD]]
806 ret i64 %old
807}
808
809define i8 @test_atomic_load_umax_i8(i8 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000810; CHECK-LABEL: test_atomic_load_umax_i8:
Tim Northover15410e92013-04-08 08:40:41 +0000811 %old = atomicrmw umax i8* @var8, i8 %offset acq_rel
812; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000813; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
Tim Northover66c36b82014-04-18 09:31:31 +0000814; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var8
Tim Northovere0e3aef2013-01-31 12:12:40 +0000815
816; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000817; CHECK: ldaxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000818 ; w0 below is a reasonable guess but could change: it certainly comes into the
819 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000820; CHECK-AARCH64-NEXT: cmp w0, w[[OLD]], uxtb
821; CHECK-AARCH64-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lo
822
823; CHECK-ARM64-NEXT: cmp w[[OLD]], w0, uxtb
824; CHECK-ARM64-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, hi
825
826
Tim Northover15410e92013-04-08 08:40:41 +0000827; CHECK-NEXT: stlxrb [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000828; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000829; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000830
Tim Northover66c36b82014-04-18 09:31:31 +0000831; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000832 ret i8 %old
833}
834
835define i16 @test_atomic_load_umax_i16(i16 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000836; CHECK-LABEL: test_atomic_load_umax_i16:
Tim Northover15410e92013-04-08 08:40:41 +0000837 %old = atomicrmw umax i16* @var16, i16 %offset monotonic
838; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000839; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
Tim Northover66c36b82014-04-18 09:31:31 +0000840; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var16
Tim Northovere0e3aef2013-01-31 12:12:40 +0000841
842; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000843; CHECK: ldxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000844 ; w0 below is a reasonable guess but could change: it certainly comes into the
845 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000846; CHECK-AARCH64-NEXT: cmp w0, w[[OLD]], uxth
847; CHECK-AARCH64-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lo
848
849; CHECK-ARM64-NEXT: cmp w[[OLD]], w0, uxth
850; CHECK-ARM64-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, hi
851
852
Tim Northovere0e3aef2013-01-31 12:12:40 +0000853; CHECK-NEXT: stxrh [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000854; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000855; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000856
Tim Northover66c36b82014-04-18 09:31:31 +0000857; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000858 ret i16 %old
859}
860
861define i32 @test_atomic_load_umax_i32(i32 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000862; CHECK-LABEL: test_atomic_load_umax_i32:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000863 %old = atomicrmw umax i32* @var32, i32 %offset seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000864; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000865; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
Tim Northover66c36b82014-04-18 09:31:31 +0000866; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var32
Tim Northovere0e3aef2013-01-31 12:12:40 +0000867
868; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000869; CHECK: ldaxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000870 ; w0 below is a reasonable guess but could change: it certainly comes into the
871 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000872; CHECK-AARCH64-NEXT: cmp w0, w[[OLD]]
873; CHECK-AARCH64-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, lo
874
875; CHECK-ARM64-NEXT: cmp w[[OLD]], w0
876; CHECK-ARM64-NEXT: csel [[NEW:w[0-9]+]], w[[OLD]], w0, hi
877
878
Tim Northover15410e92013-04-08 08:40:41 +0000879; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000880; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000881; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000882
Tim Northover66c36b82014-04-18 09:31:31 +0000883; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000884 ret i32 %old
885}
886
887define i64 @test_atomic_load_umax_i64(i64 %offset) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000888; CHECK-LABEL: test_atomic_load_umax_i64:
Tim Northover15410e92013-04-08 08:40:41 +0000889 %old = atomicrmw umax i64* @var64, i64 %offset release
890; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000891; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
Tim Northover66c36b82014-04-18 09:31:31 +0000892; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var64
Tim Northovere0e3aef2013-01-31 12:12:40 +0000893
894; CHECK: .LBB{{[0-9]+}}_1:
Tim Northover66c36b82014-04-18 09:31:31 +0000895; CHECK: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000896 ; x0 below is a reasonable guess but could change: it certainly comes into the
897 ; function there.
Tim Northover66c36b82014-04-18 09:31:31 +0000898; CHECK-AARCH64-NEXT: cmp x0, x[[OLD]]
899; CHECK-AARCH64-NEXT: csel [[NEW:x[0-9]+]], x[[OLD]], x0, lo
900
901; CHECK-ARM64-NEXT: cmp x[[OLD]], x0
902; CHECK-ARM64-NEXT: csel [[NEW:x[0-9]+]], x[[OLD]], x0, hi
903
904
Tim Northover15410e92013-04-08 08:40:41 +0000905; CHECK-NEXT: stlxr [[STATUS:w[0-9]+]], [[NEW]], [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000906; CHECK-NEXT: cbnz [[STATUS]], .LBB{{[0-9]+}}_1
Tim Northover15410e92013-04-08 08:40:41 +0000907; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000908
909; CHECK: mov x0, x[[OLD]]
910 ret i64 %old
911}
912
913define i8 @test_atomic_cmpxchg_i8(i8 %wanted, i8 %new) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000914; CHECK-LABEL: test_atomic_cmpxchg_i8:
Tim Northovere94a5182014-03-11 10:48:52 +0000915 %old = cmpxchg i8* @var8, i8 %wanted, i8 %new acquire acquire
Tim Northover15410e92013-04-08 08:40:41 +0000916; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000917; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
Tim Northover66c36b82014-04-18 09:31:31 +0000918; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var8
Tim Northovere0e3aef2013-01-31 12:12:40 +0000919
920; CHECK: [[STARTAGAIN:.LBB[0-9]+_[0-9]+]]:
Tim Northover66c36b82014-04-18 09:31:31 +0000921; CHECK: ldaxrb w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000922 ; w0 below is a reasonable guess but could change: it certainly comes into the
923 ; function there.
924; CHECK-NEXT: cmp w[[OLD]], w0
925; CHECK-NEXT: b.ne [[GET_OUT:.LBB[0-9]+_[0-9]+]]
926 ; As above, w1 is a reasonable guess.
927; CHECK: stxrb [[STATUS:w[0-9]+]], w1, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000928; CHECK-NEXT: cbnz [[STATUS]], [[STARTAGAIN]]
Tim Northover15410e92013-04-08 08:40:41 +0000929; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000930
Tim Northover66c36b82014-04-18 09:31:31 +0000931; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000932 ret i8 %old
933}
934
935define i16 @test_atomic_cmpxchg_i16(i16 %wanted, i16 %new) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000936; CHECK-LABEL: test_atomic_cmpxchg_i16:
Tim Northovere94a5182014-03-11 10:48:52 +0000937 %old = cmpxchg i16* @var16, i16 %wanted, i16 %new seq_cst seq_cst
Tim Northover15410e92013-04-08 08:40:41 +0000938; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000939; CHECK: adrp [[TMPADDR:x[0-9]+]], var16
Tim Northover66c36b82014-04-18 09:31:31 +0000940; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var16
Tim Northovere0e3aef2013-01-31 12:12:40 +0000941
942; CHECK: [[STARTAGAIN:.LBB[0-9]+_[0-9]+]]:
Tim Northover66c36b82014-04-18 09:31:31 +0000943; CHECK: ldaxrh w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000944 ; w0 below is a reasonable guess but could change: it certainly comes into the
945 ; function there.
946; CHECK-NEXT: cmp w[[OLD]], w0
947; CHECK-NEXT: b.ne [[GET_OUT:.LBB[0-9]+_[0-9]+]]
948 ; As above, w1 is a reasonable guess.
Tim Northover15410e92013-04-08 08:40:41 +0000949; CHECK: stlxrh [[STATUS:w[0-9]+]], w1, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000950; CHECK-NEXT: cbnz [[STATUS]], [[STARTAGAIN]]
Tim Northover15410e92013-04-08 08:40:41 +0000951; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000952
Tim Northover66c36b82014-04-18 09:31:31 +0000953; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000954 ret i16 %old
955}
956
957define i32 @test_atomic_cmpxchg_i32(i32 %wanted, i32 %new) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000958; CHECK-LABEL: test_atomic_cmpxchg_i32:
Tim Northovere94a5182014-03-11 10:48:52 +0000959 %old = cmpxchg i32* @var32, i32 %wanted, i32 %new release monotonic
Tim Northover15410e92013-04-08 08:40:41 +0000960; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000961; CHECK: adrp [[TMPADDR:x[0-9]+]], var32
Tim Northover66c36b82014-04-18 09:31:31 +0000962; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var32
Tim Northovere0e3aef2013-01-31 12:12:40 +0000963
964; CHECK: [[STARTAGAIN:.LBB[0-9]+_[0-9]+]]:
Tim Northover66c36b82014-04-18 09:31:31 +0000965; CHECK: ldxr w[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000966 ; w0 below is a reasonable guess but could change: it certainly comes into the
967 ; function there.
968; CHECK-NEXT: cmp w[[OLD]], w0
969; CHECK-NEXT: b.ne [[GET_OUT:.LBB[0-9]+_[0-9]+]]
970 ; As above, w1 is a reasonable guess.
Tim Northover15410e92013-04-08 08:40:41 +0000971; CHECK: stlxr [[STATUS:w[0-9]+]], w1, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000972; CHECK-NEXT: cbnz [[STATUS]], [[STARTAGAIN]]
Tim Northover15410e92013-04-08 08:40:41 +0000973; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000974
Tim Northover66c36b82014-04-18 09:31:31 +0000975; CHECK: mov {{[xw]}}0, {{[xw]}}[[OLD]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000976 ret i32 %old
977}
978
Tim Northover66c36b82014-04-18 09:31:31 +0000979define void @test_atomic_cmpxchg_i64(i64 %wanted, i64 %new) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +0000980; CHECK-LABEL: test_atomic_cmpxchg_i64:
Tim Northovere94a5182014-03-11 10:48:52 +0000981 %old = cmpxchg i64* @var64, i64 %wanted, i64 %new monotonic monotonic
Tim Northover15410e92013-04-08 08:40:41 +0000982; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000983; CHECK: adrp [[TMPADDR:x[0-9]+]], var64
Tim Northover66c36b82014-04-18 09:31:31 +0000984; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var64
Tim Northovere0e3aef2013-01-31 12:12:40 +0000985
986; CHECK: [[STARTAGAIN:.LBB[0-9]+_[0-9]+]]:
Tim Northover66c36b82014-04-18 09:31:31 +0000987; CHECK: ldxr x[[OLD:[0-9]+]], [x[[ADDR]]]
Tim Northovere0e3aef2013-01-31 12:12:40 +0000988 ; w0 below is a reasonable guess but could change: it certainly comes into the
989 ; function there.
990; CHECK-NEXT: cmp x[[OLD]], x0
991; CHECK-NEXT: b.ne [[GET_OUT:.LBB[0-9]+_[0-9]+]]
992 ; As above, w1 is a reasonable guess.
993; CHECK: stxr [[STATUS:w[0-9]+]], x1, [x[[ADDR]]]
Tim Northover9fafdf62013-02-28 13:52:07 +0000994; CHECK-NEXT: cbnz [[STATUS]], [[STARTAGAIN]]
Tim Northover15410e92013-04-08 08:40:41 +0000995; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +0000996
Tim Northover66c36b82014-04-18 09:31:31 +0000997; CHECK: str x[[OLD]],
998 store i64 %old, i64* @var64
999 ret void
Tim Northovere0e3aef2013-01-31 12:12:40 +00001000}
1001
1002define i8 @test_atomic_load_monotonic_i8() nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001003; CHECK-LABEL: test_atomic_load_monotonic_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001004 %val = load atomic i8* @var8 monotonic, align 1
1005; CHECK-NOT: dmb
1006; CHECK: adrp x[[HIADDR:[0-9]+]], var8
Tim Northover66c36b82014-04-18 09:31:31 +00001007; CHECK: ldrb w0, [x[[HIADDR]], {{#?}}:lo12:var8]
Tim Northovere0e3aef2013-01-31 12:12:40 +00001008; CHECK-NOT: dmb
1009
1010 ret i8 %val
1011}
1012
1013define i8 @test_atomic_load_monotonic_regoff_i8(i64 %base, i64 %off) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001014; CHECK-LABEL: test_atomic_load_monotonic_regoff_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001015 %addr_int = add i64 %base, %off
1016 %addr = inttoptr i64 %addr_int to i8*
1017
1018 %val = load atomic i8* %addr monotonic, align 1
1019; CHECK-NOT: dmb
1020; CHECK: ldrb w0, [x0, x1]
1021; CHECK-NOT: dmb
1022
1023 ret i8 %val
1024}
1025
1026define i8 @test_atomic_load_acquire_i8() nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001027; CHECK-LABEL: test_atomic_load_acquire_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001028 %val = load atomic i8* @var8 acquire, align 1
Tim Northover15410e92013-04-08 08:40:41 +00001029; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001030; CHECK: adrp [[TMPADDR:x[0-9]+]], var8
Tim Northover15410e92013-04-08 08:40:41 +00001031; CHECK-NOT: dmb
Tim Northover66c36b82014-04-18 09:31:31 +00001032; CHECK: add x[[ADDR:[0-9]+]], [[TMPADDR]], {{#?}}:lo12:var8
Tim Northover15410e92013-04-08 08:40:41 +00001033; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001034; CHECK: ldarb w0, [x[[ADDR]]]
Tim Northover15410e92013-04-08 08:40:41 +00001035; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001036 ret i8 %val
1037}
1038
1039define i8 @test_atomic_load_seq_cst_i8() nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001040; CHECK-LABEL: test_atomic_load_seq_cst_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001041 %val = load atomic i8* @var8 seq_cst, align 1
Tim Northover15410e92013-04-08 08:40:41 +00001042; CHECK-NOT: dmb
1043; CHECK: adrp [[HIADDR:x[0-9]+]], var8
1044; CHECK-NOT: dmb
Tim Northover66c36b82014-04-18 09:31:31 +00001045; CHECK: add x[[ADDR:[0-9]+]], [[HIADDR]], {{#?}}:lo12:var8
Tim Northover15410e92013-04-08 08:40:41 +00001046; CHECK-NOT: dmb
1047; CHECK: ldarb w0, [x[[ADDR]]]
1048; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001049 ret i8 %val
1050}
1051
1052define i16 @test_atomic_load_monotonic_i16() nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001053; CHECK-LABEL: test_atomic_load_monotonic_i16:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001054 %val = load atomic i16* @var16 monotonic, align 2
1055; CHECK-NOT: dmb
1056; CHECK: adrp x[[HIADDR:[0-9]+]], var16
Tim Northover15410e92013-04-08 08:40:41 +00001057; CHECK-NOT: dmb
Tim Northover66c36b82014-04-18 09:31:31 +00001058; CHECK: ldrh w0, [x[[HIADDR]], {{#?}}:lo12:var16]
Tim Northovere0e3aef2013-01-31 12:12:40 +00001059; CHECK-NOT: dmb
1060
1061 ret i16 %val
1062}
1063
1064define i32 @test_atomic_load_monotonic_regoff_i32(i64 %base, i64 %off) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001065; CHECK-LABEL: test_atomic_load_monotonic_regoff_i32:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001066 %addr_int = add i64 %base, %off
1067 %addr = inttoptr i64 %addr_int to i32*
1068
1069 %val = load atomic i32* %addr monotonic, align 4
1070; CHECK-NOT: dmb
1071; CHECK: ldr w0, [x0, x1]
1072; CHECK-NOT: dmb
1073
1074 ret i32 %val
1075}
1076
1077define i64 @test_atomic_load_seq_cst_i64() nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001078; CHECK-LABEL: test_atomic_load_seq_cst_i64:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001079 %val = load atomic i64* @var64 seq_cst, align 8
Tim Northover15410e92013-04-08 08:40:41 +00001080; CHECK-NOT: dmb
1081; CHECK: adrp [[HIADDR:x[0-9]+]], var64
1082; CHECK-NOT: dmb
Tim Northover66c36b82014-04-18 09:31:31 +00001083; CHECK: add x[[ADDR:[0-9]+]], [[HIADDR]], {{#?}}:lo12:var64
Tim Northover15410e92013-04-08 08:40:41 +00001084; CHECK-NOT: dmb
1085; CHECK: ldar x0, [x[[ADDR]]]
1086; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001087 ret i64 %val
1088}
1089
1090define void @test_atomic_store_monotonic_i8(i8 %val) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001091; CHECK-LABEL: test_atomic_store_monotonic_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001092 store atomic i8 %val, i8* @var8 monotonic, align 1
1093; CHECK: adrp x[[HIADDR:[0-9]+]], var8
Tim Northover66c36b82014-04-18 09:31:31 +00001094; CHECK: strb w0, [x[[HIADDR]], {{#?}}:lo12:var8]
Tim Northovere0e3aef2013-01-31 12:12:40 +00001095
1096 ret void
1097}
1098
1099define void @test_atomic_store_monotonic_regoff_i8(i64 %base, i64 %off, i8 %val) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001100; CHECK-LABEL: test_atomic_store_monotonic_regoff_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001101
1102 %addr_int = add i64 %base, %off
1103 %addr = inttoptr i64 %addr_int to i8*
1104
1105 store atomic i8 %val, i8* %addr monotonic, align 1
1106; CHECK: strb w2, [x0, x1]
1107
1108 ret void
1109}
1110define void @test_atomic_store_release_i8(i8 %val) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001111; CHECK-LABEL: test_atomic_store_release_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001112 store atomic i8 %val, i8* @var8 release, align 1
Tim Northover15410e92013-04-08 08:40:41 +00001113; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001114; CHECK: adrp [[HIADDR:x[0-9]+]], var8
Tim Northover15410e92013-04-08 08:40:41 +00001115; CHECK-NOT: dmb
Tim Northover66c36b82014-04-18 09:31:31 +00001116; CHECK: add x[[ADDR:[0-9]+]], [[HIADDR]], {{#?}}:lo12:var8
Tim Northover15410e92013-04-08 08:40:41 +00001117; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001118; CHECK: stlrb w0, [x[[ADDR]]]
Tim Northover15410e92013-04-08 08:40:41 +00001119; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001120 ret void
1121}
1122
1123define void @test_atomic_store_seq_cst_i8(i8 %val) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001124; CHECK-LABEL: test_atomic_store_seq_cst_i8:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001125 store atomic i8 %val, i8* @var8 seq_cst, align 1
Tim Northover15410e92013-04-08 08:40:41 +00001126; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001127; CHECK: adrp [[HIADDR:x[0-9]+]], var8
Tim Northover15410e92013-04-08 08:40:41 +00001128; CHECK-NOT: dmb
Tim Northover66c36b82014-04-18 09:31:31 +00001129; CHECK: add x[[ADDR:[0-9]+]], [[HIADDR]], {{#?}}:lo12:var8
Tim Northover15410e92013-04-08 08:40:41 +00001130; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001131; CHECK: stlrb w0, [x[[ADDR]]]
Tim Northover15410e92013-04-08 08:40:41 +00001132; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001133
1134 ret void
1135}
1136
1137define void @test_atomic_store_monotonic_i16(i16 %val) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001138; CHECK-LABEL: test_atomic_store_monotonic_i16:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001139 store atomic i16 %val, i16* @var16 monotonic, align 2
Tim Northover15410e92013-04-08 08:40:41 +00001140; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001141; CHECK: adrp x[[HIADDR:[0-9]+]], var16
Tim Northover15410e92013-04-08 08:40:41 +00001142; CHECK-NOT: dmb
Tim Northover66c36b82014-04-18 09:31:31 +00001143; CHECK: strh w0, [x[[HIADDR]], {{#?}}:lo12:var16]
Tim Northover15410e92013-04-08 08:40:41 +00001144; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001145 ret void
1146}
1147
1148define void @test_atomic_store_monotonic_regoff_i32(i64 %base, i64 %off, i32 %val) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001149; CHECK-LABEL: test_atomic_store_monotonic_regoff_i32:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001150
1151 %addr_int = add i64 %base, %off
1152 %addr = inttoptr i64 %addr_int to i32*
1153
1154 store atomic i32 %val, i32* %addr monotonic, align 4
Tim Northover15410e92013-04-08 08:40:41 +00001155; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001156; CHECK: str w2, [x0, x1]
Tim Northover15410e92013-04-08 08:40:41 +00001157; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001158
1159 ret void
1160}
1161
1162define void @test_atomic_store_release_i64(i64 %val) nounwind {
Stephen Linf799e3f2013-07-13 20:38:47 +00001163; CHECK-LABEL: test_atomic_store_release_i64:
Tim Northovere0e3aef2013-01-31 12:12:40 +00001164 store atomic i64 %val, i64* @var64 release, align 8
Tim Northover15410e92013-04-08 08:40:41 +00001165; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001166; CHECK: adrp [[HIADDR:x[0-9]+]], var64
Tim Northover15410e92013-04-08 08:40:41 +00001167; CHECK-NOT: dmb
Tim Northover66c36b82014-04-18 09:31:31 +00001168; CHECK: add x[[ADDR:[0-9]+]], [[HIADDR]], {{#?}}:lo12:var64
Tim Northover15410e92013-04-08 08:40:41 +00001169; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001170; CHECK: stlr x0, [x[[ADDR]]]
Tim Northover15410e92013-04-08 08:40:41 +00001171; CHECK-NOT: dmb
Tim Northovere0e3aef2013-01-31 12:12:40 +00001172 ret void
1173}