blob: bac607133a89d3adc1132af179ec856b25106429 [file] [log] [blame]
Richard Sandiford0fb90ab2013-05-28 10:41:11 +00001; Test all condition-code masks that are relevant for CGRJ.
2;
3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
4
Richard Sandifordec8693d2013-06-27 09:49:34 +00005declare i64 @foo()
Richard Sandiford0fb90ab2013-05-28 10:41:11 +00006
Richard Sandiford6d4bd282013-07-12 09:17:10 +00007; Test EQ.
Richard Sandiford0fb90ab2013-05-28 10:41:11 +00008define void @f1(i64 %target) {
Stephen Lind24ab202013-07-14 06:24:09 +00009; CHECK-LABEL: f1:
Richard Sandiford0fb90ab2013-05-28 10:41:11 +000010; CHECK: .cfi_def_cfa_offset
11; CHECK: .L[[LABEL:.*]]:
12; CHECK: cgrje %r2, {{%r[0-9]+}}, .L[[LABEL]]
13 br label %loop
14loop:
15 %val = call i64 @foo()
16 %cond = icmp eq i64 %val, %target
17 br i1 %cond, label %loop, label %exit
18exit:
19 ret void
20}
21
Richard Sandiford6d4bd282013-07-12 09:17:10 +000022; Test NE.
Richard Sandiford0fb90ab2013-05-28 10:41:11 +000023define void @f2(i64 %target) {
Stephen Lind24ab202013-07-14 06:24:09 +000024; CHECK-LABEL: f2:
Richard Sandiford0fb90ab2013-05-28 10:41:11 +000025; CHECK: .cfi_def_cfa_offset
26; CHECK: .L[[LABEL:.*]]:
27; CHECK: cgrjlh %r2, {{%r[0-9]+}}, .L[[LABEL]]
28 br label %loop
29loop:
30 %val = call i64 @foo()
31 %cond = icmp ne i64 %val, %target
32 br i1 %cond, label %loop, label %exit
33exit:
34 ret void
35}
36
Richard Sandiford6d4bd282013-07-12 09:17:10 +000037; Test SLE.
Richard Sandiford0fb90ab2013-05-28 10:41:11 +000038define void @f3(i64 %target) {
Stephen Lind24ab202013-07-14 06:24:09 +000039; CHECK-LABEL: f3:
Richard Sandiford0fb90ab2013-05-28 10:41:11 +000040; CHECK: .cfi_def_cfa_offset
41; CHECK: .L[[LABEL:.*]]:
42; CHECK: cgrjle %r2, {{%r[0-9]+}}, .L[[LABEL]]
43 br label %loop
44loop:
45 %val = call i64 @foo()
46 %cond = icmp sle i64 %val, %target
47 br i1 %cond, label %loop, label %exit
48exit:
49 ret void
50}
51
Richard Sandiford6d4bd282013-07-12 09:17:10 +000052; Test SLT.
Richard Sandiford0fb90ab2013-05-28 10:41:11 +000053define void @f4(i64 %target) {
Stephen Lind24ab202013-07-14 06:24:09 +000054; CHECK-LABEL: f4:
Richard Sandiford0fb90ab2013-05-28 10:41:11 +000055; CHECK: .cfi_def_cfa_offset
56; CHECK: .L[[LABEL:.*]]:
57; CHECK: cgrjl %r2, {{%r[0-9]+}}, .L[[LABEL]]
58 br label %loop
59loop:
60 %val = call i64 @foo()
61 %cond = icmp slt i64 %val, %target
62 br i1 %cond, label %loop, label %exit
63exit:
64 ret void
65}
66
Richard Sandiford6d4bd282013-07-12 09:17:10 +000067; Test SGT.
Richard Sandiford0fb90ab2013-05-28 10:41:11 +000068define void @f5(i64 %target) {
Stephen Lind24ab202013-07-14 06:24:09 +000069; CHECK-LABEL: f5:
Richard Sandiford0fb90ab2013-05-28 10:41:11 +000070; CHECK: .cfi_def_cfa_offset
71; CHECK: .L[[LABEL:.*]]:
72; CHECK: cgrjh %r2, {{%r[0-9]+}}, .L[[LABEL]]
73 br label %loop
74loop:
75 %val = call i64 @foo()
76 %cond = icmp sgt i64 %val, %target
77 br i1 %cond, label %loop, label %exit
78exit:
79 ret void
80}
81
Richard Sandiford6d4bd282013-07-12 09:17:10 +000082; Test SGE.
Richard Sandiford0fb90ab2013-05-28 10:41:11 +000083define void @f6(i64 %target) {
Stephen Lind24ab202013-07-14 06:24:09 +000084; CHECK-LABEL: f6:
Richard Sandiford0fb90ab2013-05-28 10:41:11 +000085; CHECK: .cfi_def_cfa_offset
86; CHECK: .L[[LABEL:.*]]:
87; CHECK: cgrjhe %r2, {{%r[0-9]+}}, .L[[LABEL]]
88 br label %loop
89loop:
90 %val = call i64 @foo()
91 %cond = icmp sge i64 %val, %target
92 br i1 %cond, label %loop, label %exit
93exit:
94 ret void
95}
Richard Sandiford6d4bd282013-07-12 09:17:10 +000096
97; Test a vector of 0/-1 results for i32 EQ.
98define i64 @f7(i64 %a, i64 %b) {
Stephen Lind24ab202013-07-14 06:24:09 +000099; CHECK-LABEL: f7:
Richard Sandifordf722a8e302013-10-16 11:10:55 +0000100; CHECK: ipm [[REG:%r[0-5]]]
101; CHECK: afi [[REG]], -268435456
102; CHECK: sra [[REG]], 31
Richard Sandiford6d4bd282013-07-12 09:17:10 +0000103; CHECK: br %r14
104 %avec = bitcast i64 %a to <2 x i32>
105 %bvec = bitcast i64 %b to <2 x i32>
106 %cmp = icmp eq <2 x i32> %avec, %bvec
107 %ext = sext <2 x i1> %cmp to <2 x i32>
108 %ret = bitcast <2 x i32> %ext to i64
109 ret i64 %ret
110}
111
112; Test a vector of 0/-1 results for i32 NE.
113define i64 @f8(i64 %a, i64 %b) {
Stephen Lind24ab202013-07-14 06:24:09 +0000114; CHECK-LABEL: f8:
Richard Sandifordf722a8e302013-10-16 11:10:55 +0000115; CHECK: ipm [[REG:%r[0-5]]]
116; CHECK: afi [[REG]], 1879048192
117; CHECK: sra [[REG]], 31
Richard Sandiford6d4bd282013-07-12 09:17:10 +0000118; CHECK: br %r14
119 %avec = bitcast i64 %a to <2 x i32>
120 %bvec = bitcast i64 %b to <2 x i32>
121 %cmp = icmp ne <2 x i32> %avec, %bvec
122 %ext = sext <2 x i1> %cmp to <2 x i32>
123 %ret = bitcast <2 x i32> %ext to i64
124 ret i64 %ret
125}
126
127; Test a vector of 0/-1 results for i64 EQ.
128define void @f9(i64 %a, i64 %b, <2 x i64> *%dest) {
Stephen Lind24ab202013-07-14 06:24:09 +0000129; CHECK-LABEL: f9:
Richard Sandifordf722a8e302013-10-16 11:10:55 +0000130; CHECK: ipm [[REG:%r[0-5]]]
131; CHECK: afi [[REG]], -268435456
132; CHECK: sllg [[REG2:%r[0-5]]], [[REG]], 32
133; CHECK: srag {{%r[0-5]}}, [[REG2]], 63
Richard Sandiford6d4bd282013-07-12 09:17:10 +0000134; CHECK: br %r14
135 %avec = bitcast i64 %a to <2 x i32>
136 %bvec = bitcast i64 %b to <2 x i32>
137 %cmp = icmp eq <2 x i32> %avec, %bvec
138 %ext = sext <2 x i1> %cmp to <2 x i64>
139 store <2 x i64> %ext, <2 x i64> *%dest
140 ret void
141}
142
143; Test a vector of 0/-1 results for i64 NE.
144define void @f10(i64 %a, i64 %b, <2 x i64> *%dest) {
Stephen Lind24ab202013-07-14 06:24:09 +0000145; CHECK-LABEL: f10:
Richard Sandifordf722a8e302013-10-16 11:10:55 +0000146; CHECK: ipm [[REG:%r[0-5]]]
147; CHECK: afi [[REG]], 1879048192
148; CHECK: sllg [[REG2:%r[0-5]]], [[REG]], 32
149; CHECK: srag {{%r[0-5]}}, [[REG2]], 63
Richard Sandiford6d4bd282013-07-12 09:17:10 +0000150; CHECK: br %r14
151 %avec = bitcast i64 %a to <2 x i32>
152 %bvec = bitcast i64 %b to <2 x i32>
153 %cmp = icmp ne <2 x i32> %avec, %bvec
154 %ext = sext <2 x i1> %cmp to <2 x i64>
155 store <2 x i64> %ext, <2 x i64> *%dest
156 ret void
157}