blob: 037eb1aa9367c37a374d692da0f03e07d08884bc [file] [log] [blame]
Richard Sandifordf834ea12013-10-31 12:14:17 +00001; Test 64-bit atomic minimum and maximum. Here we match the z10 versions,
2; which can't use LOCGR.
Ulrich Weigand9e3577f2013-05-06 16:17:29 +00003;
Richard Sandifordf834ea12013-10-31 12:14:17 +00004; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
Ulrich Weigand9e3577f2013-05-06 16:17:29 +00005
6; Check signed minium.
7define i64 @f1(i64 %dummy, i64 *%src, i64 %b) {
Stephen Lind24ab202013-07-14 06:24:09 +00008; CHECK-LABEL: f1:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +00009; CHECK: lg %r2, 0(%r3)
10; CHECK: [[LOOP:\.[^:]*]]:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000011; CHECK: lgr [[NEW:%r[0-9]+]], %r2
Richard Sandiford0fb90ab2013-05-28 10:41:11 +000012; CHECK: cgrjle %r2, %r4, [[KEEP:\..*]]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000013; CHECK: lgr [[NEW]], %r4
14; CHECK: csg %r2, [[NEW]], 0(%r3)
Richard Sandiford3d768e32013-07-31 12:30:20 +000015; CHECK: jl [[LOOP]]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000016; CHECK: br %r14
17 %res = atomicrmw min i64 *%src, i64 %b seq_cst
18 ret i64 %res
19}
20
21; Check signed maximum.
22define i64 @f2(i64 %dummy, i64 *%src, i64 %b) {
Stephen Lind24ab202013-07-14 06:24:09 +000023; CHECK-LABEL: f2:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000024; CHECK: lg %r2, 0(%r3)
25; CHECK: [[LOOP:\.[^:]*]]:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000026; CHECK: lgr [[NEW:%r[0-9]+]], %r2
Richard Sandiford0fb90ab2013-05-28 10:41:11 +000027; CHECK: cgrjhe %r2, %r4, [[KEEP:\..*]]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000028; CHECK: lgr [[NEW]], %r4
29; CHECK: csg %r2, [[NEW]], 0(%r3)
Richard Sandiford3d768e32013-07-31 12:30:20 +000030; CHECK: jl [[LOOP]]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000031; CHECK: br %r14
32 %res = atomicrmw max i64 *%src, i64 %b seq_cst
33 ret i64 %res
34}
35
36; Check unsigned minimum.
37define i64 @f3(i64 %dummy, i64 *%src, i64 %b) {
Stephen Lind24ab202013-07-14 06:24:09 +000038; CHECK-LABEL: f3:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000039; CHECK: lg %r2, 0(%r3)
40; CHECK: [[LOOP:\.[^:]*]]:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000041; CHECK: lgr [[NEW:%r[0-9]+]], %r2
Richard Sandiford93183ee2013-09-18 09:56:40 +000042; CHECK: clgrjle %r2, %r4, [[KEEP:\..*]]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000043; CHECK: lgr [[NEW]], %r4
44; CHECK: csg %r2, [[NEW]], 0(%r3)
Richard Sandiford3d768e32013-07-31 12:30:20 +000045; CHECK: jl [[LOOP]]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000046; CHECK: br %r14
47 %res = atomicrmw umin i64 *%src, i64 %b seq_cst
48 ret i64 %res
49}
50
51; Check unsigned maximum.
52define i64 @f4(i64 %dummy, i64 *%src, i64 %b) {
Stephen Lind24ab202013-07-14 06:24:09 +000053; CHECK-LABEL: f4:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000054; CHECK: lg %r2, 0(%r3)
55; CHECK: [[LOOP:\.[^:]*]]:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000056; CHECK: lgr [[NEW:%r[0-9]+]], %r2
Richard Sandiford93183ee2013-09-18 09:56:40 +000057; CHECK: clgrjhe %r2, %r4, [[KEEP:\..*]]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000058; CHECK: lgr [[NEW]], %r4
59; CHECK: csg %r2, [[NEW]], 0(%r3)
Richard Sandiford3d768e32013-07-31 12:30:20 +000060; CHECK: jl [[LOOP]]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000061; CHECK: br %r14
62 %res = atomicrmw umax i64 *%src, i64 %b seq_cst
63 ret i64 %res
64}
65
66; Check the high end of the aligned CSG range.
67define i64 @f5(i64 %dummy, i64 *%src, i64 %b) {
Stephen Lind24ab202013-07-14 06:24:09 +000068; CHECK-LABEL: f5:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000069; CHECK: lg %r2, 524280(%r3)
70; CHECK: csg %r2, {{%r[0-9]+}}, 524280(%r3)
71; CHECK: br %r14
72 %ptr = getelementptr i64 *%src, i64 65535
73 %res = atomicrmw min i64 *%ptr, i64 %b seq_cst
74 ret i64 %res
75}
76
77; Check the next doubleword up, which requires separate address logic.
78define i64 @f6(i64 %dummy, i64 *%src, i64 %b) {
Stephen Lind24ab202013-07-14 06:24:09 +000079; CHECK-LABEL: f6:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000080; CHECK: agfi %r3, 524288
81; CHECK: lg %r2, 0(%r3)
82; CHECK: csg %r2, {{%r[0-9]+}}, 0(%r3)
83; CHECK: br %r14
84 %ptr = getelementptr i64 *%src, i64 65536
85 %res = atomicrmw min i64 *%ptr, i64 %b seq_cst
86 ret i64 %res
87}
88
89; Check the low end of the CSG range.
90define i64 @f7(i64 %dummy, i64 *%src, i64 %b) {
Stephen Lind24ab202013-07-14 06:24:09 +000091; CHECK-LABEL: f7:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000092; CHECK: lg %r2, -524288(%r3)
93; CHECK: csg %r2, {{%r[0-9]+}}, -524288(%r3)
94; CHECK: br %r14
95 %ptr = getelementptr i64 *%src, i64 -65536
96 %res = atomicrmw min i64 *%ptr, i64 %b seq_cst
97 ret i64 %res
98}
99
100; Check the next doubleword down, which requires separate address logic.
101define i64 @f8(i64 %dummy, i64 *%src, i64 %b) {
Stephen Lind24ab202013-07-14 06:24:09 +0000102; CHECK-LABEL: f8:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000103; CHECK: agfi %r3, -524296
104; CHECK: lg %r2, 0(%r3)
105; CHECK: csg %r2, {{%r[0-9]+}}, 0(%r3)
106; CHECK: br %r14
107 %ptr = getelementptr i64 *%src, i64 -65537
108 %res = atomicrmw min i64 *%ptr, i64 %b seq_cst
109 ret i64 %res
110}
111
112; Check that indexed addresses are not allowed.
113define i64 @f9(i64 %dummy, i64 %base, i64 %index, i64 %b) {
Stephen Lind24ab202013-07-14 06:24:09 +0000114; CHECK-LABEL: f9:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000115; CHECK: agr %r3, %r4
116; CHECK: lg %r2, 0(%r3)
117; CHECK: csg %r2, {{%r[0-9]+}}, 0(%r3)
118; CHECK: br %r14
119 %add = add i64 %base, %index
120 %ptr = inttoptr i64 %add to i64 *
121 %res = atomicrmw min i64 *%ptr, i64 %b seq_cst
122 ret i64 %res
123}
124
Richard Sandiforda57e13b2013-06-27 09:38:48 +0000125; Check that constants are handled.
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000126define i64 @f10(i64 %dummy, i64 *%ptr) {
Stephen Lind24ab202013-07-14 06:24:09 +0000127; CHECK-LABEL: f10:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000128; CHECK: lghi [[LIMIT:%r[0-9]+]], 42
129; CHECK: lg %r2, 0(%r3)
130; CHECK: [[LOOP:\.[^:]*]]:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000131; CHECK: lgr [[NEW:%r[0-9]+]], %r2
Richard Sandiford0fb90ab2013-05-28 10:41:11 +0000132; CHECK: cgrjle %r2, [[LIMIT]], [[KEEP:\..*]]
Richard Sandiforda57e13b2013-06-27 09:38:48 +0000133; CHECK: lghi [[NEW]], 42
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000134; CHECK: csg %r2, [[NEW]], 0(%r3)
Richard Sandiford3d768e32013-07-31 12:30:20 +0000135; CHECK: jl [[LOOP]]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000136; CHECK: br %r14
137 %res = atomicrmw min i64 *%ptr, i64 42 seq_cst
138 ret i64 %res
139}