1 ;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck --check-prefix=R600 --check-prefix=FUNC %s
2 ;RUN: llc < %s -march=r600 -mcpu=SI -verify-machineinstrs| FileCheck --check-prefix=SI --check-prefix=FUNC %s
4 ; FUNC-LABEL: @setcc_v2i32
5 ; 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
8 define void @setcc_v2i32(<2 x i32> addrspace(1)* %out, <2 x i32> %a, <2 x i32> %b) {
9 %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
15 ; FUNC-LABEL: @setcc_v4i32
16 ; 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]}}
21 define void @setcc_v4i32(<4 x i32> addrspace(1)* %out, <4 x i32> addrspace(1)* %in) {
22 %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
31 ;;;==========================================================================;;;
33 ;;;==========================================================================;;;
35 ; FUNC-LABEL: @f32_oeq
38 define void @f32_oeq(i32 addrspace(1)* %out, float %a, float %b) {
40 %0 = fcmp oeq float %a, %b
41 %1 = sext i1 %0 to i32
42 store i32 %1, i32 addrspace(1)* %out
46 ; FUNC-LABEL: @f32_ogt
49 define void @f32_ogt(i32 addrspace(1)* %out, float %a, float %b) {
51 %0 = fcmp ogt float %a, %b
52 %1 = sext i1 %0 to i32
53 store i32 %1, i32 addrspace(1)* %out
57 ; FUNC-LABEL: @f32_oge
60 define void @f32_oge(i32 addrspace(1)* %out, float %a, float %b) {
62 %0 = fcmp oge float %a, %b
63 %1 = sext i1 %0 to i32
64 store i32 %1, i32 addrspace(1)* %out
68 ; FUNC-LABEL: @f32_olt
71 define void @f32_olt(i32 addrspace(1)* %out, float %a, float %b) {
73 %0 = fcmp olt float %a, %b
74 %1 = sext i1 %0 to i32
75 store i32 %1, i32 addrspace(1)* %out
79 ; FUNC-LABEL: @f32_ole
82 define void @f32_ole(i32 addrspace(1)* %out, float %a, float %b) {
84 %0 = fcmp ole float %a, %b
85 %1 = sext i1 %0 to i32
86 store i32 %1, i32 addrspace(1)* %out
90 ; FUNC-LABEL: @f32_one
94 ; R600-DAG: SETNE_DX10
99 ; SI: V_CNDMASK_B32_e64
100 ; SI: V_CNDMASK_B32_e64
102 define void @f32_one(i32 addrspace(1)* %out, float %a, float %b) {
104 %0 = fcmp one float %a, %b
105 %1 = sext i1 %0 to i32
106 store i32 %1, i32 addrspace(1)* %out
110 ; FUNC-LABEL: @f32_ord
111 ; R600-DAG: SETE_DX10
112 ; R600-DAG: SETE_DX10
114 ; R600-DAG: SETNE_INT
116 define void @f32_ord(i32 addrspace(1)* %out, float %a, float %b) {
118 %0 = fcmp ord float %a, %b
119 %1 = sext i1 %0 to i32
120 store i32 %1, i32 addrspace(1)* %out
124 ; FUNC-LABEL: @f32_ueq
125 ; R600-DAG: SETNE_DX10
126 ; R600-DAG: SETNE_DX10
128 ; R600-DAG: SETE_DX10
130 ; R600-DAG: SETNE_INT
133 ; SI: V_CNDMASK_B32_e64
134 ; SI: V_CNDMASK_B32_e64
136 define void @f32_ueq(i32 addrspace(1)* %out, float %a, float %b) {
138 %0 = fcmp ueq float %a, %b
139 %1 = sext i1 %0 to i32
140 store i32 %1, i32 addrspace(1)* %out
144 ; FUNC-LABEL: @f32_ugt
149 ; SI: V_CNDMASK_B32_e64
150 ; SI: V_CNDMASK_B32_e64
152 define void @f32_ugt(i32 addrspace(1)* %out, float %a, float %b) {
154 %0 = fcmp ugt float %a, %b
155 %1 = sext i1 %0 to i32
156 store i32 %1, i32 addrspace(1)* %out
160 ; FUNC-LABEL: @f32_uge
165 ; SI: V_CNDMASK_B32_e64
166 ; SI: V_CNDMASK_B32_e64
168 define void @f32_uge(i32 addrspace(1)* %out, float %a, float %b) {
170 %0 = fcmp uge float %a, %b
171 %1 = sext i1 %0 to i32
172 store i32 %1, i32 addrspace(1)* %out
176 ; FUNC-LABEL: @f32_ult
181 ; SI: V_CNDMASK_B32_e64
182 ; SI: V_CNDMASK_B32_e64
184 define void @f32_ult(i32 addrspace(1)* %out, float %a, float %b) {
186 %0 = fcmp ult float %a, %b
187 %1 = sext i1 %0 to i32
188 store i32 %1, i32 addrspace(1)* %out
192 ; FUNC-LABEL: @f32_ule
197 ; SI: V_CNDMASK_B32_e64
198 ; SI: V_CNDMASK_B32_e64
200 define void @f32_ule(i32 addrspace(1)* %out, float %a, float %b) {
202 %0 = fcmp ule float %a, %b
203 %1 = sext i1 %0 to i32
204 store i32 %1, i32 addrspace(1)* %out
208 ; FUNC-LABEL: @f32_une
211 define void @f32_une(i32 addrspace(1)* %out, float %a, float %b) {
213 %0 = fcmp une float %a, %b
214 %1 = sext i1 %0 to i32
215 store i32 %1, i32 addrspace(1)* %out
219 ; FUNC-LABEL: @f32_uno
225 define void @f32_uno(i32 addrspace(1)* %out, float %a, float %b) {
227 %0 = fcmp uno float %a, %b
228 %1 = sext i1 %0 to i32
229 store i32 %1, i32 addrspace(1)* %out
233 ;;;==========================================================================;;;
234 ;; 32-bit integer comparisons
235 ;;;==========================================================================;;;
237 ; FUNC-LABEL: @i32_eq
240 define void @i32_eq(i32 addrspace(1)* %out, i32 %a, i32 %b) {
242 %0 = icmp eq i32 %a, %b
243 %1 = sext i1 %0 to i32
244 store i32 %1, i32 addrspace(1)* %out
248 ; FUNC-LABEL: @i32_ne
251 define void @i32_ne(i32 addrspace(1)* %out, i32 %a, i32 %b) {
253 %0 = icmp ne i32 %a, %b
254 %1 = sext i1 %0 to i32
255 store i32 %1, i32 addrspace(1)* %out
259 ; FUNC-LABEL: @i32_ugt
262 define void @i32_ugt(i32 addrspace(1)* %out, i32 %a, i32 %b) {
264 %0 = icmp ugt i32 %a, %b
265 %1 = sext i1 %0 to i32
266 store i32 %1, i32 addrspace(1)* %out
270 ; FUNC-LABEL: @i32_uge
273 define void @i32_uge(i32 addrspace(1)* %out, i32 %a, i32 %b) {
275 %0 = icmp uge i32 %a, %b
276 %1 = sext i1 %0 to i32
277 store i32 %1, i32 addrspace(1)* %out
281 ; FUNC-LABEL: @i32_ult
284 define void @i32_ult(i32 addrspace(1)* %out, i32 %a, i32 %b) {
286 %0 = icmp ult i32 %a, %b
287 %1 = sext i1 %0 to i32
288 store i32 %1, i32 addrspace(1)* %out
292 ; FUNC-LABEL: @i32_ule
295 define void @i32_ule(i32 addrspace(1)* %out, i32 %a, i32 %b) {
297 %0 = icmp ule i32 %a, %b
298 %1 = sext i1 %0 to i32
299 store i32 %1, i32 addrspace(1)* %out
303 ; FUNC-LABEL: @i32_sgt
306 define void @i32_sgt(i32 addrspace(1)* %out, i32 %a, i32 %b) {
308 %0 = icmp sgt i32 %a, %b
309 %1 = sext i1 %0 to i32
310 store i32 %1, i32 addrspace(1)* %out
314 ; FUNC-LABEL: @i32_sge
317 define void @i32_sge(i32 addrspace(1)* %out, i32 %a, i32 %b) {
319 %0 = icmp sge i32 %a, %b
320 %1 = sext i1 %0 to i32
321 store i32 %1, i32 addrspace(1)* %out
325 ; FUNC-LABEL: @i32_slt
328 define void @i32_slt(i32 addrspace(1)* %out, i32 %a, i32 %b) {
330 %0 = icmp slt i32 %a, %b
331 %1 = sext i1 %0 to i32
332 store i32 %1, i32 addrspace(1)* %out
336 ; FUNC-LABEL: @i32_sle
339 define void @i32_sle(i32 addrspace(1)* %out, i32 %a, i32 %b) {
341 %0 = icmp sle i32 %a, %b
342 %1 = sext i1 %0 to i32
343 store i32 %1, i32 addrspace(1)* %out