AMDGPU: Add pass to detect used kernel features
[oota-llvm.git] / test / CodeGen / AMDGPU / commute-compares.ll
1 ; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=SI %s
2
3 declare i32 @llvm.r600.read.tidig.x() #0
4
5 ; --------------------------------------------------------------------------------
6 ; i32 compares
7 ; --------------------------------------------------------------------------------
8
9 ; GCN-LABEL: {{^}}commute_eq_64_i32:
10 ; GCN: v_cmp_eq_i32_e32 vcc, 64, v{{[0-9]+}}
11 define void @commute_eq_64_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #1 {
12   %tid = call i32 @llvm.r600.read.tidig.x() #0
13   %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
14   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
15   %val = load i32, i32 addrspace(1)* %gep.in
16   %cmp = icmp eq i32 %val, 64
17   %ext = sext i1 %cmp to i32
18   store i32 %ext, i32 addrspace(1)* %gep.out
19   ret void
20 }
21
22 ; GCN-LABEL: {{^}}commute_ne_64_i32:
23 ; GCN: v_cmp_ne_i32_e32 vcc, 64, v{{[0-9]+}}
24 define void @commute_ne_64_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #1 {
25   %tid = call i32 @llvm.r600.read.tidig.x() #0
26   %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
27   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
28   %val = load i32, i32 addrspace(1)* %gep.in
29   %cmp = icmp ne i32 %val, 64
30   %ext = sext i1 %cmp to i32
31   store i32 %ext, i32 addrspace(1)* %gep.out
32   ret void
33 }
34
35 ; FIXME: Why isn't this being folded as a constant?
36 ; GCN-LABEL: {{^}}commute_ne_litk_i32:
37 ; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 0x3039
38 ; GCN: v_cmp_ne_i32_e32 vcc, [[K]], v{{[0-9]+}}
39 define void @commute_ne_litk_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #1 {
40   %tid = call i32 @llvm.r600.read.tidig.x() #0
41   %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
42   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
43   %val = load i32, i32 addrspace(1)* %gep.in
44   %cmp = icmp ne i32 %val, 12345
45   %ext = sext i1 %cmp to i32
46   store i32 %ext, i32 addrspace(1)* %gep.out
47   ret void
48 }
49
50 ; GCN-LABEL: {{^}}commute_ugt_64_i32:
51 ; GCN: v_cmp_lt_u32_e32 vcc, 64, v{{[0-9]+}}
52 define void @commute_ugt_64_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #1 {
53   %tid = call i32 @llvm.r600.read.tidig.x() #0
54   %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
55   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
56   %val = load i32, i32 addrspace(1)* %gep.in
57   %cmp = icmp ugt i32 %val, 64
58   %ext = sext i1 %cmp to i32
59   store i32 %ext, i32 addrspace(1)* %gep.out
60   ret void
61 }
62
63 ; GCN-LABEL: {{^}}commute_uge_64_i32:
64 ; GCN: v_cmp_lt_u32_e32 vcc, 63, v{{[0-9]+}}
65 define void @commute_uge_64_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #1 {
66   %tid = call i32 @llvm.r600.read.tidig.x() #0
67   %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
68   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
69   %val = load i32, i32 addrspace(1)* %gep.in
70   %cmp = icmp uge i32 %val, 64
71   %ext = sext i1 %cmp to i32
72   store i32 %ext, i32 addrspace(1)* %gep.out
73   ret void
74 }
75
76 ; GCN-LABEL: {{^}}commute_ult_64_i32:
77 ; GCN: v_cmp_gt_u32_e32 vcc, 64, v{{[0-9]+}}
78 define void @commute_ult_64_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #1 {
79   %tid = call i32 @llvm.r600.read.tidig.x() #0
80   %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
81   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
82   %val = load i32, i32 addrspace(1)* %gep.in
83   %cmp = icmp ult i32 %val, 64
84   %ext = sext i1 %cmp to i32
85   store i32 %ext, i32 addrspace(1)* %gep.out
86   ret void
87 }
88
89 ; GCN-LABEL: {{^}}commute_ule_63_i32:
90 ; GCN: v_cmp_gt_u32_e32 vcc, 64, v{{[0-9]+}}
91 define void @commute_ule_63_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #1 {
92   %tid = call i32 @llvm.r600.read.tidig.x() #0
93   %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
94   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
95   %val = load i32, i32 addrspace(1)* %gep.in
96   %cmp = icmp ule i32 %val, 63
97   %ext = sext i1 %cmp to i32
98   store i32 %ext, i32 addrspace(1)* %gep.out
99   ret void
100 }
101
102 ; FIXME: Undo canonicalization to gt (x + 1) since it doesn't use the inline imm
103
104 ; GCN-LABEL: {{^}}commute_ule_64_i32:
105 ; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 0x41{{$}}
106 ; GCN: v_cmp_gt_u32_e32 vcc, [[K]], v{{[0-9]+}}
107 define void @commute_ule_64_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #1 {
108   %tid = call i32 @llvm.r600.read.tidig.x() #0
109   %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
110   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
111   %val = load i32, i32 addrspace(1)* %gep.in
112   %cmp = icmp ule i32 %val, 64
113   %ext = sext i1 %cmp to i32
114   store i32 %ext, i32 addrspace(1)* %gep.out
115   ret void
116 }
117
118 ; GCN-LABEL: {{^}}commute_sgt_neg1_i32:
119 ; GCN: v_cmp_lt_i32_e32 vcc, -1, v{{[0-9]+}}
120 define void @commute_sgt_neg1_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #1 {
121   %tid = call i32 @llvm.r600.read.tidig.x() #0
122   %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
123   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
124   %val = load i32, i32 addrspace(1)* %gep.in
125   %cmp = icmp sgt i32 %val, -1
126   %ext = sext i1 %cmp to i32
127   store i32 %ext, i32 addrspace(1)* %gep.out
128   ret void
129 }
130
131 ; GCN-LABEL: {{^}}commute_sge_neg2_i32:
132 ; GCN: v_cmp_lt_i32_e32 vcc, -3, v{{[0-9]+}}
133 define void @commute_sge_neg2_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #1 {
134   %tid = call i32 @llvm.r600.read.tidig.x() #0
135   %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
136   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
137   %val = load i32, i32 addrspace(1)* %gep.in
138   %cmp = icmp sge i32 %val, -2
139   %ext = sext i1 %cmp to i32
140   store i32 %ext, i32 addrspace(1)* %gep.out
141   ret void
142 }
143
144 ; GCN-LABEL: {{^}}commute_slt_neg16_i32:
145 ; GCN: v_cmp_gt_i32_e32 vcc, -16, v{{[0-9]+}}
146 define void @commute_slt_neg16_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #1 {
147   %tid = call i32 @llvm.r600.read.tidig.x() #0
148   %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
149   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
150   %val = load i32, i32 addrspace(1)* %gep.in
151   %cmp = icmp slt i32 %val, -16
152   %ext = sext i1 %cmp to i32
153   store i32 %ext, i32 addrspace(1)* %gep.out
154   ret void
155 }
156
157 ; GCN-LABEL: {{^}}commute_sle_5_i32:
158 ; GCN: v_cmp_gt_i32_e32 vcc, 6, v{{[0-9]+}}
159 define void @commute_sle_5_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #1 {
160   %tid = call i32 @llvm.r600.read.tidig.x() #0
161   %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
162   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
163   %val = load i32, i32 addrspace(1)* %gep.in
164   %cmp = icmp sle i32 %val, 5
165   %ext = sext i1 %cmp to i32
166   store i32 %ext, i32 addrspace(1)* %gep.out
167   ret void
168 }
169
170 ; --------------------------------------------------------------------------------
171 ; i64 compares
172 ; --------------------------------------------------------------------------------
173
174 ; GCN-LABEL: {{^}}commute_eq_64_i64:
175 ; GCN: v_cmp_eq_i64_e32 vcc, 64, v{{\[[0-9]+:[0-9]+\]}}
176 define void @commute_eq_64_i64(i32 addrspace(1)* %out, i64 addrspace(1)* %in) #1 {
177   %tid = call i32 @llvm.r600.read.tidig.x() #0
178   %gep.in = getelementptr i64, i64 addrspace(1)* %in, i32 %tid
179   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
180   %val = load i64, i64 addrspace(1)* %gep.in
181   %cmp = icmp eq i64 %val, 64
182   %ext = sext i1 %cmp to i32
183   store i32 %ext, i32 addrspace(1)* %gep.out
184   ret void
185 }
186
187 ; GCN-LABEL: {{^}}commute_ne_64_i64:
188 ; GCN: v_cmp_ne_i64_e32 vcc, 64, v{{\[[0-9]+:[0-9]+\]}}
189 define void @commute_ne_64_i64(i32 addrspace(1)* %out, i64 addrspace(1)* %in) #1 {
190   %tid = call i32 @llvm.r600.read.tidig.x() #0
191   %gep.in = getelementptr i64, i64 addrspace(1)* %in, i32 %tid
192   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
193   %val = load i64, i64 addrspace(1)* %gep.in
194   %cmp = icmp ne i64 %val, 64
195   %ext = sext i1 %cmp to i32
196   store i32 %ext, i32 addrspace(1)* %gep.out
197   ret void
198 }
199
200 ; GCN-LABEL: {{^}}commute_ugt_64_i64:
201 ; GCN: v_cmp_lt_u64_e32 vcc, 64, v{{\[[0-9]+:[0-9]+\]}}
202 define void @commute_ugt_64_i64(i32 addrspace(1)* %out, i64 addrspace(1)* %in) #1 {
203   %tid = call i32 @llvm.r600.read.tidig.x() #0
204   %gep.in = getelementptr i64, i64 addrspace(1)* %in, i32 %tid
205   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
206   %val = load i64, i64 addrspace(1)* %gep.in
207   %cmp = icmp ugt i64 %val, 64
208   %ext = sext i1 %cmp to i32
209   store i32 %ext, i32 addrspace(1)* %gep.out
210   ret void
211 }
212
213 ; GCN-LABEL: {{^}}commute_uge_64_i64:
214 ; GCN: v_cmp_lt_u64_e32 vcc, 63, v{{\[[0-9]+:[0-9]+\]}}
215 define void @commute_uge_64_i64(i32 addrspace(1)* %out, i64 addrspace(1)* %in) #1 {
216   %tid = call i32 @llvm.r600.read.tidig.x() #0
217   %gep.in = getelementptr i64, i64 addrspace(1)* %in, i32 %tid
218   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
219   %val = load i64, i64 addrspace(1)* %gep.in
220   %cmp = icmp uge i64 %val, 64
221   %ext = sext i1 %cmp to i32
222   store i32 %ext, i32 addrspace(1)* %gep.out
223   ret void
224 }
225
226 ; GCN-LABEL: {{^}}commute_ult_64_i64:
227 ; GCN: v_cmp_gt_u64_e32 vcc, 64, v{{\[[0-9]+:[0-9]+\]}}
228 define void @commute_ult_64_i64(i32 addrspace(1)* %out, i64 addrspace(1)* %in) #1 {
229   %tid = call i32 @llvm.r600.read.tidig.x() #0
230   %gep.in = getelementptr i64, i64 addrspace(1)* %in, i32 %tid
231   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
232   %val = load i64, i64 addrspace(1)* %gep.in
233   %cmp = icmp ult i64 %val, 64
234   %ext = sext i1 %cmp to i32
235   store i32 %ext, i32 addrspace(1)* %gep.out
236   ret void
237 }
238
239 ; GCN-LABEL: {{^}}commute_ule_63_i64:
240 ; GCN: v_cmp_gt_u64_e32 vcc, 64, v{{\[[0-9]+:[0-9]+\]}}
241 define void @commute_ule_63_i64(i32 addrspace(1)* %out, i64 addrspace(1)* %in) #1 {
242   %tid = call i32 @llvm.r600.read.tidig.x() #0
243   %gep.in = getelementptr i64, i64 addrspace(1)* %in, i32 %tid
244   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
245   %val = load i64, i64 addrspace(1)* %gep.in
246   %cmp = icmp ule i64 %val, 63
247   %ext = sext i1 %cmp to i32
248   store i32 %ext, i32 addrspace(1)* %gep.out
249   ret void
250 }
251
252 ; FIXME: Undo canonicalization to gt (x + 1) since it doesn't use the inline imm
253
254 ; GCN-LABEL: {{^}}commute_ule_64_i64:
255 ; GCN-DAG: s_movk_i32 s[[KLO:[0-9]+]], 0x41{{$}}
256 ; GCN: v_cmp_gt_u64_e32 vcc, s{{\[}}[[KLO]]:{{[0-9]+\]}}, v{{\[[0-9]+:[0-9]+\]}}
257 define void @commute_ule_64_i64(i32 addrspace(1)* %out, i64 addrspace(1)* %in) #1 {
258   %tid = call i32 @llvm.r600.read.tidig.x() #0
259   %gep.in = getelementptr i64, i64 addrspace(1)* %in, i32 %tid
260   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
261   %val = load i64, i64 addrspace(1)* %gep.in
262   %cmp = icmp ule i64 %val, 64
263   %ext = sext i1 %cmp to i32
264   store i32 %ext, i32 addrspace(1)* %gep.out
265   ret void
266 }
267
268 ; GCN-LABEL: {{^}}commute_sgt_neg1_i64:
269 ; GCN: v_cmp_lt_i64_e32 vcc, -1, v{{\[[0-9]+:[0-9]+\]}}
270 define void @commute_sgt_neg1_i64(i32 addrspace(1)* %out, i64 addrspace(1)* %in) #1 {
271   %tid = call i32 @llvm.r600.read.tidig.x() #0
272   %gep.in = getelementptr i64, i64 addrspace(1)* %in, i32 %tid
273   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
274   %val = load i64, i64 addrspace(1)* %gep.in
275   %cmp = icmp sgt i64 %val, -1
276   %ext = sext i1 %cmp to i32
277   store i32 %ext, i32 addrspace(1)* %gep.out
278   ret void
279 }
280
281 ; GCN-LABEL: {{^}}commute_sge_neg2_i64:
282 ; GCN: v_cmp_lt_i64_e32 vcc, -3, v{{\[[0-9]+:[0-9]+\]}}
283 define void @commute_sge_neg2_i64(i32 addrspace(1)* %out, i64 addrspace(1)* %in) #1 {
284   %tid = call i32 @llvm.r600.read.tidig.x() #0
285   %gep.in = getelementptr i64, i64 addrspace(1)* %in, i32 %tid
286   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
287   %val = load i64, i64 addrspace(1)* %gep.in
288   %cmp = icmp sge i64 %val, -2
289   %ext = sext i1 %cmp to i32
290   store i32 %ext, i32 addrspace(1)* %gep.out
291   ret void
292 }
293
294 ; GCN-LABEL: {{^}}commute_slt_neg16_i64:
295 ; GCN: v_cmp_gt_i64_e32 vcc, -16, v{{\[[0-9]+:[0-9]+\]}}
296 define void @commute_slt_neg16_i64(i32 addrspace(1)* %out, i64 addrspace(1)* %in) #1 {
297   %tid = call i32 @llvm.r600.read.tidig.x() #0
298   %gep.in = getelementptr i64, i64 addrspace(1)* %in, i32 %tid
299   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
300   %val = load i64, i64 addrspace(1)* %gep.in
301   %cmp = icmp slt i64 %val, -16
302   %ext = sext i1 %cmp to i32
303   store i32 %ext, i32 addrspace(1)* %gep.out
304   ret void
305 }
306
307 ; GCN-LABEL: {{^}}commute_sle_5_i64:
308 ; GCN: v_cmp_gt_i64_e32 vcc, 6, v{{\[[0-9]+:[0-9]+\]}}
309 define void @commute_sle_5_i64(i32 addrspace(1)* %out, i64 addrspace(1)* %in) #1 {
310   %tid = call i32 @llvm.r600.read.tidig.x() #0
311   %gep.in = getelementptr i64, i64 addrspace(1)* %in, i32 %tid
312   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
313   %val = load i64, i64 addrspace(1)* %gep.in
314   %cmp = icmp sle i64 %val, 5
315   %ext = sext i1 %cmp to i32
316   store i32 %ext, i32 addrspace(1)* %gep.out
317   ret void
318 }
319
320 ; --------------------------------------------------------------------------------
321 ; f32 compares
322 ; --------------------------------------------------------------------------------
323
324
325 ; GCN-LABEL: {{^}}commute_oeq_2.0_f32:
326 ; GCN: v_cmp_eq_f32_e32 vcc, 2.0, v{{[0-9]+}}
327 define void @commute_oeq_2.0_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #1 {
328   %tid = call i32 @llvm.r600.read.tidig.x() #0
329   %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
330   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
331   %val = load float, float addrspace(1)* %gep.in
332   %cmp = fcmp oeq float %val, 2.0
333   %ext = sext i1 %cmp to i32
334   store i32 %ext, i32 addrspace(1)* %gep.out
335   ret void
336 }
337
338
339 ; GCN-LABEL: {{^}}commute_ogt_2.0_f32:
340 ; GCN: v_cmp_lt_f32_e32 vcc, 2.0, v{{[0-9]+}}
341 define void @commute_ogt_2.0_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #1 {
342   %tid = call i32 @llvm.r600.read.tidig.x() #0
343   %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
344   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
345   %val = load float, float addrspace(1)* %gep.in
346   %cmp = fcmp ogt float %val, 2.0
347   %ext = sext i1 %cmp to i32
348   store i32 %ext, i32 addrspace(1)* %gep.out
349   ret void
350 }
351
352 ; GCN-LABEL: {{^}}commute_oge_2.0_f32:
353 ; GCN: v_cmp_le_f32_e32 vcc, 2.0, v{{[0-9]+}}
354 define void @commute_oge_2.0_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #1 {
355   %tid = call i32 @llvm.r600.read.tidig.x() #0
356   %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
357   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
358   %val = load float, float addrspace(1)* %gep.in
359   %cmp = fcmp oge float %val, 2.0
360   %ext = sext i1 %cmp to i32
361   store i32 %ext, i32 addrspace(1)* %gep.out
362   ret void
363 }
364
365 ; GCN-LABEL: {{^}}commute_olt_2.0_f32:
366 ; GCN: v_cmp_gt_f32_e32 vcc, 2.0, v{{[0-9]+}}
367 define void @commute_olt_2.0_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #1 {
368   %tid = call i32 @llvm.r600.read.tidig.x() #0
369   %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
370   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
371   %val = load float, float addrspace(1)* %gep.in
372   %cmp = fcmp olt float %val, 2.0
373   %ext = sext i1 %cmp to i32
374   store i32 %ext, i32 addrspace(1)* %gep.out
375   ret void
376 }
377
378 ; GCN-LABEL: {{^}}commute_ole_2.0_f32:
379 ; GCN: v_cmp_ge_f32_e32 vcc, 2.0, v{{[0-9]+}}
380 define void @commute_ole_2.0_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #1 {
381   %tid = call i32 @llvm.r600.read.tidig.x() #0
382   %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
383   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
384   %val = load float, float addrspace(1)* %gep.in
385   %cmp = fcmp ole float %val, 2.0
386   %ext = sext i1 %cmp to i32
387   store i32 %ext, i32 addrspace(1)* %gep.out
388   ret void
389 }
390
391 ; GCN-LABEL: {{^}}commute_one_2.0_f32:
392 ; GCN: v_cmp_lg_f32_e32 vcc, 2.0, v{{[0-9]+}}
393 define void @commute_one_2.0_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #1 {
394   %tid = call i32 @llvm.r600.read.tidig.x() #0
395   %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
396   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
397   %val = load float, float addrspace(1)* %gep.in
398   %cmp = fcmp one float %val, 2.0
399   %ext = sext i1 %cmp to i32
400   store i32 %ext, i32 addrspace(1)* %gep.out
401   ret void
402 }
403
404 ; GCN-LABEL: {{^}}commute_ord_2.0_f32:
405 ; GCN: v_cmp_o_f32_e32 vcc, [[REG:v[0-9]+]], [[REG]]
406 define void @commute_ord_2.0_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #1 {
407   %tid = call i32 @llvm.r600.read.tidig.x() #0
408   %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
409   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
410   %val = load float, float addrspace(1)* %gep.in
411   %cmp = fcmp ord float %val, 2.0
412   %ext = sext i1 %cmp to i32
413   store i32 %ext, i32 addrspace(1)* %gep.out
414   ret void
415 }
416
417 ; GCN-LABEL: {{^}}commute_ueq_2.0_f32:
418 ; GCN: v_cmp_nlg_f32_e32 vcc, 2.0, v{{[0-9]+}}
419 define void @commute_ueq_2.0_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #1 {
420   %tid = call i32 @llvm.r600.read.tidig.x() #0
421   %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
422   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
423   %val = load float, float addrspace(1)* %gep.in
424   %cmp = fcmp ueq float %val, 2.0
425   %ext = sext i1 %cmp to i32
426   store i32 %ext, i32 addrspace(1)* %gep.out
427   ret void
428 }
429
430 ; GCN-LABEL: {{^}}commute_ugt_2.0_f32:
431 ; GCN: v_cmp_nge_f32_e32 vcc, 2.0, v{{[0-9]+}}
432 define void @commute_ugt_2.0_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #1 {
433   %tid = call i32 @llvm.r600.read.tidig.x() #0
434   %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
435   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
436   %val = load float, float addrspace(1)* %gep.in
437   %cmp = fcmp ugt float %val, 2.0
438   %ext = sext i1 %cmp to i32
439   store i32 %ext, i32 addrspace(1)* %gep.out
440   ret void
441 }
442
443 ; GCN-LABEL: {{^}}commute_uge_2.0_f32:
444 ; GCN: v_cmp_ngt_f32_e32 vcc, 2.0, v{{[0-9]+}}
445 define void @commute_uge_2.0_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #1 {
446   %tid = call i32 @llvm.r600.read.tidig.x() #0
447   %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
448   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
449   %val = load float, float addrspace(1)* %gep.in
450   %cmp = fcmp uge float %val, 2.0
451   %ext = sext i1 %cmp to i32
452   store i32 %ext, i32 addrspace(1)* %gep.out
453   ret void
454 }
455
456 ; GCN-LABEL: {{^}}commute_ult_2.0_f32:
457 ; GCN: v_cmp_nle_f32_e32 vcc, 2.0, v{{[0-9]+}}
458 define void @commute_ult_2.0_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #1 {
459   %tid = call i32 @llvm.r600.read.tidig.x() #0
460   %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
461   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
462   %val = load float, float addrspace(1)* %gep.in
463   %cmp = fcmp ult float %val, 2.0
464   %ext = sext i1 %cmp to i32
465   store i32 %ext, i32 addrspace(1)* %gep.out
466   ret void
467 }
468
469 ; GCN-LABEL: {{^}}commute_ule_2.0_f32:
470 ; GCN: v_cmp_nlt_f32_e32 vcc, 2.0, v{{[0-9]+}}
471 define void @commute_ule_2.0_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #1 {
472   %tid = call i32 @llvm.r600.read.tidig.x() #0
473   %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
474   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
475   %val = load float, float addrspace(1)* %gep.in
476   %cmp = fcmp ule float %val, 2.0
477   %ext = sext i1 %cmp to i32
478   store i32 %ext, i32 addrspace(1)* %gep.out
479   ret void
480 }
481
482 ; GCN-LABEL: {{^}}commute_une_2.0_f32:
483 ; GCN: v_cmp_neq_f32_e32 vcc, 2.0, v{{[0-9]+}}
484 define void @commute_une_2.0_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #1 {
485   %tid = call i32 @llvm.r600.read.tidig.x() #0
486   %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
487   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
488   %val = load float, float addrspace(1)* %gep.in
489   %cmp = fcmp une float %val, 2.0
490   %ext = sext i1 %cmp to i32
491   store i32 %ext, i32 addrspace(1)* %gep.out
492   ret void
493 }
494
495 ; GCN-LABEL: {{^}}commute_uno_2.0_f32:
496 ; GCN: v_cmp_u_f32_e32 vcc, [[REG:v[0-9]+]], [[REG]]
497 define void @commute_uno_2.0_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #1 {
498   %tid = call i32 @llvm.r600.read.tidig.x() #0
499   %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
500   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
501   %val = load float, float addrspace(1)* %gep.in
502   %cmp = fcmp uno float %val, 2.0
503   %ext = sext i1 %cmp to i32
504   store i32 %ext, i32 addrspace(1)* %gep.out
505   ret void
506 }
507
508 ; --------------------------------------------------------------------------------
509 ; f64 compares
510 ; --------------------------------------------------------------------------------
511
512
513 ; GCN-LABEL: {{^}}commute_oeq_2.0_f64:
514 ; GCN: v_cmp_eq_f64_e32 vcc, 2.0, v{{\[[0-9]+:[0-9]+\]}}
515 define void @commute_oeq_2.0_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #1 {
516   %tid = call i32 @llvm.r600.read.tidig.x() #0
517   %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid
518   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
519   %val = load double, double addrspace(1)* %gep.in
520   %cmp = fcmp oeq double %val, 2.0
521   %ext = sext i1 %cmp to i32
522   store i32 %ext, i32 addrspace(1)* %gep.out
523   ret void
524 }
525
526
527 ; GCN-LABEL: {{^}}commute_ogt_2.0_f64:
528 ; GCN: v_cmp_lt_f64_e32 vcc, 2.0, v{{\[[0-9]+:[0-9]+\]}}
529 define void @commute_ogt_2.0_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #1 {
530   %tid = call i32 @llvm.r600.read.tidig.x() #0
531   %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid
532   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
533   %val = load double, double addrspace(1)* %gep.in
534   %cmp = fcmp ogt double %val, 2.0
535   %ext = sext i1 %cmp to i32
536   store i32 %ext, i32 addrspace(1)* %gep.out
537   ret void
538 }
539
540 ; GCN-LABEL: {{^}}commute_oge_2.0_f64:
541 ; GCN: v_cmp_le_f64_e32 vcc, 2.0, v{{\[[0-9]+:[0-9]+\]}}
542 define void @commute_oge_2.0_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #1 {
543   %tid = call i32 @llvm.r600.read.tidig.x() #0
544   %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid
545   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
546   %val = load double, double addrspace(1)* %gep.in
547   %cmp = fcmp oge double %val, 2.0
548   %ext = sext i1 %cmp to i32
549   store i32 %ext, i32 addrspace(1)* %gep.out
550   ret void
551 }
552
553 ; GCN-LABEL: {{^}}commute_olt_2.0_f64:
554 ; GCN: v_cmp_gt_f64_e32 vcc, 2.0, v{{\[[0-9]+:[0-9]+\]}}
555 define void @commute_olt_2.0_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #1 {
556   %tid = call i32 @llvm.r600.read.tidig.x() #0
557   %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid
558   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
559   %val = load double, double addrspace(1)* %gep.in
560   %cmp = fcmp olt double %val, 2.0
561   %ext = sext i1 %cmp to i32
562   store i32 %ext, i32 addrspace(1)* %gep.out
563   ret void
564 }
565
566 ; GCN-LABEL: {{^}}commute_ole_2.0_f64:
567 ; GCN: v_cmp_ge_f64_e32 vcc, 2.0, v{{\[[0-9]+:[0-9]+\]}}
568 define void @commute_ole_2.0_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #1 {
569   %tid = call i32 @llvm.r600.read.tidig.x() #0
570   %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid
571   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
572   %val = load double, double addrspace(1)* %gep.in
573   %cmp = fcmp ole double %val, 2.0
574   %ext = sext i1 %cmp to i32
575   store i32 %ext, i32 addrspace(1)* %gep.out
576   ret void
577 }
578
579 ; GCN-LABEL: {{^}}commute_one_2.0_f64:
580 ; GCN: v_cmp_lg_f64_e32 vcc, 2.0, v{{\[[0-9]+:[0-9]+\]}}
581 define void @commute_one_2.0_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #1 {
582   %tid = call i32 @llvm.r600.read.tidig.x() #0
583   %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid
584   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
585   %val = load double, double addrspace(1)* %gep.in
586   %cmp = fcmp one double %val, 2.0
587   %ext = sext i1 %cmp to i32
588   store i32 %ext, i32 addrspace(1)* %gep.out
589   ret void
590 }
591
592 ; GCN-LABEL: {{^}}commute_ord_2.0_f64:
593 ; GCN: v_cmp_o_f64_e32 vcc, [[REG:v\[[0-9]+:[0-9]+\]]], [[REG]]
594 define void @commute_ord_2.0_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #1 {
595   %tid = call i32 @llvm.r600.read.tidig.x() #0
596   %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid
597   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
598   %val = load double, double addrspace(1)* %gep.in
599   %cmp = fcmp ord double %val, 2.0
600   %ext = sext i1 %cmp to i32
601   store i32 %ext, i32 addrspace(1)* %gep.out
602   ret void
603 }
604
605 ; GCN-LABEL: {{^}}commute_ueq_2.0_f64:
606 ; GCN: v_cmp_nlg_f64_e32 vcc, 2.0, v{{\[[0-9]+:[0-9]+\]}}
607 define void @commute_ueq_2.0_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #1 {
608   %tid = call i32 @llvm.r600.read.tidig.x() #0
609   %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid
610   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
611   %val = load double, double addrspace(1)* %gep.in
612   %cmp = fcmp ueq double %val, 2.0
613   %ext = sext i1 %cmp to i32
614   store i32 %ext, i32 addrspace(1)* %gep.out
615   ret void
616 }
617
618 ; GCN-LABEL: {{^}}commute_ugt_2.0_f64:
619 ; GCN: v_cmp_nge_f64_e32 vcc, 2.0, v{{\[[0-9]+:[0-9]+\]}}
620 define void @commute_ugt_2.0_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #1 {
621   %tid = call i32 @llvm.r600.read.tidig.x() #0
622   %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid
623   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
624   %val = load double, double addrspace(1)* %gep.in
625   %cmp = fcmp ugt double %val, 2.0
626   %ext = sext i1 %cmp to i32
627   store i32 %ext, i32 addrspace(1)* %gep.out
628   ret void
629 }
630
631 ; GCN-LABEL: {{^}}commute_uge_2.0_f64:
632 ; GCN: v_cmp_ngt_f64_e32 vcc, 2.0, v{{\[[0-9]+:[0-9]+\]}}
633 define void @commute_uge_2.0_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #1 {
634   %tid = call i32 @llvm.r600.read.tidig.x() #0
635   %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid
636   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
637   %val = load double, double addrspace(1)* %gep.in
638   %cmp = fcmp uge double %val, 2.0
639   %ext = sext i1 %cmp to i32
640   store i32 %ext, i32 addrspace(1)* %gep.out
641   ret void
642 }
643
644 ; GCN-LABEL: {{^}}commute_ult_2.0_f64:
645 ; GCN: v_cmp_nle_f64_e32 vcc, 2.0, v{{\[[0-9]+:[0-9]+\]}}
646 define void @commute_ult_2.0_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #1 {
647   %tid = call i32 @llvm.r600.read.tidig.x() #0
648   %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid
649   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
650   %val = load double, double addrspace(1)* %gep.in
651   %cmp = fcmp ult double %val, 2.0
652   %ext = sext i1 %cmp to i32
653   store i32 %ext, i32 addrspace(1)* %gep.out
654   ret void
655 }
656
657 ; GCN-LABEL: {{^}}commute_ule_2.0_f64:
658 ; GCN: v_cmp_nlt_f64_e32 vcc, 2.0, v{{\[[0-9]+:[0-9]+\]}}
659 define void @commute_ule_2.0_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #1 {
660   %tid = call i32 @llvm.r600.read.tidig.x() #0
661   %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid
662   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
663   %val = load double, double addrspace(1)* %gep.in
664   %cmp = fcmp ule double %val, 2.0
665   %ext = sext i1 %cmp to i32
666   store i32 %ext, i32 addrspace(1)* %gep.out
667   ret void
668 }
669
670 ; GCN-LABEL: {{^}}commute_une_2.0_f64:
671 ; GCN: v_cmp_neq_f64_e32 vcc, 2.0, v{{\[[0-9]+:[0-9]+\]}}
672 define void @commute_une_2.0_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #1 {
673   %tid = call i32 @llvm.r600.read.tidig.x() #0
674   %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid
675   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
676   %val = load double, double addrspace(1)* %gep.in
677   %cmp = fcmp une double %val, 2.0
678   %ext = sext i1 %cmp to i32
679   store i32 %ext, i32 addrspace(1)* %gep.out
680   ret void
681 }
682
683 ; GCN-LABEL: {{^}}commute_uno_2.0_f64:
684 ; GCN: v_cmp_u_f64_e32 vcc, [[REG:v\[[0-9]+:[0-9]+\]]], [[REG]]
685 define void @commute_uno_2.0_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #1 {
686   %tid = call i32 @llvm.r600.read.tidig.x() #0
687   %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid
688   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
689   %val = load double, double addrspace(1)* %gep.in
690   %cmp = fcmp uno double %val, 2.0
691   %ext = sext i1 %cmp to i32
692   store i32 %ext, i32 addrspace(1)* %gep.out
693   ret void
694 }
695
696 attributes #0 = { nounwind readnone }
697 attributes #1 = { nounwind }