blob: 1857d5d697e65ad94f40ab110be9d701c2b254dc [file] [log] [blame]
Eli Friedman4d5532a2011-07-18 21:23:42 +00001; RUN: llc < %s -march=ppc64 | FileCheck %s
Hal Finkel58f5f9c2015-04-11 13:40:36 +00002; RUN: llc < %s -march=ppc64 -mcpu=pwr7 | FileCheck %s
3; RUN: llc < %s -march=ppc64 -mcpu=pwr8 | FileCheck %s -check-prefix=CHECK-P8U
Evan Cheng5102bd92008-04-19 02:30:38 +00004
Chris Lattner80ed9dc2011-06-18 06:05:24 +00005define i64 @exchange_and_add(i64* %mem, i64 %val) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +00006; CHECK-LABEL: exchange_and_add:
Eli Friedman4d5532a2011-07-18 21:23:42 +00007; CHECK: ldarx
Eli Friedman6fb0c1e2011-09-26 21:30:17 +00008 %tmp = atomicrmw add i64* %mem, i64 %val monotonic
Eli Friedman4d5532a2011-07-18 21:23:42 +00009; CHECK: stdcx.
Chris Lattner80ed9dc2011-06-18 06:05:24 +000010 ret i64 %tmp
Evan Cheng5102bd92008-04-19 02:30:38 +000011}
12
Nemanja Ivanovic0adf26b2015-03-10 20:51:07 +000013define i8 @exchange_and_add8(i8* %mem, i8 %val) nounwind {
14; CHECK-LABEL: exchange_and_add8:
Hal Finkel58f5f9c2015-04-11 13:40:36 +000015; CHECK-P8U: lbarx
Nemanja Ivanovic0adf26b2015-03-10 20:51:07 +000016 %tmp = atomicrmw add i8* %mem, i8 %val monotonic
Hal Finkel58f5f9c2015-04-11 13:40:36 +000017; CHECK-P8U: stbcx.
Nemanja Ivanovic0adf26b2015-03-10 20:51:07 +000018 ret i8 %tmp
19}
20
21define i16 @exchange_and_add16(i16* %mem, i16 %val) nounwind {
22; CHECK-LABEL: exchange_and_add16:
Hal Finkel58f5f9c2015-04-11 13:40:36 +000023; CHECK-P8U: lharx
Nemanja Ivanovic0adf26b2015-03-10 20:51:07 +000024 %tmp = atomicrmw add i16* %mem, i16 %val monotonic
Hal Finkel58f5f9c2015-04-11 13:40:36 +000025; CHECK-P8U: sthcx.
Nemanja Ivanovic0adf26b2015-03-10 20:51:07 +000026 ret i16 %tmp
27}
28
Chris Lattner80ed9dc2011-06-18 06:05:24 +000029define i64 @exchange_and_cmp(i64* %mem) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +000030; CHECK-LABEL: exchange_and_cmp:
Eli Friedman4d5532a2011-07-18 21:23:42 +000031; CHECK: ldarx
Tim Northover420a2162014-06-13 14:24:07 +000032 %tmppair = cmpxchg i64* %mem, i64 0, i64 1 monotonic monotonic
33 %tmp = extractvalue { i64, i1 } %tmppair, 0
Eli Friedman4d5532a2011-07-18 21:23:42 +000034; CHECK: stdcx.
35; CHECK: stdcx.
Chris Lattner80ed9dc2011-06-18 06:05:24 +000036 ret i64 %tmp
Evan Cheng5102bd92008-04-19 02:30:38 +000037}
38
Nemanja Ivanovic0adf26b2015-03-10 20:51:07 +000039define i8 @exchange_and_cmp8(i8* %mem) nounwind {
40; CHECK-LABEL: exchange_and_cmp8:
Hal Finkel58f5f9c2015-04-11 13:40:36 +000041; CHECK-P8U: lbarx
Nemanja Ivanovic0adf26b2015-03-10 20:51:07 +000042 %tmppair = cmpxchg i8* %mem, i8 0, i8 1 monotonic monotonic
43 %tmp = extractvalue { i8, i1 } %tmppair, 0
Hal Finkel58f5f9c2015-04-11 13:40:36 +000044; CHECK-P8U: stbcx.
45; CHECK-P8U: stbcx.
Nemanja Ivanovic0adf26b2015-03-10 20:51:07 +000046 ret i8 %tmp
47}
48
49define i16 @exchange_and_cmp16(i16* %mem) nounwind {
50; CHECK-LABEL: exchange_and_cmp16:
Hal Finkel58f5f9c2015-04-11 13:40:36 +000051; CHECK-P8U: lharx
Nemanja Ivanovic0adf26b2015-03-10 20:51:07 +000052 %tmppair = cmpxchg i16* %mem, i16 0, i16 1 monotonic monotonic
53 %tmp = extractvalue { i16, i1 } %tmppair, 0
Hal Finkel58f5f9c2015-04-11 13:40:36 +000054; CHECK-P8U: sthcx.
55; CHECK-P8U: sthcx.
Nemanja Ivanovic0adf26b2015-03-10 20:51:07 +000056 ret i16 %tmp
57}
58
Chris Lattner80ed9dc2011-06-18 06:05:24 +000059define i64 @exchange(i64* %mem, i64 %val) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +000060; CHECK-LABEL: exchange:
Eli Friedman4d5532a2011-07-18 21:23:42 +000061; CHECK: ldarx
Eli Friedman6fb0c1e2011-09-26 21:30:17 +000062 %tmp = atomicrmw xchg i64* %mem, i64 1 monotonic
Eli Friedman4d5532a2011-07-18 21:23:42 +000063; CHECK: stdcx.
Chris Lattner80ed9dc2011-06-18 06:05:24 +000064 ret i64 %tmp
Evan Cheng5102bd92008-04-19 02:30:38 +000065}
Hal Finkel1b5ff082012-12-25 17:22:53 +000066
Nemanja Ivanovic0adf26b2015-03-10 20:51:07 +000067define i8 @exchange8(i8* %mem, i8 %val) nounwind {
68; CHECK-LABEL: exchange8:
Hal Finkel58f5f9c2015-04-11 13:40:36 +000069; CHECK-P8U: lbarx
Nemanja Ivanovic0adf26b2015-03-10 20:51:07 +000070 %tmp = atomicrmw xchg i8* %mem, i8 1 monotonic
Hal Finkel58f5f9c2015-04-11 13:40:36 +000071; CHECK-P8U: stbcx.
Nemanja Ivanovic0adf26b2015-03-10 20:51:07 +000072 ret i8 %tmp
73}
74
75define i16 @exchange16(i16* %mem, i16 %val) nounwind {
76; CHECK-LABEL: exchange16:
Hal Finkel58f5f9c2015-04-11 13:40:36 +000077; CHECK-P8U: lharx
Nemanja Ivanovic0adf26b2015-03-10 20:51:07 +000078 %tmp = atomicrmw xchg i16* %mem, i16 1 monotonic
Hal Finkel58f5f9c2015-04-11 13:40:36 +000079; CHECK-P8U: sthcx.
Nemanja Ivanovic0adf26b2015-03-10 20:51:07 +000080 ret i16 %tmp
81}
82
Hal Finkel1b5ff082012-12-25 17:22:53 +000083define void @atomic_store(i64* %mem, i64 %val) nounwind {
84entry:
85; CHECK: @atomic_store
86 store atomic i64 %val, i64* %mem release, align 64
Hal Finkel7c5cb062015-04-23 18:30:38 +000087; CHECK: lwsync
Robin Morissete1ca44b2014-10-02 22:27:07 +000088; CHECK-NOT: stdcx
89; CHECK: std
Hal Finkel1b5ff082012-12-25 17:22:53 +000090 ret void
91}
92
93define i64 @atomic_load(i64* %mem) nounwind {
94entry:
95; CHECK: @atomic_load
David Blaikiea79ac142015-02-27 21:17:42 +000096 %tmp = load atomic i64, i64* %mem acquire, align 64
Robin Morissete1ca44b2014-10-02 22:27:07 +000097; CHECK-NOT: ldarx
98; CHECK: ld
Hal Finkel7c5cb062015-04-23 18:30:38 +000099; CHECK: lwsync
Hal Finkel1b5ff082012-12-25 17:22:53 +0000100 ret i64 %tmp
101}
102