[SystemZ] Optimize sign-extends of vector setccs
[oota-llvm.git] / test / CodeGen / SystemZ / branch-07.ll
1 ; Test all condition-code masks that are relevant for CGRJ.
2 ;
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
4
5 declare i64 @foo()
6
7 ; Test EQ.
8 define 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
14 loop:
15   %val = call i64 @foo()
16   %cond = icmp eq i64 %val, %target
17   br i1 %cond, label %loop, label %exit
18 exit:
19   ret void
20 }
21
22 ; Test NE.
23 define 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
29 loop:
30   %val = call i64 @foo()
31   %cond = icmp ne i64 %val, %target
32   br i1 %cond, label %loop, label %exit
33 exit:
34   ret void
35 }
36
37 ; Test SLE.
38 define 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
44 loop:
45   %val = call i64 @foo()
46   %cond = icmp sle i64 %val, %target
47   br i1 %cond, label %loop, label %exit
48 exit:
49   ret void
50 }
51
52 ; Test SLT.
53 define 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
59 loop:
60   %val = call i64 @foo()
61   %cond = icmp slt i64 %val, %target
62   br i1 %cond, label %loop, label %exit
63 exit:
64   ret void
65 }
66
67 ; Test SGT.
68 define 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
74 loop:
75   %val = call i64 @foo()
76   %cond = icmp sgt i64 %val, %target
77   br i1 %cond, label %loop, label %exit
78 exit:
79   ret void
80 }
81
82 ; Test SGE.
83 define 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
89 loop:
90   %val = call i64 @foo()
91   %cond = icmp sge i64 %val, %target
92   br i1 %cond, label %loop, label %exit
93 exit:
94   ret void
95 }
96
97 ; Test a vector of 0/-1 results for i32 EQ.
98 define 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.
114 define 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.
130 define 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.
146 define 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 }