blob: 8841483c97a47cd312b1b2c5e5f40082141c98a4 [file] [log] [blame]
Christian Pirkerb5728192014-05-08 14:06:24 +00001; RUN: llc < %s -mtriple=armv7-apple-ios | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-LE
2; RUN: llc < %s -mtriple=thumbv7-none-linux-gnueabihf | FileCheck %s --check-prefix=CHECK-THUMB --check-prefix=CHECK-THUMB-LE
Eric Christopher661f2d12014-12-18 02:20:58 +00003; RUN: llc < %s -mtriple=armebv7 -target-abi apcs | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-BE
Christian Pirkerb5728192014-05-08 14:06:24 +00004; RUN: llc < %s -mtriple=thumbebv7-none-linux-gnueabihf | FileCheck %s --check-prefix=CHECK-THUMB --check-prefix=CHECK-THUMB-BE
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +00005
6define i64 @test1(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +00007; CHECK-LABEL: test1:
Tim Northover36b24172013-07-03 09:20:36 +00008; CHECK: dmb {{ish$}}
Weiming Zhao8f56f882012-11-16 21:55:34 +00009; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
Christian Pirkerb5728192014-05-08 14:06:24 +000010; CHECK-LE: adds [[REG3:(r[0-9]?[02468])]], [[REG1]]
11; CHECK-LE: adc [[REG4:(r[0-9]?[13579])]], [[REG2]]
12; CHECK-BE: adds [[REG4:(r[0-9]?[13579])]], [[REG2]]
13; CHECK-BE: adc [[REG3:(r[0-9]?[02468])]], [[REG1]]
Weiming Zhao8f56f882012-11-16 21:55:34 +000014; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +000015; CHECK: cmp
16; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +000017; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000018
Stephen Lind24ab202013-07-14 06:24:09 +000019; CHECK-THUMB-LABEL: test1:
Tim Northover36b24172013-07-03 09:20:36 +000020; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000021; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
Christian Pirkerb5728192014-05-08 14:06:24 +000022; CHECK-THUMB-LE: adds.w [[REG3:[a-z0-9]+]], [[REG1]]
23; CHECK-THUMB-LE: adc.w [[REG4:[a-z0-9]+]], [[REG2]]
24; CHECK-THUMB-BE: adds.w [[REG4:[a-z0-9]+]], [[REG2]]
25; CHECK-THUMB-BE: adc.w [[REG3:[a-z0-9]+]], [[REG1]]
Tim Northovera0edd3e2013-01-29 09:06:13 +000026; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
27; CHECK-THUMB: cmp
28; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +000029; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000030
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +000031 %r = atomicrmw add i64* %ptr, i64 %val seq_cst
32 ret i64 %r
33}
34
35define i64 @test2(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +000036; CHECK-LABEL: test2:
Tim Northover36b24172013-07-03 09:20:36 +000037; CHECK: dmb {{ish$}}
Weiming Zhao8f56f882012-11-16 21:55:34 +000038; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
Christian Pirkerb5728192014-05-08 14:06:24 +000039; CHECK-LE: subs [[REG3:(r[0-9]?[02468])]], [[REG1]]
40; CHECK-LE: sbc [[REG4:(r[0-9]?[13579])]], [[REG2]]
41; CHECK-BE: subs [[REG4:(r[0-9]?[13579])]], [[REG2]]
42; CHECK-BE: sbc [[REG3:(r[0-9]?[02468])]], [[REG1]]
Weiming Zhao8f56f882012-11-16 21:55:34 +000043; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +000044; CHECK: cmp
45; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +000046; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000047
Stephen Lind24ab202013-07-14 06:24:09 +000048; CHECK-THUMB-LABEL: test2:
Tim Northover36b24172013-07-03 09:20:36 +000049; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000050; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
Christian Pirkerb5728192014-05-08 14:06:24 +000051; CHECK-THUMB-LE: subs.w [[REG3:[a-z0-9]+]], [[REG1]]
52; CHECK-THUMB-LE: sbc.w [[REG4:[a-z0-9]+]], [[REG2]]
53; CHECK-THUMB-BE: subs.w [[REG4:[a-z0-9]+]], [[REG2]]
54; CHECK-THUMB-BE: sbc.w [[REG3:[a-z0-9]+]], [[REG1]]
Tim Northovera0edd3e2013-01-29 09:06:13 +000055; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
56; CHECK-THUMB: cmp
57; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +000058; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000059
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +000060 %r = atomicrmw sub i64* %ptr, i64 %val seq_cst
61 ret i64 %r
62}
63
64define i64 @test3(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +000065; CHECK-LABEL: test3:
Tim Northover36b24172013-07-03 09:20:36 +000066; CHECK: dmb {{ish$}}
Weiming Zhao8f56f882012-11-16 21:55:34 +000067; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
Christian Pirkerb5728192014-05-08 14:06:24 +000068; CHECK-LE-DAG: and [[REG3:(r[0-9]?[02468])]], [[REG1]]
69; CHECK-LE-DAG: and [[REG4:(r[0-9]?[13579])]], [[REG2]]
70; CHECK-BE-DAG: and [[REG4:(r[0-9]?[13579])]], [[REG2]]
71; CHECK-BE-DAG: and [[REG3:(r[0-9]?[02468])]], [[REG1]]
Weiming Zhao8f56f882012-11-16 21:55:34 +000072; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +000073; CHECK: cmp
74; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +000075; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000076
Stephen Lind24ab202013-07-14 06:24:09 +000077; CHECK-THUMB-LABEL: test3:
Tim Northover36b24172013-07-03 09:20:36 +000078; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000079; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
Christian Pirkerb5728192014-05-08 14:06:24 +000080; CHECK-THUMB-LE-DAG: and.w [[REG3:[a-z0-9]+]], [[REG1]]
81; CHECK-THUMB-LE-DAG: and.w [[REG4:[a-z0-9]+]], [[REG2]]
82; CHECK-THUMB-BE-DAG: and.w [[REG4:[a-z0-9]+]], [[REG2]]
83; CHECK-THUMB-BE-DAG: and.w [[REG3:[a-z0-9]+]], [[REG1]]
Tim Northovera0edd3e2013-01-29 09:06:13 +000084; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
85; CHECK-THUMB: cmp
86; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +000087; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000088
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +000089 %r = atomicrmw and i64* %ptr, i64 %val seq_cst
90 ret i64 %r
91}
92
93define i64 @test4(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +000094; CHECK-LABEL: test4:
Tim Northover36b24172013-07-03 09:20:36 +000095; CHECK: dmb {{ish$}}
Weiming Zhao8f56f882012-11-16 21:55:34 +000096; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
Christian Pirkerb5728192014-05-08 14:06:24 +000097; CHECK-LE-DAG: orr [[REG3:(r[0-9]?[02468])]], [[REG1]]
98; CHECK-LE-DAG: orr [[REG4:(r[0-9]?[13579])]], [[REG2]]
99; CHECK-BE-DAG: orr [[REG4:(r[0-9]?[13579])]], [[REG2]]
100; CHECK-BE-DAG: orr [[REG3:(r[0-9]?[02468])]], [[REG1]]
Weiming Zhao8f56f882012-11-16 21:55:34 +0000101; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +0000102; CHECK: cmp
103; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000104; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000105
Stephen Lind24ab202013-07-14 06:24:09 +0000106; CHECK-THUMB-LABEL: test4:
Tim Northover36b24172013-07-03 09:20:36 +0000107; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000108; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
Christian Pirkerb5728192014-05-08 14:06:24 +0000109; CHECK-THUMB-LE-DAG: orr.w [[REG3:[a-z0-9]+]], [[REG1]]
110; CHECK-THUMB-LE-DAG: orr.w [[REG4:[a-z0-9]+]], [[REG2]]
111; CHECK-THUMB-BE-DAG: orr.w [[REG4:[a-z0-9]+]], [[REG2]]
112; CHECK-THUMB-BE-DAG: orr.w [[REG3:[a-z0-9]+]], [[REG1]]
Tim Northovera0edd3e2013-01-29 09:06:13 +0000113; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
114; CHECK-THUMB: cmp
115; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000116; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000117
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +0000118 %r = atomicrmw or i64* %ptr, i64 %val seq_cst
119 ret i64 %r
120}
121
122define i64 @test5(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000123; CHECK-LABEL: test5:
Tim Northover36b24172013-07-03 09:20:36 +0000124; CHECK: dmb {{ish$}}
Weiming Zhao8f56f882012-11-16 21:55:34 +0000125; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
Christian Pirkerb5728192014-05-08 14:06:24 +0000126; CHECK-LE-DAG: eor [[REG3:(r[0-9]?[02468])]], [[REG1]]
127; CHECK-LE-DAG: eor [[REG4:(r[0-9]?[13579])]], [[REG2]]
128; CHECK-BE-DAG: eor [[REG4:(r[0-9]?[13579])]], [[REG2]]
129; CHECK-BE-DAG: eor [[REG3:(r[0-9]?[02468])]], [[REG1]]
Weiming Zhao8f56f882012-11-16 21:55:34 +0000130; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +0000131; CHECK: cmp
132; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000133; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000134
Stephen Lind24ab202013-07-14 06:24:09 +0000135; CHECK-THUMB-LABEL: test5:
Tim Northover36b24172013-07-03 09:20:36 +0000136; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000137; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
Christian Pirkerb5728192014-05-08 14:06:24 +0000138; CHECK-THUMB-LE-DAG: eor.w [[REG3:[a-z0-9]+]], [[REG1]]
139; CHECK-THUMB-LE-DAG: eor.w [[REG4:[a-z0-9]+]], [[REG2]]
140; CHECK-THUMB-BE-DAG: eor.w [[REG4:[a-z0-9]+]], [[REG2]]
141; CHECK-THUMB-BE-DAG: eor.w [[REG3:[a-z0-9]+]], [[REG1]]
Tim Northovera0edd3e2013-01-29 09:06:13 +0000142; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
143; CHECK-THUMB: cmp
144; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000145; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000146
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +0000147 %r = atomicrmw xor i64* %ptr, i64 %val seq_cst
148 ret i64 %r
149}
150
151define i64 @test6(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000152; CHECK-LABEL: test6:
Tim Northover36b24172013-07-03 09:20:36 +0000153; CHECK: dmb {{ish$}}
Weiming Zhao8f56f882012-11-16 21:55:34 +0000154; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
155; CHECK: strexd {{[a-z0-9]+}}, {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +0000156; CHECK: cmp
157; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000158; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000159
Stephen Lind24ab202013-07-14 06:24:09 +0000160; CHECK-THUMB-LABEL: test6:
Tim Northover36b24172013-07-03 09:20:36 +0000161; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000162; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
163; CHECK-THUMB: strexd {{[a-z0-9]+}}, {{[a-z0-9]+}}, {{[a-z0-9]+}}
164; CHECK-THUMB: cmp
165; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000166; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000167
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +0000168 %r = atomicrmw xchg i64* %ptr, i64 %val seq_cst
169 ret i64 %r
Eli Friedman2c7bb522011-08-31 00:41:05 +0000170}
Eli Friedman1ccecbb2011-08-31 17:52:22 +0000171
172define i64 @test7(i64* %ptr, i64 %val1, i64 %val2) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000173; CHECK-LABEL: test7:
Tim Northover20b9f732014-06-13 16:45:52 +0000174; CHECK-DAG: mov [[VAL1LO:r[0-9]+]], r1
Weiming Zhao8f56f882012-11-16 21:55:34 +0000175; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
Tim Northoverd32f8e62016-02-22 20:55:50 +0000176; CHECK-LE-DAG: eor [[MISMATCH_LO:.*]], [[REG1]], [[VAL1LO]]
177; CHECK-LE-DAG: eor [[MISMATCH_HI:.*]], [[REG2]], r2
178; CHECK-BE-DAG: eor [[MISMATCH_LO:.*]], [[REG2]], r2
179; CHECK-BE-DAG: eor [[MISMATCH_HI:.*]], [[REG1]], r1
Tim Northoverc882eb02014-04-03 11:44:58 +0000180; CHECK: orrs {{r[0-9]+}}, [[MISMATCH_LO]], [[MISMATCH_HI]]
Eli Friedman1ccecbb2011-08-31 17:52:22 +0000181; CHECK: bne
Tim Northoverd32f8e62016-02-22 20:55:50 +0000182; CHECK-DAG: dmb {{ish$}}
Weiming Zhao8f56f882012-11-16 21:55:34 +0000183; CHECK: strexd {{[a-z0-9]+}}, {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}
Eli Friedman1ccecbb2011-08-31 17:52:22 +0000184; CHECK: cmp
Tim Northoverd32f8e62016-02-22 20:55:50 +0000185; CHECK: beq
Tim Northover36b24172013-07-03 09:20:36 +0000186; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000187
Stephen Lind24ab202013-07-14 06:24:09 +0000188; CHECK-THUMB-LABEL: test7:
Tim Northovera0edd3e2013-01-29 09:06:13 +0000189; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
Christian Pirkerb5728192014-05-08 14:06:24 +0000190; CHECK-THUMB-LE-DAG: eor.w [[MISMATCH_LO:[a-z0-9]+]], [[REG1]], r2
191; CHECK-THUMB-LE-DAG: eor.w [[MISMATCH_HI:[a-z0-9]+]], [[REG2]], r3
Tim Northoverb4ddc082014-05-30 10:09:59 +0000192; CHECK-THUMB-BE-DAG: eor.w [[MISMATCH_HI:[a-z0-9]+]], [[REG1]], r2
193; CHECK-THUMB-BE-DAG: eor.w [[MISMATCH_LO:[a-z0-9]+]], [[REG2]], r3
Tim Northoverd32f8e62016-02-22 20:55:50 +0000194; CHECK-THUMB-LE: orrs.w {{.*}}, [[MISMATCH_LO]], [[MISMATCH_HI]]
Tim Northovera0edd3e2013-01-29 09:06:13 +0000195; CHECK-THUMB: bne
Tim Northoverd32f8e62016-02-22 20:55:50 +0000196; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000197; CHECK-THUMB: strexd {{[a-z0-9]+}}, {{[a-z0-9]+}}, {{[a-z0-9]+}}
198; CHECK-THUMB: cmp
Tim Northoverd32f8e62016-02-22 20:55:50 +0000199; CHECK-THUMB: beq
Tim Northover36b24172013-07-03 09:20:36 +0000200; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000201
Tim Northover420a2162014-06-13 14:24:07 +0000202 %pair = cmpxchg i64* %ptr, i64 %val1, i64 %val2 seq_cst seq_cst
203 %r = extractvalue { i64, i1 } %pair, 0
Eli Friedman1ccecbb2011-08-31 17:52:22 +0000204 ret i64 %r
205}
Eli Friedman7c3bded2011-08-31 18:26:09 +0000206
Amara Emersonb4ad2f32013-09-26 12:22:36 +0000207; Compiles down to a single ldrexd
Eli Friedman7c3bded2011-08-31 18:26:09 +0000208define i64 @test8(i64* %ptr) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000209; CHECK-LABEL: test8:
Weiming Zhao8f56f882012-11-16 21:55:34 +0000210; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
Tim Northoverf520eff2015-12-02 18:12:57 +0000211; CHECK-NOT: strexd
212; CHECK: clrex
213; CHECK-NOT: strexd
Tim Northover36b24172013-07-03 09:20:36 +0000214; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000215
Stephen Lind24ab202013-07-14 06:24:09 +0000216; CHECK-THUMB-LABEL: test8:
Tim Northovera0edd3e2013-01-29 09:06:13 +0000217; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
Tim Northoverf520eff2015-12-02 18:12:57 +0000218; CHECK-THUMB-NOT: strexd
219; CHECK-THUMB: clrex
220; CHECK-THUMB-NOT: strexd
Tim Northover36b24172013-07-03 09:20:36 +0000221; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000222
David Blaikiea79ac142015-02-27 21:17:42 +0000223 %r = load atomic i64, i64* %ptr seq_cst, align 8
Eli Friedman7c3bded2011-08-31 18:26:09 +0000224 ret i64 %r
225}
226
227; Compiles down to atomicrmw xchg; there really isn't any more efficient
228; way to write it.
229define void @test9(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000230; CHECK-LABEL: test9:
Tim Northover36b24172013-07-03 09:20:36 +0000231; CHECK: dmb {{ish$}}
Weiming Zhao8f56f882012-11-16 21:55:34 +0000232; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
233; CHECK: strexd {{[a-z0-9]+}}, {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}
Eli Friedman7c3bded2011-08-31 18:26:09 +0000234; CHECK: cmp
235; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000236; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000237
Stephen Lind24ab202013-07-14 06:24:09 +0000238; CHECK-THUMB-LABEL: test9:
Tim Northover36b24172013-07-03 09:20:36 +0000239; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000240; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
241; CHECK-THUMB: strexd {{[a-z0-9]+}}, {{[a-z0-9]+}}, {{[a-z0-9]+}}
242; CHECK-THUMB: cmp
243; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000244; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000245
Eli Friedman7c3bded2011-08-31 18:26:09 +0000246 store atomic i64 %val, i64* %ptr seq_cst, align 8
247 ret void
248}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000249
250define i64 @test10(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000251; CHECK-LABEL: test10:
Tim Northover36b24172013-07-03 09:20:36 +0000252; CHECK: dmb {{ish$}}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000253; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
Tim Northoverc882eb02014-04-03 11:44:58 +0000254; CHECK: mov [[OUT_HI:[a-z0-9]+]], r2
Peter Collingbourne86b9fbe2016-03-21 18:00:02 +0000255; CHECK-LE: subs {{[^,]+}}, r1, [[REG1]]
256; CHECK-BE: subs {{[^,]+}}, r2, [[REG2]]
257; CHECK-LE: sbcs {{[^,]+}}, r2, [[REG2]]
258; CHECK-BE: sbcs {{[^,]+}}, r1, [[REG1]]
259; CHECK: mov [[CMP:[a-z0-9]+]], #0
260; CHECK: movwge [[CMP]], #1
261; CHECK: cmp [[CMP]], #0
Tim Northoverc882eb02014-04-03 11:44:58 +0000262; CHECK: movne [[OUT_HI]], [[REG2]]
263; CHECK: mov [[OUT_LO:[a-z0-9]+]], r1
264; CHECK: movne [[OUT_LO]], [[REG1]]
Peter Collingbourne86b9fbe2016-03-21 18:00:02 +0000265; CHECK: strexd {{[a-z0-9]+}}, [[OUT_LO]], [[OUT_HI]]
Silviu Baranga93aefa52012-11-29 14:41:25 +0000266; CHECK: cmp
267; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000268; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000269
Stephen Lind24ab202013-07-14 06:24:09 +0000270; CHECK-THUMB-LABEL: test10:
Tim Northover36b24172013-07-03 09:20:36 +0000271; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000272; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
Peter Collingbourne86b9fbe2016-03-21 18:00:02 +0000273; CHECK-THUMB: mov [[OUT_LO:[a-z0-9]+]], r2
274; CHECK-THUMB-LE: subs.w {{[^,]+}}, r2, [[REG1]]
275; CHECK-THUMB-BE: subs.w {{[^,]+}}, r3, [[REG2]]
276; CHECK-THUMB-LE: sbcs.w {{[^,]+}}, r3, [[REG2]]
277; CHECK-THUMB-BE: sbcs.w {{[^,]+}}, r2, [[REG1]]
278; CHECK-THUMB: mov.w [[CMP:[a-z0-9]+]], #0
279; CHECK-THUMB: movge.w [[CMP]], #1
280; CHECK-THUMB: cmp.w [[CMP]], #0
281; CHECK-THUMB: mov [[OUT_HI:[a-z0-9]+]], r3
Tim Northoverc882eb02014-04-03 11:44:58 +0000282; CHECK-THUMB: movne [[OUT_HI]], [[REG2]]
283; CHECK-THUMB: movne [[OUT_LO]], [[REG1]]
Peter Collingbourne86b9fbe2016-03-21 18:00:02 +0000284; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[OUT_LO]], [[OUT_HI]]
Tim Northovera0edd3e2013-01-29 09:06:13 +0000285; CHECK-THUMB: cmp
286; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000287; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000288
Silviu Baranga93aefa52012-11-29 14:41:25 +0000289 %r = atomicrmw min i64* %ptr, i64 %val seq_cst
290 ret i64 %r
291}
292
293define i64 @test11(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000294; CHECK-LABEL: test11:
Tim Northover36b24172013-07-03 09:20:36 +0000295; CHECK: dmb {{ish$}}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000296; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
Tim Northoverc882eb02014-04-03 11:44:58 +0000297; CHECK: mov [[OUT_HI:[a-z0-9]+]], r2
Peter Collingbourne86b9fbe2016-03-21 18:00:02 +0000298; CHECK-LE: subs {{[^,]+}}, r1, [[REG1]]
299; CHECK-BE: subs {{[^,]+}}, r2, [[REG2]]
300; CHECK-LE: sbcs {{[^,]+}}, r2, [[REG2]]
301; CHECK-BE: sbcs {{[^,]+}}, r1, [[REG1]]
302; CHECK: mov [[CMP:[a-z0-9]+]], #0
303; CHECK: movwhs [[CMP]], #1
304; CHECK: cmp [[CMP]], #0
Tim Northoverc882eb02014-04-03 11:44:58 +0000305; CHECK: movne [[OUT_HI]], [[REG2]]
306; CHECK: mov [[OUT_LO:[a-z0-9]+]], r1
307; CHECK: movne [[OUT_LO]], [[REG1]]
Peter Collingbourne86b9fbe2016-03-21 18:00:02 +0000308; CHECK: strexd {{[a-z0-9]+}}, [[OUT_LO]], [[OUT_HI]]
Silviu Baranga93aefa52012-11-29 14:41:25 +0000309; CHECK: cmp
310; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000311; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000312
Stephen Lind24ab202013-07-14 06:24:09 +0000313; CHECK-THUMB-LABEL: test11:
Tim Northover36b24172013-07-03 09:20:36 +0000314; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000315; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
Peter Collingbourne86b9fbe2016-03-21 18:00:02 +0000316; CHECK-THUMB: mov [[OUT_LO:[a-z0-9]+]], r2
317; CHECK-THUMB-LE: subs.w {{[^,]+}}, r2, [[REG1]]
318; CHECK-THUMB-BE: subs.w {{[^,]+}}, r3, [[REG2]]
319; CHECK-THUMB-LE: sbcs.w {{[^,]+}}, r3, [[REG2]]
320; CHECK-THUMB-BE: sbcs.w {{[^,]+}}, r2, [[REG1]]
321; CHECK-THUMB: mov.w [[CMP:[a-z0-9]+]], #0
322; CHECK-THUMB: movhs.w [[CMP]], #1
323; CHECK-THUMB: cmp.w [[CMP]], #0
324; CHECK-THUMB: mov [[OUT_HI:[a-z0-9]+]], r3
Tim Northoverc882eb02014-04-03 11:44:58 +0000325; CHECK-THUMB: movne [[OUT_HI]], [[REG2]]
326; CHECK-THUMB: movne [[OUT_LO]], [[REG1]]
Peter Collingbourne86b9fbe2016-03-21 18:00:02 +0000327; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[OUT_LO]], [[OUT_HI]]
Tim Northovera0edd3e2013-01-29 09:06:13 +0000328; CHECK-THUMB: cmp
329; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000330; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000331
Silviu Baranga93aefa52012-11-29 14:41:25 +0000332 %r = atomicrmw umin i64* %ptr, i64 %val seq_cst
333 ret i64 %r
334}
335
336define i64 @test12(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000337; CHECK-LABEL: test12:
Tim Northover36b24172013-07-03 09:20:36 +0000338; CHECK: dmb {{ish$}}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000339; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
Tim Northoverc882eb02014-04-03 11:44:58 +0000340; CHECK: mov [[OUT_HI:[a-z0-9]+]], r2
Peter Collingbourne86b9fbe2016-03-21 18:00:02 +0000341; CHECK-LE: subs {{[^,]+}}, r1, [[REG1]]
342; CHECK-BE: subs {{[^,]+}}, r2, [[REG2]]
343; CHECK-LE: sbcs {{[^,]+}}, r2, [[REG2]]
344; CHECK-BE: sbcs {{[^,]+}}, r1, [[REG1]]
345; CHECK: mov [[CMP:[a-z0-9]+]], #0
346; CHECK: movwlt [[CMP]], #1
347; CHECK: cmp [[CMP]], #0
Tim Northoverc882eb02014-04-03 11:44:58 +0000348; CHECK: movne [[OUT_HI]], [[REG2]]
349; CHECK: mov [[OUT_LO:[a-z0-9]+]], r1
350; CHECK: movne [[OUT_LO]], [[REG1]]
Peter Collingbourne86b9fbe2016-03-21 18:00:02 +0000351; CHECK: strexd {{[a-z0-9]+}}, [[OUT_LO]], [[OUT_HI]]
Silviu Baranga93aefa52012-11-29 14:41:25 +0000352; CHECK: cmp
353; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000354; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000355
Stephen Lind24ab202013-07-14 06:24:09 +0000356; CHECK-THUMB-LABEL: test12:
Tim Northover36b24172013-07-03 09:20:36 +0000357; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000358; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
Peter Collingbourne86b9fbe2016-03-21 18:00:02 +0000359; CHECK-THUMB: mov [[OUT_LO:[a-z0-9]+]], r2
360; CHECK-THUMB-LE: subs.w {{[^,]+}}, r2, [[REG1]]
361; CHECK-THUMB-BE: subs.w {{[^,]+}}, r3, [[REG2]]
362; CHECK-THUMB-LE: sbcs.w {{[^,]+}}, r3, [[REG2]]
363; CHECK-THUMB-BE: sbcs.w {{[^,]+}}, r2, [[REG1]]
364; CHECK-THUMB: mov.w [[CMP:[a-z0-9]+]], #0
365; CHECK-THUMB: movlt.w [[CMP]], #1
366; CHECK-THUMB: cmp.w [[CMP]], #0
367; CHECK-THUMB: mov [[OUT_HI:[a-z0-9]+]], r3
Tim Northoverc882eb02014-04-03 11:44:58 +0000368; CHECK-THUMB: movne [[OUT_HI]], [[REG2]]
369; CHECK-THUMB: movne [[OUT_LO]], [[REG1]]
Peter Collingbourne86b9fbe2016-03-21 18:00:02 +0000370; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[OUT_LO]], [[OUT_HI]]
Tim Northovera0edd3e2013-01-29 09:06:13 +0000371; CHECK-THUMB: cmp
372; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000373; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000374
Silviu Baranga93aefa52012-11-29 14:41:25 +0000375 %r = atomicrmw max i64* %ptr, i64 %val seq_cst
376 ret i64 %r
377}
378
379define i64 @test13(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000380; CHECK-LABEL: test13:
Tim Northover36b24172013-07-03 09:20:36 +0000381; CHECK: dmb {{ish$}}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000382; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
Tim Northoverc882eb02014-04-03 11:44:58 +0000383; CHECK: mov [[OUT_HI:[a-z0-9]+]], r2
Peter Collingbourne86b9fbe2016-03-21 18:00:02 +0000384; CHECK-LE: subs {{[^,]+}}, r1, [[REG1]]
385; CHECK-BE: subs {{[^,]+}}, r2, [[REG2]]
386; CHECK-LE: sbcs {{[^,]+}}, r2, [[REG2]]
387; CHECK-BE: sbcs {{[^,]+}}, r1, [[REG1]]
388; CHECK: mov [[CMP:[a-z0-9]+]], #0
389; CHECK: movwlo [[CMP]], #1
390; CHECK: cmp [[CMP]], #0
Tim Northoverc882eb02014-04-03 11:44:58 +0000391; CHECK: movne [[OUT_HI]], [[REG2]]
392; CHECK: mov [[OUT_LO:[a-z0-9]+]], r1
393; CHECK: movne [[OUT_LO]], [[REG1]]
Peter Collingbourne86b9fbe2016-03-21 18:00:02 +0000394; CHECK: strexd {{[a-z0-9]+}}, [[OUT_LO]], [[OUT_HI]]
Silviu Baranga93aefa52012-11-29 14:41:25 +0000395; CHECK: cmp
396; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000397; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000398
Stephen Lind24ab202013-07-14 06:24:09 +0000399; CHECK-THUMB-LABEL: test13:
Tim Northover36b24172013-07-03 09:20:36 +0000400; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000401; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
Peter Collingbourne86b9fbe2016-03-21 18:00:02 +0000402; CHECK-THUMB: mov [[OUT_LO:[a-z0-9]+]], r2
403; CHECK-THUMB-LE: subs.w {{[^,]+}}, r2, [[REG1]]
404; CHECK-THUMB-BE: subs.w {{[^,]+}}, r3, [[REG2]]
405; CHECK-THUMB-LE: sbcs.w {{[^,]+}}, r3, [[REG2]]
406; CHECK-THUMB-BE: sbcs.w {{[^,]+}}, r2, [[REG1]]
407; CHECK-THUMB: mov.w [[CMP:[a-z0-9]+]], #0
408; CHECK-THUMB: movlo.w [[CMP]], #1
409; CHECK-THUMB: cmp.w [[CMP]], #0
410; CHECK-THUMB: mov [[OUT_HI:[a-z0-9]+]], r3
Tim Northoverc882eb02014-04-03 11:44:58 +0000411; CHECK-THUMB: movne [[OUT_HI]], [[REG2]]
412; CHECK-THUMB: movne [[OUT_LO]], [[REG1]]
Peter Collingbourne86b9fbe2016-03-21 18:00:02 +0000413; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[OUT_LO]], [[OUT_HI]]
Tim Northovera0edd3e2013-01-29 09:06:13 +0000414; CHECK-THUMB: cmp
415; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000416; CHECK-THUMB: dmb {{ish$}}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000417 %r = atomicrmw umax i64* %ptr, i64 %val seq_cst
418 ret i64 %r
419}
420