1; Test all condition-code masks that are relevant for CGRJ.
2;
3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
4
5declare i64 @foo()
6
7; Test EQ.
8define void @f1(i64 %target) {
9; CHECK-LABEL: f1:
10; 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
22; Test NE.
23define void @f2(i64 %target) {
24; CHECK-LABEL: f2:
25; 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
37; Test SLE.
38define void @f3(i64 %target) {
39; CHECK-LABEL: f3:
40; 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
52; Test SLT.
53define void @f4(i64 %target) {
54; CHECK-LABEL: f4:
55; 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
67; Test SGT.
68define void @f5(i64 %target) {
69; CHECK-LABEL: f5:
70; 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
82; Test SGE.
83define void @f6(i64 %target) {
84; CHECK-LABEL: f6:
85; 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}
96
97; Test a vector of 0/-1 results for i32 EQ.
98define i64 @f7(i64 %a, i64 %b) {
99; CHECK-LABEL: f7:
100; CHECK: ipm [[REG:%r[0-5]]]
101; CHECK: afi [[REG]], -268435456
102; CHECK: sra [[REG]], 31
103; 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) {
114; CHECK-LABEL: f8:
115; CHECK: ipm [[REG:%r[0-5]]]
116; CHECK: afi [[REG]], 1879048192
117; CHECK: sra [[REG]], 31
118; 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) {
129; CHECK-LABEL: f9:
130; 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
134; 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) {
145; CHECK-LABEL: f10:
146; 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
150; 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}
158