blob: d2842d440cb6df13d54be6c50326ad7942631058 [file] [log] [blame]
Matt Arsenault8596f712014-11-28 22:51:38 +00001; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck -check-prefix=R600 -check-prefix=FUNC %s
2; RUN: llc -march=r600 -mcpu=SI -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
3
4declare i32 @llvm.r600.read.tidig.x() nounwind readnone
Tom Stellard75aadc22012-12-11 21:25:42 +00005
Tom Stellard79243d92014-10-01 17:15:17 +00006; FUNC-LABEL: {{^}}setcc_v2i32:
Tom Stellardc0845332013-11-22 23:07:58 +00007; R600-DAG: SETE_INT * T{{[0-9]+\.[XYZW]}}, KC0[3].X, KC0[3].Z
8; R600-DAG: SETE_INT * T{{[0-9]+\.[XYZW]}}, KC0[2].W, KC0[3].Y
Aaron Watry91d28862013-06-25 13:55:49 +00009
Tom Stellard0344cdf2013-08-01 15:23:42 +000010define void @setcc_v2i32(<2 x i32> addrspace(1)* %out, <2 x i32> %a, <2 x i32> %b) {
Aaron Watry91d28862013-06-25 13:55:49 +000011 %result = icmp eq <2 x i32> %a, %b
12 %sext = sext <2 x i1> %result to <2 x i32>
13 store <2 x i32> %sext, <2 x i32> addrspace(1)* %out
14 ret void
15}
16
Tom Stellard79243d92014-10-01 17:15:17 +000017; FUNC-LABEL: {{^}}setcc_v4i32:
Tom Stellardc0845332013-11-22 23:07:58 +000018; R600-DAG: SETE_INT * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
19; R600-DAG: SETE_INT * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
20; R600-DAG: SETE_INT * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
21; R600-DAG: SETE_INT * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
Aaron Watry91d28862013-06-25 13:55:49 +000022
Tom Stellard0344cdf2013-08-01 15:23:42 +000023define void @setcc_v4i32(<4 x i32> addrspace(1)* %out, <4 x i32> addrspace(1)* %in) {
Tom Stellard75aadc22012-12-11 21:25:42 +000024 %b_ptr = getelementptr <4 x i32> addrspace(1)* %in, i32 1
25 %a = load <4 x i32> addrspace(1) * %in
26 %b = load <4 x i32> addrspace(1) * %b_ptr
27 %result = icmp eq <4 x i32> %a, %b
28 %sext = sext <4 x i1> %result to <4 x i32>
29 store <4 x i32> %sext, <4 x i32> addrspace(1)* %out
30 ret void
31}
Tom Stellardc0845332013-11-22 23:07:58 +000032
33;;;==========================================================================;;;
34;; Float comparisons
35;;;==========================================================================;;;
36
Tom Stellard79243d92014-10-01 17:15:17 +000037; FUNC-LABEL: {{^}}f32_oeq:
Tom Stellardc0845332013-11-22 23:07:58 +000038; R600: SETE_DX10
Tom Stellard326d6ec2014-11-05 14:50:53 +000039; SI: v_cmp_eq_f32
Tom Stellardc0845332013-11-22 23:07:58 +000040define void @f32_oeq(i32 addrspace(1)* %out, float %a, float %b) {
41entry:
42 %0 = fcmp oeq float %a, %b
43 %1 = sext i1 %0 to i32
44 store i32 %1, i32 addrspace(1)* %out
45 ret void
46}
47
Tom Stellard79243d92014-10-01 17:15:17 +000048; FUNC-LABEL: {{^}}f32_ogt:
Tom Stellardc0845332013-11-22 23:07:58 +000049; R600: SETGT_DX10
Tom Stellard326d6ec2014-11-05 14:50:53 +000050; SI: v_cmp_gt_f32
Tom Stellardc0845332013-11-22 23:07:58 +000051define void @f32_ogt(i32 addrspace(1)* %out, float %a, float %b) {
52entry:
53 %0 = fcmp ogt float %a, %b
54 %1 = sext i1 %0 to i32
55 store i32 %1, i32 addrspace(1)* %out
56 ret void
57}
58
Tom Stellard79243d92014-10-01 17:15:17 +000059; FUNC-LABEL: {{^}}f32_oge:
Tom Stellardc0845332013-11-22 23:07:58 +000060; R600: SETGE_DX10
Tom Stellard326d6ec2014-11-05 14:50:53 +000061; SI: v_cmp_ge_f32
Tom Stellardc0845332013-11-22 23:07:58 +000062define void @f32_oge(i32 addrspace(1)* %out, float %a, float %b) {
63entry:
64 %0 = fcmp oge float %a, %b
65 %1 = sext i1 %0 to i32
66 store i32 %1, i32 addrspace(1)* %out
67 ret void
68}
69
Tom Stellard79243d92014-10-01 17:15:17 +000070; FUNC-LABEL: {{^}}f32_olt:
Tom Stellardc0845332013-11-22 23:07:58 +000071; R600: SETGT_DX10
Tom Stellard326d6ec2014-11-05 14:50:53 +000072; SI: v_cmp_lt_f32
Tom Stellardc0845332013-11-22 23:07:58 +000073define void @f32_olt(i32 addrspace(1)* %out, float %a, float %b) {
74entry:
75 %0 = fcmp olt float %a, %b
76 %1 = sext i1 %0 to i32
77 store i32 %1, i32 addrspace(1)* %out
78 ret void
79}
80
Tom Stellard79243d92014-10-01 17:15:17 +000081; FUNC-LABEL: {{^}}f32_ole:
Tom Stellardc0845332013-11-22 23:07:58 +000082; R600: SETGE_DX10
Tom Stellard326d6ec2014-11-05 14:50:53 +000083; SI: v_cmp_le_f32
Tom Stellardc0845332013-11-22 23:07:58 +000084define void @f32_ole(i32 addrspace(1)* %out, float %a, float %b) {
85entry:
86 %0 = fcmp ole float %a, %b
87 %1 = sext i1 %0 to i32
88 store i32 %1, i32 addrspace(1)* %out
89 ret void
90}
91
Tom Stellard79243d92014-10-01 17:15:17 +000092; FUNC-LABEL: {{^}}f32_one:
Tom Stellardc0845332013-11-22 23:07:58 +000093; R600-DAG: SETE_DX10
94; R600-DAG: SETE_DX10
95; R600-DAG: AND_INT
96; R600-DAG: SETNE_DX10
97; R600-DAG: AND_INT
98; R600-DAG: SETNE_INT
Matt Arsenaultbecd6562014-12-03 05:22:35 +000099
Matt Arsenault9cded7a2014-12-11 22:15:35 +0000100; SI: v_cmp_lg_f32_e32 vcc
101; SI-NEXT: v_cndmask_b32_e64 {{v[0-9]+}}, 0, -1, vcc
Tom Stellardc0845332013-11-22 23:07:58 +0000102define void @f32_one(i32 addrspace(1)* %out, float %a, float %b) {
103entry:
104 %0 = fcmp one float %a, %b
105 %1 = sext i1 %0 to i32
106 store i32 %1, i32 addrspace(1)* %out
107 ret void
108}
109
Tom Stellard79243d92014-10-01 17:15:17 +0000110; FUNC-LABEL: {{^}}f32_ord:
Tom Stellardc0845332013-11-22 23:07:58 +0000111; R600-DAG: SETE_DX10
112; R600-DAG: SETE_DX10
113; R600-DAG: AND_INT
114; R600-DAG: SETNE_INT
Tom Stellard326d6ec2014-11-05 14:50:53 +0000115; SI: v_cmp_o_f32
Tom Stellardc0845332013-11-22 23:07:58 +0000116define void @f32_ord(i32 addrspace(1)* %out, float %a, float %b) {
117entry:
118 %0 = fcmp ord float %a, %b
119 %1 = sext i1 %0 to i32
120 store i32 %1, i32 addrspace(1)* %out
121 ret void
122}
123
Tom Stellard79243d92014-10-01 17:15:17 +0000124; FUNC-LABEL: {{^}}f32_ueq:
Tom Stellardc0845332013-11-22 23:07:58 +0000125; R600-DAG: SETNE_DX10
126; R600-DAG: SETNE_DX10
127; R600-DAG: OR_INT
128; R600-DAG: SETE_DX10
129; R600-DAG: OR_INT
130; R600-DAG: SETNE_INT
Matt Arsenaultbecd6562014-12-03 05:22:35 +0000131
132; SI-DAG: v_cmp_u_f32_e32 vcc
133; SI-DAG: v_cmp_eq_f32_e64 [[CMP1:s\[[0-9]+:[0-9]+\]]]
134; SI: s_or_b64 [[OR:s\[[0-9]+:[0-9]+\]]], [[CMP1]], vcc
135; SI: v_cndmask_b32_e64 [[VRESULT:v[0-9]+]], 0, -1, [[OR]]
136; SI: buffer_store_dword [[VRESULT]]
Tom Stellardc0845332013-11-22 23:07:58 +0000137define void @f32_ueq(i32 addrspace(1)* %out, float %a, float %b) {
138entry:
139 %0 = fcmp ueq float %a, %b
140 %1 = sext i1 %0 to i32
141 store i32 %1, i32 addrspace(1)* %out
142 ret void
143}
144
Tom Stellard79243d92014-10-01 17:15:17 +0000145; FUNC-LABEL: {{^}}f32_ugt:
Tom Stellardc0845332013-11-22 23:07:58 +0000146; R600: SETGE
147; R600: SETE_DX10
Tom Stellard326d6ec2014-11-05 14:50:53 +0000148; SI: v_cmp_u_f32
149; SI: v_cmp_gt_f32
Matt Arsenaultbecd6562014-12-03 05:22:35 +0000150; SI: s_or_b64
151; SI: v_cndmask_b32
Tom Stellardc0845332013-11-22 23:07:58 +0000152define void @f32_ugt(i32 addrspace(1)* %out, float %a, float %b) {
153entry:
154 %0 = fcmp ugt float %a, %b
155 %1 = sext i1 %0 to i32
156 store i32 %1, i32 addrspace(1)* %out
157 ret void
158}
159
Tom Stellard79243d92014-10-01 17:15:17 +0000160; FUNC-LABEL: {{^}}f32_uge:
Tom Stellardc0845332013-11-22 23:07:58 +0000161; R600: SETGT
162; R600: SETE_DX10
Tom Stellard326d6ec2014-11-05 14:50:53 +0000163; SI: v_cmp_u_f32
164; SI: v_cmp_ge_f32
Matt Arsenaultbecd6562014-12-03 05:22:35 +0000165; SI: s_or_b64
166; SI: v_cndmask_b32
Tom Stellardc0845332013-11-22 23:07:58 +0000167define void @f32_uge(i32 addrspace(1)* %out, float %a, float %b) {
168entry:
169 %0 = fcmp uge float %a, %b
170 %1 = sext i1 %0 to i32
171 store i32 %1, i32 addrspace(1)* %out
172 ret void
173}
174
Tom Stellard79243d92014-10-01 17:15:17 +0000175; FUNC-LABEL: {{^}}f32_ult:
Tom Stellardc0845332013-11-22 23:07:58 +0000176; R600: SETGE
177; R600: SETE_DX10
Tom Stellard326d6ec2014-11-05 14:50:53 +0000178; SI: v_cmp_u_f32
179; SI: v_cmp_lt_f32
Matt Arsenaultbecd6562014-12-03 05:22:35 +0000180; SI: s_or_b64
181; SI: v_cndmask_b32
Tom Stellardc0845332013-11-22 23:07:58 +0000182define void @f32_ult(i32 addrspace(1)* %out, float %a, float %b) {
183entry:
184 %0 = fcmp ult float %a, %b
185 %1 = sext i1 %0 to i32
186 store i32 %1, i32 addrspace(1)* %out
187 ret void
188}
189
Tom Stellard79243d92014-10-01 17:15:17 +0000190; FUNC-LABEL: {{^}}f32_ule:
Tom Stellardc0845332013-11-22 23:07:58 +0000191; R600: SETGT
192; R600: SETE_DX10
Tom Stellard326d6ec2014-11-05 14:50:53 +0000193; SI: v_cmp_u_f32
194; SI: v_cmp_le_f32
Matt Arsenaultbecd6562014-12-03 05:22:35 +0000195; SI: s_or_b64
196; SI: v_cndmask_b32
Tom Stellardc0845332013-11-22 23:07:58 +0000197define void @f32_ule(i32 addrspace(1)* %out, float %a, float %b) {
198entry:
199 %0 = fcmp ule float %a, %b
200 %1 = sext i1 %0 to i32
201 store i32 %1, i32 addrspace(1)* %out
202 ret void
203}
204
Tom Stellard79243d92014-10-01 17:15:17 +0000205; FUNC-LABEL: {{^}}f32_une:
Tom Stellardc0845332013-11-22 23:07:58 +0000206; R600: SETNE_DX10
Tom Stellard326d6ec2014-11-05 14:50:53 +0000207; SI: v_cmp_neq_f32
Tom Stellardc0845332013-11-22 23:07:58 +0000208define void @f32_une(i32 addrspace(1)* %out, float %a, float %b) {
209entry:
210 %0 = fcmp une float %a, %b
211 %1 = sext i1 %0 to i32
212 store i32 %1, i32 addrspace(1)* %out
213 ret void
214}
215
Tom Stellard79243d92014-10-01 17:15:17 +0000216; FUNC-LABEL: {{^}}f32_uno:
Tom Stellardc0845332013-11-22 23:07:58 +0000217; R600: SETNE_DX10
218; R600: SETNE_DX10
219; R600: OR_INT
220; R600: SETNE_INT
Tom Stellard326d6ec2014-11-05 14:50:53 +0000221; SI: v_cmp_u_f32
Tom Stellardc0845332013-11-22 23:07:58 +0000222define void @f32_uno(i32 addrspace(1)* %out, float %a, float %b) {
223entry:
224 %0 = fcmp uno float %a, %b
225 %1 = sext i1 %0 to i32
226 store i32 %1, i32 addrspace(1)* %out
227 ret void
228}
229
230;;;==========================================================================;;;
231;; 32-bit integer comparisons
232;;;==========================================================================;;;
233
Tom Stellard79243d92014-10-01 17:15:17 +0000234; FUNC-LABEL: {{^}}i32_eq:
Tom Stellardc0845332013-11-22 23:07:58 +0000235; R600: SETE_INT
Tom Stellard326d6ec2014-11-05 14:50:53 +0000236; SI: v_cmp_eq_i32
Tom Stellardc0845332013-11-22 23:07:58 +0000237define void @i32_eq(i32 addrspace(1)* %out, i32 %a, i32 %b) {
238entry:
239 %0 = icmp eq i32 %a, %b
240 %1 = sext i1 %0 to i32
241 store i32 %1, i32 addrspace(1)* %out
242 ret void
243}
244
Tom Stellard79243d92014-10-01 17:15:17 +0000245; FUNC-LABEL: {{^}}i32_ne:
Tom Stellardc0845332013-11-22 23:07:58 +0000246; R600: SETNE_INT
Tom Stellard326d6ec2014-11-05 14:50:53 +0000247; SI: v_cmp_ne_i32
Tom Stellardc0845332013-11-22 23:07:58 +0000248define void @i32_ne(i32 addrspace(1)* %out, i32 %a, i32 %b) {
249entry:
250 %0 = icmp ne i32 %a, %b
251 %1 = sext i1 %0 to i32
252 store i32 %1, i32 addrspace(1)* %out
253 ret void
254}
255
Tom Stellard79243d92014-10-01 17:15:17 +0000256; FUNC-LABEL: {{^}}i32_ugt:
Tom Stellardc0845332013-11-22 23:07:58 +0000257; R600: SETGT_UINT
Tom Stellard326d6ec2014-11-05 14:50:53 +0000258; SI: v_cmp_gt_u32
Tom Stellardc0845332013-11-22 23:07:58 +0000259define void @i32_ugt(i32 addrspace(1)* %out, i32 %a, i32 %b) {
260entry:
261 %0 = icmp ugt i32 %a, %b
262 %1 = sext i1 %0 to i32
263 store i32 %1, i32 addrspace(1)* %out
264 ret void
265}
266
Tom Stellard79243d92014-10-01 17:15:17 +0000267; FUNC-LABEL: {{^}}i32_uge:
Tom Stellardc0845332013-11-22 23:07:58 +0000268; R600: SETGE_UINT
Tom Stellard326d6ec2014-11-05 14:50:53 +0000269; SI: v_cmp_ge_u32
Tom Stellardc0845332013-11-22 23:07:58 +0000270define void @i32_uge(i32 addrspace(1)* %out, i32 %a, i32 %b) {
271entry:
272 %0 = icmp uge i32 %a, %b
273 %1 = sext i1 %0 to i32
274 store i32 %1, i32 addrspace(1)* %out
275 ret void
276}
277
Tom Stellard79243d92014-10-01 17:15:17 +0000278; FUNC-LABEL: {{^}}i32_ult:
Tom Stellardc0845332013-11-22 23:07:58 +0000279; R600: SETGT_UINT
Tom Stellard326d6ec2014-11-05 14:50:53 +0000280; SI: v_cmp_lt_u32
Tom Stellardc0845332013-11-22 23:07:58 +0000281define void @i32_ult(i32 addrspace(1)* %out, i32 %a, i32 %b) {
282entry:
283 %0 = icmp ult i32 %a, %b
284 %1 = sext i1 %0 to i32
285 store i32 %1, i32 addrspace(1)* %out
286 ret void
287}
288
Tom Stellard79243d92014-10-01 17:15:17 +0000289; FUNC-LABEL: {{^}}i32_ule:
Tom Stellardc0845332013-11-22 23:07:58 +0000290; R600: SETGE_UINT
Tom Stellard326d6ec2014-11-05 14:50:53 +0000291; SI: v_cmp_le_u32
Tom Stellardc0845332013-11-22 23:07:58 +0000292define void @i32_ule(i32 addrspace(1)* %out, i32 %a, i32 %b) {
293entry:
294 %0 = icmp ule i32 %a, %b
295 %1 = sext i1 %0 to i32
296 store i32 %1, i32 addrspace(1)* %out
297 ret void
298}
299
Tom Stellard79243d92014-10-01 17:15:17 +0000300; FUNC-LABEL: {{^}}i32_sgt:
Tom Stellardc0845332013-11-22 23:07:58 +0000301; R600: SETGT_INT
Tom Stellard326d6ec2014-11-05 14:50:53 +0000302; SI: v_cmp_gt_i32
Tom Stellardc0845332013-11-22 23:07:58 +0000303define void @i32_sgt(i32 addrspace(1)* %out, i32 %a, i32 %b) {
304entry:
305 %0 = icmp sgt i32 %a, %b
306 %1 = sext i1 %0 to i32
307 store i32 %1, i32 addrspace(1)* %out
308 ret void
309}
310
Tom Stellard79243d92014-10-01 17:15:17 +0000311; FUNC-LABEL: {{^}}i32_sge:
Tom Stellardc0845332013-11-22 23:07:58 +0000312; R600: SETGE_INT
Tom Stellard326d6ec2014-11-05 14:50:53 +0000313; SI: v_cmp_ge_i32
Tom Stellardc0845332013-11-22 23:07:58 +0000314define void @i32_sge(i32 addrspace(1)* %out, i32 %a, i32 %b) {
315entry:
316 %0 = icmp sge i32 %a, %b
317 %1 = sext i1 %0 to i32
318 store i32 %1, i32 addrspace(1)* %out
319 ret void
320}
321
Tom Stellard79243d92014-10-01 17:15:17 +0000322; FUNC-LABEL: {{^}}i32_slt:
Tom Stellardc0845332013-11-22 23:07:58 +0000323; R600: SETGT_INT
Tom Stellard326d6ec2014-11-05 14:50:53 +0000324; SI: v_cmp_lt_i32
Tom Stellardc0845332013-11-22 23:07:58 +0000325define void @i32_slt(i32 addrspace(1)* %out, i32 %a, i32 %b) {
326entry:
327 %0 = icmp slt i32 %a, %b
328 %1 = sext i1 %0 to i32
329 store i32 %1, i32 addrspace(1)* %out
330 ret void
331}
332
Tom Stellard79243d92014-10-01 17:15:17 +0000333; FUNC-LABEL: {{^}}i32_sle:
Tom Stellardc0845332013-11-22 23:07:58 +0000334; R600: SETGE_INT
Tom Stellard326d6ec2014-11-05 14:50:53 +0000335; SI: v_cmp_le_i32
Tom Stellardc0845332013-11-22 23:07:58 +0000336define void @i32_sle(i32 addrspace(1)* %out, i32 %a, i32 %b) {
337entry:
338 %0 = icmp sle i32 %a, %b
339 %1 = sext i1 %0 to i32
340 store i32 %1, i32 addrspace(1)* %out
341 ret void
342}
Matt Arsenault8596f712014-11-28 22:51:38 +0000343
344; FIXME: This does 4 compares
345; FUNC-LABEL: {{^}}v3i32_eq:
346; SI-DAG: v_cmp_eq_i32
347; SI-DAG: v_cndmask_b32_e64 {{v[0-9]+}}, 0, -1,
348; SI-DAG: v_cmp_eq_i32
349; SI-DAG: v_cndmask_b32_e64 {{v[0-9]+}}, 0, -1,
350; SI-DAG: v_cmp_eq_i32
351; SI-DAG: v_cndmask_b32_e64 {{v[0-9]+}}, 0, -1,
352; SI: s_endpgm
353define void @v3i32_eq(<3 x i32> addrspace(1)* %out, <3 x i32> addrspace(1)* %ptra, <3 x i32> addrspace(1)* %ptrb) {
354 %tid = call i32 @llvm.r600.read.tidig.x() nounwind readnone
355 %gep.a = getelementptr <3 x i32> addrspace(1)* %ptra, i32 %tid
356 %gep.b = getelementptr <3 x i32> addrspace(1)* %ptrb, i32 %tid
357 %gep.out = getelementptr <3 x i32> addrspace(1)* %out, i32 %tid
358 %a = load <3 x i32> addrspace(1)* %gep.a
359 %b = load <3 x i32> addrspace(1)* %gep.b
360 %cmp = icmp eq <3 x i32> %a, %b
361 %ext = sext <3 x i1> %cmp to <3 x i32>
362 store <3 x i32> %ext, <3 x i32> addrspace(1)* %gep.out
363 ret void
364}
365
366; FUNC-LABEL: {{^}}v3i8_eq:
367; SI-DAG: v_cmp_eq_i32
368; SI-DAG: v_cndmask_b32_e64 {{v[0-9]+}}, 0, -1,
369; SI-DAG: v_cmp_eq_i32
370; SI-DAG: v_cndmask_b32_e64 {{v[0-9]+}}, 0, -1,
371; SI-DAG: v_cmp_eq_i32
372; SI-DAG: v_cndmask_b32_e64 {{v[0-9]+}}, 0, -1,
373; SI: s_endpgm
374define void @v3i8_eq(<3 x i8> addrspace(1)* %out, <3 x i8> addrspace(1)* %ptra, <3 x i8> addrspace(1)* %ptrb) {
375 %tid = call i32 @llvm.r600.read.tidig.x() nounwind readnone
376 %gep.a = getelementptr <3 x i8> addrspace(1)* %ptra, i32 %tid
377 %gep.b = getelementptr <3 x i8> addrspace(1)* %ptrb, i32 %tid
378 %gep.out = getelementptr <3 x i8> addrspace(1)* %out, i32 %tid
379 %a = load <3 x i8> addrspace(1)* %gep.a
380 %b = load <3 x i8> addrspace(1)* %gep.b
381 %cmp = icmp eq <3 x i8> %a, %b
382 %ext = sext <3 x i1> %cmp to <3 x i8>
383 store <3 x i8> %ext, <3 x i8> addrspace(1)* %gep.out
384 ret void
385}