blob: d009af2f1f01c0f1acd9ea1bb5ce4138f188b9ee [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) {
9; CHECK: 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
Richard Sandiford6d4bd282013-07-12 09:17:10 +000022; Test NE.
Richard Sandiford0fb90ab2013-05-28 10:41:11 +000023define void @f2(i64 %target) {
24; CHECK: 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
Richard Sandiford6d4bd282013-07-12 09:17:10 +000037; Test SLE.
Richard Sandiford0fb90ab2013-05-28 10:41:11 +000038define void @f3(i64 %target) {
39; CHECK: 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
Richard Sandiford6d4bd282013-07-12 09:17:10 +000052; Test SLT.
Richard Sandiford0fb90ab2013-05-28 10:41:11 +000053define void @f4(i64 %target) {
54; CHECK: 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
Richard Sandiford6d4bd282013-07-12 09:17:10 +000067; Test SGT.
Richard Sandiford0fb90ab2013-05-28 10:41:11 +000068define void @f5(i64 %target) {
69; CHECK: 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
Richard Sandiford6d4bd282013-07-12 09:17:10 +000082; Test SGE.
Richard Sandiford0fb90ab2013-05-28 10:41:11 +000083define void @f6(i64 %target) {
84; CHECK: 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}
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) {
99; CHECK: f7:
100; CHECK: lhi [[REG:%r[0-5]]], -1
101; CHECK: crje {{%r[0-5]}}
102; CHECK: lhi [[REG]], 0
103; CHECK-NOT: sra
104; CHECK: br %r14
105 %avec = bitcast i64 %a to <2 x i32>
106 %bvec = bitcast i64 %b to <2 x i32>
107 %cmp = icmp eq <2 x i32> %avec, %bvec
108 %ext = sext <2 x i1> %cmp to <2 x i32>
109 %ret = bitcast <2 x i32> %ext to i64
110 ret i64 %ret
111}
112
113; Test a vector of 0/-1 results for i32 NE.
114define i64 @f8(i64 %a, i64 %b) {
115; CHECK: f8:
116; CHECK: lhi [[REG:%r[0-5]]], -1
117; CHECK: crjlh {{%r[0-5]}}
118; CHECK: lhi [[REG]], 0
119; CHECK-NOT: sra
120; CHECK: br %r14
121 %avec = bitcast i64 %a to <2 x i32>
122 %bvec = bitcast i64 %b to <2 x i32>
123 %cmp = icmp ne <2 x i32> %avec, %bvec
124 %ext = sext <2 x i1> %cmp to <2 x i32>
125 %ret = bitcast <2 x i32> %ext to i64
126 ret i64 %ret
127}
128
129; Test a vector of 0/-1 results for i64 EQ.
130define void @f9(i64 %a, i64 %b, <2 x i64> *%dest) {
131; CHECK: f9:
132; CHECK: lghi [[REG:%r[0-5]]], -1
133; CHECK: crje {{%r[0-5]}}
134; CHECK: lghi [[REG]], 0
135; CHECK-NOT: sra
136; CHECK: br %r14
137 %avec = bitcast i64 %a to <2 x i32>
138 %bvec = bitcast i64 %b to <2 x i32>
139 %cmp = icmp eq <2 x i32> %avec, %bvec
140 %ext = sext <2 x i1> %cmp to <2 x i64>
141 store <2 x i64> %ext, <2 x i64> *%dest
142 ret void
143}
144
145; Test a vector of 0/-1 results for i64 NE.
146define void @f10(i64 %a, i64 %b, <2 x i64> *%dest) {
147; CHECK: f10:
148; CHECK: lghi [[REG:%r[0-5]]], -1
149; CHECK: crjlh {{%r[0-5]}}
150; CHECK: lghi [[REG]], 0
151; CHECK-NOT: sra
152; CHECK: br %r14
153 %avec = bitcast i64 %a to <2 x i32>
154 %bvec = bitcast i64 %b to <2 x i32>
155 %cmp = icmp ne <2 x i32> %avec, %bvec
156 %ext = sext <2 x i1> %cmp to <2 x i64>
157 store <2 x i64> %ext, <2 x i64> *%dest
158 ret void
159}