blob: 9913f30712b612e9ccef8e93e95f2218530f7190 [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
3; RUN: llc < %s -mtriple=armebv7 | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-BE
4; 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 Northover36b24172013-07-03 09:20:36 +0000174; CHECK: dmb {{ish$}}
Weiming Zhao8f56f882012-11-16 21:55:34 +0000175; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
Christian Pirkerb5728192014-05-08 14:06:24 +0000176; CHECK-LE-DAG: eor [[MISMATCH_LO:r[0-9]+]], [[REG1]], r1
177; CHECK-LE-DAG: eor [[MISMATCH_HI:r[0-9]+]], [[REG2]], r2
178; CHECK-BE-DAG: eor [[MISMATCH_LO:r[0-9]+]], [[REG2]], r2
179; CHECK-BE-DAG: eor [[MISMATCH_HI:r[0-9]+]], [[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
Weiming Zhao8f56f882012-11-16 21:55:34 +0000182; CHECK: strexd {{[a-z0-9]+}}, {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}
Eli Friedman1ccecbb2011-08-31 17:52:22 +0000183; CHECK: cmp
184; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000185; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000186
Stephen Lind24ab202013-07-14 06:24:09 +0000187; CHECK-THUMB-LABEL: test7:
Tim Northover36b24172013-07-03 09:20:36 +0000188; CHECK-THUMB: dmb {{ish$}}
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
192; CHECK-THUMB-BE-DAG: eor.w [[MISMATCH_HI:[a-z0-9]+]], [[REG1]]
193; CHECK-THUMB-BE-DAG: eor.w [[MISMATCH_LO:[a-z0-9]+]], [[REG2]]
Tim Northoverc882eb02014-04-03 11:44:58 +0000194; CHECK-THUMB: orrs [[MISMATCH_HI]], [[MISMATCH_LO]]
Tim Northovera0edd3e2013-01-29 09:06:13 +0000195; CHECK-THUMB: bne
196; CHECK-THUMB: strexd {{[a-z0-9]+}}, {{[a-z0-9]+}}, {{[a-z0-9]+}}
197; CHECK-THUMB: cmp
198; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000199; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000200
Tim Northovere94a5182014-03-11 10:48:52 +0000201 %r = cmpxchg i64* %ptr, i64 %val1, i64 %val2 seq_cst seq_cst
Eli Friedman1ccecbb2011-08-31 17:52:22 +0000202 ret i64 %r
203}
Eli Friedman7c3bded2011-08-31 18:26:09 +0000204
Amara Emersonb4ad2f32013-09-26 12:22:36 +0000205; Compiles down to a single ldrexd
Eli Friedman7c3bded2011-08-31 18:26:09 +0000206define i64 @test8(i64* %ptr) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000207; CHECK-LABEL: test8:
Weiming Zhao8f56f882012-11-16 21:55:34 +0000208; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
Tim Northover36b24172013-07-03 09:20:36 +0000209; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000210
Stephen Lind24ab202013-07-14 06:24:09 +0000211; CHECK-THUMB-LABEL: test8:
Tim Northovera0edd3e2013-01-29 09:06:13 +0000212; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
Tim Northover36b24172013-07-03 09:20:36 +0000213; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000214
Eli Friedman7c3bded2011-08-31 18:26:09 +0000215 %r = load atomic i64* %ptr seq_cst, align 8
216 ret i64 %r
217}
218
219; Compiles down to atomicrmw xchg; there really isn't any more efficient
220; way to write it.
221define void @test9(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000222; CHECK-LABEL: test9:
Tim Northover36b24172013-07-03 09:20:36 +0000223; CHECK: dmb {{ish$}}
Weiming Zhao8f56f882012-11-16 21:55:34 +0000224; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
225; CHECK: strexd {{[a-z0-9]+}}, {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}
Eli Friedman7c3bded2011-08-31 18:26:09 +0000226; CHECK: cmp
227; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000228; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000229
Stephen Lind24ab202013-07-14 06:24:09 +0000230; CHECK-THUMB-LABEL: test9:
Tim Northover36b24172013-07-03 09:20:36 +0000231; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000232; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
233; CHECK-THUMB: strexd {{[a-z0-9]+}}, {{[a-z0-9]+}}, {{[a-z0-9]+}}
234; CHECK-THUMB: cmp
235; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000236; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000237
Eli Friedman7c3bded2011-08-31 18:26:09 +0000238 store atomic i64 %val, i64* %ptr seq_cst, align 8
239 ret void
240}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000241
242define i64 @test10(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000243; CHECK-LABEL: test10:
Tim Northover36b24172013-07-03 09:20:36 +0000244; CHECK: dmb {{ish$}}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000245; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
Tim Northoverc882eb02014-04-03 11:44:58 +0000246; CHECK: mov [[CARRY_LO:[a-z0-9]+]], #0
247; CHECK: mov [[CARRY_HI:[a-z0-9]+]], #0
248; CHECK: mov [[OUT_HI:[a-z0-9]+]], r2
Christian Pirkerb5728192014-05-08 14:06:24 +0000249; CHECK-LE: cmp [[REG1]], r1
250; CHECK-BE: cmp [[REG2]], r2
Tim Northoverc882eb02014-04-03 11:44:58 +0000251; CHECK: movwls [[CARRY_LO]], #1
Christian Pirkerb5728192014-05-08 14:06:24 +0000252; CHECK-LE: cmp [[REG2]], r2
253; CHECK-BE: cmp [[REG1]], r1
Tim Northoverc882eb02014-04-03 11:44:58 +0000254; CHECK: movwle [[CARRY_HI]], #1
255; CHECK: moveq [[CARRY_HI]], [[CARRY_LO]]
256; CHECK: cmp [[CARRY_HI]], #0
257; CHECK: movne [[OUT_HI]], [[REG2]]
258; CHECK: mov [[OUT_LO:[a-z0-9]+]], r1
259; CHECK: movne [[OUT_LO]], [[REG1]]
Silviu Baranga93aefa52012-11-29 14:41:25 +0000260; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
261; CHECK: cmp
262; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000263; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000264
Stephen Lind24ab202013-07-14 06:24:09 +0000265; CHECK-THUMB-LABEL: test10:
Tim Northover36b24172013-07-03 09:20:36 +0000266; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000267; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
Christian Pirkerb5728192014-05-08 14:06:24 +0000268; CHECK-THUMB: mov.w [[CARRY_LO:[a-z0-9]+|lr]], #0
269; CHECK-THUMB: movs [[CARRY_HI:[a-z0-9]+|lr]], #0
270; CHECK-THUMB-LE: cmp [[REG1]], r2
271; CHECK-THUMB-BE: cmp [[REG2]], r3
Tim Northoverc882eb02014-04-03 11:44:58 +0000272; CHECK-THUMB: movls.w [[CARRY_LO]], #1
Christian Pirkerb5728192014-05-08 14:06:24 +0000273; CHECK-THUMB-LE: cmp [[REG2]], r3
274; CHECK-THUMB-BE: cmp [[REG1]], r2
Tim Northoverc882eb02014-04-03 11:44:58 +0000275; CHECK-THUMB: movle [[CARRY_HI]], #1
276; CHECK-THUMB: moveq [[CARRY_HI]], [[CARRY_LO]]
277; CHECK-THUMB: mov [[OUT_HI:[a-z0-9]+]], r3
278; CHECK-THUMB: cmp [[CARRY_HI]], #0
279; CHECK-THUMB: mov [[OUT_LO:[a-z0-9]+]], r2
280; CHECK-THUMB: movne [[OUT_HI]], [[REG2]]
281; CHECK-THUMB: movne [[OUT_LO]], [[REG1]]
Tim Northovera0edd3e2013-01-29 09:06:13 +0000282; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
283; CHECK-THUMB: cmp
284; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000285; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000286
Silviu Baranga93aefa52012-11-29 14:41:25 +0000287 %r = atomicrmw min i64* %ptr, i64 %val seq_cst
288 ret i64 %r
289}
290
291define i64 @test11(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000292; CHECK-LABEL: test11:
Tim Northover36b24172013-07-03 09:20:36 +0000293; CHECK: dmb {{ish$}}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000294; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
Tim Northoverc882eb02014-04-03 11:44:58 +0000295; CHECK: mov [[CARRY_LO:[a-z0-9]+]], #0
296; CHECK: mov [[CARRY_HI:[a-z0-9]+]], #0
297; CHECK: mov [[OUT_HI:[a-z0-9]+]], r2
Christian Pirkerb5728192014-05-08 14:06:24 +0000298; CHECK-LE: cmp [[REG1]], r1
299; CHECK-BE: cmp [[REG2]], r2
Tim Northoverc882eb02014-04-03 11:44:58 +0000300; CHECK: movwls [[CARRY_LO]], #1
Christian Pirkerb5728192014-05-08 14:06:24 +0000301; CHECK-LE: cmp [[REG2]], r2
302; CHECK-BE: cmp [[REG1]], r1
Tim Northoverc882eb02014-04-03 11:44:58 +0000303; CHECK: movwls [[CARRY_HI]], #1
304; CHECK: moveq [[CARRY_HI]], [[CARRY_LO]]
305; CHECK: cmp [[CARRY_HI]], #0
306; CHECK: movne [[OUT_HI]], [[REG2]]
307; CHECK: mov [[OUT_LO:[a-z0-9]+]], r1
308; CHECK: movne [[OUT_LO]], [[REG1]]
Silviu Baranga93aefa52012-11-29 14:41:25 +0000309; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
310; CHECK: cmp
311; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000312; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000313
Stephen Lind24ab202013-07-14 06:24:09 +0000314; CHECK-THUMB-LABEL: test11:
Tim Northover36b24172013-07-03 09:20:36 +0000315; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000316; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
Tim Northoverc882eb02014-04-03 11:44:58 +0000317; CHECK-THUMB: mov.w [[CARRY_LO:[a-z0-9]+]], #0
318; CHECK-THUMB: movs [[CARRY_HI:[a-z0-9]+]], #0
Christian Pirkerb5728192014-05-08 14:06:24 +0000319; CHECK-THUMB-LE: cmp [[REG1]], r2
320; CHECK-THUMB-BE: cmp [[REG2]], r3
Tim Northoverc882eb02014-04-03 11:44:58 +0000321; CHECK-THUMB: movls.w [[CARRY_LO]], #1
Christian Pirkerb5728192014-05-08 14:06:24 +0000322; CHECK-THUMB-LE: cmp [[REG2]], r3
323; CHECK-THUMB-BE: cmp [[REG1]], r2
Tim Northoverc882eb02014-04-03 11:44:58 +0000324; CHECK-THUMB: movls [[CARRY_HI]], #1
325; CHECK-THUMB: moveq [[CARRY_HI]], [[CARRY_LO]]
326; CHECK-THUMB: mov [[OUT_HI:[a-z0-9]+]], r3
327; CHECK-THUMB: cmp [[CARRY_HI]], #0
328; CHECK-THUMB: mov [[OUT_LO:[a-z0-9]+]], r2
329; CHECK-THUMB: movne [[OUT_HI]], [[REG2]]
330; CHECK-THUMB: movne [[OUT_LO]], [[REG1]]
Tim Northovera0edd3e2013-01-29 09:06:13 +0000331; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
332; CHECK-THUMB: cmp
333; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000334; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000335
Silviu Baranga93aefa52012-11-29 14:41:25 +0000336 %r = atomicrmw umin i64* %ptr, i64 %val seq_cst
337 ret i64 %r
338}
339
340define i64 @test12(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000341; CHECK-LABEL: test12:
Tim Northover36b24172013-07-03 09:20:36 +0000342; CHECK: dmb {{ish$}}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000343; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
Tim Northoverc882eb02014-04-03 11:44:58 +0000344; CHECK: mov [[CARRY_LO:[a-z0-9]+]], #0
345; CHECK: mov [[CARRY_HI:[a-z0-9]+]], #0
346; CHECK: mov [[OUT_HI:[a-z0-9]+]], r2
Christian Pirkerb5728192014-05-08 14:06:24 +0000347; CHECK-LE: cmp [[REG1]], r1
348; CHECK-BE: cmp [[REG2]], r2
Tim Northoverc882eb02014-04-03 11:44:58 +0000349; CHECK: movwhi [[CARRY_LO]], #1
Christian Pirkerb5728192014-05-08 14:06:24 +0000350; CHECK-LE: cmp [[REG2]], r2
351; CHECK-BE: cmp [[REG1]], r1
Tim Northoverc882eb02014-04-03 11:44:58 +0000352; CHECK: movwgt [[CARRY_HI]], #1
353; CHECK: moveq [[CARRY_HI]], [[CARRY_LO]]
354; CHECK: cmp [[CARRY_HI]], #0
355; CHECK: movne [[OUT_HI]], [[REG2]]
356; CHECK: mov [[OUT_LO:[a-z0-9]+]], r1
357; CHECK: movne [[OUT_LO]], [[REG1]]
Silviu Baranga93aefa52012-11-29 14:41:25 +0000358; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
359; CHECK: cmp
360; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000361; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000362
Stephen Lind24ab202013-07-14 06:24:09 +0000363; CHECK-THUMB-LABEL: test12:
Tim Northover36b24172013-07-03 09:20:36 +0000364; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000365; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
Tim Northoverc882eb02014-04-03 11:44:58 +0000366; CHECK-THUMB: mov.w [[CARRY_LO:[a-z0-9]+]], #0
367; CHECK-THUMB: movs [[CARRY_HI:[a-z0-9]+]], #0
Christian Pirkerb5728192014-05-08 14:06:24 +0000368; CHECK-THUMB-LE: cmp [[REG1]], r2
369; CHECK-THUMB-BE: cmp [[REG2]], r3
Tim Northoverc882eb02014-04-03 11:44:58 +0000370; CHECK-THUMB: movhi.w [[CARRY_LO]], #1
Christian Pirkerb5728192014-05-08 14:06:24 +0000371; CHECK-THUMB-LE: cmp [[REG2]], r3
372; CHECK-THUMB-BE: cmp [[REG1]], r2
Tim Northoverc882eb02014-04-03 11:44:58 +0000373; CHECK-THUMB: movgt [[CARRY_HI]], #1
374; CHECK-THUMB: moveq [[CARRY_HI]], [[CARRY_LO]]
375; CHECK-THUMB: mov [[OUT_HI:[a-z0-9]+]], r3
376; CHECK-THUMB: cmp [[CARRY_HI]], #0
377; CHECK-THUMB: mov [[OUT_LO:[a-z0-9]+]], r2
378; CHECK-THUMB: movne [[OUT_HI]], [[REG2]]
379; CHECK-THUMB: movne [[OUT_LO]], [[REG1]]
Tim Northovera0edd3e2013-01-29 09:06:13 +0000380; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
381; CHECK-THUMB: cmp
382; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000383; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000384
Silviu Baranga93aefa52012-11-29 14:41:25 +0000385 %r = atomicrmw max i64* %ptr, i64 %val seq_cst
386 ret i64 %r
387}
388
389define i64 @test13(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000390; CHECK-LABEL: test13:
Tim Northover36b24172013-07-03 09:20:36 +0000391; CHECK: dmb {{ish$}}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000392; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
Tim Northoverc882eb02014-04-03 11:44:58 +0000393; CHECK: mov [[CARRY_LO:[a-z0-9]+]], #0
394; CHECK: mov [[CARRY_HI:[a-z0-9]+]], #0
395; CHECK: mov [[OUT_HI:[a-z0-9]+]], r2
Christian Pirkerb5728192014-05-08 14:06:24 +0000396; CHECK-LE: cmp [[REG1]], r1
397; CHECK-BE: cmp [[REG2]], r2
Tim Northoverc882eb02014-04-03 11:44:58 +0000398; CHECK: movwhi [[CARRY_LO]], #1
Christian Pirkerb5728192014-05-08 14:06:24 +0000399; CHECK-LE: cmp [[REG2]], r2
400; CHECK-BE: cmp [[REG1]], r1
Tim Northoverc882eb02014-04-03 11:44:58 +0000401; CHECK: movwhi [[CARRY_HI]], #1
402; CHECK: moveq [[CARRY_HI]], [[CARRY_LO]]
403; CHECK: cmp [[CARRY_HI]], #0
404; CHECK: movne [[OUT_HI]], [[REG2]]
405; CHECK: mov [[OUT_LO:[a-z0-9]+]], r1
406; CHECK: movne [[OUT_LO]], [[REG1]]
Silviu Baranga93aefa52012-11-29 14:41:25 +0000407; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
408; CHECK: cmp
409; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000410; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000411
Stephen Lind24ab202013-07-14 06:24:09 +0000412; CHECK-THUMB-LABEL: test13:
Tim Northover36b24172013-07-03 09:20:36 +0000413; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000414; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
Tim Northoverc882eb02014-04-03 11:44:58 +0000415; CHECK-THUMB: mov.w [[CARRY_LO:[a-z0-9]+]], #0
416; CHECK-THUMB: movs [[CARRY_HI:[a-z0-9]+]], #0
Christian Pirkerb5728192014-05-08 14:06:24 +0000417; CHECK-THUMB-LE: cmp [[REG1]], r2
418; CHECK-THUMB-BE: cmp [[REG2]], r3
Tim Northoverc882eb02014-04-03 11:44:58 +0000419; CHECK-THUMB: movhi.w [[CARRY_LO]], #1
Christian Pirkerb5728192014-05-08 14:06:24 +0000420; CHECK-THUMB-LE: cmp [[REG2]], r3
421; CHECK-THUMB-BE: cmp [[REG1]], r2
Tim Northoverc882eb02014-04-03 11:44:58 +0000422; CHECK-THUMB: movhi [[CARRY_HI]], #1
423; CHECK-THUMB: moveq [[CARRY_HI]], [[CARRY_LO]]
424; CHECK-THUMB: mov [[OUT_HI:[a-z0-9]+]], r3
425; CHECK-THUMB: cmp [[CARRY_HI]], #0
426; CHECK-THUMB: mov [[OUT_LO:[a-z0-9]+]], r2
427; CHECK-THUMB: movne [[OUT_HI]], [[REG2]]
428; CHECK-THUMB: movne [[OUT_LO]], [[REG1]]
Tim Northovera0edd3e2013-01-29 09:06:13 +0000429; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
430; CHECK-THUMB: cmp
431; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000432; CHECK-THUMB: dmb {{ish$}}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000433 %r = atomicrmw umax i64* %ptr, i64 %val seq_cst
434 ret i64 %r
435}
436