1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+sse4.1,-avx < %s | FileCheck %s --check-prefix=SSE41 3 ; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+avx,-avx2 < %s | FileCheck %s --check-prefix=AVX --check-prefix=AVX1 4 ; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+avx512dq,+avx512bw < %s | FileCheck %s --check-prefix=AVX --check-prefix=AVX512 5 6 define i32 @veccond128(<4 x i32> %input) { 7 ; SSE41-LABEL: veccond128: 8 ; SSE41: # %bb.0: # %entry 9 ; SSE41-NEXT: ptest %xmm0, %xmm0 10 ; SSE41-NEXT: je .LBB0_2 11 ; SSE41-NEXT: # %bb.1: # %if-true-block 12 ; SSE41-NEXT: xorl %eax, %eax 13 ; SSE41-NEXT: retq 14 ; SSE41-NEXT: .LBB0_2: # %endif-block 15 ; SSE41-NEXT: movl $1, %eax 16 ; SSE41-NEXT: retq 17 ; 18 ; AVX-LABEL: veccond128: 19 ; AVX: # %bb.0: # %entry 20 ; AVX-NEXT: vptest %xmm0, %xmm0 21 ; AVX-NEXT: je .LBB0_2 22 ; AVX-NEXT: # %bb.1: # %if-true-block 23 ; AVX-NEXT: xorl %eax, %eax 24 ; AVX-NEXT: retq 25 ; AVX-NEXT: .LBB0_2: # %endif-block 26 ; AVX-NEXT: movl $1, %eax 27 ; AVX-NEXT: retq 28 entry: 29 %0 = bitcast <4 x i32> %input to i128 30 %1 = icmp ne i128 %0, 0 31 br i1 %1, label %if-true-block, label %endif-block 32 if-true-block: 33 ret i32 0 34 endif-block: 35 ret i32 1 36 } 37 38 define i32 @veccond256(<8 x i32> %input) { 39 ; SSE41-LABEL: veccond256: 40 ; SSE41: # %bb.0: # %entry 41 ; SSE41-NEXT: por %xmm1, %xmm0 42 ; SSE41-NEXT: ptest %xmm0, %xmm0 43 ; SSE41-NEXT: je .LBB1_2 44 ; SSE41-NEXT: # %bb.1: # %if-true-block 45 ; SSE41-NEXT: xorl %eax, %eax 46 ; SSE41-NEXT: retq 47 ; SSE41-NEXT: .LBB1_2: # %endif-block 48 ; SSE41-NEXT: movl $1, %eax 49 ; SSE41-NEXT: retq 50 ; 51 ; AVX-LABEL: veccond256: 52 ; AVX: # %bb.0: # %entry 53 ; AVX-NEXT: vptest %ymm0, %ymm0 54 ; AVX-NEXT: je .LBB1_2 55 ; AVX-NEXT: # %bb.1: # %if-true-block 56 ; AVX-NEXT: xorl %eax, %eax 57 ; AVX-NEXT: vzeroupper 58 ; AVX-NEXT: retq 59 ; AVX-NEXT: .LBB1_2: # %endif-block 60 ; AVX-NEXT: movl $1, %eax 61 ; AVX-NEXT: vzeroupper 62 ; AVX-NEXT: retq 63 entry: 64 %0 = bitcast <8 x i32> %input to i256 65 %1 = icmp ne i256 %0, 0 66 br i1 %1, label %if-true-block, label %endif-block 67 if-true-block: 68 ret i32 0 69 endif-block: 70 ret i32 1 71 } 72 73 define i32 @veccond512(<16 x i32> %input) { 74 ; SSE41-LABEL: veccond512: 75 ; SSE41: # %bb.0: # %entry 76 ; SSE41-NEXT: por %xmm3, %xmm1 77 ; SSE41-NEXT: por %xmm2, %xmm1 78 ; SSE41-NEXT: por %xmm0, %xmm1 79 ; SSE41-NEXT: ptest %xmm1, %xmm1 80 ; SSE41-NEXT: je .LBB2_2 81 ; SSE41-NEXT: # %bb.1: # %if-true-block 82 ; SSE41-NEXT: xorl %eax, %eax 83 ; SSE41-NEXT: retq 84 ; SSE41-NEXT: .LBB2_2: # %endif-block 85 ; SSE41-NEXT: movl $1, %eax 86 ; SSE41-NEXT: retq 87 ; 88 ; AVX1-LABEL: veccond512: 89 ; AVX1: # %bb.0: # %entry 90 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 91 ; AVX1-NEXT: vptest %ymm0, %ymm0 92 ; AVX1-NEXT: je .LBB2_2 93 ; AVX1-NEXT: # %bb.1: # %if-true-block 94 ; AVX1-NEXT: xorl %eax, %eax 95 ; AVX1-NEXT: vzeroupper 96 ; AVX1-NEXT: retq 97 ; AVX1-NEXT: .LBB2_2: # %endif-block 98 ; AVX1-NEXT: movl $1, %eax 99 ; AVX1-NEXT: vzeroupper 100 ; AVX1-NEXT: retq 101 ; 102 ; AVX512-LABEL: veccond512: 103 ; AVX512: # %bb.0: # %entry 104 ; AVX512-NEXT: vextracti32x4 $3, %zmm0, %xmm1 105 ; AVX512-NEXT: vmovq %xmm1, %rax 106 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm2 107 ; AVX512-NEXT: vmovq %xmm2, %rcx 108 ; AVX512-NEXT: orq %rax, %rcx 109 ; AVX512-NEXT: vextracti32x4 $2, %zmm0, %xmm3 110 ; AVX512-NEXT: vmovq %xmm3, %rax 111 ; AVX512-NEXT: orq %rcx, %rax 112 ; AVX512-NEXT: vmovq %xmm0, %rcx 113 ; AVX512-NEXT: orq %rax, %rcx 114 ; AVX512-NEXT: vpextrq $1, %xmm1, %rax 115 ; AVX512-NEXT: vpextrq $1, %xmm2, %rdx 116 ; AVX512-NEXT: orq %rax, %rdx 117 ; AVX512-NEXT: vpextrq $1, %xmm3, %rax 118 ; AVX512-NEXT: orq %rdx, %rax 119 ; AVX512-NEXT: vpextrq $1, %xmm0, %rdx 120 ; AVX512-NEXT: orq %rax, %rdx 121 ; AVX512-NEXT: orq %rcx, %rdx 122 ; AVX512-NEXT: je .LBB2_2 123 ; AVX512-NEXT: # %bb.1: # %if-true-block 124 ; AVX512-NEXT: xorl %eax, %eax 125 ; AVX512-NEXT: vzeroupper 126 ; AVX512-NEXT: retq 127 ; AVX512-NEXT: .LBB2_2: # %endif-block 128 ; AVX512-NEXT: movl $1, %eax 129 ; AVX512-NEXT: vzeroupper 130 ; AVX512-NEXT: retq 131 entry: 132 %0 = bitcast <16 x i32> %input to i512 133 %1 = icmp ne i512 %0, 0 134 br i1 %1, label %if-true-block, label %endif-block 135 if-true-block: 136 ret i32 0 137 endif-block: 138 ret i32 1 139 } 140 141 define i32 @vectest128(<4 x i32> %input) { 142 ; SSE41-LABEL: vectest128: 143 ; SSE41: # %bb.0: 144 ; SSE41-NEXT: xorl %eax, %eax 145 ; SSE41-NEXT: ptest %xmm0, %xmm0 146 ; SSE41-NEXT: setne %al 147 ; SSE41-NEXT: retq 148 ; 149 ; AVX-LABEL: vectest128: 150 ; AVX: # %bb.0: 151 ; AVX-NEXT: xorl %eax, %eax 152 ; AVX-NEXT: vptest %xmm0, %xmm0 153 ; AVX-NEXT: setne %al 154 ; AVX-NEXT: retq 155 %t0 = bitcast <4 x i32> %input to i128 156 %t1 = icmp ne i128 %t0, 0 157 %t2 = zext i1 %t1 to i32 158 ret i32 %t2 159 } 160 161 define i32 @vectest256(<8 x i32> %input) { 162 ; SSE41-LABEL: vectest256: 163 ; SSE41: # %bb.0: 164 ; SSE41-NEXT: por %xmm1, %xmm0 165 ; SSE41-NEXT: xorl %eax, %eax 166 ; SSE41-NEXT: ptest %xmm0, %xmm0 167 ; SSE41-NEXT: setne %al 168 ; SSE41-NEXT: retq 169 ; 170 ; AVX-LABEL: vectest256: 171 ; AVX: # %bb.0: 172 ; AVX-NEXT: xorl %eax, %eax 173 ; AVX-NEXT: vptest %ymm0, %ymm0 174 ; AVX-NEXT: setne %al 175 ; AVX-NEXT: vzeroupper 176 ; AVX-NEXT: retq 177 %t0 = bitcast <8 x i32> %input to i256 178 %t1 = icmp ne i256 %t0, 0 179 %t2 = zext i1 %t1 to i32 180 ret i32 %t2 181 } 182 183 define i32 @vectest512(<16 x i32> %input) { 184 ; SSE41-LABEL: vectest512: 185 ; SSE41: # %bb.0: 186 ; SSE41-NEXT: por %xmm3, %xmm1 187 ; SSE41-NEXT: por %xmm2, %xmm1 188 ; SSE41-NEXT: por %xmm0, %xmm1 189 ; SSE41-NEXT: xorl %eax, %eax 190 ; SSE41-NEXT: ptest %xmm1, %xmm1 191 ; SSE41-NEXT: setne %al 192 ; SSE41-NEXT: retq 193 ; 194 ; AVX1-LABEL: vectest512: 195 ; AVX1: # %bb.0: 196 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 197 ; AVX1-NEXT: xorl %eax, %eax 198 ; AVX1-NEXT: vptest %ymm0, %ymm0 199 ; AVX1-NEXT: setne %al 200 ; AVX1-NEXT: vzeroupper 201 ; AVX1-NEXT: retq 202 ; 203 ; AVX512-LABEL: vectest512: 204 ; AVX512: # %bb.0: 205 ; AVX512-NEXT: vextracti32x4 $3, %zmm0, %xmm1 206 ; AVX512-NEXT: vmovq %xmm1, %rax 207 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm2 208 ; AVX512-NEXT: vmovq %xmm2, %rcx 209 ; AVX512-NEXT: orq %rax, %rcx 210 ; AVX512-NEXT: vextracti32x4 $2, %zmm0, %xmm3 211 ; AVX512-NEXT: vmovq %xmm3, %rax 212 ; AVX512-NEXT: orq %rcx, %rax 213 ; AVX512-NEXT: vmovq %xmm0, %rcx 214 ; AVX512-NEXT: orq %rax, %rcx 215 ; AVX512-NEXT: vpextrq $1, %xmm1, %rax 216 ; AVX512-NEXT: vpextrq $1, %xmm2, %rdx 217 ; AVX512-NEXT: orq %rax, %rdx 218 ; AVX512-NEXT: vpextrq $1, %xmm3, %rax 219 ; AVX512-NEXT: orq %rdx, %rax 220 ; AVX512-NEXT: vpextrq $1, %xmm0, %rdx 221 ; AVX512-NEXT: orq %rax, %rdx 222 ; AVX512-NEXT: xorl %eax, %eax 223 ; AVX512-NEXT: orq %rcx, %rdx 224 ; AVX512-NEXT: setne %al 225 ; AVX512-NEXT: vzeroupper 226 ; AVX512-NEXT: retq 227 %t0 = bitcast <16 x i32> %input to i512 228 %t1 = icmp ne i512 %t0, 0 229 %t2 = zext i1 %t1 to i32 230 ret i32 %t2 231 } 232 233 define i32 @vecsel128(<4 x i32> %input, i32 %a, i32 %b) { 234 ; SSE41-LABEL: vecsel128: 235 ; SSE41: # %bb.0: 236 ; SSE41-NEXT: ptest %xmm0, %xmm0 237 ; SSE41-NEXT: cmovel %esi, %edi 238 ; SSE41-NEXT: movl %edi, %eax 239 ; SSE41-NEXT: retq 240 ; 241 ; AVX-LABEL: vecsel128: 242 ; AVX: # %bb.0: 243 ; AVX-NEXT: vptest %xmm0, %xmm0 244 ; AVX-NEXT: cmovel %esi, %edi 245 ; AVX-NEXT: movl %edi, %eax 246 ; AVX-NEXT: retq 247 %t0 = bitcast <4 x i32> %input to i128 248 %t1 = icmp ne i128 %t0, 0 249 %t2 = select i1 %t1, i32 %a, i32 %b 250 ret i32 %t2 251 } 252 253 define i32 @vecsel256(<8 x i32> %input, i32 %a, i32 %b) { 254 ; SSE41-LABEL: vecsel256: 255 ; SSE41: # %bb.0: 256 ; SSE41-NEXT: por %xmm1, %xmm0 257 ; SSE41-NEXT: ptest %xmm0, %xmm0 258 ; SSE41-NEXT: cmovel %esi, %edi 259 ; SSE41-NEXT: movl %edi, %eax 260 ; SSE41-NEXT: retq 261 ; 262 ; AVX-LABEL: vecsel256: 263 ; AVX: # %bb.0: 264 ; AVX-NEXT: vptest %ymm0, %ymm0 265 ; AVX-NEXT: cmovel %esi, %edi 266 ; AVX-NEXT: movl %edi, %eax 267 ; AVX-NEXT: vzeroupper 268 ; AVX-NEXT: retq 269 %t0 = bitcast <8 x i32> %input to i256 270 %t1 = icmp ne i256 %t0, 0 271 %t2 = select i1 %t1, i32 %a, i32 %b 272 ret i32 %t2 273 } 274 275 define i32 @vecsel512(<16 x i32> %input, i32 %a, i32 %b) { 276 ; SSE41-LABEL: vecsel512: 277 ; SSE41: # %bb.0: 278 ; SSE41-NEXT: por %xmm3, %xmm1 279 ; SSE41-NEXT: por %xmm2, %xmm1 280 ; SSE41-NEXT: por %xmm0, %xmm1 281 ; SSE41-NEXT: ptest %xmm1, %xmm1 282 ; SSE41-NEXT: cmovel %esi, %edi 283 ; SSE41-NEXT: movl %edi, %eax 284 ; SSE41-NEXT: retq 285 ; 286 ; AVX1-LABEL: vecsel512: 287 ; AVX1: # %bb.0: 288 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 289 ; AVX1-NEXT: vptest %ymm0, %ymm0 290 ; AVX1-NEXT: cmovel %esi, %edi 291 ; AVX1-NEXT: movl %edi, %eax 292 ; AVX1-NEXT: vzeroupper 293 ; AVX1-NEXT: retq 294 ; 295 ; AVX512-LABEL: vecsel512: 296 ; AVX512: # %bb.0: 297 ; AVX512-NEXT: vextracti32x4 $3, %zmm0, %xmm1 298 ; AVX512-NEXT: vmovq %xmm1, %rax 299 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm2 300 ; AVX512-NEXT: vmovq %xmm2, %rcx 301 ; AVX512-NEXT: orq %rax, %rcx 302 ; AVX512-NEXT: vextracti32x4 $2, %zmm0, %xmm3 303 ; AVX512-NEXT: vmovq %xmm3, %rax 304 ; AVX512-NEXT: orq %rcx, %rax 305 ; AVX512-NEXT: vmovq %xmm0, %rcx 306 ; AVX512-NEXT: orq %rax, %rcx 307 ; AVX512-NEXT: vpextrq $1, %xmm1, %rax 308 ; AVX512-NEXT: vpextrq $1, %xmm2, %rdx 309 ; AVX512-NEXT: orq %rax, %rdx 310 ; AVX512-NEXT: vpextrq $1, %xmm3, %rax 311 ; AVX512-NEXT: orq %rdx, %rax 312 ; AVX512-NEXT: vpextrq $1, %xmm0, %rdx 313 ; AVX512-NEXT: orq %rax, %rdx 314 ; AVX512-NEXT: orq %rcx, %rdx 315 ; AVX512-NEXT: cmovel %esi, %edi 316 ; AVX512-NEXT: movl %edi, %eax 317 ; AVX512-NEXT: vzeroupper 318 ; AVX512-NEXT: retq 319 %t0 = bitcast <16 x i32> %input to i512 320 %t1 = icmp ne i512 %t0, 0 321 %t2 = select i1 %t1, i32 %a, i32 %b 322 ret i32 %t2 323 } 324