blob: 371ebbedf18e2086f30a2fbb42a8c3cba4b23a54 [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
Tom Stellard326d6ec2014-11-05 14:50:53 +000099; SI: v_cmp_o_f32
100; SI: v_cmp_neq_f32
101; SI: v_cndmask_b32_e64
102; SI: v_cndmask_b32_e64
103; SI: v_and_b32_e32
Tom Stellardc0845332013-11-22 23:07:58 +0000104define void @f32_one(i32 addrspace(1)* %out, float %a, float %b) {
105entry:
106 %0 = fcmp one float %a, %b
107 %1 = sext i1 %0 to i32
108 store i32 %1, i32 addrspace(1)* %out
109 ret void
110}
111
Tom Stellard79243d92014-10-01 17:15:17 +0000112; FUNC-LABEL: {{^}}f32_ord:
Tom Stellardc0845332013-11-22 23:07:58 +0000113; R600-DAG: SETE_DX10
114; R600-DAG: SETE_DX10
115; R600-DAG: AND_INT
116; R600-DAG: SETNE_INT
Tom Stellard326d6ec2014-11-05 14:50:53 +0000117; SI: v_cmp_o_f32
Tom Stellardc0845332013-11-22 23:07:58 +0000118define void @f32_ord(i32 addrspace(1)* %out, float %a, float %b) {
119entry:
120 %0 = fcmp ord float %a, %b
121 %1 = sext i1 %0 to i32
122 store i32 %1, i32 addrspace(1)* %out
123 ret void
124}
125
Tom Stellard79243d92014-10-01 17:15:17 +0000126; FUNC-LABEL: {{^}}f32_ueq:
Tom Stellardc0845332013-11-22 23:07:58 +0000127; R600-DAG: SETNE_DX10
128; R600-DAG: SETNE_DX10
129; R600-DAG: OR_INT
130; R600-DAG: SETE_DX10
131; R600-DAG: OR_INT
132; R600-DAG: SETNE_INT
Tom Stellard326d6ec2014-11-05 14:50:53 +0000133; SI: v_cmp_u_f32
134; SI: v_cmp_eq_f32
135; SI: v_cndmask_b32_e64
136; SI: v_cndmask_b32_e64
137; SI: v_or_b32_e32
Tom Stellardc0845332013-11-22 23:07:58 +0000138define void @f32_ueq(i32 addrspace(1)* %out, float %a, float %b) {
139entry:
140 %0 = fcmp ueq float %a, %b
141 %1 = sext i1 %0 to i32
142 store i32 %1, i32 addrspace(1)* %out
143 ret void
144}
145
Tom Stellard79243d92014-10-01 17:15:17 +0000146; FUNC-LABEL: {{^}}f32_ugt:
Tom Stellardc0845332013-11-22 23:07:58 +0000147; R600: SETGE
148; R600: SETE_DX10
Tom Stellard326d6ec2014-11-05 14:50:53 +0000149; SI: v_cmp_u_f32
150; SI: v_cmp_gt_f32
151; SI: v_cndmask_b32_e64
152; SI: v_cndmask_b32_e64
153; SI: v_or_b32_e32
Tom Stellardc0845332013-11-22 23:07:58 +0000154define void @f32_ugt(i32 addrspace(1)* %out, float %a, float %b) {
155entry:
156 %0 = fcmp ugt float %a, %b
157 %1 = sext i1 %0 to i32
158 store i32 %1, i32 addrspace(1)* %out
159 ret void
160}
161
Tom Stellard79243d92014-10-01 17:15:17 +0000162; FUNC-LABEL: {{^}}f32_uge:
Tom Stellardc0845332013-11-22 23:07:58 +0000163; R600: SETGT
164; R600: SETE_DX10
Tom Stellard326d6ec2014-11-05 14:50:53 +0000165; SI: v_cmp_u_f32
166; SI: v_cmp_ge_f32
167; SI: v_cndmask_b32_e64
168; SI: v_cndmask_b32_e64
169; SI: v_or_b32_e32
Tom Stellardc0845332013-11-22 23:07:58 +0000170define void @f32_uge(i32 addrspace(1)* %out, float %a, float %b) {
171entry:
172 %0 = fcmp uge float %a, %b
173 %1 = sext i1 %0 to i32
174 store i32 %1, i32 addrspace(1)* %out
175 ret void
176}
177
Tom Stellard79243d92014-10-01 17:15:17 +0000178; FUNC-LABEL: {{^}}f32_ult:
Tom Stellardc0845332013-11-22 23:07:58 +0000179; R600: SETGE
180; R600: SETE_DX10
Tom Stellard326d6ec2014-11-05 14:50:53 +0000181; SI: v_cmp_u_f32
182; SI: v_cmp_lt_f32
183; SI: v_cndmask_b32_e64
184; SI: v_cndmask_b32_e64
185; SI: v_or_b32_e32
Tom Stellardc0845332013-11-22 23:07:58 +0000186define void @f32_ult(i32 addrspace(1)* %out, float %a, float %b) {
187entry:
188 %0 = fcmp ult float %a, %b
189 %1 = sext i1 %0 to i32
190 store i32 %1, i32 addrspace(1)* %out
191 ret void
192}
193
Tom Stellard79243d92014-10-01 17:15:17 +0000194; FUNC-LABEL: {{^}}f32_ule:
Tom Stellardc0845332013-11-22 23:07:58 +0000195; R600: SETGT
196; R600: SETE_DX10
Tom Stellard326d6ec2014-11-05 14:50:53 +0000197; SI: v_cmp_u_f32
198; SI: v_cmp_le_f32
199; SI: v_cndmask_b32_e64
200; SI: v_cndmask_b32_e64
201; SI: v_or_b32_e32
Tom Stellardc0845332013-11-22 23:07:58 +0000202define void @f32_ule(i32 addrspace(1)* %out, float %a, float %b) {
203entry:
204 %0 = fcmp ule float %a, %b
205 %1 = sext i1 %0 to i32
206 store i32 %1, i32 addrspace(1)* %out
207 ret void
208}
209
Tom Stellard79243d92014-10-01 17:15:17 +0000210; FUNC-LABEL: {{^}}f32_une:
Tom Stellardc0845332013-11-22 23:07:58 +0000211; R600: SETNE_DX10
Tom Stellard326d6ec2014-11-05 14:50:53 +0000212; SI: v_cmp_neq_f32
Tom Stellardc0845332013-11-22 23:07:58 +0000213define void @f32_une(i32 addrspace(1)* %out, float %a, float %b) {
214entry:
215 %0 = fcmp une float %a, %b
216 %1 = sext i1 %0 to i32
217 store i32 %1, i32 addrspace(1)* %out
218 ret void
219}
220
Tom Stellard79243d92014-10-01 17:15:17 +0000221; FUNC-LABEL: {{^}}f32_uno:
Tom Stellardc0845332013-11-22 23:07:58 +0000222; R600: SETNE_DX10
223; R600: SETNE_DX10
224; R600: OR_INT
225; R600: SETNE_INT
Tom Stellard326d6ec2014-11-05 14:50:53 +0000226; SI: v_cmp_u_f32
Tom Stellardc0845332013-11-22 23:07:58 +0000227define void @f32_uno(i32 addrspace(1)* %out, float %a, float %b) {
228entry:
229 %0 = fcmp uno float %a, %b
230 %1 = sext i1 %0 to i32
231 store i32 %1, i32 addrspace(1)* %out
232 ret void
233}
234
235;;;==========================================================================;;;
236;; 32-bit integer comparisons
237;;;==========================================================================;;;
238
Tom Stellard79243d92014-10-01 17:15:17 +0000239; FUNC-LABEL: {{^}}i32_eq:
Tom Stellardc0845332013-11-22 23:07:58 +0000240; R600: SETE_INT
Tom Stellard326d6ec2014-11-05 14:50:53 +0000241; SI: v_cmp_eq_i32
Tom Stellardc0845332013-11-22 23:07:58 +0000242define void @i32_eq(i32 addrspace(1)* %out, i32 %a, i32 %b) {
243entry:
244 %0 = icmp eq i32 %a, %b
245 %1 = sext i1 %0 to i32
246 store i32 %1, i32 addrspace(1)* %out
247 ret void
248}
249
Tom Stellard79243d92014-10-01 17:15:17 +0000250; FUNC-LABEL: {{^}}i32_ne:
Tom Stellardc0845332013-11-22 23:07:58 +0000251; R600: SETNE_INT
Tom Stellard326d6ec2014-11-05 14:50:53 +0000252; SI: v_cmp_ne_i32
Tom Stellardc0845332013-11-22 23:07:58 +0000253define void @i32_ne(i32 addrspace(1)* %out, i32 %a, i32 %b) {
254entry:
255 %0 = icmp ne i32 %a, %b
256 %1 = sext i1 %0 to i32
257 store i32 %1, i32 addrspace(1)* %out
258 ret void
259}
260
Tom Stellard79243d92014-10-01 17:15:17 +0000261; FUNC-LABEL: {{^}}i32_ugt:
Tom Stellardc0845332013-11-22 23:07:58 +0000262; R600: SETGT_UINT
Tom Stellard326d6ec2014-11-05 14:50:53 +0000263; SI: v_cmp_gt_u32
Tom Stellardc0845332013-11-22 23:07:58 +0000264define void @i32_ugt(i32 addrspace(1)* %out, i32 %a, i32 %b) {
265entry:
266 %0 = icmp ugt i32 %a, %b
267 %1 = sext i1 %0 to i32
268 store i32 %1, i32 addrspace(1)* %out
269 ret void
270}
271
Tom Stellard79243d92014-10-01 17:15:17 +0000272; FUNC-LABEL: {{^}}i32_uge:
Tom Stellardc0845332013-11-22 23:07:58 +0000273; R600: SETGE_UINT
Tom Stellard326d6ec2014-11-05 14:50:53 +0000274; SI: v_cmp_ge_u32
Tom Stellardc0845332013-11-22 23:07:58 +0000275define void @i32_uge(i32 addrspace(1)* %out, i32 %a, i32 %b) {
276entry:
277 %0 = icmp uge i32 %a, %b
278 %1 = sext i1 %0 to i32
279 store i32 %1, i32 addrspace(1)* %out
280 ret void
281}
282
Tom Stellard79243d92014-10-01 17:15:17 +0000283; FUNC-LABEL: {{^}}i32_ult:
Tom Stellardc0845332013-11-22 23:07:58 +0000284; R600: SETGT_UINT
Tom Stellard326d6ec2014-11-05 14:50:53 +0000285; SI: v_cmp_lt_u32
Tom Stellardc0845332013-11-22 23:07:58 +0000286define void @i32_ult(i32 addrspace(1)* %out, i32 %a, i32 %b) {
287entry:
288 %0 = icmp ult i32 %a, %b
289 %1 = sext i1 %0 to i32
290 store i32 %1, i32 addrspace(1)* %out
291 ret void
292}
293
Tom Stellard79243d92014-10-01 17:15:17 +0000294; FUNC-LABEL: {{^}}i32_ule:
Tom Stellardc0845332013-11-22 23:07:58 +0000295; R600: SETGE_UINT
Tom Stellard326d6ec2014-11-05 14:50:53 +0000296; SI: v_cmp_le_u32
Tom Stellardc0845332013-11-22 23:07:58 +0000297define void @i32_ule(i32 addrspace(1)* %out, i32 %a, i32 %b) {
298entry:
299 %0 = icmp ule i32 %a, %b
300 %1 = sext i1 %0 to i32
301 store i32 %1, i32 addrspace(1)* %out
302 ret void
303}
304
Tom Stellard79243d92014-10-01 17:15:17 +0000305; FUNC-LABEL: {{^}}i32_sgt:
Tom Stellardc0845332013-11-22 23:07:58 +0000306; R600: SETGT_INT
Tom Stellard326d6ec2014-11-05 14:50:53 +0000307; SI: v_cmp_gt_i32
Tom Stellardc0845332013-11-22 23:07:58 +0000308define void @i32_sgt(i32 addrspace(1)* %out, i32 %a, i32 %b) {
309entry:
310 %0 = icmp sgt i32 %a, %b
311 %1 = sext i1 %0 to i32
312 store i32 %1, i32 addrspace(1)* %out
313 ret void
314}
315
Tom Stellard79243d92014-10-01 17:15:17 +0000316; FUNC-LABEL: {{^}}i32_sge:
Tom Stellardc0845332013-11-22 23:07:58 +0000317; R600: SETGE_INT
Tom Stellard326d6ec2014-11-05 14:50:53 +0000318; SI: v_cmp_ge_i32
Tom Stellardc0845332013-11-22 23:07:58 +0000319define void @i32_sge(i32 addrspace(1)* %out, i32 %a, i32 %b) {
320entry:
321 %0 = icmp sge i32 %a, %b
322 %1 = sext i1 %0 to i32
323 store i32 %1, i32 addrspace(1)* %out
324 ret void
325}
326
Tom Stellard79243d92014-10-01 17:15:17 +0000327; FUNC-LABEL: {{^}}i32_slt:
Tom Stellardc0845332013-11-22 23:07:58 +0000328; R600: SETGT_INT
Tom Stellard326d6ec2014-11-05 14:50:53 +0000329; SI: v_cmp_lt_i32
Tom Stellardc0845332013-11-22 23:07:58 +0000330define void @i32_slt(i32 addrspace(1)* %out, i32 %a, i32 %b) {
331entry:
332 %0 = icmp slt i32 %a, %b
333 %1 = sext i1 %0 to i32
334 store i32 %1, i32 addrspace(1)* %out
335 ret void
336}
337
Tom Stellard79243d92014-10-01 17:15:17 +0000338; FUNC-LABEL: {{^}}i32_sle:
Tom Stellardc0845332013-11-22 23:07:58 +0000339; R600: SETGE_INT
Tom Stellard326d6ec2014-11-05 14:50:53 +0000340; SI: v_cmp_le_i32
Tom Stellardc0845332013-11-22 23:07:58 +0000341define void @i32_sle(i32 addrspace(1)* %out, i32 %a, i32 %b) {
342entry:
343 %0 = icmp sle i32 %a, %b
344 %1 = sext i1 %0 to i32
345 store i32 %1, i32 addrspace(1)* %out
346 ret void
347}
Matt Arsenault8596f712014-11-28 22:51:38 +0000348
349; FIXME: This does 4 compares
350; FUNC-LABEL: {{^}}v3i32_eq:
351; SI-DAG: v_cmp_eq_i32
352; SI-DAG: v_cndmask_b32_e64 {{v[0-9]+}}, 0, -1,
353; SI-DAG: v_cmp_eq_i32
354; SI-DAG: v_cndmask_b32_e64 {{v[0-9]+}}, 0, -1,
355; SI-DAG: v_cmp_eq_i32
356; SI-DAG: v_cndmask_b32_e64 {{v[0-9]+}}, 0, -1,
357; SI: s_endpgm
358define void @v3i32_eq(<3 x i32> addrspace(1)* %out, <3 x i32> addrspace(1)* %ptra, <3 x i32> addrspace(1)* %ptrb) {
359 %tid = call i32 @llvm.r600.read.tidig.x() nounwind readnone
360 %gep.a = getelementptr <3 x i32> addrspace(1)* %ptra, i32 %tid
361 %gep.b = getelementptr <3 x i32> addrspace(1)* %ptrb, i32 %tid
362 %gep.out = getelementptr <3 x i32> addrspace(1)* %out, i32 %tid
363 %a = load <3 x i32> addrspace(1)* %gep.a
364 %b = load <3 x i32> addrspace(1)* %gep.b
365 %cmp = icmp eq <3 x i32> %a, %b
366 %ext = sext <3 x i1> %cmp to <3 x i32>
367 store <3 x i32> %ext, <3 x i32> addrspace(1)* %gep.out
368 ret void
369}
370
371; FUNC-LABEL: {{^}}v3i8_eq:
372; SI-DAG: v_cmp_eq_i32
373; SI-DAG: v_cndmask_b32_e64 {{v[0-9]+}}, 0, -1,
374; SI-DAG: v_cmp_eq_i32
375; SI-DAG: v_cndmask_b32_e64 {{v[0-9]+}}, 0, -1,
376; SI-DAG: v_cmp_eq_i32
377; SI-DAG: v_cndmask_b32_e64 {{v[0-9]+}}, 0, -1,
378; SI: s_endpgm
379define void @v3i8_eq(<3 x i8> addrspace(1)* %out, <3 x i8> addrspace(1)* %ptra, <3 x i8> addrspace(1)* %ptrb) {
380 %tid = call i32 @llvm.r600.read.tidig.x() nounwind readnone
381 %gep.a = getelementptr <3 x i8> addrspace(1)* %ptra, i32 %tid
382 %gep.b = getelementptr <3 x i8> addrspace(1)* %ptrb, i32 %tid
383 %gep.out = getelementptr <3 x i8> addrspace(1)* %out, i32 %tid
384 %a = load <3 x i8> addrspace(1)* %gep.a
385 %b = load <3 x i8> addrspace(1)* %gep.b
386 %cmp = icmp eq <3 x i8> %a, %b
387 %ext = sext <3 x i1> %cmp to <3 x i8>
388 store <3 x i8> %ext, <3 x i8> addrspace(1)* %gep.out
389 ret void
390}