blob: 351adf9185c8c6f37f4dbfb463fea4f12ec46405 [file] [log] [blame]
Tom Stellardc0845332013-11-22 23:07:58 +00001;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck --check-prefix=R600 --check-prefix=FUNC %s
Tom Stellard919bb6b2014-04-29 23:12:53 +00002;RUN: llc < %s -march=r600 -mcpu=SI -verify-machineinstrs| FileCheck --check-prefix=SI --check-prefix=FUNC %s
Tom Stellard75aadc22012-12-11 21:25:42 +00003
Tom Stellard79243d92014-10-01 17:15:17 +00004; FUNC-LABEL: {{^}}setcc_v2i32:
Tom Stellardc0845332013-11-22 23:07:58 +00005; R600-DAG: SETE_INT * T{{[0-9]+\.[XYZW]}}, KC0[3].X, KC0[3].Z
6; R600-DAG: SETE_INT * T{{[0-9]+\.[XYZW]}}, KC0[2].W, KC0[3].Y
Aaron Watry91d28862013-06-25 13:55:49 +00007
Tom Stellard0344cdf2013-08-01 15:23:42 +00008define void @setcc_v2i32(<2 x i32> addrspace(1)* %out, <2 x i32> %a, <2 x i32> %b) {
Aaron Watry91d28862013-06-25 13:55:49 +00009 %result = icmp eq <2 x i32> %a, %b
10 %sext = sext <2 x i1> %result to <2 x i32>
11 store <2 x i32> %sext, <2 x i32> addrspace(1)* %out
12 ret void
13}
14
Tom Stellard79243d92014-10-01 17:15:17 +000015; FUNC-LABEL: {{^}}setcc_v4i32:
Tom Stellardc0845332013-11-22 23:07:58 +000016; R600-DAG: SETE_INT * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
17; R600-DAG: SETE_INT * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
18; 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]}}
Aaron Watry91d28862013-06-25 13:55:49 +000020
Tom Stellard0344cdf2013-08-01 15:23:42 +000021define void @setcc_v4i32(<4 x i32> addrspace(1)* %out, <4 x i32> addrspace(1)* %in) {
Tom Stellard75aadc22012-12-11 21:25:42 +000022 %b_ptr = getelementptr <4 x i32> addrspace(1)* %in, i32 1
23 %a = load <4 x i32> addrspace(1) * %in
24 %b = load <4 x i32> addrspace(1) * %b_ptr
25 %result = icmp eq <4 x i32> %a, %b
26 %sext = sext <4 x i1> %result to <4 x i32>
27 store <4 x i32> %sext, <4 x i32> addrspace(1)* %out
28 ret void
29}
Tom Stellardc0845332013-11-22 23:07:58 +000030
31;;;==========================================================================;;;
32;; Float comparisons
33;;;==========================================================================;;;
34
Tom Stellard79243d92014-10-01 17:15:17 +000035; FUNC-LABEL: {{^}}f32_oeq:
Tom Stellardc0845332013-11-22 23:07:58 +000036; R600: SETE_DX10
37; SI: V_CMP_EQ_F32
38define void @f32_oeq(i32 addrspace(1)* %out, float %a, float %b) {
39entry:
40 %0 = fcmp oeq float %a, %b
41 %1 = sext i1 %0 to i32
42 store i32 %1, i32 addrspace(1)* %out
43 ret void
44}
45
Tom Stellard79243d92014-10-01 17:15:17 +000046; FUNC-LABEL: {{^}}f32_ogt:
Tom Stellardc0845332013-11-22 23:07:58 +000047; R600: SETGT_DX10
48; SI: V_CMP_GT_F32
49define void @f32_ogt(i32 addrspace(1)* %out, float %a, float %b) {
50entry:
51 %0 = fcmp ogt float %a, %b
52 %1 = sext i1 %0 to i32
53 store i32 %1, i32 addrspace(1)* %out
54 ret void
55}
56
Tom Stellard79243d92014-10-01 17:15:17 +000057; FUNC-LABEL: {{^}}f32_oge:
Tom Stellardc0845332013-11-22 23:07:58 +000058; R600: SETGE_DX10
59; SI: V_CMP_GE_F32
60define void @f32_oge(i32 addrspace(1)* %out, float %a, float %b) {
61entry:
62 %0 = fcmp oge float %a, %b
63 %1 = sext i1 %0 to i32
64 store i32 %1, i32 addrspace(1)* %out
65 ret void
66}
67
Tom Stellard79243d92014-10-01 17:15:17 +000068; FUNC-LABEL: {{^}}f32_olt:
Tom Stellardc0845332013-11-22 23:07:58 +000069; R600: SETGT_DX10
70; SI: V_CMP_LT_F32
71define void @f32_olt(i32 addrspace(1)* %out, float %a, float %b) {
72entry:
73 %0 = fcmp olt float %a, %b
74 %1 = sext i1 %0 to i32
75 store i32 %1, i32 addrspace(1)* %out
76 ret void
77}
78
Tom Stellard79243d92014-10-01 17:15:17 +000079; FUNC-LABEL: {{^}}f32_ole:
Tom Stellardc0845332013-11-22 23:07:58 +000080; R600: SETGE_DX10
81; SI: V_CMP_LE_F32
82define void @f32_ole(i32 addrspace(1)* %out, float %a, float %b) {
83entry:
84 %0 = fcmp ole float %a, %b
85 %1 = sext i1 %0 to i32
86 store i32 %1, i32 addrspace(1)* %out
87 ret void
88}
89
Tom Stellard79243d92014-10-01 17:15:17 +000090; FUNC-LABEL: {{^}}f32_one:
Tom Stellardc0845332013-11-22 23:07:58 +000091; R600-DAG: SETE_DX10
92; R600-DAG: SETE_DX10
93; R600-DAG: AND_INT
94; R600-DAG: SETNE_DX10
95; R600-DAG: AND_INT
96; R600-DAG: SETNE_INT
97; SI: V_CMP_O_F32
98; SI: V_CMP_NEQ_F32
Tom Stellard365a2b42014-05-15 14:41:50 +000099; SI: V_CNDMASK_B32_e64
100; SI: V_CNDMASK_B32_e64
101; SI: V_AND_B32_e32
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
115; SI: V_CMP_O_F32
116define 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
131; SI: V_CMP_U_F32
132; SI: V_CMP_EQ_F32
Tom Stellard365a2b42014-05-15 14:41:50 +0000133; SI: V_CNDMASK_B32_e64
134; SI: V_CNDMASK_B32_e64
135; SI: V_OR_B32_e32
Tom Stellardc0845332013-11-22 23:07:58 +0000136define void @f32_ueq(i32 addrspace(1)* %out, float %a, float %b) {
137entry:
138 %0 = fcmp ueq float %a, %b
139 %1 = sext i1 %0 to i32
140 store i32 %1, i32 addrspace(1)* %out
141 ret void
142}
143
Tom Stellard79243d92014-10-01 17:15:17 +0000144; FUNC-LABEL: {{^}}f32_ugt:
Tom Stellardc0845332013-11-22 23:07:58 +0000145; R600: SETGE
146; R600: SETE_DX10
147; SI: V_CMP_U_F32
148; SI: V_CMP_GT_F32
Tom Stellard365a2b42014-05-15 14:41:50 +0000149; SI: V_CNDMASK_B32_e64
150; SI: V_CNDMASK_B32_e64
151; SI: V_OR_B32_e32
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
163; SI: V_CMP_U_F32
164; SI: V_CMP_GE_F32
Tom Stellard365a2b42014-05-15 14:41:50 +0000165; SI: V_CNDMASK_B32_e64
166; SI: V_CNDMASK_B32_e64
167; SI: V_OR_B32_e32
Tom Stellardc0845332013-11-22 23:07:58 +0000168define void @f32_uge(i32 addrspace(1)* %out, float %a, float %b) {
169entry:
170 %0 = fcmp uge float %a, %b
171 %1 = sext i1 %0 to i32
172 store i32 %1, i32 addrspace(1)* %out
173 ret void
174}
175
Tom Stellard79243d92014-10-01 17:15:17 +0000176; FUNC-LABEL: {{^}}f32_ult:
Tom Stellardc0845332013-11-22 23:07:58 +0000177; R600: SETGE
178; R600: SETE_DX10
179; SI: V_CMP_U_F32
180; SI: V_CMP_LT_F32
Tom Stellard365a2b42014-05-15 14:41:50 +0000181; SI: V_CNDMASK_B32_e64
182; SI: V_CNDMASK_B32_e64
183; SI: V_OR_B32_e32
Tom Stellardc0845332013-11-22 23:07:58 +0000184define void @f32_ult(i32 addrspace(1)* %out, float %a, float %b) {
185entry:
186 %0 = fcmp ult float %a, %b
187 %1 = sext i1 %0 to i32
188 store i32 %1, i32 addrspace(1)* %out
189 ret void
190}
191
Tom Stellard79243d92014-10-01 17:15:17 +0000192; FUNC-LABEL: {{^}}f32_ule:
Tom Stellardc0845332013-11-22 23:07:58 +0000193; R600: SETGT
194; R600: SETE_DX10
195; SI: V_CMP_U_F32
196; SI: V_CMP_LE_F32
Tom Stellard365a2b42014-05-15 14:41:50 +0000197; SI: V_CNDMASK_B32_e64
198; SI: V_CNDMASK_B32_e64
199; SI: V_OR_B32_e32
Tom Stellardc0845332013-11-22 23:07:58 +0000200define void @f32_ule(i32 addrspace(1)* %out, float %a, float %b) {
201entry:
202 %0 = fcmp ule float %a, %b
203 %1 = sext i1 %0 to i32
204 store i32 %1, i32 addrspace(1)* %out
205 ret void
206}
207
Tom Stellard79243d92014-10-01 17:15:17 +0000208; FUNC-LABEL: {{^}}f32_une:
Tom Stellardc0845332013-11-22 23:07:58 +0000209; R600: SETNE_DX10
210; SI: V_CMP_NEQ_F32
211define void @f32_une(i32 addrspace(1)* %out, float %a, float %b) {
212entry:
213 %0 = fcmp une float %a, %b
214 %1 = sext i1 %0 to i32
215 store i32 %1, i32 addrspace(1)* %out
216 ret void
217}
218
Tom Stellard79243d92014-10-01 17:15:17 +0000219; FUNC-LABEL: {{^}}f32_uno:
Tom Stellardc0845332013-11-22 23:07:58 +0000220; R600: SETNE_DX10
221; R600: SETNE_DX10
222; R600: OR_INT
223; R600: SETNE_INT
224; SI: V_CMP_U_F32
225define void @f32_uno(i32 addrspace(1)* %out, float %a, float %b) {
226entry:
227 %0 = fcmp uno float %a, %b
228 %1 = sext i1 %0 to i32
229 store i32 %1, i32 addrspace(1)* %out
230 ret void
231}
232
233;;;==========================================================================;;;
234;; 32-bit integer comparisons
235;;;==========================================================================;;;
236
Tom Stellard79243d92014-10-01 17:15:17 +0000237; FUNC-LABEL: {{^}}i32_eq:
Tom Stellardc0845332013-11-22 23:07:58 +0000238; R600: SETE_INT
239; SI: V_CMP_EQ_I32
240define void @i32_eq(i32 addrspace(1)* %out, i32 %a, i32 %b) {
241entry:
242 %0 = icmp eq i32 %a, %b
243 %1 = sext i1 %0 to i32
244 store i32 %1, i32 addrspace(1)* %out
245 ret void
246}
247
Tom Stellard79243d92014-10-01 17:15:17 +0000248; FUNC-LABEL: {{^}}i32_ne:
Tom Stellardc0845332013-11-22 23:07:58 +0000249; R600: SETNE_INT
250; SI: V_CMP_NE_I32
251define void @i32_ne(i32 addrspace(1)* %out, i32 %a, i32 %b) {
252entry:
253 %0 = icmp ne i32 %a, %b
254 %1 = sext i1 %0 to i32
255 store i32 %1, i32 addrspace(1)* %out
256 ret void
257}
258
Tom Stellard79243d92014-10-01 17:15:17 +0000259; FUNC-LABEL: {{^}}i32_ugt:
Tom Stellardc0845332013-11-22 23:07:58 +0000260; R600: SETGT_UINT
261; SI: V_CMP_GT_U32
262define void @i32_ugt(i32 addrspace(1)* %out, i32 %a, i32 %b) {
263entry:
264 %0 = icmp ugt i32 %a, %b
265 %1 = sext i1 %0 to i32
266 store i32 %1, i32 addrspace(1)* %out
267 ret void
268}
269
Tom Stellard79243d92014-10-01 17:15:17 +0000270; FUNC-LABEL: {{^}}i32_uge:
Tom Stellardc0845332013-11-22 23:07:58 +0000271; R600: SETGE_UINT
272; SI: V_CMP_GE_U32
273define void @i32_uge(i32 addrspace(1)* %out, i32 %a, i32 %b) {
274entry:
275 %0 = icmp uge i32 %a, %b
276 %1 = sext i1 %0 to i32
277 store i32 %1, i32 addrspace(1)* %out
278 ret void
279}
280
Tom Stellard79243d92014-10-01 17:15:17 +0000281; FUNC-LABEL: {{^}}i32_ult:
Tom Stellardc0845332013-11-22 23:07:58 +0000282; R600: SETGT_UINT
283; SI: V_CMP_LT_U32
284define void @i32_ult(i32 addrspace(1)* %out, i32 %a, i32 %b) {
285entry:
286 %0 = icmp ult i32 %a, %b
287 %1 = sext i1 %0 to i32
288 store i32 %1, i32 addrspace(1)* %out
289 ret void
290}
291
Tom Stellard79243d92014-10-01 17:15:17 +0000292; FUNC-LABEL: {{^}}i32_ule:
Tom Stellardc0845332013-11-22 23:07:58 +0000293; R600: SETGE_UINT
294; SI: V_CMP_LE_U32
295define void @i32_ule(i32 addrspace(1)* %out, i32 %a, i32 %b) {
296entry:
297 %0 = icmp ule i32 %a, %b
298 %1 = sext i1 %0 to i32
299 store i32 %1, i32 addrspace(1)* %out
300 ret void
301}
302
Tom Stellard79243d92014-10-01 17:15:17 +0000303; FUNC-LABEL: {{^}}i32_sgt:
Tom Stellardc0845332013-11-22 23:07:58 +0000304; R600: SETGT_INT
305; SI: V_CMP_GT_I32
306define void @i32_sgt(i32 addrspace(1)* %out, i32 %a, i32 %b) {
307entry:
308 %0 = icmp sgt i32 %a, %b
309 %1 = sext i1 %0 to i32
310 store i32 %1, i32 addrspace(1)* %out
311 ret void
312}
313
Tom Stellard79243d92014-10-01 17:15:17 +0000314; FUNC-LABEL: {{^}}i32_sge:
Tom Stellardc0845332013-11-22 23:07:58 +0000315; R600: SETGE_INT
316; SI: V_CMP_GE_I32
317define void @i32_sge(i32 addrspace(1)* %out, i32 %a, i32 %b) {
318entry:
319 %0 = icmp sge i32 %a, %b
320 %1 = sext i1 %0 to i32
321 store i32 %1, i32 addrspace(1)* %out
322 ret void
323}
324
Tom Stellard79243d92014-10-01 17:15:17 +0000325; FUNC-LABEL: {{^}}i32_slt:
Tom Stellardc0845332013-11-22 23:07:58 +0000326; R600: SETGT_INT
327; SI: V_CMP_LT_I32
328define void @i32_slt(i32 addrspace(1)* %out, i32 %a, i32 %b) {
329entry:
330 %0 = icmp slt i32 %a, %b
331 %1 = sext i1 %0 to i32
332 store i32 %1, i32 addrspace(1)* %out
333 ret void
334}
335
Tom Stellard79243d92014-10-01 17:15:17 +0000336; FUNC-LABEL: {{^}}i32_sle:
Tom Stellardc0845332013-11-22 23:07:58 +0000337; R600: SETGE_INT
338; SI: V_CMP_LE_I32
339define void @i32_sle(i32 addrspace(1)* %out, i32 %a, i32 %b) {
340entry:
341 %0 = icmp sle i32 %a, %b
342 %1 = sext i1 %0 to i32
343 store i32 %1, i32 addrspace(1)* %out
344 ret void
345}