[SystemZ] Extend the use of C(L)GFR
[oota-llvm.git] / test / CodeGen / SystemZ / selectcc-03.ll
1 ; Test an i64 0/-1 SELECTCCC for every floating-point condition.
2 ;
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
4
5 ; Test CC in { 0 }
6 define i64 @f1(float %a, float %b) {
7 ; CHECK-LABEL: f1:
8 ; CHECK: ipm [[REG:%r[0-5]]]
9 ; CHECK-NEXT: afi [[REG]], -268435456
10 ; CHECK-NEXT: sllg [[REG]], [[REG]], 32
11 ; CHECK-NEXT: srag %r2, [[REG]], 63
12 ; CHECK: br %r14
13   %cond = fcmp oeq float %a, %b
14   %res = select i1 %cond, i64 -1, i64 0
15   ret i64 %res
16 }
17
18 ; Test CC in { 1 }
19 define i64 @f2(float %a, float %b) {
20 ; CHECK-LABEL: f2:
21 ; CHECK: ipm [[REG:%r[0-5]]]
22 ; CHECK-NEXT: xilf [[REG]], 268435456
23 ; CHECK-NEXT: afi [[REG]], -268435456
24 ; CHECK-NEXT: sllg [[REG]], [[REG]], 32
25 ; CHECK-NEXT: srag %r2, [[REG]], 63
26 ; CHECK: br %r14
27   %cond = fcmp olt float %a, %b
28   %res = select i1 %cond, i64 -1, i64 0
29   ret i64 %res
30 }
31
32 ; Test CC in { 0, 1 }
33 define i64 @f3(float %a, float %b) {
34 ; CHECK-LABEL: f3:
35 ; CHECK: ipm [[REG:%r[0-5]]]
36 ; CHECK-NEXT: afi [[REG]], -536870912
37 ; CHECK-NEXT: sllg [[REG]], [[REG]], 32
38 ; CHECK-NEXT: srag %r2, [[REG]], 63
39 ; CHECK: br %r14
40   %cond = fcmp ole float %a, %b
41   %res = select i1 %cond, i64 -1, i64 0
42   ret i64 %res
43 }
44
45 ; Test CC in { 2 }
46 define i64 @f4(float %a, float %b) {
47 ; CHECK-LABEL: f4:
48 ; CHECK: ipm [[REG:%r[0-5]]]
49 ; CHECK-NEXT: xilf [[REG]], 268435456
50 ; CHECK-NEXT: afi [[REG]], 1342177280
51 ; CHECK-NEXT: sllg [[REG]], [[REG]], 32
52 ; CHECK-NEXT: srag %r2, [[REG]], 63
53 ; CHECK: br %r14
54   %cond = fcmp ogt float %a, %b
55   %res = select i1 %cond, i64 -1, i64 0
56   ret i64 %res
57 }
58
59 ; Test CC in { 0, 2 }
60 define i64 @f5(float %a, float %b) {
61 ; CHECK-LABEL: f5:
62 ; CHECK: ipm [[REG:%r[0-5]]]
63 ; CHECK-NEXT: xilf [[REG]], 4294967295
64 ; CHECK-NEXT: sllg [[REG]], [[REG]], 35
65 ; CHECK-NEXT: srag %r2, [[REG]], 63
66 ; CHECK: br %r14
67   %cond = fcmp oge float %a, %b
68   %res = select i1 %cond, i64 -1, i64 0
69   ret i64 %res
70 }
71
72 ; Test CC in { 1, 2 }
73 define i64 @f6(float %a, float %b) {
74 ; CHECK-LABEL: f6:
75 ; CHECK: ipm [[REG:%r[0-5]]]
76 ; CHECK-NEXT: afi [[REG]], 268435456
77 ; CHECK-NEXT: sllg [[REG]], [[REG]], 34
78 ; CHECK-NEXT: srag %r2, [[REG]], 63
79 ; CHECK: br %r14
80   %cond = fcmp one float %a, %b
81   %res = select i1 %cond, i64 -1, i64 0
82   ret i64 %res
83 }
84
85 ; Test CC in { 0, 1, 2 }
86 define i64 @f7(float %a, float %b) {
87 ; CHECK-LABEL: f7:
88 ; CHECK: ipm [[REG:%r[0-5]]]
89 ; CHECK-NEXT: afi [[REG]], -805306368
90 ; CHECK-NEXT: sllg [[REG]], [[REG]], 32
91 ; CHECK-NEXT: srag %r2, [[REG]], 63
92 ; CHECK: br %r14
93   %cond = fcmp ord float %a, %b
94   %res = select i1 %cond, i64 -1, i64 0
95   ret i64 %res
96 }
97
98 ; Test CC in { 3 }
99 define i64 @f8(float %a, float %b) {
100 ; CHECK-LABEL: f8:
101 ; CHECK: ipm [[REG:%r[0-5]]]
102 ; CHECK-NEXT: afi [[REG]], 1342177280
103 ; CHECK-NEXT: sllg [[REG]], [[REG]], 32
104 ; CHECK-NEXT: srag %r2, [[REG]], 63
105 ; CHECK: br %r14
106   %cond = fcmp uno float %a, %b
107   %res = select i1 %cond, i64 -1, i64 0
108   ret i64 %res
109 }
110
111 ; Test CC in { 0, 3 }
112 define i64 @f9(float %a, float %b) {
113 ; CHECK-LABEL: f9:
114 ; CHECK: ipm [[REG:%r[0-5]]]
115 ; CHECK-NEXT: afi [[REG]], -268435456
116 ; CHECK-NEXT: sllg [[REG]], [[REG]], 34
117 ; CHECK-NEXT: srag %r2, [[REG]], 63
118 ; CHECK: br %r14
119   %cond = fcmp ueq float %a, %b
120   %res = select i1 %cond, i64 -1, i64 0
121   ret i64 %res
122 }
123
124 ; Test CC in { 1, 3 }
125 define i64 @f10(float %a, float %b) {
126 ; CHECK-LABEL: f10:
127 ; CHECK: ipm [[REG:%r[0-5]]]
128 ; CHECK-NEXT: sllg [[REG]], [[REG]], 35
129 ; CHECK-NEXT: srag %r2, [[REG]], 63
130 ; CHECK: br %r14
131   %cond = fcmp ult float %a, %b
132   %res = select i1 %cond, i64 -1, i64 0
133   ret i64 %res
134 }
135
136 ; Test CC in { 0, 1, 3 }
137 define i64 @f11(float %a, float %b) {
138 ; CHECK-LABEL: f11:
139 ; CHECK: ipm [[REG:%r[0-5]]]
140 ; CHECK-NEXT: xilf [[REG]], 268435456
141 ; CHECK-NEXT: afi [[REG]], -805306368
142 ; CHECK-NEXT: sllg [[REG]], [[REG]], 32
143 ; CHECK-NEXT: srag %r2, [[REG]], 63
144 ; CHECK: br %r14
145   %cond = fcmp ule float %a, %b
146   %res = select i1 %cond, i64 -1, i64 0
147   ret i64 %res
148 }
149
150 ; Test CC in { 2, 3 }
151 define i64 @f12(float %a, float %b) {
152 ; CHECK-LABEL: f12:
153 ; CHECK: ipm [[REG:%r[0-5]]]
154 ; CHECK-NEXT: sllg [[REG]], [[REG]], 34
155 ; CHECK-NEXT: srag %r2, [[REG]], 63
156 ; CHECK: br %r14
157   %cond = fcmp ugt float %a, %b
158   %res = select i1 %cond, i64 -1, i64 0
159   ret i64 %res
160 }
161
162 ; Test CC in { 0, 2, 3 }
163 define i64 @f13(float %a, float %b) {
164 ; CHECK-LABEL: f13:
165 ; CHECK: ipm [[REG:%r[0-5]]]
166 ; CHECK-NEXT: xilf [[REG]], 268435456
167 ; CHECK-NEXT: afi [[REG]], 1879048192
168 ; CHECK-NEXT: sllg [[REG]], [[REG]], 32
169 ; CHECK-NEXT: srag %r2, [[REG]], 63
170 ; CHECK: br %r14
171   %cond = fcmp uge float %a, %b
172   %res = select i1 %cond, i64 -1, i64 0
173   ret i64 %res
174 }
175
176 ; Test CC in { 1, 2, 3 }
177 define i64 @f14(float %a, float %b) {
178 ; CHECK-LABEL: f14:
179 ; CHECK: ipm [[REG:%r[0-5]]]
180 ; CHECK-NEXT: afi [[REG]], 1879048192
181 ; CHECK-NEXT: sllg [[REG]], [[REG]], 32
182 ; CHECK-NEXT: srag %r2, [[REG]], 63
183 ; CHECK: br %r14
184   %cond = fcmp une float %a, %b
185   %res = select i1 %cond, i64 -1, i64 0
186   ret i64 %res
187 }