1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2 3 ; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41 4 ; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1 5 ; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2 6 7 ; 8 ; ExtractElement - Constant Index 9 ; 10 11 define i8 @extractelement_v16i8_1(<16 x i8> %a) nounwind { 12 ; SSE2-LABEL: extractelement_v16i8_1: 13 ; SSE2: # BB#0: 14 ; SSE2-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp) 15 ; SSE2-NEXT: movb -{{[0-9]+}}(%rsp), %al 16 ; SSE2-NEXT: retq 17 ; 18 ; SSE41-LABEL: extractelement_v16i8_1: 19 ; SSE41: # BB#0: 20 ; SSE41-NEXT: pextrb $1, %xmm0, %eax 21 ; SSE41-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> 22 ; SSE41-NEXT: retq 23 ; 24 ; AVX-LABEL: extractelement_v16i8_1: 25 ; AVX: # BB#0: 26 ; AVX-NEXT: vpextrb $1, %xmm0, %eax 27 ; AVX-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> 28 ; AVX-NEXT: retq 29 %b = extractelement <16 x i8> %a, i256 1 30 ret i8 %b 31 } 32 33 define i8 @extractelement_v16i8_11(<16 x i8> %a) nounwind { 34 ; SSE2-LABEL: extractelement_v16i8_11: 35 ; SSE2: # BB#0: 36 ; SSE2-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp) 37 ; SSE2-NEXT: movb -{{[0-9]+}}(%rsp), %al 38 ; SSE2-NEXT: retq 39 ; 40 ; SSE41-LABEL: extractelement_v16i8_11: 41 ; SSE41: # BB#0: 42 ; SSE41-NEXT: pextrb $11, %xmm0, %eax 43 ; SSE41-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> 44 ; SSE41-NEXT: retq 45 ; 46 ; AVX-LABEL: extractelement_v16i8_11: 47 ; AVX: # BB#0: 48 ; AVX-NEXT: vpextrb $11, %xmm0, %eax 49 ; AVX-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> 50 ; AVX-NEXT: retq 51 %b = extractelement <16 x i8> %a, i256 11 52 ret i8 %b 53 } 54 55 define i8 @extractelement_v16i8_14(<16 x i8> %a) nounwind { 56 ; SSE2-LABEL: extractelement_v16i8_14: 57 ; SSE2: # BB#0: 58 ; SSE2-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp) 59 ; SSE2-NEXT: movb -{{[0-9]+}}(%rsp), %al 60 ; SSE2-NEXT: retq 61 ; 62 ; SSE41-LABEL: extractelement_v16i8_14: 63 ; SSE41: # BB#0: 64 ; SSE41-NEXT: pextrb $14, %xmm0, %eax 65 ; SSE41-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> 66 ; SSE41-NEXT: retq 67 ; 68 ; AVX-LABEL: extractelement_v16i8_14: 69 ; AVX: # BB#0: 70 ; AVX-NEXT: vpextrb $14, %xmm0, %eax 71 ; AVX-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> 72 ; AVX-NEXT: retq 73 %b = extractelement <16 x i8> %a, i256 14 74 ret i8 %b 75 } 76 77 define i8 @extractelement_v32i8_1(<32 x i8> %a) nounwind { 78 ; SSE2-LABEL: extractelement_v32i8_1: 79 ; SSE2: # BB#0: 80 ; SSE2-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp) 81 ; SSE2-NEXT: movb -{{[0-9]+}}(%rsp), %al 82 ; SSE2-NEXT: retq 83 ; 84 ; SSE41-LABEL: extractelement_v32i8_1: 85 ; SSE41: # BB#0: 86 ; SSE41-NEXT: pextrb $1, %xmm0, %eax 87 ; SSE41-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> 88 ; SSE41-NEXT: retq 89 ; 90 ; AVX-LABEL: extractelement_v32i8_1: 91 ; AVX: # BB#0: 92 ; AVX-NEXT: vpextrb $1, %xmm0, %eax 93 ; AVX-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> 94 ; AVX-NEXT: vzeroupper 95 ; AVX-NEXT: retq 96 %b = extractelement <32 x i8> %a, i256 1 97 ret i8 %b 98 } 99 100 define i8 @extractelement_v32i8_17(<32 x i8> %a) nounwind { 101 ; SSE2-LABEL: extractelement_v32i8_17: 102 ; SSE2: # BB#0: 103 ; SSE2-NEXT: movaps %xmm1, -{{[0-9]+}}(%rsp) 104 ; SSE2-NEXT: movb -{{[0-9]+}}(%rsp), %al 105 ; SSE2-NEXT: retq 106 ; 107 ; SSE41-LABEL: extractelement_v32i8_17: 108 ; SSE41: # BB#0: 109 ; SSE41-NEXT: pextrb $1, %xmm1, %eax 110 ; SSE41-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> 111 ; SSE41-NEXT: retq 112 ; 113 ; AVX1-LABEL: extractelement_v32i8_17: 114 ; AVX1: # BB#0: 115 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 116 ; AVX1-NEXT: vpextrb $1, %xmm0, %eax 117 ; AVX1-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> 118 ; AVX1-NEXT: vzeroupper 119 ; AVX1-NEXT: retq 120 ; 121 ; AVX2-LABEL: extractelement_v32i8_17: 122 ; AVX2: # BB#0: 123 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 124 ; AVX2-NEXT: vpextrb $1, %xmm0, %eax 125 ; AVX2-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> 126 ; AVX2-NEXT: vzeroupper 127 ; AVX2-NEXT: retq 128 %b = extractelement <32 x i8> %a, i256 17 129 ret i8 %b 130 } 131 132 define i16 @extractelement_v8i16_0(<8 x i16> %a, i256 %i) nounwind { 133 ; SSE-LABEL: extractelement_v8i16_0: 134 ; SSE: # BB#0: 135 ; SSE-NEXT: movd %xmm0, %eax 136 ; SSE-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill> 137 ; SSE-NEXT: retq 138 ; 139 ; AVX-LABEL: extractelement_v8i16_0: 140 ; AVX: # BB#0: 141 ; AVX-NEXT: vmovd %xmm0, %eax 142 ; AVX-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill> 143 ; AVX-NEXT: retq 144 %b = extractelement <8 x i16> %a, i256 0 145 ret i16 %b 146 } 147 148 define i16 @extractelement_v8i16_3(<8 x i16> %a, i256 %i) nounwind { 149 ; SSE-LABEL: extractelement_v8i16_3: 150 ; SSE: # BB#0: 151 ; SSE-NEXT: pextrw $3, %xmm0, %eax 152 ; SSE-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill> 153 ; SSE-NEXT: retq 154 ; 155 ; AVX-LABEL: extractelement_v8i16_3: 156 ; AVX: # BB#0: 157 ; AVX-NEXT: vpextrw $3, %xmm0, %eax 158 ; AVX-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill> 159 ; AVX-NEXT: retq 160 %b = extractelement <8 x i16> %a, i256 3 161 ret i16 %b 162 } 163 164 define i16 @extractelement_v16i16_0(<16 x i16> %a, i256 %i) nounwind { 165 ; SSE-LABEL: extractelement_v16i16_0: 166 ; SSE: # BB#0: 167 ; SSE-NEXT: movd %xmm0, %eax 168 ; SSE-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill> 169 ; SSE-NEXT: retq 170 ; 171 ; AVX-LABEL: extractelement_v16i16_0: 172 ; AVX: # BB#0: 173 ; AVX-NEXT: vmovd %xmm0, %eax 174 ; AVX-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill> 175 ; AVX-NEXT: vzeroupper 176 ; AVX-NEXT: retq 177 %b = extractelement <16 x i16> %a, i256 0 178 ret i16 %b 179 } 180 181 define i16 @extractelement_v16i16_13(<16 x i16> %a, i256 %i) nounwind { 182 ; SSE-LABEL: extractelement_v16i16_13: 183 ; SSE: # BB#0: 184 ; SSE-NEXT: pextrw $5, %xmm1, %eax 185 ; SSE-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill> 186 ; SSE-NEXT: retq 187 ; 188 ; AVX1-LABEL: extractelement_v16i16_13: 189 ; AVX1: # BB#0: 190 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 191 ; AVX1-NEXT: vpextrw $5, %xmm0, %eax 192 ; AVX1-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill> 193 ; AVX1-NEXT: vzeroupper 194 ; AVX1-NEXT: retq 195 ; 196 ; AVX2-LABEL: extractelement_v16i16_13: 197 ; AVX2: # BB#0: 198 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 199 ; AVX2-NEXT: vpextrw $5, %xmm0, %eax 200 ; AVX2-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill> 201 ; AVX2-NEXT: vzeroupper 202 ; AVX2-NEXT: retq 203 %b = extractelement <16 x i16> %a, i256 13 204 ret i16 %b 205 } 206 207 define i32 @extractelement_v4i32_0(<4 x i32> %a) nounwind { 208 ; SSE-LABEL: extractelement_v4i32_0: 209 ; SSE: # BB#0: 210 ; SSE-NEXT: movd %xmm0, %eax 211 ; SSE-NEXT: retq 212 ; 213 ; AVX-LABEL: extractelement_v4i32_0: 214 ; AVX: # BB#0: 215 ; AVX-NEXT: vmovd %xmm0, %eax 216 ; AVX-NEXT: retq 217 %b = extractelement <4 x i32> %a, i256 0 218 ret i32 %b 219 } 220 221 define i32 @extractelement_v4i32_3(<4 x i32> %a) nounwind { 222 ; SSE2-LABEL: extractelement_v4i32_3: 223 ; SSE2: # BB#0: 224 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3] 225 ; SSE2-NEXT: movd %xmm0, %eax 226 ; SSE2-NEXT: retq 227 ; 228 ; SSE41-LABEL: extractelement_v4i32_3: 229 ; SSE41: # BB#0: 230 ; SSE41-NEXT: pextrd $3, %xmm0, %eax 231 ; SSE41-NEXT: retq 232 ; 233 ; AVX-LABEL: extractelement_v4i32_3: 234 ; AVX: # BB#0: 235 ; AVX-NEXT: vpextrd $3, %xmm0, %eax 236 ; AVX-NEXT: retq 237 %b = extractelement <4 x i32> %a, i256 3 238 ret i32 %b 239 } 240 241 define i32 @extractelement_v8i32_0(<8 x i32> %a) nounwind { 242 ; SSE-LABEL: extractelement_v8i32_0: 243 ; SSE: # BB#0: 244 ; SSE-NEXT: movd %xmm1, %eax 245 ; SSE-NEXT: retq 246 ; 247 ; AVX-LABEL: extractelement_v8i32_0: 248 ; AVX: # BB#0: 249 ; AVX-NEXT: vextractf128 $1, %ymm0, %xmm0 250 ; AVX-NEXT: vmovd %xmm0, %eax 251 ; AVX-NEXT: vzeroupper 252 ; AVX-NEXT: retq 253 %b = extractelement <8 x i32> %a, i256 4 254 ret i32 %b 255 } 256 257 define i32 @extractelement_v8i32_4(<8 x i32> %a) nounwind { 258 ; SSE-LABEL: extractelement_v8i32_4: 259 ; SSE: # BB#0: 260 ; SSE-NEXT: movd %xmm1, %eax 261 ; SSE-NEXT: retq 262 ; 263 ; AVX-LABEL: extractelement_v8i32_4: 264 ; AVX: # BB#0: 265 ; AVX-NEXT: vextractf128 $1, %ymm0, %xmm0 266 ; AVX-NEXT: vmovd %xmm0, %eax 267 ; AVX-NEXT: vzeroupper 268 ; AVX-NEXT: retq 269 %b = extractelement <8 x i32> %a, i256 4 270 ret i32 %b 271 } 272 273 define i32 @extractelement_v8i32_7(<8 x i32> %a) nounwind { 274 ; SSE2-LABEL: extractelement_v8i32_7: 275 ; SSE2: # BB#0: 276 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[3,1,2,3] 277 ; SSE2-NEXT: movd %xmm0, %eax 278 ; SSE2-NEXT: retq 279 ; 280 ; SSE41-LABEL: extractelement_v8i32_7: 281 ; SSE41: # BB#0: 282 ; SSE41-NEXT: pextrd $3, %xmm1, %eax 283 ; SSE41-NEXT: retq 284 ; 285 ; AVX1-LABEL: extractelement_v8i32_7: 286 ; AVX1: # BB#0: 287 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 288 ; AVX1-NEXT: vpextrd $3, %xmm0, %eax 289 ; AVX1-NEXT: vzeroupper 290 ; AVX1-NEXT: retq 291 ; 292 ; AVX2-LABEL: extractelement_v8i32_7: 293 ; AVX2: # BB#0: 294 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 295 ; AVX2-NEXT: vpextrd $3, %xmm0, %eax 296 ; AVX2-NEXT: vzeroupper 297 ; AVX2-NEXT: retq 298 %b = extractelement <8 x i32> %a, i64 7 299 ret i32 %b 300 } 301 302 define i64 @extractelement_v2i64_0(<2 x i64> %a, i256 %i) nounwind { 303 ; SSE-LABEL: extractelement_v2i64_0: 304 ; SSE: # BB#0: 305 ; SSE-NEXT: movd %xmm0, %rax 306 ; SSE-NEXT: retq 307 ; 308 ; AVX-LABEL: extractelement_v2i64_0: 309 ; AVX: # BB#0: 310 ; AVX-NEXT: vmovq %xmm0, %rax 311 ; AVX-NEXT: retq 312 %b = extractelement <2 x i64> %a, i256 0 313 ret i64 %b 314 } 315 316 define i64 @extractelement_v2i64_1(<2 x i64> %a, i256 %i) nounwind { 317 ; SSE2-LABEL: extractelement_v2i64_1: 318 ; SSE2: # BB#0: 319 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 320 ; SSE2-NEXT: movd %xmm0, %rax 321 ; SSE2-NEXT: retq 322 ; 323 ; SSE41-LABEL: extractelement_v2i64_1: 324 ; SSE41: # BB#0: 325 ; SSE41-NEXT: pextrq $1, %xmm0, %rax 326 ; SSE41-NEXT: retq 327 ; 328 ; AVX-LABEL: extractelement_v2i64_1: 329 ; AVX: # BB#0: 330 ; AVX-NEXT: vpextrq $1, %xmm0, %rax 331 ; AVX-NEXT: retq 332 %b = extractelement <2 x i64> %a, i256 1 333 ret i64 %b 334 } 335 336 define i64 @extractelement_v4i64_1(<4 x i64> %a, i256 %i) nounwind { 337 ; SSE2-LABEL: extractelement_v4i64_1: 338 ; SSE2: # BB#0: 339 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 340 ; SSE2-NEXT: movd %xmm0, %rax 341 ; SSE2-NEXT: retq 342 ; 343 ; SSE41-LABEL: extractelement_v4i64_1: 344 ; SSE41: # BB#0: 345 ; SSE41-NEXT: pextrq $1, %xmm0, %rax 346 ; SSE41-NEXT: retq 347 ; 348 ; AVX-LABEL: extractelement_v4i64_1: 349 ; AVX: # BB#0: 350 ; AVX-NEXT: vpextrq $1, %xmm0, %rax 351 ; AVX-NEXT: vzeroupper 352 ; AVX-NEXT: retq 353 %b = extractelement <4 x i64> %a, i256 1 354 ret i64 %b 355 } 356 357 define i64 @extractelement_v4i64_3(<4 x i64> %a, i256 %i) nounwind { 358 ; SSE2-LABEL: extractelement_v4i64_3: 359 ; SSE2: # BB#0: 360 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1] 361 ; SSE2-NEXT: movd %xmm0, %rax 362 ; SSE2-NEXT: retq 363 ; 364 ; SSE41-LABEL: extractelement_v4i64_3: 365 ; SSE41: # BB#0: 366 ; SSE41-NEXT: pextrq $1, %xmm1, %rax 367 ; SSE41-NEXT: retq 368 ; 369 ; AVX1-LABEL: extractelement_v4i64_3: 370 ; AVX1: # BB#0: 371 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 372 ; AVX1-NEXT: vpextrq $1, %xmm0, %rax 373 ; AVX1-NEXT: vzeroupper 374 ; AVX1-NEXT: retq 375 ; 376 ; AVX2-LABEL: extractelement_v4i64_3: 377 ; AVX2: # BB#0: 378 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 379 ; AVX2-NEXT: vpextrq $1, %xmm0, %rax 380 ; AVX2-NEXT: vzeroupper 381 ; AVX2-NEXT: retq 382 %b = extractelement <4 x i64> %a, i256 3 383 ret i64 %b 384 } 385 386 ; 387 ; ExtractElement - Variable Index 388 ; 389 390 define i8 @extractelement_v16i8_var(<16 x i8> %a, i256 %i) nounwind { 391 ; SSE-LABEL: extractelement_v16i8_var: 392 ; SSE: # BB#0: 393 ; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp) 394 ; SSE-NEXT: leaq -{{[0-9]+}}(%rsp), %rax 395 ; SSE-NEXT: movb (%rdi,%rax), %al 396 ; SSE-NEXT: retq 397 ; 398 ; AVX-LABEL: extractelement_v16i8_var: 399 ; AVX: # BB#0: 400 ; AVX-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp) 401 ; AVX-NEXT: leaq -{{[0-9]+}}(%rsp), %rax 402 ; AVX-NEXT: movb (%rdi,%rax), %al 403 ; AVX-NEXT: retq 404 %b = extractelement <16 x i8> %a, i256 %i 405 ret i8 %b 406 } 407 408 define i8 @extractelement_v32i8_var(<32 x i8> %a, i256 %i) nounwind { 409 ; SSE-LABEL: extractelement_v32i8_var: 410 ; SSE: # BB#0: 411 ; SSE-NEXT: pushq %rbp 412 ; SSE-NEXT: movq %rsp, %rbp 413 ; SSE-NEXT: andq $-32, %rsp 414 ; SSE-NEXT: subq $64, %rsp 415 ; SSE-NEXT: movaps %xmm1, {{[0-9]+}}(%rsp) 416 ; SSE-NEXT: movaps %xmm0, (%rsp) 417 ; SSE-NEXT: leaq (%rsp), %rax 418 ; SSE-NEXT: movb (%rdi,%rax), %al 419 ; SSE-NEXT: movq %rbp, %rsp 420 ; SSE-NEXT: popq %rbp 421 ; SSE-NEXT: retq 422 ; 423 ; AVX-LABEL: extractelement_v32i8_var: 424 ; AVX: # BB#0: 425 ; AVX-NEXT: pushq %rbp 426 ; AVX-NEXT: movq %rsp, %rbp 427 ; AVX-NEXT: andq $-32, %rsp 428 ; AVX-NEXT: subq $64, %rsp 429 ; AVX-NEXT: vmovaps %ymm0, (%rsp) 430 ; AVX-NEXT: leaq (%rsp), %rax 431 ; AVX-NEXT: movb (%rdi,%rax), %al 432 ; AVX-NEXT: movq %rbp, %rsp 433 ; AVX-NEXT: popq %rbp 434 ; AVX-NEXT: vzeroupper 435 ; AVX-NEXT: retq 436 %b = extractelement <32 x i8> %a, i256 %i 437 ret i8 %b 438 } 439 440 define i16 @extractelement_v8i16_var(<8 x i16> %a, i256 %i) nounwind { 441 ; SSE-LABEL: extractelement_v8i16_var: 442 ; SSE: # BB#0: 443 ; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp) 444 ; SSE-NEXT: movzwl -24(%rsp,%rdi,2), %eax 445 ; SSE-NEXT: retq 446 ; 447 ; AVX-LABEL: extractelement_v8i16_var: 448 ; AVX: # BB#0: 449 ; AVX-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp) 450 ; AVX-NEXT: movzwl -24(%rsp,%rdi,2), %eax 451 ; AVX-NEXT: retq 452 %b = extractelement <8 x i16> %a, i256 %i 453 ret i16 %b 454 } 455 456 define i16 @extractelement_v16i16_var(<16 x i16> %a, i256 %i) nounwind { 457 ; SSE-LABEL: extractelement_v16i16_var: 458 ; SSE: # BB#0: 459 ; SSE-NEXT: pushq %rbp 460 ; SSE-NEXT: movq %rsp, %rbp 461 ; SSE-NEXT: andq $-32, %rsp 462 ; SSE-NEXT: subq $64, %rsp 463 ; SSE-NEXT: movaps %xmm1, {{[0-9]+}}(%rsp) 464 ; SSE-NEXT: movaps %xmm0, (%rsp) 465 ; SSE-NEXT: movzwl (%rsp,%rdi,2), %eax 466 ; SSE-NEXT: movq %rbp, %rsp 467 ; SSE-NEXT: popq %rbp 468 ; SSE-NEXT: retq 469 ; 470 ; AVX-LABEL: extractelement_v16i16_var: 471 ; AVX: # BB#0: 472 ; AVX-NEXT: pushq %rbp 473 ; AVX-NEXT: movq %rsp, %rbp 474 ; AVX-NEXT: andq $-32, %rsp 475 ; AVX-NEXT: subq $64, %rsp 476 ; AVX-NEXT: vmovaps %ymm0, (%rsp) 477 ; AVX-NEXT: movzwl (%rsp,%rdi,2), %eax 478 ; AVX-NEXT: movq %rbp, %rsp 479 ; AVX-NEXT: popq %rbp 480 ; AVX-NEXT: vzeroupper 481 ; AVX-NEXT: retq 482 %b = extractelement <16 x i16> %a, i256 %i 483 ret i16 %b 484 } 485 486 define i32 @extractelement_v4i32_var(<4 x i32> %a, i256 %i) nounwind { 487 ; SSE-LABEL: extractelement_v4i32_var: 488 ; SSE: # BB#0: 489 ; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp) 490 ; SSE-NEXT: movl -24(%rsp,%rdi,4), %eax 491 ; SSE-NEXT: retq 492 ; 493 ; AVX-LABEL: extractelement_v4i32_var: 494 ; AVX: # BB#0: 495 ; AVX-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp) 496 ; AVX-NEXT: movl -24(%rsp,%rdi,4), %eax 497 ; AVX-NEXT: retq 498 %b = extractelement <4 x i32> %a, i256 %i 499 ret i32 %b 500 } 501 502 define i32 @extractelement_v8i32_var(<8 x i32> %a, i256 %i) nounwind { 503 ; SSE-LABEL: extractelement_v8i32_var: 504 ; SSE: # BB#0: 505 ; SSE-NEXT: pushq %rbp 506 ; SSE-NEXT: movq %rsp, %rbp 507 ; SSE-NEXT: andq $-32, %rsp 508 ; SSE-NEXT: subq $64, %rsp 509 ; SSE-NEXT: movaps %xmm1, {{[0-9]+}}(%rsp) 510 ; SSE-NEXT: movaps %xmm0, (%rsp) 511 ; SSE-NEXT: movl (%rsp,%rdi,4), %eax 512 ; SSE-NEXT: movq %rbp, %rsp 513 ; SSE-NEXT: popq %rbp 514 ; SSE-NEXT: retq 515 ; 516 ; AVX1-LABEL: extractelement_v8i32_var: 517 ; AVX1: # BB#0: 518 ; AVX1-NEXT: pushq %rbp 519 ; AVX1-NEXT: movq %rsp, %rbp 520 ; AVX1-NEXT: andq $-32, %rsp 521 ; AVX1-NEXT: subq $64, %rsp 522 ; AVX1-NEXT: vmovaps %ymm0, (%rsp) 523 ; AVX1-NEXT: movl (%rsp,%rdi,4), %eax 524 ; AVX1-NEXT: movq %rbp, %rsp 525 ; AVX1-NEXT: popq %rbp 526 ; AVX1-NEXT: vzeroupper 527 ; AVX1-NEXT: retq 528 ; 529 ; AVX2-LABEL: extractelement_v8i32_var: 530 ; AVX2: # BB#0: 531 ; AVX2-NEXT: vmovd %edi, %xmm1 532 ; AVX2-NEXT: vpermd %ymm0, %ymm1, %ymm0 533 ; AVX2-NEXT: vmovd %xmm0, %eax 534 ; AVX2-NEXT: vzeroupper 535 ; AVX2-NEXT: retq 536 %b = extractelement <8 x i32> %a, i256 %i 537 ret i32 %b 538 } 539 540 define i64 @extractelement_v2i64_var(<2 x i64> %a, i256 %i) nounwind { 541 ; SSE-LABEL: extractelement_v2i64_var: 542 ; SSE: # BB#0: 543 ; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp) 544 ; SSE-NEXT: movq -24(%rsp,%rdi,8), %rax 545 ; SSE-NEXT: retq 546 ; 547 ; AVX-LABEL: extractelement_v2i64_var: 548 ; AVX: # BB#0: 549 ; AVX-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp) 550 ; AVX-NEXT: movq -24(%rsp,%rdi,8), %rax 551 ; AVX-NEXT: retq 552 %b = extractelement <2 x i64> %a, i256 %i 553 ret i64 %b 554 } 555 556 define i64 @extractelement_v4i64_var(<4 x i64> %a, i256 %i) nounwind { 557 ; SSE-LABEL: extractelement_v4i64_var: 558 ; SSE: # BB#0: 559 ; SSE-NEXT: pushq %rbp 560 ; SSE-NEXT: movq %rsp, %rbp 561 ; SSE-NEXT: andq $-32, %rsp 562 ; SSE-NEXT: subq $64, %rsp 563 ; SSE-NEXT: movaps %xmm1, {{[0-9]+}}(%rsp) 564 ; SSE-NEXT: movaps %xmm0, (%rsp) 565 ; SSE-NEXT: movq (%rsp,%rdi,8), %rax 566 ; SSE-NEXT: movq %rbp, %rsp 567 ; SSE-NEXT: popq %rbp 568 ; SSE-NEXT: retq 569 ; 570 ; AVX-LABEL: extractelement_v4i64_var: 571 ; AVX: # BB#0: 572 ; AVX-NEXT: pushq %rbp 573 ; AVX-NEXT: movq %rsp, %rbp 574 ; AVX-NEXT: andq $-32, %rsp 575 ; AVX-NEXT: subq $64, %rsp 576 ; AVX-NEXT: vmovaps %ymm0, (%rsp) 577 ; AVX-NEXT: movq (%rsp,%rdi,8), %rax 578 ; AVX-NEXT: movq %rbp, %rsp 579 ; AVX-NEXT: popq %rbp 580 ; AVX-NEXT: vzeroupper 581 ; AVX-NEXT: retq 582 %b = extractelement <4 x i64> %a, i256 %i 583 ret i64 %b 584 } 585 586 ; 587 ; ExtractElement - Constant (Out Of Range) Index 588 ; 589 590 define i8 @extractelement_32i8_m1(<32 x i8> %a) nounwind { 591 ; SSE-LABEL: extractelement_32i8_m1: 592 ; SSE: # BB#0: 593 ; SSE-NEXT: retq 594 ; 595 ; AVX-LABEL: extractelement_32i8_m1: 596 ; AVX: # BB#0: 597 ; AVX-NEXT: retq 598 %b = extractelement <32 x i8> %a, i256 -1 599 ret i8 %b 600 } 601 602 define i16 @extractelement_v16i16_m4(<16 x i16> %a, i256 %i) nounwind { 603 ; SSE-LABEL: extractelement_v16i16_m4: 604 ; SSE: # BB#0: 605 ; SSE-NEXT: retq 606 ; 607 ; AVX-LABEL: extractelement_v16i16_m4: 608 ; AVX: # BB#0: 609 ; AVX-NEXT: retq 610 %b = extractelement <16 x i16> %a, i256 -4 611 ret i16 %b 612 } 613 614 define i32 @extractelement_v8i32_15(<8 x i32> %a) nounwind { 615 ; SSE-LABEL: extractelement_v8i32_15: 616 ; SSE: # BB#0: 617 ; SSE-NEXT: retq 618 ; 619 ; AVX-LABEL: extractelement_v8i32_15: 620 ; AVX: # BB#0: 621 ; AVX-NEXT: retq 622 %b = extractelement <8 x i32> %a, i64 15 623 ret i32 %b 624 } 625 626 define i64 @extractelement_v4i64_4(<4 x i64> %a, i256 %i) nounwind { 627 ; SSE-LABEL: extractelement_v4i64_4: 628 ; SSE: # BB#0: 629 ; SSE-NEXT: retq 630 ; 631 ; AVX-LABEL: extractelement_v4i64_4: 632 ; AVX: # BB#0: 633 ; AVX-NEXT: retq 634 %b = extractelement <4 x i64> %a, i256 4 635 ret i64 %b 636 } 637