[SystemZ] SystemZElimCompare pass improved.
[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-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
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-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
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-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
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-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
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-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
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-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
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-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.
113 define 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.
128 define 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.
144 define 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 }