blob: 9d26d28bc1df4e8f8684b89e1052e411f20271ab [file] [log] [blame]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +00001; Test 64-bit atomic minimum and maximum.
2;
3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
4
5; Check signed minium.
6define i64 @f1(i64 %dummy, i64 *%src, i64 %b) {
Stephen Lind24ab202013-07-14 06:24:09 +00007; CHECK-LABEL: f1:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +00008; CHECK: lg %r2, 0(%r3)
9; CHECK: [[LOOP:\.[^:]*]]:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000010; CHECK: lgr [[NEW:%r[0-9]+]], %r2
Richard Sandiford0fb90ab2013-05-28 10:41:11 +000011; CHECK: cgrjle %r2, %r4, [[KEEP:\..*]]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000012; CHECK: lgr [[NEW]], %r4
13; CHECK: csg %r2, [[NEW]], 0(%r3)
Richard Sandiford3d768e32013-07-31 12:30:20 +000014; CHECK: jl [[LOOP]]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000015; CHECK: br %r14
16 %res = atomicrmw min i64 *%src, i64 %b seq_cst
17 ret i64 %res
18}
19
20; Check signed maximum.
21define i64 @f2(i64 %dummy, i64 *%src, i64 %b) {
Stephen Lind24ab202013-07-14 06:24:09 +000022; CHECK-LABEL: f2:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000023; CHECK: lg %r2, 0(%r3)
24; CHECK: [[LOOP:\.[^:]*]]:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000025; CHECK: lgr [[NEW:%r[0-9]+]], %r2
Richard Sandiford0fb90ab2013-05-28 10:41:11 +000026; CHECK: cgrjhe %r2, %r4, [[KEEP:\..*]]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000027; CHECK: lgr [[NEW]], %r4
28; CHECK: csg %r2, [[NEW]], 0(%r3)
Richard Sandiford3d768e32013-07-31 12:30:20 +000029; CHECK: jl [[LOOP]]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000030; CHECK: br %r14
31 %res = atomicrmw max i64 *%src, i64 %b seq_cst
32 ret i64 %res
33}
34
35; Check unsigned minimum.
36define i64 @f3(i64 %dummy, i64 *%src, i64 %b) {
Stephen Lind24ab202013-07-14 06:24:09 +000037; CHECK-LABEL: f3:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000038; CHECK: lg %r2, 0(%r3)
39; CHECK: [[LOOP:\.[^:]*]]:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000040; CHECK: lgr [[NEW:%r[0-9]+]], %r2
Richard Sandiford93183ee2013-09-18 09:56:40 +000041; CHECK: clgrjle %r2, %r4, [[KEEP:\..*]]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000042; CHECK: lgr [[NEW]], %r4
43; CHECK: csg %r2, [[NEW]], 0(%r3)
Richard Sandiford3d768e32013-07-31 12:30:20 +000044; CHECK: jl [[LOOP]]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000045; CHECK: br %r14
46 %res = atomicrmw umin i64 *%src, i64 %b seq_cst
47 ret i64 %res
48}
49
50; Check unsigned maximum.
51define i64 @f4(i64 %dummy, i64 *%src, i64 %b) {
Stephen Lind24ab202013-07-14 06:24:09 +000052; CHECK-LABEL: f4:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000053; CHECK: lg %r2, 0(%r3)
54; CHECK: [[LOOP:\.[^:]*]]:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000055; CHECK: lgr [[NEW:%r[0-9]+]], %r2
Richard Sandiford93183ee2013-09-18 09:56:40 +000056; CHECK: clgrjhe %r2, %r4, [[KEEP:\..*]]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000057; CHECK: lgr [[NEW]], %r4
58; CHECK: csg %r2, [[NEW]], 0(%r3)
Richard Sandiford3d768e32013-07-31 12:30:20 +000059; CHECK: jl [[LOOP]]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000060; CHECK: br %r14
61 %res = atomicrmw umax i64 *%src, i64 %b seq_cst
62 ret i64 %res
63}
64
65; Check the high end of the aligned CSG range.
66define i64 @f5(i64 %dummy, i64 *%src, i64 %b) {
Stephen Lind24ab202013-07-14 06:24:09 +000067; CHECK-LABEL: f5:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000068; CHECK: lg %r2, 524280(%r3)
69; CHECK: csg %r2, {{%r[0-9]+}}, 524280(%r3)
70; CHECK: br %r14
71 %ptr = getelementptr i64 *%src, i64 65535
72 %res = atomicrmw min i64 *%ptr, i64 %b seq_cst
73 ret i64 %res
74}
75
76; Check the next doubleword up, which requires separate address logic.
77define i64 @f6(i64 %dummy, i64 *%src, i64 %b) {
Stephen Lind24ab202013-07-14 06:24:09 +000078; CHECK-LABEL: f6:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000079; CHECK: agfi %r3, 524288
80; CHECK: lg %r2, 0(%r3)
81; CHECK: csg %r2, {{%r[0-9]+}}, 0(%r3)
82; CHECK: br %r14
83 %ptr = getelementptr i64 *%src, i64 65536
84 %res = atomicrmw min i64 *%ptr, i64 %b seq_cst
85 ret i64 %res
86}
87
88; Check the low end of the CSG range.
89define i64 @f7(i64 %dummy, i64 *%src, i64 %b) {
Stephen Lind24ab202013-07-14 06:24:09 +000090; CHECK-LABEL: f7:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000091; CHECK: lg %r2, -524288(%r3)
92; CHECK: csg %r2, {{%r[0-9]+}}, -524288(%r3)
93; CHECK: br %r14
94 %ptr = getelementptr i64 *%src, i64 -65536
95 %res = atomicrmw min i64 *%ptr, i64 %b seq_cst
96 ret i64 %res
97}
98
99; Check the next doubleword down, which requires separate address logic.
100define i64 @f8(i64 %dummy, i64 *%src, i64 %b) {
Stephen Lind24ab202013-07-14 06:24:09 +0000101; CHECK-LABEL: f8:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000102; CHECK: agfi %r3, -524296
103; CHECK: lg %r2, 0(%r3)
104; CHECK: csg %r2, {{%r[0-9]+}}, 0(%r3)
105; CHECK: br %r14
106 %ptr = getelementptr i64 *%src, i64 -65537
107 %res = atomicrmw min i64 *%ptr, i64 %b seq_cst
108 ret i64 %res
109}
110
111; Check that indexed addresses are not allowed.
112define i64 @f9(i64 %dummy, i64 %base, i64 %index, i64 %b) {
Stephen Lind24ab202013-07-14 06:24:09 +0000113; CHECK-LABEL: f9:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000114; CHECK: agr %r3, %r4
115; CHECK: lg %r2, 0(%r3)
116; CHECK: csg %r2, {{%r[0-9]+}}, 0(%r3)
117; CHECK: br %r14
118 %add = add i64 %base, %index
119 %ptr = inttoptr i64 %add to i64 *
120 %res = atomicrmw min i64 *%ptr, i64 %b seq_cst
121 ret i64 %res
122}
123
Richard Sandiforda57e13b2013-06-27 09:38:48 +0000124; Check that constants are handled.
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000125define i64 @f10(i64 %dummy, i64 *%ptr) {
Stephen Lind24ab202013-07-14 06:24:09 +0000126; CHECK-LABEL: f10:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000127; CHECK: lghi [[LIMIT:%r[0-9]+]], 42
128; CHECK: lg %r2, 0(%r3)
129; CHECK: [[LOOP:\.[^:]*]]:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000130; CHECK: lgr [[NEW:%r[0-9]+]], %r2
Richard Sandiford0fb90ab2013-05-28 10:41:11 +0000131; CHECK: cgrjle %r2, [[LIMIT]], [[KEEP:\..*]]
Richard Sandiforda57e13b2013-06-27 09:38:48 +0000132; CHECK: lghi [[NEW]], 42
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000133; CHECK: csg %r2, [[NEW]], 0(%r3)
Richard Sandiford3d768e32013-07-31 12:30:20 +0000134; CHECK: jl [[LOOP]]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000135; CHECK: br %r14
136 %res = atomicrmw min i64 *%ptr, i64 42 seq_cst
137 ret i64 %res
138}