1 ;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck --check-prefix=R600 --check-prefix=FUNC %s
2 ;RUN: llc < %s -march=r600 -mcpu=SI | 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
100 define void @f32_one(i32 addrspace(1)* %out, float %a, float %b) {
102 %0 = fcmp one float %a, %b
103 %1 = sext i1 %0 to i32
104 store i32 %1, i32 addrspace(1)* %out
108 ; FUNC-LABEL: @f32_ord
109 ; R600-DAG: SETE_DX10
110 ; R600-DAG: SETE_DX10
112 ; R600-DAG: SETNE_INT
114 define void @f32_ord(i32 addrspace(1)* %out, float %a, float %b) {
116 %0 = fcmp ord float %a, %b
117 %1 = sext i1 %0 to i32
118 store i32 %1, i32 addrspace(1)* %out
122 ; FUNC-LABEL: @f32_ueq
123 ; R600-DAG: SETNE_DX10
124 ; R600-DAG: SETNE_DX10
126 ; R600-DAG: SETE_DX10
128 ; R600-DAG: SETNE_INT
132 define void @f32_ueq(i32 addrspace(1)* %out, float %a, float %b) {
134 %0 = fcmp ueq float %a, %b
135 %1 = sext i1 %0 to i32
136 store i32 %1, i32 addrspace(1)* %out
140 ; FUNC-LABEL: @f32_ugt
146 define void @f32_ugt(i32 addrspace(1)* %out, float %a, float %b) {
148 %0 = fcmp ugt float %a, %b
149 %1 = sext i1 %0 to i32
150 store i32 %1, i32 addrspace(1)* %out
154 ; FUNC-LABEL: @f32_uge
160 define void @f32_uge(i32 addrspace(1)* %out, float %a, float %b) {
162 %0 = fcmp uge float %a, %b
163 %1 = sext i1 %0 to i32
164 store i32 %1, i32 addrspace(1)* %out
168 ; FUNC-LABEL: @f32_ult
174 define void @f32_ult(i32 addrspace(1)* %out, float %a, float %b) {
176 %0 = fcmp ult float %a, %b
177 %1 = sext i1 %0 to i32
178 store i32 %1, i32 addrspace(1)* %out
182 ; FUNC-LABEL: @f32_ule
188 define void @f32_ule(i32 addrspace(1)* %out, float %a, float %b) {
190 %0 = fcmp ule float %a, %b
191 %1 = sext i1 %0 to i32
192 store i32 %1, i32 addrspace(1)* %out
196 ; FUNC-LABEL: @f32_une
199 define void @f32_une(i32 addrspace(1)* %out, float %a, float %b) {
201 %0 = fcmp une float %a, %b
202 %1 = sext i1 %0 to i32
203 store i32 %1, i32 addrspace(1)* %out
207 ; FUNC-LABEL: @f32_uno
213 define void @f32_uno(i32 addrspace(1)* %out, float %a, float %b) {
215 %0 = fcmp uno float %a, %b
216 %1 = sext i1 %0 to i32
217 store i32 %1, i32 addrspace(1)* %out
221 ;;;==========================================================================;;;
222 ;; 32-bit integer comparisons
223 ;;;==========================================================================;;;
225 ; FUNC-LABEL: @i32_eq
228 define void @i32_eq(i32 addrspace(1)* %out, i32 %a, i32 %b) {
230 %0 = icmp eq i32 %a, %b
231 %1 = sext i1 %0 to i32
232 store i32 %1, i32 addrspace(1)* %out
236 ; FUNC-LABEL: @i32_ne
239 define void @i32_ne(i32 addrspace(1)* %out, i32 %a, i32 %b) {
241 %0 = icmp ne i32 %a, %b
242 %1 = sext i1 %0 to i32
243 store i32 %1, i32 addrspace(1)* %out
247 ; FUNC-LABEL: @i32_ugt
250 define void @i32_ugt(i32 addrspace(1)* %out, i32 %a, i32 %b) {
252 %0 = icmp ugt i32 %a, %b
253 %1 = sext i1 %0 to i32
254 store i32 %1, i32 addrspace(1)* %out
258 ; FUNC-LABEL: @i32_uge
261 define void @i32_uge(i32 addrspace(1)* %out, i32 %a, i32 %b) {
263 %0 = icmp uge i32 %a, %b
264 %1 = sext i1 %0 to i32
265 store i32 %1, i32 addrspace(1)* %out
269 ; FUNC-LABEL: @i32_ult
272 define void @i32_ult(i32 addrspace(1)* %out, i32 %a, i32 %b) {
274 %0 = icmp ult i32 %a, %b
275 %1 = sext i1 %0 to i32
276 store i32 %1, i32 addrspace(1)* %out
280 ; FUNC-LABEL: @i32_ule
283 define void @i32_ule(i32 addrspace(1)* %out, i32 %a, i32 %b) {
285 %0 = icmp ule i32 %a, %b
286 %1 = sext i1 %0 to i32
287 store i32 %1, i32 addrspace(1)* %out
291 ; FUNC-LABEL: @i32_sgt
294 define void @i32_sgt(i32 addrspace(1)* %out, i32 %a, i32 %b) {
296 %0 = icmp sgt i32 %a, %b
297 %1 = sext i1 %0 to i32
298 store i32 %1, i32 addrspace(1)* %out
302 ; FUNC-LABEL: @i32_sge
305 define void @i32_sge(i32 addrspace(1)* %out, i32 %a, i32 %b) {
307 %0 = icmp sge i32 %a, %b
308 %1 = sext i1 %0 to i32
309 store i32 %1, i32 addrspace(1)* %out
313 ; FUNC-LABEL: @i32_slt
316 define void @i32_slt(i32 addrspace(1)* %out, i32 %a, i32 %b) {
318 %0 = icmp slt i32 %a, %b
319 %1 = sext i1 %0 to i32
320 store i32 %1, i32 addrspace(1)* %out
324 ; FUNC-LABEL: @i32_sle
327 define void @i32_sle(i32 addrspace(1)* %out, i32 %a, i32 %b) {
329 %0 = icmp sle i32 %a, %b
330 %1 = sext i1 %0 to i32
331 store i32 %1, i32 addrspace(1)* %out