blob: a881d5fd7155d596e968407180ec867e96e19538 [file] [log] [blame]
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +00001; RUN: llc < %s -mtriple=armv7-apple-ios | FileCheck %s
Joey Goulye1de9e92013-08-22 12:19:24 +00002; RUN: llc < %s -mtriple=thumbv7-none-linux-gnueabihf -verify-machineinstrs | FileCheck %s --check-prefix=CHECK-THUMB
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +00003
4define i64 @test1(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +00005; CHECK-LABEL: test1:
Tim Northover36b24172013-07-03 09:20:36 +00006; CHECK: dmb {{ish$}}
Weiming Zhao8f56f882012-11-16 21:55:34 +00007; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
8; CHECK: adds [[REG3:(r[0-9]?[02468])]], [[REG1]]
9; CHECK: adc [[REG4:(r[0-9]?[13579])]], [[REG2]]
10; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +000011; CHECK: cmp
12; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +000013; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000014
Stephen Lind24ab202013-07-14 06:24:09 +000015; CHECK-THUMB-LABEL: test1:
Tim Northover36b24172013-07-03 09:20:36 +000016; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000017; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
18; CHECK-THUMB: adds.w [[REG3:[a-z0-9]+]], [[REG1]]
19; CHECK-THUMB: adc.w [[REG4:[a-z0-9]+]], [[REG2]]
20; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
21; CHECK-THUMB: cmp
22; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +000023; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000024
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +000025 %r = atomicrmw add i64* %ptr, i64 %val seq_cst
26 ret i64 %r
27}
28
29define i64 @test2(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +000030; CHECK-LABEL: test2:
Tim Northover36b24172013-07-03 09:20:36 +000031; CHECK: dmb {{ish$}}
Weiming Zhao8f56f882012-11-16 21:55:34 +000032; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
33; CHECK: subs [[REG3:(r[0-9]?[02468])]], [[REG1]]
34; CHECK: sbc [[REG4:(r[0-9]?[13579])]], [[REG2]]
35; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +000036; CHECK: cmp
37; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +000038; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000039
Stephen Lind24ab202013-07-14 06:24:09 +000040; CHECK-THUMB-LABEL: test2:
Tim Northover36b24172013-07-03 09:20:36 +000041; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000042; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
43; CHECK-THUMB: subs.w [[REG3:[a-z0-9]+]], [[REG1]]
44; CHECK-THUMB: sbc.w [[REG4:[a-z0-9]+]], [[REG2]]
45; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
46; CHECK-THUMB: cmp
47; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +000048; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000049
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +000050 %r = atomicrmw sub i64* %ptr, i64 %val seq_cst
51 ret i64 %r
52}
53
54define i64 @test3(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +000055; CHECK-LABEL: test3:
Tim Northover36b24172013-07-03 09:20:36 +000056; CHECK: dmb {{ish$}}
Weiming Zhao8f56f882012-11-16 21:55:34 +000057; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
Tim Northoverc882eb02014-04-03 11:44:58 +000058; CHECK-DAG: and [[REG3:(r[0-9]?[02468])]], [[REG1]]
59; CHECK-DAG: and [[REG4:(r[0-9]?[13579])]], [[REG2]]
Weiming Zhao8f56f882012-11-16 21:55:34 +000060; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +000061; CHECK: cmp
62; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +000063; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000064
Stephen Lind24ab202013-07-14 06:24:09 +000065; CHECK-THUMB-LABEL: test3:
Tim Northover36b24172013-07-03 09:20:36 +000066; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000067; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
Tim Northoverc882eb02014-04-03 11:44:58 +000068; CHECK-THUMB-DAG: and.w [[REG3:[a-z0-9]+]], [[REG1]]
69; CHECK-THUMB-DAG: and.w [[REG4:[a-z0-9]+]], [[REG2]]
Tim Northovera0edd3e2013-01-29 09:06:13 +000070; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
71; CHECK-THUMB: cmp
72; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +000073; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000074
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +000075 %r = atomicrmw and i64* %ptr, i64 %val seq_cst
76 ret i64 %r
77}
78
79define i64 @test4(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +000080; CHECK-LABEL: test4:
Tim Northover36b24172013-07-03 09:20:36 +000081; CHECK: dmb {{ish$}}
Weiming Zhao8f56f882012-11-16 21:55:34 +000082; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
Tim Northoverc882eb02014-04-03 11:44:58 +000083; CHECK-DAG: orr [[REG3:(r[0-9]?[02468])]], [[REG1]]
84; CHECK-DAG: orr [[REG4:(r[0-9]?[13579])]], [[REG2]]
Weiming Zhao8f56f882012-11-16 21:55:34 +000085; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +000086; CHECK: cmp
87; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +000088; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000089
Stephen Lind24ab202013-07-14 06:24:09 +000090; CHECK-THUMB-LABEL: test4:
Tim Northover36b24172013-07-03 09:20:36 +000091; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000092; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
Tim Northoverc882eb02014-04-03 11:44:58 +000093; CHECK-THUMB-DAG: orr.w [[REG3:[a-z0-9]+]], [[REG1]]
94; CHECK-THUMB-DAG: orr.w [[REG4:[a-z0-9]+]], [[REG2]]
Tim Northovera0edd3e2013-01-29 09:06:13 +000095; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
96; CHECK-THUMB: cmp
97; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +000098; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +000099
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +0000100 %r = atomicrmw or i64* %ptr, i64 %val seq_cst
101 ret i64 %r
102}
103
104define i64 @test5(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000105; CHECK-LABEL: test5:
Tim Northover36b24172013-07-03 09:20:36 +0000106; CHECK: dmb {{ish$}}
Weiming Zhao8f56f882012-11-16 21:55:34 +0000107; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
Tim Northoverc882eb02014-04-03 11:44:58 +0000108; CHECK-DAG: eor [[REG3:(r[0-9]?[02468])]], [[REG1]]
109; CHECK-DAG: eor [[REG4:(r[0-9]?[13579])]], [[REG2]]
Weiming Zhao8f56f882012-11-16 21:55:34 +0000110; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +0000111; CHECK: cmp
112; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000113; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000114
Stephen Lind24ab202013-07-14 06:24:09 +0000115; CHECK-THUMB-LABEL: test5:
Tim Northover36b24172013-07-03 09:20:36 +0000116; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000117; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
Tim Northoverc882eb02014-04-03 11:44:58 +0000118; CHECK-THUMB-DAG: eor.w [[REG3:[a-z0-9]+]], [[REG1]]
119; CHECK-THUMB-DAG: eor.w [[REG4:[a-z0-9]+]], [[REG2]]
Tim Northovera0edd3e2013-01-29 09:06:13 +0000120; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
121; CHECK-THUMB: cmp
122; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000123; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000124
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +0000125 %r = atomicrmw xor i64* %ptr, i64 %val seq_cst
126 ret i64 %r
127}
128
129define i64 @test6(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000130; CHECK-LABEL: test6:
Tim Northover36b24172013-07-03 09:20:36 +0000131; CHECK: dmb {{ish$}}
Weiming Zhao8f56f882012-11-16 21:55:34 +0000132; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
133; CHECK: strexd {{[a-z0-9]+}}, {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +0000134; CHECK: cmp
135; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000136; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000137
Stephen Lind24ab202013-07-14 06:24:09 +0000138; CHECK-THUMB-LABEL: test6:
Tim Northover36b24172013-07-03 09:20:36 +0000139; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000140; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
141; CHECK-THUMB: strexd {{[a-z0-9]+}}, {{[a-z0-9]+}}, {{[a-z0-9]+}}
142; CHECK-THUMB: cmp
143; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000144; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000145
Eli Friedmanc3f9c4a2011-08-31 00:31:29 +0000146 %r = atomicrmw xchg i64* %ptr, i64 %val seq_cst
147 ret i64 %r
Eli Friedman2c7bb522011-08-31 00:41:05 +0000148}
Eli Friedman1ccecbb2011-08-31 17:52:22 +0000149
150define i64 @test7(i64* %ptr, i64 %val1, i64 %val2) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000151; CHECK-LABEL: test7:
Tim Northover36b24172013-07-03 09:20:36 +0000152; CHECK: dmb {{ish$}}
Weiming Zhao8f56f882012-11-16 21:55:34 +0000153; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
Tim Northoverc882eb02014-04-03 11:44:58 +0000154; CHECK-DAG: eor [[MISMATCH_LO:r[0-9]+]], [[REG1]], r1
155; CHECK-DAG: eor [[MISMATCH_HI:r[0-9]+]], [[REG2]], r2
156; CHECK: orrs {{r[0-9]+}}, [[MISMATCH_LO]], [[MISMATCH_HI]]
Eli Friedman1ccecbb2011-08-31 17:52:22 +0000157; CHECK: bne
Weiming Zhao8f56f882012-11-16 21:55:34 +0000158; CHECK: strexd {{[a-z0-9]+}}, {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}
Eli Friedman1ccecbb2011-08-31 17:52:22 +0000159; CHECK: cmp
160; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000161; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000162
Stephen Lind24ab202013-07-14 06:24:09 +0000163; CHECK-THUMB-LABEL: test7:
Tim Northover36b24172013-07-03 09:20:36 +0000164; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000165; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
Tim Northoverc882eb02014-04-03 11:44:58 +0000166; CHECK-THUMB-DAG: eor.w [[MISMATCH_LO:[a-z0-9]+]], [[REG1]], r2
167; CHECK-THUMB-DAG: eor.w [[MISMATCH_HI:[a-z0-9]+]], [[REG2]], r3
168; CHECK-THUMB: orrs [[MISMATCH_HI]], [[MISMATCH_LO]]
Tim Northovera0edd3e2013-01-29 09:06:13 +0000169; CHECK-THUMB: bne
170; CHECK-THUMB: strexd {{[a-z0-9]+}}, {{[a-z0-9]+}}, {{[a-z0-9]+}}
171; CHECK-THUMB: cmp
172; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000173; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000174
Tim Northovere94a5182014-03-11 10:48:52 +0000175 %r = cmpxchg i64* %ptr, i64 %val1, i64 %val2 seq_cst seq_cst
Eli Friedman1ccecbb2011-08-31 17:52:22 +0000176 ret i64 %r
177}
Eli Friedman7c3bded2011-08-31 18:26:09 +0000178
Amara Emersonb4ad2f32013-09-26 12:22:36 +0000179; Compiles down to a single ldrexd
Eli Friedman7c3bded2011-08-31 18:26:09 +0000180define i64 @test8(i64* %ptr) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000181; CHECK-LABEL: test8:
Weiming Zhao8f56f882012-11-16 21:55:34 +0000182; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
Tim Northover36b24172013-07-03 09:20:36 +0000183; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000184
Stephen Lind24ab202013-07-14 06:24:09 +0000185; CHECK-THUMB-LABEL: test8:
Tim Northovera0edd3e2013-01-29 09:06:13 +0000186; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
Tim Northover36b24172013-07-03 09:20:36 +0000187; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000188
Eli Friedman7c3bded2011-08-31 18:26:09 +0000189 %r = load atomic i64* %ptr seq_cst, align 8
190 ret i64 %r
191}
192
193; Compiles down to atomicrmw xchg; there really isn't any more efficient
194; way to write it.
195define void @test9(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000196; CHECK-LABEL: test9:
Tim Northover36b24172013-07-03 09:20:36 +0000197; CHECK: dmb {{ish$}}
Weiming Zhao8f56f882012-11-16 21:55:34 +0000198; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
199; CHECK: strexd {{[a-z0-9]+}}, {{r[0-9]?[02468]}}, {{r[0-9]?[13579]}}
Eli Friedman7c3bded2011-08-31 18:26:09 +0000200; CHECK: cmp
201; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000202; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000203
Stephen Lind24ab202013-07-14 06:24:09 +0000204; CHECK-THUMB-LABEL: test9:
Tim Northover36b24172013-07-03 09:20:36 +0000205; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000206; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
207; CHECK-THUMB: strexd {{[a-z0-9]+}}, {{[a-z0-9]+}}, {{[a-z0-9]+}}
208; CHECK-THUMB: cmp
209; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000210; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000211
Eli Friedman7c3bded2011-08-31 18:26:09 +0000212 store atomic i64 %val, i64* %ptr seq_cst, align 8
213 ret void
214}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000215
216define i64 @test10(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000217; CHECK-LABEL: test10:
Tim Northover36b24172013-07-03 09:20:36 +0000218; CHECK: dmb {{ish$}}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000219; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
Tim Northoverc882eb02014-04-03 11:44:58 +0000220; CHECK: mov [[CARRY_LO:[a-z0-9]+]], #0
221; CHECK: mov [[CARRY_HI:[a-z0-9]+]], #0
222; CHECK: mov [[OUT_HI:[a-z0-9]+]], r2
223; CHECK: cmp [[REG1]], r1
224; CHECK: movwls [[CARRY_LO]], #1
225; CHECK: cmp [[REG2]], r2
226; CHECK: movwle [[CARRY_HI]], #1
227; CHECK: moveq [[CARRY_HI]], [[CARRY_LO]]
228; CHECK: cmp [[CARRY_HI]], #0
229; CHECK: movne [[OUT_HI]], [[REG2]]
230; CHECK: mov [[OUT_LO:[a-z0-9]+]], r1
231; CHECK: movne [[OUT_LO]], [[REG1]]
Silviu Baranga93aefa52012-11-29 14:41:25 +0000232; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
233; CHECK: cmp
234; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000235; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000236
Stephen Lind24ab202013-07-14 06:24:09 +0000237; CHECK-THUMB-LABEL: test10:
Tim Northover36b24172013-07-03 09:20:36 +0000238; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000239; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
Tim Northoverc882eb02014-04-03 11:44:58 +0000240; CHECK-THUMB: mov.w [[CARRY_LO:[a-z0-9]+]], #0
241; CHECK-THUMB: movs [[CARRY_HI:[a-z0-9]+]], #0
242; CHECK-THUMB: cmp [[REG1]], r2
243; CHECK-THUMB: movls.w [[CARRY_LO]], #1
244; CHECK-THUMB: cmp [[REG2]], r3
245; CHECK-THUMB: movle [[CARRY_HI]], #1
246; CHECK-THUMB: moveq [[CARRY_HI]], [[CARRY_LO]]
247; CHECK-THUMB: mov [[OUT_HI:[a-z0-9]+]], r3
248; CHECK-THUMB: cmp [[CARRY_HI]], #0
249; CHECK-THUMB: mov [[OUT_LO:[a-z0-9]+]], r2
250; CHECK-THUMB: movne [[OUT_HI]], [[REG2]]
251; CHECK-THUMB: movne [[OUT_LO]], [[REG1]]
Tim Northovera0edd3e2013-01-29 09:06:13 +0000252; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
253; CHECK-THUMB: cmp
254; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000255; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000256
Silviu Baranga93aefa52012-11-29 14:41:25 +0000257 %r = atomicrmw min i64* %ptr, i64 %val seq_cst
258 ret i64 %r
259}
260
261define i64 @test11(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000262; CHECK-LABEL: test11:
Tim Northover36b24172013-07-03 09:20:36 +0000263; CHECK: dmb {{ish$}}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000264; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
Tim Northoverc882eb02014-04-03 11:44:58 +0000265; CHECK: mov [[CARRY_LO:[a-z0-9]+]], #0
266; CHECK: mov [[CARRY_HI:[a-z0-9]+]], #0
267; CHECK: mov [[OUT_HI:[a-z0-9]+]], r2
268; CHECK: cmp [[REG1]], r1
269; CHECK: movwls [[CARRY_LO]], #1
270; CHECK: cmp [[REG2]], r2
271; CHECK: movwls [[CARRY_HI]], #1
272; CHECK: moveq [[CARRY_HI]], [[CARRY_LO]]
273; CHECK: cmp [[CARRY_HI]], #0
274; CHECK: movne [[OUT_HI]], [[REG2]]
275; CHECK: mov [[OUT_LO:[a-z0-9]+]], r1
276; CHECK: movne [[OUT_LO]], [[REG1]]
Silviu Baranga93aefa52012-11-29 14:41:25 +0000277; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
278; CHECK: cmp
279; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000280; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000281
282
Stephen Lind24ab202013-07-14 06:24:09 +0000283; CHECK-THUMB-LABEL: test11:
Tim Northover36b24172013-07-03 09:20:36 +0000284; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000285; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
Tim Northoverc882eb02014-04-03 11:44:58 +0000286; CHECK-THUMB: mov.w [[CARRY_LO:[a-z0-9]+]], #0
287; CHECK-THUMB: movs [[CARRY_HI:[a-z0-9]+]], #0
288; CHECK-THUMB: cmp [[REG1]], r2
289; CHECK-THUMB: movls.w [[CARRY_LO]], #1
290; CHECK-THUMB: cmp [[REG2]], r3
291; CHECK-THUMB: movls [[CARRY_HI]], #1
292; CHECK-THUMB: moveq [[CARRY_HI]], [[CARRY_LO]]
293; CHECK-THUMB: mov [[OUT_HI:[a-z0-9]+]], r3
294; CHECK-THUMB: cmp [[CARRY_HI]], #0
295; CHECK-THUMB: mov [[OUT_LO:[a-z0-9]+]], r2
296; CHECK-THUMB: movne [[OUT_HI]], [[REG2]]
297; CHECK-THUMB: movne [[OUT_LO]], [[REG1]]
Tim Northovera0edd3e2013-01-29 09:06:13 +0000298; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
299; CHECK-THUMB: cmp
300; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000301; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000302
Silviu Baranga93aefa52012-11-29 14:41:25 +0000303 %r = atomicrmw umin i64* %ptr, i64 %val seq_cst
304 ret i64 %r
305}
306
307define i64 @test12(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000308; CHECK-LABEL: test12:
Tim Northover36b24172013-07-03 09:20:36 +0000309; CHECK: dmb {{ish$}}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000310; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
Tim Northoverc882eb02014-04-03 11:44:58 +0000311; CHECK: mov [[CARRY_LO:[a-z0-9]+]], #0
312; CHECK: mov [[CARRY_HI:[a-z0-9]+]], #0
313; CHECK: mov [[OUT_HI:[a-z0-9]+]], r2
314; CHECK: cmp [[REG1]], r1
315; CHECK: movwhi [[CARRY_LO]], #1
316; CHECK: cmp [[REG2]], r2
317; CHECK: movwgt [[CARRY_HI]], #1
318; CHECK: moveq [[CARRY_HI]], [[CARRY_LO]]
319; CHECK: cmp [[CARRY_HI]], #0
320; CHECK: movne [[OUT_HI]], [[REG2]]
321; CHECK: mov [[OUT_LO:[a-z0-9]+]], r1
322; CHECK: movne [[OUT_LO]], [[REG1]]
Silviu Baranga93aefa52012-11-29 14:41:25 +0000323; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
324; CHECK: cmp
325; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000326; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000327
Stephen Lind24ab202013-07-14 06:24:09 +0000328; CHECK-THUMB-LABEL: test12:
Tim Northover36b24172013-07-03 09:20:36 +0000329; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000330; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
Tim Northoverc882eb02014-04-03 11:44:58 +0000331; CHECK-THUMB: mov.w [[CARRY_LO:[a-z0-9]+]], #0
332; CHECK-THUMB: movs [[CARRY_HI:[a-z0-9]+]], #0
333; CHECK-THUMB: cmp [[REG1]], r2
334; CHECK-THUMB: movhi.w [[CARRY_LO]], #1
335; CHECK-THUMB: cmp [[REG2]], r3
336; CHECK-THUMB: movgt [[CARRY_HI]], #1
337; CHECK-THUMB: moveq [[CARRY_HI]], [[CARRY_LO]]
338; CHECK-THUMB: mov [[OUT_HI:[a-z0-9]+]], r3
339; CHECK-THUMB: cmp [[CARRY_HI]], #0
340; CHECK-THUMB: mov [[OUT_LO:[a-z0-9]+]], r2
341; CHECK-THUMB: movne [[OUT_HI]], [[REG2]]
342; CHECK-THUMB: movne [[OUT_LO]], [[REG1]]
Tim Northovera0edd3e2013-01-29 09:06:13 +0000343; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
344; CHECK-THUMB: cmp
345; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000346; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000347
Silviu Baranga93aefa52012-11-29 14:41:25 +0000348 %r = atomicrmw max i64* %ptr, i64 %val seq_cst
349 ret i64 %r
350}
351
352define i64 @test13(i64* %ptr, i64 %val) {
Stephen Linf799e3f2013-07-13 20:38:47 +0000353; CHECK-LABEL: test13:
Tim Northover36b24172013-07-03 09:20:36 +0000354; CHECK: dmb {{ish$}}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000355; CHECK: ldrexd [[REG1:(r[0-9]?[02468])]], [[REG2:(r[0-9]?[13579])]]
Tim Northoverc882eb02014-04-03 11:44:58 +0000356; CHECK: mov [[CARRY_LO:[a-z0-9]+]], #0
357; CHECK: mov [[CARRY_HI:[a-z0-9]+]], #0
358; CHECK: mov [[OUT_HI:[a-z0-9]+]], r2
359; CHECK: cmp [[REG1]], r1
360; CHECK: movwhi [[CARRY_LO]], #1
361; CHECK: cmp [[REG2]], r2
362; CHECK: movwhi [[CARRY_HI]], #1
363; CHECK: moveq [[CARRY_HI]], [[CARRY_LO]]
364; CHECK: cmp [[CARRY_HI]], #0
365; CHECK: movne [[OUT_HI]], [[REG2]]
366; CHECK: mov [[OUT_LO:[a-z0-9]+]], r1
367; CHECK: movne [[OUT_LO]], [[REG1]]
Silviu Baranga93aefa52012-11-29 14:41:25 +0000368; CHECK: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
369; CHECK: cmp
370; CHECK: bne
Tim Northover36b24172013-07-03 09:20:36 +0000371; CHECK: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000372
Stephen Lind24ab202013-07-14 06:24:09 +0000373; CHECK-THUMB-LABEL: test13:
Tim Northover36b24172013-07-03 09:20:36 +0000374; CHECK-THUMB: dmb {{ish$}}
Tim Northovera0edd3e2013-01-29 09:06:13 +0000375; CHECK-THUMB: ldrexd [[REG1:[a-z0-9]+]], [[REG2:[a-z0-9]+]]
Tim Northoverc882eb02014-04-03 11:44:58 +0000376; CHECK-THUMB: mov.w [[CARRY_LO:[a-z0-9]+]], #0
377; CHECK-THUMB: movs [[CARRY_HI:[a-z0-9]+]], #0
378; CHECK-THUMB: cmp [[REG1]], r2
379; CHECK-THUMB: movhi.w [[CARRY_LO]], #1
380; CHECK-THUMB: cmp [[REG2]], r3
381; CHECK-THUMB: movhi [[CARRY_HI]], #1
382; CHECK-THUMB: moveq [[CARRY_HI]], [[CARRY_LO]]
383; CHECK-THUMB: mov [[OUT_HI:[a-z0-9]+]], r3
384; CHECK-THUMB: cmp [[CARRY_HI]], #0
385; CHECK-THUMB: mov [[OUT_LO:[a-z0-9]+]], r2
386; CHECK-THUMB: movne [[OUT_HI]], [[REG2]]
387; CHECK-THUMB: movne [[OUT_LO]], [[REG1]]
Tim Northovera0edd3e2013-01-29 09:06:13 +0000388; CHECK-THUMB: strexd {{[a-z0-9]+}}, [[REG3]], [[REG4]]
389; CHECK-THUMB: cmp
390; CHECK-THUMB: bne
Tim Northover36b24172013-07-03 09:20:36 +0000391; CHECK-THUMB: dmb {{ish$}}
Silviu Baranga93aefa52012-11-29 14:41:25 +0000392 %r = atomicrmw umax i64* %ptr, i64 %val seq_cst
393 ret i64 %r
394}
395