1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-apple-darwin10 | FileCheck %s --check-prefix=CHECK --check-prefix=SSE
3 ; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -fast-isel -fast-isel-abort=1 | FileCheck %s --check-prefix=CHECK --check-prefix=SSE
4 ; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -mcpu=corei7-avx | FileCheck %s --check-prefix=CHECK --check-prefix=AVX
5 ; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -fast-isel -fast-isel-abort=1 -mcpu=corei7-avx | FileCheck %s --check-prefix=CHECK --check-prefix=AVX
8 define float @select_fcmp_one_f32(float %a, float %b, float %c, float %d) {
9 ; SSE-LABEL: select_fcmp_one_f32:
11 ; SSE-NEXT: ucomiss %xmm1, %xmm0
12 ; SSE-NEXT: jne LBB0_2
14 ; SSE-NEXT: movaps %xmm3, %xmm2
16 ; SSE-NEXT: movaps %xmm2, %xmm0
19 ; AVX-LABEL: select_fcmp_one_f32:
21 ; AVX-NEXT: vcmpneq_oqss %xmm1, %xmm0, %xmm0
22 ; AVX-NEXT: vblendvps %xmm0, %xmm2, %xmm3, %xmm0
24 %1 = fcmp one float %a, %b
25 %2 = select i1 %1, float %c, float %d
29 define double @select_fcmp_one_f64(double %a, double %b, double %c, double %d) {
30 ; SSE-LABEL: select_fcmp_one_f64:
32 ; SSE-NEXT: ucomisd %xmm1, %xmm0
33 ; SSE-NEXT: jne LBB1_2
35 ; SSE-NEXT: movaps %xmm3, %xmm2
37 ; SSE-NEXT: movaps %xmm2, %xmm0
40 ; AVX-LABEL: select_fcmp_one_f64:
42 ; AVX-NEXT: vcmpneq_oqsd %xmm1, %xmm0, %xmm0
43 ; AVX-NEXT: vblendvpd %xmm0, %xmm2, %xmm3, %xmm0
45 %1 = fcmp one double %a, %b
46 %2 = select i1 %1, double %c, double %d
50 define float @select_icmp_eq_f32(i64 %a, i64 %b, float %c, float %d) {
51 ; SSE-LABEL: select_icmp_eq_f32:
53 ; SSE-NEXT: cmpq %rsi, %rdi
56 ; SSE-NEXT: movaps %xmm1, %xmm0
60 ; AVX-LABEL: select_icmp_eq_f32:
62 ; AVX-NEXT: cmpq %rsi, %rdi
65 ; AVX-NEXT: vmovaps %xmm1, %xmm0
68 %1 = icmp eq i64 %a, %b
69 %2 = select i1 %1, float %c, float %d
73 define float @select_icmp_ne_f32(i64 %a, i64 %b, float %c, float %d) {
74 ; SSE-LABEL: select_icmp_ne_f32:
76 ; SSE-NEXT: cmpq %rsi, %rdi
77 ; SSE-NEXT: jne LBB3_2
79 ; SSE-NEXT: movaps %xmm1, %xmm0
83 ; AVX-LABEL: select_icmp_ne_f32:
85 ; AVX-NEXT: cmpq %rsi, %rdi
86 ; AVX-NEXT: jne LBB3_2
88 ; AVX-NEXT: vmovaps %xmm1, %xmm0
91 %1 = icmp ne i64 %a, %b
92 %2 = select i1 %1, float %c, float %d
96 define float @select_icmp_ugt_f32(i64 %a, i64 %b, float %c, float %d) {
97 ; SSE-LABEL: select_icmp_ugt_f32:
99 ; SSE-NEXT: cmpq %rsi, %rdi
100 ; SSE-NEXT: ja LBB4_2
101 ; SSE-NEXT: ## %bb.1:
102 ; SSE-NEXT: movaps %xmm1, %xmm0
106 ; AVX-LABEL: select_icmp_ugt_f32:
108 ; AVX-NEXT: cmpq %rsi, %rdi
109 ; AVX-NEXT: ja LBB4_2
110 ; AVX-NEXT: ## %bb.1:
111 ; AVX-NEXT: vmovaps %xmm1, %xmm0
114 %1 = icmp ugt i64 %a, %b
115 %2 = select i1 %1, float %c, float %d
119 define float @select_icmp_uge_f32(i64 %a, i64 %b, float %c, float %d) {
120 ; SSE-LABEL: select_icmp_uge_f32:
122 ; SSE-NEXT: cmpq %rsi, %rdi
123 ; SSE-NEXT: jae LBB5_2
124 ; SSE-NEXT: ## %bb.1:
125 ; SSE-NEXT: movaps %xmm1, %xmm0
129 ; AVX-LABEL: select_icmp_uge_f32:
131 ; AVX-NEXT: cmpq %rsi, %rdi
132 ; AVX-NEXT: jae LBB5_2
133 ; AVX-NEXT: ## %bb.1:
134 ; AVX-NEXT: vmovaps %xmm1, %xmm0
137 %1 = icmp uge i64 %a, %b
138 %2 = select i1 %1, float %c, float %d
142 define float @select_icmp_ult_f32(i64 %a, i64 %b, float %c, float %d) {
143 ; SSE-LABEL: select_icmp_ult_f32:
145 ; SSE-NEXT: cmpq %rsi, %rdi
146 ; SSE-NEXT: jb LBB6_2
147 ; SSE-NEXT: ## %bb.1:
148 ; SSE-NEXT: movaps %xmm1, %xmm0
152 ; AVX-LABEL: select_icmp_ult_f32:
154 ; AVX-NEXT: cmpq %rsi, %rdi
155 ; AVX-NEXT: jb LBB6_2
156 ; AVX-NEXT: ## %bb.1:
157 ; AVX-NEXT: vmovaps %xmm1, %xmm0
160 %1 = icmp ult i64 %a, %b
161 %2 = select i1 %1, float %c, float %d
165 define float @select_icmp_ule_f32(i64 %a, i64 %b, float %c, float %d) {
166 ; SSE-LABEL: select_icmp_ule_f32:
168 ; SSE-NEXT: cmpq %rsi, %rdi
169 ; SSE-NEXT: jbe LBB7_2
170 ; SSE-NEXT: ## %bb.1:
171 ; SSE-NEXT: movaps %xmm1, %xmm0
175 ; AVX-LABEL: select_icmp_ule_f32:
177 ; AVX-NEXT: cmpq %rsi, %rdi
178 ; AVX-NEXT: jbe LBB7_2
179 ; AVX-NEXT: ## %bb.1:
180 ; AVX-NEXT: vmovaps %xmm1, %xmm0
183 %1 = icmp ule i64 %a, %b
184 %2 = select i1 %1, float %c, float %d
188 define float @select_icmp_sgt_f32(i64 %a, i64 %b, float %c, float %d) {
189 ; SSE-LABEL: select_icmp_sgt_f32:
191 ; SSE-NEXT: cmpq %rsi, %rdi
192 ; SSE-NEXT: jg LBB8_2
193 ; SSE-NEXT: ## %bb.1:
194 ; SSE-NEXT: movaps %xmm1, %xmm0
198 ; AVX-LABEL: select_icmp_sgt_f32:
200 ; AVX-NEXT: cmpq %rsi, %rdi
201 ; AVX-NEXT: jg LBB8_2
202 ; AVX-NEXT: ## %bb.1:
203 ; AVX-NEXT: vmovaps %xmm1, %xmm0
206 %1 = icmp sgt i64 %a, %b
207 %2 = select i1 %1, float %c, float %d
211 define float @select_icmp_sge_f32(i64 %a, i64 %b, float %c, float %d) {
212 ; SSE-LABEL: select_icmp_sge_f32:
214 ; SSE-NEXT: cmpq %rsi, %rdi
215 ; SSE-NEXT: jge LBB9_2
216 ; SSE-NEXT: ## %bb.1:
217 ; SSE-NEXT: movaps %xmm1, %xmm0
221 ; AVX-LABEL: select_icmp_sge_f32:
223 ; AVX-NEXT: cmpq %rsi, %rdi
224 ; AVX-NEXT: jge LBB9_2
225 ; AVX-NEXT: ## %bb.1:
226 ; AVX-NEXT: vmovaps %xmm1, %xmm0
229 %1 = icmp sge i64 %a, %b
230 %2 = select i1 %1, float %c, float %d
234 define float @select_icmp_slt_f32(i64 %a, i64 %b, float %c, float %d) {
235 ; SSE-LABEL: select_icmp_slt_f32:
237 ; SSE-NEXT: cmpq %rsi, %rdi
238 ; SSE-NEXT: jl LBB10_2
239 ; SSE-NEXT: ## %bb.1:
240 ; SSE-NEXT: movaps %xmm1, %xmm0
244 ; AVX-LABEL: select_icmp_slt_f32:
246 ; AVX-NEXT: cmpq %rsi, %rdi
247 ; AVX-NEXT: jl LBB10_2
248 ; AVX-NEXT: ## %bb.1:
249 ; AVX-NEXT: vmovaps %xmm1, %xmm0
252 %1 = icmp slt i64 %a, %b
253 %2 = select i1 %1, float %c, float %d
257 define float @select_icmp_sle_f32(i64 %a, i64 %b, float %c, float %d) {
258 ; SSE-LABEL: select_icmp_sle_f32:
260 ; SSE-NEXT: cmpq %rsi, %rdi
261 ; SSE-NEXT: jle LBB11_2
262 ; SSE-NEXT: ## %bb.1:
263 ; SSE-NEXT: movaps %xmm1, %xmm0
267 ; AVX-LABEL: select_icmp_sle_f32:
269 ; AVX-NEXT: cmpq %rsi, %rdi
270 ; AVX-NEXT: jle LBB11_2
271 ; AVX-NEXT: ## %bb.1:
272 ; AVX-NEXT: vmovaps %xmm1, %xmm0
275 %1 = icmp sle i64 %a, %b
276 %2 = select i1 %1, float %c, float %d
280 define i8 @select_icmp_sle_i8(i64 %a, i64 %b, i8 %c, i8 %d) {
281 ; CHECK-LABEL: select_icmp_sle_i8:
283 ; CHECK-NEXT: cmpq %rsi, %rdi
284 ; CHECK-NEXT: jle LBB12_1
285 ; CHECK-NEXT: ## %bb.2:
286 ; CHECK-NEXT: movl %ecx, %eax
287 ; CHECK-NEXT: ## kill: def $al killed $al killed $eax
289 ; CHECK-NEXT: LBB12_1:
290 ; CHECK-NEXT: movl %edx, %eax
291 ; CHECK-NEXT: ## kill: def $al killed $al killed $eax
293 %1 = icmp sle i64 %a, %b
294 %2 = select i1 %1, i8 %c, i8 %d