1 ; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=SI %s
3 declare i32 @llvm.r600.read.tidig.x() #0
5 ; --------------------------------------------------------------------------------
7 ; --------------------------------------------------------------------------------
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
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
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
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
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
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
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
102 ; FIXME: Undo canonicalization to gt (x + 1) since it doesn't use the inline imm
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
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
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
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
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
170 ; --------------------------------------------------------------------------------
172 ; --------------------------------------------------------------------------------
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
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
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
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
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
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
252 ; FIXME: Undo canonicalization to gt (x + 1) since it doesn't use the inline imm
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
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
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
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
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
320 ; --------------------------------------------------------------------------------
322 ; --------------------------------------------------------------------------------
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
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
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
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
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
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
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
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
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
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
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
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
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
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
508 ; --------------------------------------------------------------------------------
510 ; --------------------------------------------------------------------------------
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
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
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
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
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
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
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
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
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
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
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
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
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
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
696 attributes #0 = { nounwind readnone }
697 attributes #1 = { nounwind }