1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512f | FileCheck --check-prefixes=CHECK,KNL %s 3; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512f,+avx512bw,+avx512vl,+avx512dq | FileCheck --check-prefixes=CHECK,SKX %s 4; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512f,+avx512bw,+avx512vl,+avx512dq,+avx512vbmi | FileCheck --check-prefixes=CHECK,SKX %s 5 6define <16 x float> @test1(<16 x float> %x, ptr %br, float %y) nounwind { 7; CHECK-LABEL: test1: 8; CHECK: ## %bb.0: 9; CHECK-NEXT: vinsertps {{.*#+}} xmm2 = xmm0[0],mem[0],xmm0[2,3] 10; CHECK-NEXT: vinsertf32x4 $0, %xmm2, %zmm0, %zmm2 11; CHECK-NEXT: vbroadcastss %xmm1, %zmm1 12; CHECK-NEXT: vmovaps {{.*#+}} zmm0 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,30,15] 13; CHECK-NEXT: vpermi2ps %zmm1, %zmm2, %zmm0 14; CHECK-NEXT: retq 15 %rrr = load float, ptr %br 16 %rrr2 = insertelement <16 x float> %x, float %rrr, i32 1 17 %rrr3 = insertelement <16 x float> %rrr2, float %y, i32 14 18 ret <16 x float> %rrr3 19} 20 21define <8 x double> @test2(<8 x double> %x, ptr %br, double %y) nounwind { 22; KNL-LABEL: test2: 23; KNL: ## %bb.0: 24; KNL-NEXT: vmovhpd {{.*#+}} xmm2 = xmm0[0],mem[0] 25; KNL-NEXT: vinsertf32x4 $0, %xmm2, %zmm0, %zmm0 26; KNL-NEXT: movb $64, %al 27; KNL-NEXT: kmovw %eax, %k1 28; KNL-NEXT: vbroadcastsd %xmm1, %zmm0 {%k1} 29; KNL-NEXT: retq 30; 31; SKX-LABEL: test2: 32; SKX: ## %bb.0: 33; SKX-NEXT: vmovhpd {{.*#+}} xmm2 = xmm0[0],mem[0] 34; SKX-NEXT: vinsertf32x4 $0, %xmm2, %zmm0, %zmm0 35; SKX-NEXT: movb $64, %al 36; SKX-NEXT: kmovd %eax, %k1 37; SKX-NEXT: vbroadcastsd %xmm1, %zmm0 {%k1} 38; SKX-NEXT: retq 39 %rrr = load double, ptr %br 40 %rrr2 = insertelement <8 x double> %x, double %rrr, i32 1 41 %rrr3 = insertelement <8 x double> %rrr2, double %y, i32 6 42 ret <8 x double> %rrr3 43} 44 45define <16 x float> @test3(<16 x float> %x) nounwind { 46; CHECK-LABEL: test3: 47; CHECK: ## %bb.0: 48; CHECK-NEXT: vextractf128 $1, %ymm0, %xmm1 49; CHECK-NEXT: vinsertps {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[2,3] 50; CHECK-NEXT: vinsertf32x4 $0, %xmm1, %zmm0, %zmm0 51; CHECK-NEXT: retq 52 %eee = extractelement <16 x float> %x, i32 4 53 %rrr2 = insertelement <16 x float> %x, float %eee, i32 1 54 ret <16 x float> %rrr2 55} 56 57define <8 x i64> @test4(<8 x i64> %x) nounwind { 58; CHECK-LABEL: test4: 59; CHECK: ## %bb.0: 60; CHECK-NEXT: vextractf32x4 $2, %zmm0, %xmm1 61; CHECK-NEXT: vmovlhps {{.*#+}} xmm1 = xmm0[0],xmm1[0] 62; CHECK-NEXT: vinsertf32x4 $0, %xmm1, %zmm0, %zmm0 63; CHECK-NEXT: retq 64 %eee = extractelement <8 x i64> %x, i32 4 65 %rrr2 = insertelement <8 x i64> %x, i64 %eee, i32 1 66 ret <8 x i64> %rrr2 67} 68 69define i32 @test5(<4 x float> %x) nounwind { 70; CHECK-LABEL: test5: 71; CHECK: ## %bb.0: 72; CHECK-NEXT: vextractps $3, %xmm0, %eax 73; CHECK-NEXT: retq 74 %ef = extractelement <4 x float> %x, i32 3 75 %ei = bitcast float %ef to i32 76 ret i32 %ei 77} 78 79define void @test6(<4 x float> %x, ptr %out) nounwind { 80; CHECK-LABEL: test6: 81; CHECK: ## %bb.0: 82; CHECK-NEXT: vextractps $3, %xmm0, (%rdi) 83; CHECK-NEXT: retq 84 %ef = extractelement <4 x float> %x, i32 3 85 store float %ef, ptr %out, align 4 86 ret void 87} 88 89define float @test7(<16 x float> %x, i32 %ind) nounwind { 90; CHECK-LABEL: test7: 91; CHECK: ## %bb.0: 92; CHECK-NEXT: pushq %rbp 93; CHECK-NEXT: movq %rsp, %rbp 94; CHECK-NEXT: andq $-64, %rsp 95; CHECK-NEXT: subq $128, %rsp 96; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi 97; CHECK-NEXT: vmovaps %zmm0, (%rsp) 98; CHECK-NEXT: andl $15, %edi 99; CHECK-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero 100; CHECK-NEXT: movq %rbp, %rsp 101; CHECK-NEXT: popq %rbp 102; CHECK-NEXT: vzeroupper 103; CHECK-NEXT: retq 104 %e = extractelement <16 x float> %x, i32 %ind 105 ret float %e 106} 107 108define double @test8(<8 x double> %x, i32 %ind) nounwind { 109; CHECK-LABEL: test8: 110; CHECK: ## %bb.0: 111; CHECK-NEXT: pushq %rbp 112; CHECK-NEXT: movq %rsp, %rbp 113; CHECK-NEXT: andq $-64, %rsp 114; CHECK-NEXT: subq $128, %rsp 115; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi 116; CHECK-NEXT: vmovaps %zmm0, (%rsp) 117; CHECK-NEXT: andl $7, %edi 118; CHECK-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero 119; CHECK-NEXT: movq %rbp, %rsp 120; CHECK-NEXT: popq %rbp 121; CHECK-NEXT: vzeroupper 122; CHECK-NEXT: retq 123 %e = extractelement <8 x double> %x, i32 %ind 124 ret double %e 125} 126 127define float @test9(<8 x float> %x, i32 %ind) nounwind { 128; CHECK-LABEL: test9: 129; CHECK: ## %bb.0: 130; CHECK-NEXT: pushq %rbp 131; CHECK-NEXT: movq %rsp, %rbp 132; CHECK-NEXT: andq $-32, %rsp 133; CHECK-NEXT: subq $64, %rsp 134; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi 135; CHECK-NEXT: vmovaps %ymm0, (%rsp) 136; CHECK-NEXT: andl $7, %edi 137; CHECK-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero 138; CHECK-NEXT: movq %rbp, %rsp 139; CHECK-NEXT: popq %rbp 140; CHECK-NEXT: vzeroupper 141; CHECK-NEXT: retq 142 %e = extractelement <8 x float> %x, i32 %ind 143 ret float %e 144} 145 146define i32 @test10(<16 x i32> %x, i32 %ind) nounwind { 147; CHECK-LABEL: test10: 148; CHECK: ## %bb.0: 149; CHECK-NEXT: pushq %rbp 150; CHECK-NEXT: movq %rsp, %rbp 151; CHECK-NEXT: andq $-64, %rsp 152; CHECK-NEXT: subq $128, %rsp 153; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi 154; CHECK-NEXT: vmovaps %zmm0, (%rsp) 155; CHECK-NEXT: andl $15, %edi 156; CHECK-NEXT: movl (%rsp,%rdi,4), %eax 157; CHECK-NEXT: movq %rbp, %rsp 158; CHECK-NEXT: popq %rbp 159; CHECK-NEXT: vzeroupper 160; CHECK-NEXT: retq 161 %e = extractelement <16 x i32> %x, i32 %ind 162 ret i32 %e 163} 164 165define <16 x i32> @test11(<16 x i32>%a, <16 x i32>%b) { 166; KNL-LABEL: test11: 167; KNL: ## %bb.0: 168; KNL-NEXT: vpcmpltud %zmm1, %zmm0, %k0 169; KNL-NEXT: kshiftrw $4, %k0, %k0 170; KNL-NEXT: kmovw %k0, %eax 171; KNL-NEXT: testb $1, %al 172; KNL-NEXT: je LBB10_2 173; KNL-NEXT: ## %bb.1: ## %A 174; KNL-NEXT: vmovdqa64 %zmm1, %zmm0 175; KNL-NEXT: retq 176; KNL-NEXT: LBB10_2: ## %B 177; KNL-NEXT: vpaddd %zmm0, %zmm1, %zmm0 178; KNL-NEXT: retq 179; 180; SKX-LABEL: test11: 181; SKX: ## %bb.0: 182; SKX-NEXT: vpcmpltud %zmm1, %zmm0, %k0 183; SKX-NEXT: kshiftrw $4, %k0, %k0 184; SKX-NEXT: kmovd %k0, %eax 185; SKX-NEXT: testb $1, %al 186; SKX-NEXT: je LBB10_2 187; SKX-NEXT: ## %bb.1: ## %A 188; SKX-NEXT: vmovdqa64 %zmm1, %zmm0 189; SKX-NEXT: retq 190; SKX-NEXT: LBB10_2: ## %B 191; SKX-NEXT: vpaddd %zmm0, %zmm1, %zmm0 192; SKX-NEXT: retq 193 %cmp_res = icmp ult <16 x i32> %a, %b 194 %ia = extractelement <16 x i1> %cmp_res, i32 4 195 br i1 %ia, label %A, label %B 196 A: 197 ret <16 x i32>%b 198 B: 199 %c = add <16 x i32>%b, %a 200 ret <16 x i32>%c 201} 202 203define i64 @test12(<16 x i64>%a, <16 x i64>%b, i64 %a1, i64 %b1) { 204; KNL-LABEL: test12: 205; KNL: ## %bb.0: 206; KNL-NEXT: movq %rdi, %rax 207; KNL-NEXT: vpcmpgtq %zmm0, %zmm2, %k0 208; KNL-NEXT: kmovw %k0, %ecx 209; KNL-NEXT: testb $1, %cl 210; KNL-NEXT: cmoveq %rsi, %rax 211; KNL-NEXT: vzeroupper 212; KNL-NEXT: retq 213; 214; SKX-LABEL: test12: 215; SKX: ## %bb.0: 216; SKX-NEXT: movq %rdi, %rax 217; SKX-NEXT: vpcmpgtq %zmm0, %zmm2, %k0 218; SKX-NEXT: kmovd %k0, %ecx 219; SKX-NEXT: testb $1, %cl 220; SKX-NEXT: cmoveq %rsi, %rax 221; SKX-NEXT: vzeroupper 222; SKX-NEXT: retq 223 %cmpvector_func.i = icmp slt <16 x i64> %a, %b 224 %extract24vector_func.i = extractelement <16 x i1> %cmpvector_func.i, i32 0 225 %res = select i1 %extract24vector_func.i, i64 %a1, i64 %b1 226 ret i64 %res 227} 228 229define i16 @test13(i32 %a, i32 %b) { 230; KNL-LABEL: test13: 231; KNL: ## %bb.0: 232; KNL-NEXT: cmpl %esi, %edi 233; KNL-NEXT: setb %al 234; KNL-NEXT: movw $-4, %cx 235; KNL-NEXT: kmovw %ecx, %k0 236; KNL-NEXT: kshiftrw $1, %k0, %k0 237; KNL-NEXT: kshiftlw $1, %k0, %k0 238; KNL-NEXT: andl $1, %eax 239; KNL-NEXT: kmovw %eax, %k1 240; KNL-NEXT: korw %k1, %k0, %k0 241; KNL-NEXT: kmovw %k0, %eax 242; KNL-NEXT: ## kill: def $ax killed $ax killed $eax 243; KNL-NEXT: retq 244; 245; SKX-LABEL: test13: 246; SKX: ## %bb.0: 247; SKX-NEXT: cmpl %esi, %edi 248; SKX-NEXT: setb %al 249; SKX-NEXT: movw $-4, %cx 250; SKX-NEXT: kmovd %ecx, %k0 251; SKX-NEXT: kshiftrw $1, %k0, %k0 252; SKX-NEXT: kshiftlw $1, %k0, %k0 253; SKX-NEXT: andl $1, %eax 254; SKX-NEXT: kmovw %eax, %k1 255; SKX-NEXT: korw %k1, %k0, %k0 256; SKX-NEXT: kmovd %k0, %eax 257; SKX-NEXT: ## kill: def $ax killed $ax killed $eax 258; SKX-NEXT: retq 259 %cmp_res = icmp ult i32 %a, %b 260 %maskv = insertelement <16 x i1> <i1 true, i1 false, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, i1 %cmp_res, i32 0 261 %res = bitcast <16 x i1> %maskv to i16 262 ret i16 %res 263} 264 265define i64 @test14(<8 x i64>%a, <8 x i64>%b, i64 %a1, i64 %b1) { 266; KNL-LABEL: test14: 267; KNL: ## %bb.0: 268; KNL-NEXT: movq %rdi, %rax 269; KNL-NEXT: vpcmpgtq %zmm0, %zmm1, %k0 270; KNL-NEXT: kshiftrw $4, %k0, %k0 271; KNL-NEXT: kmovw %k0, %ecx 272; KNL-NEXT: testb $1, %cl 273; KNL-NEXT: cmoveq %rsi, %rax 274; KNL-NEXT: vzeroupper 275; KNL-NEXT: retq 276; 277; SKX-LABEL: test14: 278; SKX: ## %bb.0: 279; SKX-NEXT: movq %rdi, %rax 280; SKX-NEXT: vpcmpgtq %zmm0, %zmm1, %k0 281; SKX-NEXT: kshiftrb $4, %k0, %k0 282; SKX-NEXT: kmovd %k0, %ecx 283; SKX-NEXT: testb $1, %cl 284; SKX-NEXT: cmoveq %rsi, %rax 285; SKX-NEXT: vzeroupper 286; SKX-NEXT: retq 287 %cmpvector_func.i = icmp slt <8 x i64> %a, %b 288 %extract24vector_func.i = extractelement <8 x i1> %cmpvector_func.i, i32 4 289 %res = select i1 %extract24vector_func.i, i64 %a1, i64 %b1 290 ret i64 %res 291} 292 293define i16 @test15(ptr%addr) { 294; CHECK-LABEL: test15: 295; CHECK: ## %bb.0: 296; CHECK-NEXT: xorl %ecx, %ecx 297; CHECK-NEXT: cmpb $0, (%rdi) 298; CHECK-NEXT: movl $65535, %eax ## imm = 0xFFFF 299; CHECK-NEXT: cmovel %ecx, %eax 300; CHECK-NEXT: ## kill: def $ax killed $ax killed $eax 301; CHECK-NEXT: retq 302 %x = load i1 , ptr %addr, align 1 303 %x1 = insertelement <16 x i1> undef, i1 %x, i32 10 304 %x2 = bitcast <16 x i1>%x1 to i16 305 ret i16 %x2 306} 307 308define i16 @test16(ptr%addr, i16 %a) { 309; KNL-LABEL: test16: 310; KNL: ## %bb.0: 311; KNL-NEXT: movb (%rdi), %al 312; KNL-NEXT: kmovw %esi, %k0 313; KNL-NEXT: movw $-1025, %cx ## imm = 0xFBFF 314; KNL-NEXT: kmovw %ecx, %k1 315; KNL-NEXT: kandw %k1, %k0, %k0 316; KNL-NEXT: kmovw %eax, %k1 317; KNL-NEXT: kshiftlw $15, %k1, %k1 318; KNL-NEXT: kshiftrw $5, %k1, %k1 319; KNL-NEXT: korw %k1, %k0, %k0 320; KNL-NEXT: kmovw %k0, %eax 321; KNL-NEXT: ## kill: def $ax killed $ax killed $eax 322; KNL-NEXT: retq 323; 324; SKX-LABEL: test16: 325; SKX: ## %bb.0: 326; SKX-NEXT: kmovb (%rdi), %k0 327; SKX-NEXT: kmovd %esi, %k1 328; SKX-NEXT: movw $-1025, %ax ## imm = 0xFBFF 329; SKX-NEXT: kmovd %eax, %k2 330; SKX-NEXT: kandw %k2, %k1, %k1 331; SKX-NEXT: kshiftlw $15, %k0, %k0 332; SKX-NEXT: kshiftrw $5, %k0, %k0 333; SKX-NEXT: korw %k0, %k1, %k0 334; SKX-NEXT: kmovd %k0, %eax 335; SKX-NEXT: ## kill: def $ax killed $ax killed $eax 336; SKX-NEXT: retq 337 %x = load i1 , ptr %addr, align 128 338 %a1 = bitcast i16 %a to <16 x i1> 339 %x1 = insertelement <16 x i1> %a1, i1 %x, i32 10 340 %x2 = bitcast <16 x i1>%x1 to i16 341 ret i16 %x2 342} 343 344define i8 @test17(ptr%addr, i8 %a) { 345; KNL-LABEL: test17: 346; KNL: ## %bb.0: 347; KNL-NEXT: movb (%rdi), %al 348; KNL-NEXT: kmovw %esi, %k0 349; KNL-NEXT: movw $-17, %cx 350; KNL-NEXT: kmovw %ecx, %k1 351; KNL-NEXT: kandw %k1, %k0, %k0 352; KNL-NEXT: kmovw %eax, %k1 353; KNL-NEXT: kshiftlw $15, %k1, %k1 354; KNL-NEXT: kshiftrw $11, %k1, %k1 355; KNL-NEXT: korw %k1, %k0, %k0 356; KNL-NEXT: kmovw %k0, %eax 357; KNL-NEXT: ## kill: def $al killed $al killed $eax 358; KNL-NEXT: retq 359; 360; SKX-LABEL: test17: 361; SKX: ## %bb.0: 362; SKX-NEXT: kmovb (%rdi), %k0 363; SKX-NEXT: kmovd %esi, %k1 364; SKX-NEXT: movb $-17, %al 365; SKX-NEXT: kmovd %eax, %k2 366; SKX-NEXT: kandb %k2, %k1, %k1 367; SKX-NEXT: kshiftlb $7, %k0, %k0 368; SKX-NEXT: kshiftrb $3, %k0, %k0 369; SKX-NEXT: korb %k0, %k1, %k0 370; SKX-NEXT: kmovd %k0, %eax 371; SKX-NEXT: ## kill: def $al killed $al killed $eax 372; SKX-NEXT: retq 373 %x = load i1 , ptr %addr, align 128 374 %a1 = bitcast i8 %a to <8 x i1> 375 %x1 = insertelement <8 x i1> %a1, i1 %x, i32 4 376 %x2 = bitcast <8 x i1>%x1 to i8 377 ret i8 %x2 378} 379 380define i64 @extract_v8i64(<8 x i64> %x, ptr %dst) { 381; CHECK-LABEL: extract_v8i64: 382; CHECK: ## %bb.0: 383; CHECK-NEXT: vpextrq $1, %xmm0, %rax 384; CHECK-NEXT: vextracti128 $1, %ymm0, %xmm0 385; CHECK-NEXT: vpextrq $1, %xmm0, (%rdi) 386; CHECK-NEXT: vzeroupper 387; CHECK-NEXT: retq 388 %r1 = extractelement <8 x i64> %x, i32 1 389 %r2 = extractelement <8 x i64> %x, i32 3 390 store i64 %r2, ptr %dst, align 1 391 ret i64 %r1 392} 393 394define i64 @extract_v4i64(<4 x i64> %x, ptr %dst) { 395; CHECK-LABEL: extract_v4i64: 396; CHECK: ## %bb.0: 397; CHECK-NEXT: vpextrq $1, %xmm0, %rax 398; CHECK-NEXT: vextracti128 $1, %ymm0, %xmm0 399; CHECK-NEXT: vpextrq $1, %xmm0, (%rdi) 400; CHECK-NEXT: vzeroupper 401; CHECK-NEXT: retq 402 %r1 = extractelement <4 x i64> %x, i32 1 403 %r2 = extractelement <4 x i64> %x, i32 3 404 store i64 %r2, ptr %dst, align 1 405 ret i64 %r1 406} 407 408define i64 @extract_v2i64(<2 x i64> %x, ptr %dst) { 409; CHECK-LABEL: extract_v2i64: 410; CHECK: ## %bb.0: 411; CHECK-NEXT: vmovq %xmm0, %rax 412; CHECK-NEXT: vpextrq $1, %xmm0, (%rdi) 413; CHECK-NEXT: retq 414 %r1 = extractelement <2 x i64> %x, i32 0 415 %r2 = extractelement <2 x i64> %x, i32 1 416 store i64 %r2, ptr %dst, align 1 417 ret i64 %r1 418} 419 420define i32 @extract_v16i32(<16 x i32> %x, ptr %dst) { 421; CHECK-LABEL: extract_v16i32: 422; CHECK: ## %bb.0: 423; CHECK-NEXT: vextractps $1, %xmm0, %eax 424; CHECK-NEXT: vextractf128 $1, %ymm0, %xmm0 425; CHECK-NEXT: vextractps $1, %xmm0, (%rdi) 426; CHECK-NEXT: vzeroupper 427; CHECK-NEXT: retq 428 %r1 = extractelement <16 x i32> %x, i32 1 429 %r2 = extractelement <16 x i32> %x, i32 5 430 store i32 %r2, ptr %dst, align 1 431 ret i32 %r1 432} 433 434define i32 @extract_v8i32(<8 x i32> %x, ptr %dst) { 435; CHECK-LABEL: extract_v8i32: 436; CHECK: ## %bb.0: 437; CHECK-NEXT: vextractps $1, %xmm0, %eax 438; CHECK-NEXT: vextractf128 $1, %ymm0, %xmm0 439; CHECK-NEXT: vextractps $1, %xmm0, (%rdi) 440; CHECK-NEXT: vzeroupper 441; CHECK-NEXT: retq 442 %r1 = extractelement <8 x i32> %x, i32 1 443 %r2 = extractelement <8 x i32> %x, i32 5 444 store i32 %r2, ptr %dst, align 1 445 ret i32 %r1 446} 447 448define i32 @extract_v4i32(<4 x i32> %x, ptr %dst) { 449; CHECK-LABEL: extract_v4i32: 450; CHECK: ## %bb.0: 451; CHECK-NEXT: vextractps $1, %xmm0, %eax 452; CHECK-NEXT: vextractps $3, %xmm0, (%rdi) 453; CHECK-NEXT: retq 454 %r1 = extractelement <4 x i32> %x, i32 1 455 %r2 = extractelement <4 x i32> %x, i32 3 456 store i32 %r2, ptr %dst, align 1 457 ret i32 %r1 458} 459 460define i16 @extract_v32i16(<32 x i16> %x, ptr %dst) { 461; CHECK-LABEL: extract_v32i16: 462; CHECK: ## %bb.0: 463; CHECK-NEXT: vpextrw $1, %xmm0, %eax 464; CHECK-NEXT: vextracti128 $1, %ymm0, %xmm0 465; CHECK-NEXT: vpextrw $1, %xmm0, (%rdi) 466; CHECK-NEXT: ## kill: def $ax killed $ax killed $eax 467; CHECK-NEXT: vzeroupper 468; CHECK-NEXT: retq 469 %r1 = extractelement <32 x i16> %x, i32 1 470 %r2 = extractelement <32 x i16> %x, i32 9 471 store i16 %r2, ptr %dst, align 1 472 ret i16 %r1 473} 474 475define i16 @extract_v16i16(<16 x i16> %x, ptr %dst) { 476; CHECK-LABEL: extract_v16i16: 477; CHECK: ## %bb.0: 478; CHECK-NEXT: vpextrw $1, %xmm0, %eax 479; CHECK-NEXT: vextracti128 $1, %ymm0, %xmm0 480; CHECK-NEXT: vpextrw $1, %xmm0, (%rdi) 481; CHECK-NEXT: ## kill: def $ax killed $ax killed $eax 482; CHECK-NEXT: vzeroupper 483; CHECK-NEXT: retq 484 %r1 = extractelement <16 x i16> %x, i32 1 485 %r2 = extractelement <16 x i16> %x, i32 9 486 store i16 %r2, ptr %dst, align 1 487 ret i16 %r1 488} 489 490define i16 @extract_v8i16(<8 x i16> %x, ptr %dst) { 491; CHECK-LABEL: extract_v8i16: 492; CHECK: ## %bb.0: 493; CHECK-NEXT: vpextrw $1, %xmm0, %eax 494; CHECK-NEXT: vpextrw $3, %xmm0, (%rdi) 495; CHECK-NEXT: ## kill: def $ax killed $ax killed $eax 496; CHECK-NEXT: retq 497 %r1 = extractelement <8 x i16> %x, i32 1 498 %r2 = extractelement <8 x i16> %x, i32 3 499 store i16 %r2, ptr %dst, align 1 500 ret i16 %r1 501} 502 503define i8 @extract_v64i8(<64 x i8> %x, ptr %dst) { 504; CHECK-LABEL: extract_v64i8: 505; CHECK: ## %bb.0: 506; CHECK-NEXT: vpextrb $1, %xmm0, %eax 507; CHECK-NEXT: vextracti128 $1, %ymm0, %xmm0 508; CHECK-NEXT: vpextrb $1, %xmm0, (%rdi) 509; CHECK-NEXT: ## kill: def $al killed $al killed $eax 510; CHECK-NEXT: vzeroupper 511; CHECK-NEXT: retq 512 %r1 = extractelement <64 x i8> %x, i32 1 513 %r2 = extractelement <64 x i8> %x, i32 17 514 store i8 %r2, ptr %dst, align 1 515 ret i8 %r1 516} 517 518define i8 @extract_v32i8(<32 x i8> %x, ptr %dst) { 519; CHECK-LABEL: extract_v32i8: 520; CHECK: ## %bb.0: 521; CHECK-NEXT: vpextrb $1, %xmm0, %eax 522; CHECK-NEXT: vextracti128 $1, %ymm0, %xmm0 523; CHECK-NEXT: vpextrb $1, %xmm0, (%rdi) 524; CHECK-NEXT: ## kill: def $al killed $al killed $eax 525; CHECK-NEXT: vzeroupper 526; CHECK-NEXT: retq 527 %r1 = extractelement <32 x i8> %x, i32 1 528 %r2 = extractelement <32 x i8> %x, i32 17 529 store i8 %r2, ptr %dst, align 1 530 ret i8 %r1 531} 532 533define i8 @extract_v16i8(<16 x i8> %x, ptr %dst) { 534; CHECK-LABEL: extract_v16i8: 535; CHECK: ## %bb.0: 536; CHECK-NEXT: vpextrb $1, %xmm0, %eax 537; CHECK-NEXT: vpextrb $3, %xmm0, (%rdi) 538; CHECK-NEXT: ## kill: def $al killed $al killed $eax 539; CHECK-NEXT: retq 540 %r1 = extractelement <16 x i8> %x, i32 1 541 %r2 = extractelement <16 x i8> %x, i32 3 542 store i8 %r2, ptr %dst, align 1 543 ret i8 %r1 544} 545 546define <8 x i64> @insert_v8i64(<8 x i64> %x, i64 %y , ptr %ptr) { 547; KNL-LABEL: insert_v8i64: 548; KNL: ## %bb.0: 549; KNL-NEXT: vpinsrq $1, (%rsi), %xmm0, %xmm1 550; KNL-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm0 551; KNL-NEXT: movb $8, %al 552; KNL-NEXT: kmovw %eax, %k1 553; KNL-NEXT: vpbroadcastq %rdi, %zmm0 {%k1} 554; KNL-NEXT: retq 555; 556; SKX-LABEL: insert_v8i64: 557; SKX: ## %bb.0: 558; SKX-NEXT: vpinsrq $1, (%rsi), %xmm0, %xmm1 559; SKX-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm0 560; SKX-NEXT: movb $8, %al 561; SKX-NEXT: kmovd %eax, %k1 562; SKX-NEXT: vpbroadcastq %rdi, %zmm0 {%k1} 563; SKX-NEXT: retq 564 %val = load i64, ptr %ptr 565 %r1 = insertelement <8 x i64> %x, i64 %val, i32 1 566 %r2 = insertelement <8 x i64> %r1, i64 %y, i32 3 567 ret <8 x i64> %r2 568} 569 570define <4 x i64> @insert_v4i64(<4 x i64> %x, i64 %y , ptr %ptr) { 571; KNL-LABEL: insert_v4i64: 572; KNL: ## %bb.0: 573; KNL-NEXT: vpinsrq $1, (%rsi), %xmm0, %xmm1 574; KNL-NEXT: vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7] 575; KNL-NEXT: vmovq %rdi, %xmm1 576; KNL-NEXT: vpbroadcastq %xmm1, %ymm1 577; KNL-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3,4,5],ymm1[6,7] 578; KNL-NEXT: retq 579; 580; SKX-LABEL: insert_v4i64: 581; SKX: ## %bb.0: 582; SKX-NEXT: vpinsrq $1, (%rsi), %xmm0, %xmm1 583; SKX-NEXT: vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7] 584; SKX-NEXT: vpbroadcastq %rdi, %ymm1 585; SKX-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3,4,5],ymm1[6,7] 586; SKX-NEXT: retq 587 %val = load i64, ptr %ptr 588 %r1 = insertelement <4 x i64> %x, i64 %val, i32 1 589 %r2 = insertelement <4 x i64> %r1, i64 %y, i32 3 590 ret <4 x i64> %r2 591} 592 593define <2 x i64> @insert_v2i64(<2 x i64> %x, i64 %y , ptr %ptr) { 594; CHECK-LABEL: insert_v2i64: 595; CHECK: ## %bb.0: 596; CHECK-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero 597; CHECK-NEXT: vmovq %rdi, %xmm1 598; CHECK-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 599; CHECK-NEXT: retq 600 %val = load i64, ptr %ptr 601 %r1 = insertelement <2 x i64> %x, i64 %val, i32 1 602 %r2 = insertelement <2 x i64> %r1, i64 %y, i32 0 603 ret <2 x i64> %r2 604} 605 606define <16 x i32> @insert_v16i32(<16 x i32> %x, i32 %y, ptr %ptr) { 607; KNL-LABEL: insert_v16i32: 608; KNL: ## %bb.0: 609; KNL-NEXT: vpinsrd $1, (%rsi), %xmm0, %xmm1 610; KNL-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm0 611; KNL-NEXT: movw $32, %ax 612; KNL-NEXT: kmovw %eax, %k1 613; KNL-NEXT: vpbroadcastd %edi, %zmm0 {%k1} 614; KNL-NEXT: retq 615; 616; SKX-LABEL: insert_v16i32: 617; SKX: ## %bb.0: 618; SKX-NEXT: vpinsrd $1, (%rsi), %xmm0, %xmm1 619; SKX-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm0 620; SKX-NEXT: movw $32, %ax 621; SKX-NEXT: kmovd %eax, %k1 622; SKX-NEXT: vpbroadcastd %edi, %zmm0 {%k1} 623; SKX-NEXT: retq 624 %val = load i32, ptr %ptr 625 %r1 = insertelement <16 x i32> %x, i32 %val, i32 1 626 %r2 = insertelement <16 x i32> %r1, i32 %y, i32 5 627 ret <16 x i32> %r2 628} 629 630define <8 x i32> @insert_v8i32(<8 x i32> %x, i32 %y, ptr %ptr) { 631; KNL-LABEL: insert_v8i32: 632; KNL: ## %bb.0: 633; KNL-NEXT: vpinsrd $1, (%rsi), %xmm0, %xmm1 634; KNL-NEXT: vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7] 635; KNL-NEXT: vmovd %edi, %xmm1 636; KNL-NEXT: vpbroadcastd %xmm1, %ymm1 637; KNL-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3,4],ymm1[5],ymm0[6,7] 638; KNL-NEXT: retq 639; 640; SKX-LABEL: insert_v8i32: 641; SKX: ## %bb.0: 642; SKX-NEXT: vpinsrd $1, (%rsi), %xmm0, %xmm1 643; SKX-NEXT: vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7] 644; SKX-NEXT: vpbroadcastd %edi, %ymm1 645; SKX-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3,4],ymm1[5],ymm0[6,7] 646; SKX-NEXT: retq 647 %val = load i32, ptr %ptr 648 %r1 = insertelement <8 x i32> %x, i32 %val, i32 1 649 %r2 = insertelement <8 x i32> %r1, i32 %y, i32 5 650 ret <8 x i32> %r2 651} 652 653define <4 x i32> @insert_v4i32(<4 x i32> %x, i32 %y, ptr %ptr) { 654; CHECK-LABEL: insert_v4i32: 655; CHECK: ## %bb.0: 656; CHECK-NEXT: vpinsrd $1, (%rsi), %xmm0, %xmm0 657; CHECK-NEXT: vpinsrd $3, %edi, %xmm0, %xmm0 658; CHECK-NEXT: retq 659 %val = load i32, ptr %ptr 660 %r1 = insertelement <4 x i32> %x, i32 %val, i32 1 661 %r2 = insertelement <4 x i32> %r1, i32 %y, i32 3 662 ret <4 x i32> %r2 663} 664 665define <32 x i16> @insert_v32i16(<32 x i16> %x, i16 %y, ptr %ptr) { 666; KNL-LABEL: insert_v32i16: 667; KNL: ## %bb.0: 668; KNL-NEXT: vpinsrw $1, (%rsi), %xmm0, %xmm1 669; KNL-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm1 670; KNL-NEXT: vmovd %edi, %xmm0 671; KNL-NEXT: vpbroadcastw %xmm0, %ymm0 672; KNL-NEXT: vpternlogq $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm0 673; KNL-NEXT: retq 674; 675; SKX-LABEL: insert_v32i16: 676; SKX: ## %bb.0: 677; SKX-NEXT: vpinsrw $1, (%rsi), %xmm0, %xmm1 678; SKX-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm0 679; SKX-NEXT: movl $512, %eax ## imm = 0x200 680; SKX-NEXT: kmovd %eax, %k1 681; SKX-NEXT: vpbroadcastw %edi, %zmm0 {%k1} 682; SKX-NEXT: retq 683 %val = load i16, ptr %ptr 684 %r1 = insertelement <32 x i16> %x, i16 %val, i32 1 685 %r2 = insertelement <32 x i16> %r1, i16 %y, i32 9 686 ret <32 x i16> %r2 687} 688 689define <16 x i16> @insert_v16i16(<16 x i16> %x, i16 %y, ptr %ptr) { 690; KNL-LABEL: insert_v16i16: 691; KNL: ## %bb.0: 692; KNL-NEXT: vpinsrw $1, (%rsi), %xmm0, %xmm1 693; KNL-NEXT: vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7] 694; KNL-NEXT: vmovd %edi, %xmm1 695; KNL-NEXT: vpbroadcastw %xmm1, %ymm1 696; KNL-NEXT: vpblendw {{.*#+}} ymm1 = ymm0[0],ymm1[1],ymm0[2,3,4,5,6,7,8],ymm1[9],ymm0[10,11,12,13,14,15] 697; KNL-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7] 698; KNL-NEXT: retq 699; 700; SKX-LABEL: insert_v16i16: 701; SKX: ## %bb.0: 702; SKX-NEXT: vpinsrw $1, (%rsi), %xmm0, %xmm1 703; SKX-NEXT: vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7] 704; SKX-NEXT: vpbroadcastw %edi, %ymm1 705; SKX-NEXT: vpblendw {{.*#+}} ymm1 = ymm0[0],ymm1[1],ymm0[2,3,4,5,6,7,8],ymm1[9],ymm0[10,11,12,13,14,15] 706; SKX-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7] 707; SKX-NEXT: retq 708 %val = load i16, ptr %ptr 709 %r1 = insertelement <16 x i16> %x, i16 %val, i32 1 710 %r2 = insertelement <16 x i16> %r1, i16 %y, i32 9 711 ret <16 x i16> %r2 712} 713 714define <8 x i16> @insert_v8i16(<8 x i16> %x, i16 %y, ptr %ptr) { 715; CHECK-LABEL: insert_v8i16: 716; CHECK: ## %bb.0: 717; CHECK-NEXT: vpinsrw $1, (%rsi), %xmm0, %xmm0 718; CHECK-NEXT: vpinsrw $5, %edi, %xmm0, %xmm0 719; CHECK-NEXT: retq 720 %val = load i16, ptr %ptr 721 %r1 = insertelement <8 x i16> %x, i16 %val, i32 1 722 %r2 = insertelement <8 x i16> %r1, i16 %y, i32 5 723 ret <8 x i16> %r2 724} 725 726define <64 x i8> @insert_v64i8(<64 x i8> %x, i8 %y, ptr %ptr) { 727; CHECK-LABEL: insert_v64i8: 728; CHECK: ## %bb.0: 729; CHECK-NEXT: vpinsrb $1, (%rsi), %xmm0, %xmm1 730; CHECK-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm1 731; CHECK-NEXT: vextracti32x4 $3, %zmm0, %xmm0 732; CHECK-NEXT: vpinsrb $2, %edi, %xmm0, %xmm0 733; CHECK-NEXT: vinserti32x4 $3, %xmm0, %zmm1, %zmm0 734; CHECK-NEXT: retq 735 %val = load i8, ptr %ptr 736 %r1 = insertelement <64 x i8> %x, i8 %val, i32 1 737 %r2 = insertelement <64 x i8> %r1, i8 %y, i32 50 738 ret <64 x i8> %r2 739} 740 741define <32 x i8> @insert_v32i8(<32 x i8> %x, i8 %y, ptr %ptr) { 742; CHECK-LABEL: insert_v32i8: 743; CHECK: ## %bb.0: 744; CHECK-NEXT: vpinsrb $1, (%rsi), %xmm0, %xmm1 745; CHECK-NEXT: vextracti128 $1, %ymm0, %xmm0 746; CHECK-NEXT: vpinsrb $1, %edi, %xmm0, %xmm0 747; CHECK-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0 748; CHECK-NEXT: retq 749 %val = load i8, ptr %ptr 750 %r1 = insertelement <32 x i8> %x, i8 %val, i32 1 751 %r2 = insertelement <32 x i8> %r1, i8 %y, i32 17 752 ret <32 x i8> %r2 753} 754 755define <16 x i8> @insert_v16i8(<16 x i8> %x, i8 %y, ptr %ptr) { 756; CHECK-LABEL: insert_v16i8: 757; CHECK: ## %bb.0: 758; CHECK-NEXT: vpinsrb $3, (%rsi), %xmm0, %xmm0 759; CHECK-NEXT: vpinsrb $10, %edi, %xmm0, %xmm0 760; CHECK-NEXT: retq 761 %val = load i8, ptr %ptr 762 %r1 = insertelement <16 x i8> %x, i8 %val, i32 3 763 %r2 = insertelement <16 x i8> %r1, i8 %y, i32 10 764 ret <16 x i8> %r2 765} 766 767define <8 x i64> @test_insert_128_v8i64(<8 x i64> %x, i64 %y) { 768; CHECK-LABEL: test_insert_128_v8i64: 769; CHECK: ## %bb.0: 770; CHECK-NEXT: vpinsrq $1, %rdi, %xmm0, %xmm1 771; CHECK-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm0 772; CHECK-NEXT: retq 773 %r = insertelement <8 x i64> %x, i64 %y, i32 1 774 ret <8 x i64> %r 775} 776 777define <16 x i32> @test_insert_128_v16i32(<16 x i32> %x, i32 %y) { 778; CHECK-LABEL: test_insert_128_v16i32: 779; CHECK: ## %bb.0: 780; CHECK-NEXT: vpinsrd $1, %edi, %xmm0, %xmm1 781; CHECK-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm0 782; CHECK-NEXT: retq 783 %r = insertelement <16 x i32> %x, i32 %y, i32 1 784 ret <16 x i32> %r 785} 786 787define <8 x double> @test_insert_128_v8f64(<8 x double> %x, double %y) { 788; CHECK-LABEL: test_insert_128_v8f64: 789; CHECK: ## %bb.0: 790; CHECK-NEXT: vmovlhps {{.*#+}} xmm1 = xmm0[0],xmm1[0] 791; CHECK-NEXT: vinsertf32x4 $0, %xmm1, %zmm0, %zmm0 792; CHECK-NEXT: retq 793 %r = insertelement <8 x double> %x, double %y, i32 1 794 ret <8 x double> %r 795} 796 797define <16 x float> @test_insert_128_v16f32(<16 x float> %x, float %y) { 798; CHECK-LABEL: test_insert_128_v16f32: 799; CHECK: ## %bb.0: 800; CHECK-NEXT: vinsertps {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[2,3] 801; CHECK-NEXT: vinsertf32x4 $0, %xmm1, %zmm0, %zmm0 802; CHECK-NEXT: retq 803 %r = insertelement <16 x float> %x, float %y, i32 1 804 ret <16 x float> %r 805} 806 807define <16 x i16> @test_insert_128_v16i16(<16 x i16> %x, i16 %y) { 808; KNL-LABEL: test_insert_128_v16i16: 809; KNL: ## %bb.0: 810; KNL-NEXT: vmovd %edi, %xmm1 811; KNL-NEXT: vpbroadcastw %xmm1, %ymm1 812; KNL-NEXT: vpblendw {{.*#+}} ymm1 = ymm0[0,1],ymm1[2],ymm0[3,4,5,6,7,8,9],ymm1[10],ymm0[11,12,13,14,15] 813; KNL-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7] 814; KNL-NEXT: retq 815; 816; SKX-LABEL: test_insert_128_v16i16: 817; SKX: ## %bb.0: 818; SKX-NEXT: vpbroadcastw %edi, %ymm1 819; SKX-NEXT: vpblendw {{.*#+}} ymm1 = ymm0[0,1],ymm1[2],ymm0[3,4,5,6,7,8,9],ymm1[10],ymm0[11,12,13,14,15] 820; SKX-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7] 821; SKX-NEXT: retq 822 %r = insertelement <16 x i16> %x, i16 %y, i32 10 823 ret <16 x i16> %r 824} 825 826define <32 x i8> @test_insert_128_v32i8(<32 x i8> %x, i8 %y) { 827; CHECK-LABEL: test_insert_128_v32i8: 828; CHECK: ## %bb.0: 829; CHECK-NEXT: vextracti128 $1, %ymm0, %xmm1 830; CHECK-NEXT: vpinsrb $4, %edi, %xmm1, %xmm1 831; CHECK-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 832; CHECK-NEXT: retq 833 %r = insertelement <32 x i8> %x, i8 %y, i32 20 834 ret <32 x i8> %r 835} 836 837define i32 @test_insertelement_v32i1(i32 %a, i32 %b, <32 x i32> %x , <32 x i32> %y) { 838; KNL-LABEL: test_insertelement_v32i1: 839; KNL: ## %bb.0: 840; KNL-NEXT: cmpl %esi, %edi 841; KNL-NEXT: setb %al 842; KNL-NEXT: vpcmpltud %zmm3, %zmm1, %k0 843; KNL-NEXT: kmovw %k0, %ecx 844; KNL-NEXT: shll $16, %ecx 845; KNL-NEXT: movw $-17, %dx 846; KNL-NEXT: kmovw %edx, %k1 847; KNL-NEXT: vpcmpltud %zmm2, %zmm0, %k0 {%k1} 848; KNL-NEXT: kmovw %eax, %k1 849; KNL-NEXT: kshiftlw $15, %k1, %k1 850; KNL-NEXT: kshiftrw $11, %k1, %k1 851; KNL-NEXT: korw %k1, %k0, %k0 852; KNL-NEXT: kmovw %k0, %eax 853; KNL-NEXT: orl %ecx, %eax 854; KNL-NEXT: vzeroupper 855; KNL-NEXT: retq 856; 857; SKX-LABEL: test_insertelement_v32i1: 858; SKX: ## %bb.0: 859; SKX-NEXT: cmpl %esi, %edi 860; SKX-NEXT: setb %al 861; SKX-NEXT: vpcmpltud %zmm2, %zmm0, %k0 862; SKX-NEXT: vpcmpltud %zmm3, %zmm1, %k1 863; SKX-NEXT: kunpckwd %k0, %k1, %k0 864; SKX-NEXT: movl $-17, %ecx 865; SKX-NEXT: kmovd %ecx, %k1 866; SKX-NEXT: kandd %k1, %k0, %k0 867; SKX-NEXT: kmovd %eax, %k1 868; SKX-NEXT: kshiftld $31, %k1, %k1 869; SKX-NEXT: kshiftrd $27, %k1, %k1 870; SKX-NEXT: kord %k1, %k0, %k0 871; SKX-NEXT: kmovd %k0, %eax 872; SKX-NEXT: vzeroupper 873; SKX-NEXT: retq 874 %cmp_res_i1 = icmp ult i32 %a, %b 875 %cmp_cmp_vec = icmp ult <32 x i32> %x, %y 876 %maskv = insertelement <32 x i1> %cmp_cmp_vec, i1 %cmp_res_i1, i32 4 877 %res = bitcast <32 x i1> %maskv to i32 878 ret i32 %res 879} 880 881define i8 @test_iinsertelement_v4i1(i32 %a, i32 %b, <4 x i32> %x , <4 x i32> %y) { 882; KNL-LABEL: test_iinsertelement_v4i1: 883; KNL: ## %bb.0: 884; KNL-NEXT: ## kill: def $xmm1 killed $xmm1 def $zmm1 885; KNL-NEXT: ## kill: def $xmm0 killed $xmm0 def $zmm0 886; KNL-NEXT: cmpl %esi, %edi 887; KNL-NEXT: setb %al 888; KNL-NEXT: movw $-5, %cx 889; KNL-NEXT: kmovw %ecx, %k1 890; KNL-NEXT: vpcmpltud %zmm1, %zmm0, %k0 {%k1} 891; KNL-NEXT: kmovw %eax, %k1 892; KNL-NEXT: kshiftlw $15, %k1, %k1 893; KNL-NEXT: kshiftrw $13, %k1, %k1 894; KNL-NEXT: korw %k1, %k0, %k0 895; KNL-NEXT: kmovw %k0, %eax 896; KNL-NEXT: ## kill: def $al killed $al killed $eax 897; KNL-NEXT: vzeroupper 898; KNL-NEXT: retq 899; 900; SKX-LABEL: test_iinsertelement_v4i1: 901; SKX: ## %bb.0: 902; SKX-NEXT: cmpl %esi, %edi 903; SKX-NEXT: setb %al 904; SKX-NEXT: movb $-5, %cl 905; SKX-NEXT: kmovd %ecx, %k1 906; SKX-NEXT: vpcmpltud %xmm1, %xmm0, %k0 {%k1} 907; SKX-NEXT: kmovd %eax, %k1 908; SKX-NEXT: kshiftlb $7, %k1, %k1 909; SKX-NEXT: kshiftrb $5, %k1, %k1 910; SKX-NEXT: korw %k1, %k0, %k0 911; SKX-NEXT: kmovd %k0, %eax 912; SKX-NEXT: ## kill: def $al killed $al killed $eax 913; SKX-NEXT: retq 914 %cmp_res_i1 = icmp ult i32 %a, %b 915 %cmp_cmp_vec = icmp ult <4 x i32> %x, %y 916 %maskv = insertelement <4 x i1> %cmp_cmp_vec, i1 %cmp_res_i1, i32 2 917 %res0 = shufflevector <4 x i1> %maskv, <4 x i1> undef , <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 4, i32 4, i32 4> 918 %res = bitcast <8 x i1> %res0 to i8 919 ret i8 %res 920} 921 922define i8 @test_iinsertelement_v2i1(i32 %a, i32 %b, <2 x i64> %x , <2 x i64> %y) { 923; KNL-LABEL: test_iinsertelement_v2i1: 924; KNL: ## %bb.0: 925; KNL-NEXT: ## kill: def $xmm1 killed $xmm1 def $zmm1 926; KNL-NEXT: ## kill: def $xmm0 killed $xmm0 def $zmm0 927; KNL-NEXT: cmpl %esi, %edi 928; KNL-NEXT: setb %al 929; KNL-NEXT: vpcmpltuq %zmm1, %zmm0, %k0 930; KNL-NEXT: kshiftlw $15, %k0, %k0 931; KNL-NEXT: kshiftrw $15, %k0, %k0 932; KNL-NEXT: kmovw %eax, %k1 933; KNL-NEXT: kshiftlw $1, %k1, %k1 934; KNL-NEXT: korw %k1, %k0, %k0 935; KNL-NEXT: kmovw %k0, %eax 936; KNL-NEXT: ## kill: def $al killed $al killed $eax 937; KNL-NEXT: vzeroupper 938; KNL-NEXT: retq 939; 940; SKX-LABEL: test_iinsertelement_v2i1: 941; SKX: ## %bb.0: 942; SKX-NEXT: cmpl %esi, %edi 943; SKX-NEXT: setb %al 944; SKX-NEXT: vpcmpltuq %xmm1, %xmm0, %k0 945; SKX-NEXT: kshiftlb $7, %k0, %k0 946; SKX-NEXT: kshiftrb $7, %k0, %k0 947; SKX-NEXT: kmovd %eax, %k1 948; SKX-NEXT: kshiftlb $1, %k1, %k1 949; SKX-NEXT: korw %k1, %k0, %k0 950; SKX-NEXT: kmovd %k0, %eax 951; SKX-NEXT: ## kill: def $al killed $al killed $eax 952; SKX-NEXT: retq 953 %cmp_res_i1 = icmp ult i32 %a, %b 954 %cmp_cmp_vec = icmp ult <2 x i64> %x, %y 955 %maskv = insertelement <2 x i1> %cmp_cmp_vec, i1 %cmp_res_i1, i32 1 956 %res0 = shufflevector <2 x i1> %maskv, <2 x i1> undef , <8 x i32> <i32 0, i32 1, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2> 957 %res = bitcast <8 x i1> %res0 to i8 958 ret i8 %res 959} 960 961define zeroext i8 @test_extractelement_v2i1(<2 x i64> %a, <2 x i64> %b) { 962; KNL-LABEL: test_extractelement_v2i1: 963; KNL: ## %bb.0: 964; KNL-NEXT: ## kill: def $xmm1 killed $xmm1 def $zmm1 965; KNL-NEXT: ## kill: def $xmm0 killed $xmm0 def $zmm0 966; KNL-NEXT: vpcmpnleuq %zmm1, %zmm0, %k0 967; KNL-NEXT: kmovw %k0, %ecx 968; KNL-NEXT: andl $1, %ecx 969; KNL-NEXT: movl $4, %eax 970; KNL-NEXT: subl %ecx, %eax 971; KNL-NEXT: vzeroupper 972; KNL-NEXT: retq 973; 974; SKX-LABEL: test_extractelement_v2i1: 975; SKX: ## %bb.0: 976; SKX-NEXT: vpcmpnleuq %xmm1, %xmm0, %k0 977; SKX-NEXT: kmovd %k0, %ecx 978; SKX-NEXT: andl $1, %ecx 979; SKX-NEXT: movl $4, %eax 980; SKX-NEXT: subl %ecx, %eax 981; SKX-NEXT: retq 982 %t1 = icmp ugt <2 x i64> %a, %b 983 %t2 = extractelement <2 x i1> %t1, i32 0 984 %res = select i1 %t2, i8 3, i8 4 985 ret i8 %res 986} 987 988define zeroext i8 @extractelement_v2i1_alt(<2 x i64> %a, <2 x i64> %b) { 989; KNL-LABEL: extractelement_v2i1_alt: 990; KNL: ## %bb.0: 991; KNL-NEXT: ## kill: def $xmm1 killed $xmm1 def $zmm1 992; KNL-NEXT: ## kill: def $xmm0 killed $xmm0 def $zmm0 993; KNL-NEXT: vpcmpnleuq %zmm1, %zmm0, %k0 994; KNL-NEXT: kmovw %k0, %eax 995; KNL-NEXT: andb $1, %al 996; KNL-NEXT: movb $4, %cl 997; KNL-NEXT: subb %al, %cl 998; KNL-NEXT: movzbl %cl, %eax 999; KNL-NEXT: vzeroupper 1000; KNL-NEXT: retq 1001; 1002; SKX-LABEL: extractelement_v2i1_alt: 1003; SKX: ## %bb.0: 1004; SKX-NEXT: vpcmpnleuq %xmm1, %xmm0, %k0 1005; SKX-NEXT: kmovd %k0, %eax 1006; SKX-NEXT: andb $1, %al 1007; SKX-NEXT: movb $4, %cl 1008; SKX-NEXT: subb %al, %cl 1009; SKX-NEXT: movzbl %cl, %eax 1010; SKX-NEXT: retq 1011 %t1 = icmp ugt <2 x i64> %a, %b 1012 %t2 = extractelement <2 x i1> %t1, i32 0 1013 %sext = sext i1 %t2 to i8 1014 %res = add i8 %sext, 4 1015 ret i8 %res 1016} 1017 1018define zeroext i8 @test_extractelement_v4i1(<4 x i32> %a, <4 x i32> %b) { 1019; KNL-LABEL: test_extractelement_v4i1: 1020; KNL: ## %bb.0: 1021; KNL-NEXT: ## kill: def $xmm1 killed $xmm1 def $zmm1 1022; KNL-NEXT: ## kill: def $xmm0 killed $xmm0 def $zmm0 1023; KNL-NEXT: vpcmpnleud %zmm1, %zmm0, %k0 1024; KNL-NEXT: kshiftrw $3, %k0, %k0 1025; KNL-NEXT: kmovw %k0, %eax 1026; KNL-NEXT: andl $1, %eax 1027; KNL-NEXT: vzeroupper 1028; KNL-NEXT: retq 1029; 1030; SKX-LABEL: test_extractelement_v4i1: 1031; SKX: ## %bb.0: 1032; SKX-NEXT: vpcmpnleud %xmm1, %xmm0, %k0 1033; SKX-NEXT: kshiftrb $3, %k0, %k0 1034; SKX-NEXT: kmovd %k0, %eax 1035; SKX-NEXT: andl $1, %eax 1036; SKX-NEXT: retq 1037 %t1 = icmp ugt <4 x i32> %a, %b 1038 %t2 = extractelement <4 x i1> %t1, i32 3 1039 %res = zext i1 %t2 to i8 1040 ret i8 %res 1041} 1042 1043define zeroext i8 @test_extractelement_v32i1(<32 x i8> %a, <32 x i8> %b) { 1044; KNL-LABEL: test_extractelement_v32i1: 1045; KNL: ## %bb.0: 1046; KNL-NEXT: vpminub %xmm1, %xmm0, %xmm1 1047; KNL-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 1048; KNL-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0 1049; KNL-NEXT: vpmovsxbd %xmm0, %zmm0 1050; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 1051; KNL-NEXT: kshiftrw $2, %k0, %k0 1052; KNL-NEXT: kmovw %k0, %eax 1053; KNL-NEXT: andl $1, %eax 1054; KNL-NEXT: vzeroupper 1055; KNL-NEXT: retq 1056; 1057; SKX-LABEL: test_extractelement_v32i1: 1058; SKX: ## %bb.0: 1059; SKX-NEXT: vpcmpnleub %ymm1, %ymm0, %k0 1060; SKX-NEXT: kshiftrd $2, %k0, %k0 1061; SKX-NEXT: kmovd %k0, %eax 1062; SKX-NEXT: andl $1, %eax 1063; SKX-NEXT: vzeroupper 1064; SKX-NEXT: retq 1065 %t1 = icmp ugt <32 x i8> %a, %b 1066 %t2 = extractelement <32 x i1> %t1, i32 2 1067 %res = zext i1 %t2 to i8 1068 ret i8 %res 1069} 1070 1071define zeroext i8 @test_extractelement_v64i1(<64 x i8> %a, <64 x i8> %b) { 1072; KNL-LABEL: test_extractelement_v64i1: 1073; KNL: ## %bb.0: 1074; KNL-NEXT: vextracti64x4 $1, %zmm1, %ymm1 1075; KNL-NEXT: vextracti128 $1, %ymm1, %xmm1 1076; KNL-NEXT: vextracti64x4 $1, %zmm0, %ymm0 1077; KNL-NEXT: vextracti128 $1, %ymm0, %xmm0 1078; KNL-NEXT: vpminub %xmm1, %xmm0, %xmm1 1079; KNL-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 1080; KNL-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0 1081; KNL-NEXT: vpmovsxbd %xmm0, %zmm0 1082; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 1083; KNL-NEXT: kshiftrw $15, %k0, %k0 1084; KNL-NEXT: kmovw %k0, %ecx 1085; KNL-NEXT: andl $1, %ecx 1086; KNL-NEXT: movl $4, %eax 1087; KNL-NEXT: subl %ecx, %eax 1088; KNL-NEXT: vzeroupper 1089; KNL-NEXT: retq 1090; 1091; SKX-LABEL: test_extractelement_v64i1: 1092; SKX: ## %bb.0: 1093; SKX-NEXT: vpcmpnleub %zmm1, %zmm0, %k0 1094; SKX-NEXT: kshiftrq $63, %k0, %k0 1095; SKX-NEXT: kmovd %k0, %ecx 1096; SKX-NEXT: andl $1, %ecx 1097; SKX-NEXT: movl $4, %eax 1098; SKX-NEXT: subl %ecx, %eax 1099; SKX-NEXT: vzeroupper 1100; SKX-NEXT: retq 1101 %t1 = icmp ugt <64 x i8> %a, %b 1102 %t2 = extractelement <64 x i1> %t1, i32 63 1103 %res = select i1 %t2, i8 3, i8 4 1104 ret i8 %res 1105} 1106 1107define zeroext i8 @extractelement_v64i1_alt(<64 x i8> %a, <64 x i8> %b) { 1108; KNL-LABEL: extractelement_v64i1_alt: 1109; KNL: ## %bb.0: 1110; KNL-NEXT: vextracti64x4 $1, %zmm1, %ymm1 1111; KNL-NEXT: vextracti128 $1, %ymm1, %xmm1 1112; KNL-NEXT: vextracti64x4 $1, %zmm0, %ymm0 1113; KNL-NEXT: vextracti128 $1, %ymm0, %xmm0 1114; KNL-NEXT: vpminub %xmm1, %xmm0, %xmm1 1115; KNL-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 1116; KNL-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0 1117; KNL-NEXT: vpmovsxbd %xmm0, %zmm0 1118; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 1119; KNL-NEXT: kshiftrw $15, %k0, %k0 1120; KNL-NEXT: kmovw %k0, %eax 1121; KNL-NEXT: andb $1, %al 1122; KNL-NEXT: movb $4, %cl 1123; KNL-NEXT: subb %al, %cl 1124; KNL-NEXT: movzbl %cl, %eax 1125; KNL-NEXT: vzeroupper 1126; KNL-NEXT: retq 1127; 1128; SKX-LABEL: extractelement_v64i1_alt: 1129; SKX: ## %bb.0: 1130; SKX-NEXT: vpcmpnleub %zmm1, %zmm0, %k0 1131; SKX-NEXT: kshiftrq $63, %k0, %k0 1132; SKX-NEXT: kmovd %k0, %eax 1133; SKX-NEXT: andb $1, %al 1134; SKX-NEXT: movb $4, %cl 1135; SKX-NEXT: subb %al, %cl 1136; SKX-NEXT: movzbl %cl, %eax 1137; SKX-NEXT: vzeroupper 1138; SKX-NEXT: retq 1139 %t1 = icmp ugt <64 x i8> %a, %b 1140 %t2 = extractelement <64 x i1> %t1, i32 63 1141 %sext = sext i1 %t2 to i8 1142 %res = add i8 %sext, 4 1143 ret i8 %res 1144} 1145 1146define i64 @test_extractelement_variable_v2i64(<2 x i64> %t1, i32 %index) { 1147; CHECK-LABEL: test_extractelement_variable_v2i64: 1148; CHECK: ## %bb.0: 1149; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi 1150; CHECK-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp) 1151; CHECK-NEXT: andl $1, %edi 1152; CHECK-NEXT: movq -24(%rsp,%rdi,8), %rax 1153; CHECK-NEXT: retq 1154 %t2 = extractelement <2 x i64> %t1, i32 %index 1155 ret i64 %t2 1156} 1157 1158define i64 @test_extractelement_variable_v4i64(<4 x i64> %t1, i32 %index) { 1159; CHECK-LABEL: test_extractelement_variable_v4i64: 1160; CHECK: ## %bb.0: 1161; CHECK-NEXT: pushq %rbp 1162; CHECK-NEXT: .cfi_def_cfa_offset 16 1163; CHECK-NEXT: .cfi_offset %rbp, -16 1164; CHECK-NEXT: movq %rsp, %rbp 1165; CHECK-NEXT: .cfi_def_cfa_register %rbp 1166; CHECK-NEXT: andq $-32, %rsp 1167; CHECK-NEXT: subq $64, %rsp 1168; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi 1169; CHECK-NEXT: vmovaps %ymm0, (%rsp) 1170; CHECK-NEXT: andl $3, %edi 1171; CHECK-NEXT: movq (%rsp,%rdi,8), %rax 1172; CHECK-NEXT: movq %rbp, %rsp 1173; CHECK-NEXT: popq %rbp 1174; CHECK-NEXT: vzeroupper 1175; CHECK-NEXT: retq 1176 %t2 = extractelement <4 x i64> %t1, i32 %index 1177 ret i64 %t2 1178} 1179 1180define i64 @test_extractelement_variable_v8i64(<8 x i64> %t1, i32 %index) { 1181; CHECK-LABEL: test_extractelement_variable_v8i64: 1182; CHECK: ## %bb.0: 1183; CHECK-NEXT: pushq %rbp 1184; CHECK-NEXT: .cfi_def_cfa_offset 16 1185; CHECK-NEXT: .cfi_offset %rbp, -16 1186; CHECK-NEXT: movq %rsp, %rbp 1187; CHECK-NEXT: .cfi_def_cfa_register %rbp 1188; CHECK-NEXT: andq $-64, %rsp 1189; CHECK-NEXT: subq $128, %rsp 1190; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi 1191; CHECK-NEXT: vmovaps %zmm0, (%rsp) 1192; CHECK-NEXT: andl $7, %edi 1193; CHECK-NEXT: movq (%rsp,%rdi,8), %rax 1194; CHECK-NEXT: movq %rbp, %rsp 1195; CHECK-NEXT: popq %rbp 1196; CHECK-NEXT: vzeroupper 1197; CHECK-NEXT: retq 1198 %t2 = extractelement <8 x i64> %t1, i32 %index 1199 ret i64 %t2 1200} 1201 1202define double @test_extractelement_variable_v2f64(<2 x double> %t1, i32 %index) { 1203; CHECK-LABEL: test_extractelement_variable_v2f64: 1204; CHECK: ## %bb.0: 1205; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi 1206; CHECK-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp) 1207; CHECK-NEXT: andl $1, %edi 1208; CHECK-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero 1209; CHECK-NEXT: retq 1210 %t2 = extractelement <2 x double> %t1, i32 %index 1211 ret double %t2 1212} 1213 1214define double @test_extractelement_variable_v4f64(<4 x double> %t1, i32 %index) { 1215; CHECK-LABEL: test_extractelement_variable_v4f64: 1216; CHECK: ## %bb.0: 1217; CHECK-NEXT: pushq %rbp 1218; CHECK-NEXT: .cfi_def_cfa_offset 16 1219; CHECK-NEXT: .cfi_offset %rbp, -16 1220; CHECK-NEXT: movq %rsp, %rbp 1221; CHECK-NEXT: .cfi_def_cfa_register %rbp 1222; CHECK-NEXT: andq $-32, %rsp 1223; CHECK-NEXT: subq $64, %rsp 1224; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi 1225; CHECK-NEXT: vmovaps %ymm0, (%rsp) 1226; CHECK-NEXT: andl $3, %edi 1227; CHECK-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero 1228; CHECK-NEXT: movq %rbp, %rsp 1229; CHECK-NEXT: popq %rbp 1230; CHECK-NEXT: vzeroupper 1231; CHECK-NEXT: retq 1232 %t2 = extractelement <4 x double> %t1, i32 %index 1233 ret double %t2 1234} 1235 1236define double @test_extractelement_variable_v8f64(<8 x double> %t1, i32 %index) { 1237; CHECK-LABEL: test_extractelement_variable_v8f64: 1238; CHECK: ## %bb.0: 1239; CHECK-NEXT: pushq %rbp 1240; CHECK-NEXT: .cfi_def_cfa_offset 16 1241; CHECK-NEXT: .cfi_offset %rbp, -16 1242; CHECK-NEXT: movq %rsp, %rbp 1243; CHECK-NEXT: .cfi_def_cfa_register %rbp 1244; CHECK-NEXT: andq $-64, %rsp 1245; CHECK-NEXT: subq $128, %rsp 1246; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi 1247; CHECK-NEXT: vmovaps %zmm0, (%rsp) 1248; CHECK-NEXT: andl $7, %edi 1249; CHECK-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero 1250; CHECK-NEXT: movq %rbp, %rsp 1251; CHECK-NEXT: popq %rbp 1252; CHECK-NEXT: vzeroupper 1253; CHECK-NEXT: retq 1254 %t2 = extractelement <8 x double> %t1, i32 %index 1255 ret double %t2 1256} 1257 1258define i32 @test_extractelement_variable_v4i32(<4 x i32> %t1, i32 %index) { 1259; CHECK-LABEL: test_extractelement_variable_v4i32: 1260; CHECK: ## %bb.0: 1261; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi 1262; CHECK-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp) 1263; CHECK-NEXT: andl $3, %edi 1264; CHECK-NEXT: movl -24(%rsp,%rdi,4), %eax 1265; CHECK-NEXT: retq 1266 %t2 = extractelement <4 x i32> %t1, i32 %index 1267 ret i32 %t2 1268} 1269 1270define i32 @test_extractelement_variable_v8i32(<8 x i32> %t1, i32 %index) { 1271; CHECK-LABEL: test_extractelement_variable_v8i32: 1272; CHECK: ## %bb.0: 1273; CHECK-NEXT: pushq %rbp 1274; CHECK-NEXT: .cfi_def_cfa_offset 16 1275; CHECK-NEXT: .cfi_offset %rbp, -16 1276; CHECK-NEXT: movq %rsp, %rbp 1277; CHECK-NEXT: .cfi_def_cfa_register %rbp 1278; CHECK-NEXT: andq $-32, %rsp 1279; CHECK-NEXT: subq $64, %rsp 1280; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi 1281; CHECK-NEXT: vmovaps %ymm0, (%rsp) 1282; CHECK-NEXT: andl $7, %edi 1283; CHECK-NEXT: movl (%rsp,%rdi,4), %eax 1284; CHECK-NEXT: movq %rbp, %rsp 1285; CHECK-NEXT: popq %rbp 1286; CHECK-NEXT: vzeroupper 1287; CHECK-NEXT: retq 1288 %t2 = extractelement <8 x i32> %t1, i32 %index 1289 ret i32 %t2 1290} 1291 1292define i32 @test_extractelement_variable_v16i32(<16 x i32> %t1, i32 %index) { 1293; CHECK-LABEL: test_extractelement_variable_v16i32: 1294; CHECK: ## %bb.0: 1295; CHECK-NEXT: pushq %rbp 1296; CHECK-NEXT: .cfi_def_cfa_offset 16 1297; CHECK-NEXT: .cfi_offset %rbp, -16 1298; CHECK-NEXT: movq %rsp, %rbp 1299; CHECK-NEXT: .cfi_def_cfa_register %rbp 1300; CHECK-NEXT: andq $-64, %rsp 1301; CHECK-NEXT: subq $128, %rsp 1302; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi 1303; CHECK-NEXT: vmovaps %zmm0, (%rsp) 1304; CHECK-NEXT: andl $15, %edi 1305; CHECK-NEXT: movl (%rsp,%rdi,4), %eax 1306; CHECK-NEXT: movq %rbp, %rsp 1307; CHECK-NEXT: popq %rbp 1308; CHECK-NEXT: vzeroupper 1309; CHECK-NEXT: retq 1310 %t2 = extractelement <16 x i32> %t1, i32 %index 1311 ret i32 %t2 1312} 1313 1314define float @test_extractelement_variable_v4f32(<4 x float> %t1, i32 %index) { 1315; CHECK-LABEL: test_extractelement_variable_v4f32: 1316; CHECK: ## %bb.0: 1317; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi 1318; CHECK-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp) 1319; CHECK-NEXT: andl $3, %edi 1320; CHECK-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero 1321; CHECK-NEXT: retq 1322 %t2 = extractelement <4 x float> %t1, i32 %index 1323 ret float %t2 1324} 1325 1326define float @test_extractelement_variable_v8f32(<8 x float> %t1, i32 %index) { 1327; CHECK-LABEL: test_extractelement_variable_v8f32: 1328; CHECK: ## %bb.0: 1329; CHECK-NEXT: pushq %rbp 1330; CHECK-NEXT: .cfi_def_cfa_offset 16 1331; CHECK-NEXT: .cfi_offset %rbp, -16 1332; CHECK-NEXT: movq %rsp, %rbp 1333; CHECK-NEXT: .cfi_def_cfa_register %rbp 1334; CHECK-NEXT: andq $-32, %rsp 1335; CHECK-NEXT: subq $64, %rsp 1336; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi 1337; CHECK-NEXT: vmovaps %ymm0, (%rsp) 1338; CHECK-NEXT: andl $7, %edi 1339; CHECK-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero 1340; CHECK-NEXT: movq %rbp, %rsp 1341; CHECK-NEXT: popq %rbp 1342; CHECK-NEXT: vzeroupper 1343; CHECK-NEXT: retq 1344 %t2 = extractelement <8 x float> %t1, i32 %index 1345 ret float %t2 1346} 1347 1348define float @test_extractelement_variable_v16f32(<16 x float> %t1, i32 %index) { 1349; CHECK-LABEL: test_extractelement_variable_v16f32: 1350; CHECK: ## %bb.0: 1351; CHECK-NEXT: pushq %rbp 1352; CHECK-NEXT: .cfi_def_cfa_offset 16 1353; CHECK-NEXT: .cfi_offset %rbp, -16 1354; CHECK-NEXT: movq %rsp, %rbp 1355; CHECK-NEXT: .cfi_def_cfa_register %rbp 1356; CHECK-NEXT: andq $-64, %rsp 1357; CHECK-NEXT: subq $128, %rsp 1358; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi 1359; CHECK-NEXT: vmovaps %zmm0, (%rsp) 1360; CHECK-NEXT: andl $15, %edi 1361; CHECK-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero 1362; CHECK-NEXT: movq %rbp, %rsp 1363; CHECK-NEXT: popq %rbp 1364; CHECK-NEXT: vzeroupper 1365; CHECK-NEXT: retq 1366 %t2 = extractelement <16 x float> %t1, i32 %index 1367 ret float %t2 1368} 1369 1370define i16 @test_extractelement_variable_v8i16(<8 x i16> %t1, i32 %index) { 1371; CHECK-LABEL: test_extractelement_variable_v8i16: 1372; CHECK: ## %bb.0: 1373; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi 1374; CHECK-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp) 1375; CHECK-NEXT: andl $7, %edi 1376; CHECK-NEXT: movzwl -24(%rsp,%rdi,2), %eax 1377; CHECK-NEXT: retq 1378 %t2 = extractelement <8 x i16> %t1, i32 %index 1379 ret i16 %t2 1380} 1381 1382define i16 @test_extractelement_variable_v16i16(<16 x i16> %t1, i32 %index) { 1383; CHECK-LABEL: test_extractelement_variable_v16i16: 1384; CHECK: ## %bb.0: 1385; CHECK-NEXT: pushq %rbp 1386; CHECK-NEXT: .cfi_def_cfa_offset 16 1387; CHECK-NEXT: .cfi_offset %rbp, -16 1388; CHECK-NEXT: movq %rsp, %rbp 1389; CHECK-NEXT: .cfi_def_cfa_register %rbp 1390; CHECK-NEXT: andq $-32, %rsp 1391; CHECK-NEXT: subq $64, %rsp 1392; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi 1393; CHECK-NEXT: vmovaps %ymm0, (%rsp) 1394; CHECK-NEXT: andl $15, %edi 1395; CHECK-NEXT: movzwl (%rsp,%rdi,2), %eax 1396; CHECK-NEXT: movq %rbp, %rsp 1397; CHECK-NEXT: popq %rbp 1398; CHECK-NEXT: vzeroupper 1399; CHECK-NEXT: retq 1400 %t2 = extractelement <16 x i16> %t1, i32 %index 1401 ret i16 %t2 1402} 1403 1404define i16 @test_extractelement_variable_v32i16(<32 x i16> %t1, i32 %index) { 1405; CHECK-LABEL: test_extractelement_variable_v32i16: 1406; CHECK: ## %bb.0: 1407; CHECK-NEXT: pushq %rbp 1408; CHECK-NEXT: .cfi_def_cfa_offset 16 1409; CHECK-NEXT: .cfi_offset %rbp, -16 1410; CHECK-NEXT: movq %rsp, %rbp 1411; CHECK-NEXT: .cfi_def_cfa_register %rbp 1412; CHECK-NEXT: andq $-64, %rsp 1413; CHECK-NEXT: subq $128, %rsp 1414; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi 1415; CHECK-NEXT: vmovaps %zmm0, (%rsp) 1416; CHECK-NEXT: andl $31, %edi 1417; CHECK-NEXT: movzwl (%rsp,%rdi,2), %eax 1418; CHECK-NEXT: movq %rbp, %rsp 1419; CHECK-NEXT: popq %rbp 1420; CHECK-NEXT: vzeroupper 1421; CHECK-NEXT: retq 1422 %t2 = extractelement <32 x i16> %t1, i32 %index 1423 ret i16 %t2 1424} 1425 1426define i8 @test_extractelement_variable_v16i8(<16 x i8> %t1, i32 %index) { 1427; CHECK-LABEL: test_extractelement_variable_v16i8: 1428; CHECK: ## %bb.0: 1429; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi 1430; CHECK-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp) 1431; CHECK-NEXT: andl $15, %edi 1432; CHECK-NEXT: movb -24(%rsp,%rdi), %al 1433; CHECK-NEXT: retq 1434 %t2 = extractelement <16 x i8> %t1, i32 %index 1435 ret i8 %t2 1436} 1437 1438define i8 @test_extractelement_variable_v32i8(<32 x i8> %t1, i32 %index) { 1439; CHECK-LABEL: test_extractelement_variable_v32i8: 1440; CHECK: ## %bb.0: 1441; CHECK-NEXT: pushq %rbp 1442; CHECK-NEXT: .cfi_def_cfa_offset 16 1443; CHECK-NEXT: .cfi_offset %rbp, -16 1444; CHECK-NEXT: movq %rsp, %rbp 1445; CHECK-NEXT: .cfi_def_cfa_register %rbp 1446; CHECK-NEXT: andq $-32, %rsp 1447; CHECK-NEXT: subq $64, %rsp 1448; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi 1449; CHECK-NEXT: vmovaps %ymm0, (%rsp) 1450; CHECK-NEXT: andl $31, %edi 1451; CHECK-NEXT: movb (%rsp,%rdi), %al 1452; CHECK-NEXT: movq %rbp, %rsp 1453; CHECK-NEXT: popq %rbp 1454; CHECK-NEXT: vzeroupper 1455; CHECK-NEXT: retq 1456 1457 %t2 = extractelement <32 x i8> %t1, i32 %index 1458 ret i8 %t2 1459} 1460 1461define i8 @test_extractelement_variable_v64i8(<64 x i8> %t1, i32 %index) { 1462; CHECK-LABEL: test_extractelement_variable_v64i8: 1463; CHECK: ## %bb.0: 1464; CHECK-NEXT: pushq %rbp 1465; CHECK-NEXT: .cfi_def_cfa_offset 16 1466; CHECK-NEXT: .cfi_offset %rbp, -16 1467; CHECK-NEXT: movq %rsp, %rbp 1468; CHECK-NEXT: .cfi_def_cfa_register %rbp 1469; CHECK-NEXT: andq $-64, %rsp 1470; CHECK-NEXT: subq $128, %rsp 1471; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi 1472; CHECK-NEXT: vmovaps %zmm0, (%rsp) 1473; CHECK-NEXT: andl $63, %edi 1474; CHECK-NEXT: movb (%rsp,%rdi), %al 1475; CHECK-NEXT: movq %rbp, %rsp 1476; CHECK-NEXT: popq %rbp 1477; CHECK-NEXT: vzeroupper 1478; CHECK-NEXT: retq 1479 1480 %t2 = extractelement <64 x i8> %t1, i32 %index 1481 ret i8 %t2 1482} 1483 1484define i8 @test_extractelement_variable_v64i8_indexi8(<64 x i8> %t1, i8 %index) { 1485; CHECK-LABEL: test_extractelement_variable_v64i8_indexi8: 1486; CHECK: ## %bb.0: 1487; CHECK-NEXT: pushq %rbp 1488; CHECK-NEXT: .cfi_def_cfa_offset 16 1489; CHECK-NEXT: .cfi_offset %rbp, -16 1490; CHECK-NEXT: movq %rsp, %rbp 1491; CHECK-NEXT: .cfi_def_cfa_register %rbp 1492; CHECK-NEXT: andq $-64, %rsp 1493; CHECK-NEXT: subq $128, %rsp 1494; CHECK-NEXT: addb %dil, %dil 1495; CHECK-NEXT: vmovaps %zmm0, (%rsp) 1496; CHECK-NEXT: movzbl %dil, %eax 1497; CHECK-NEXT: andl $63, %eax 1498; CHECK-NEXT: movb (%rsp,%rax), %al 1499; CHECK-NEXT: movq %rbp, %rsp 1500; CHECK-NEXT: popq %rbp 1501; CHECK-NEXT: vzeroupper 1502; CHECK-NEXT: retq 1503 1504 %i = add i8 %index, %index 1505 %t2 = extractelement <64 x i8> %t1, i8 %i 1506 ret i8 %t2 1507} 1508 1509define zeroext i8 @test_extractelement_varible_v2i1(<2 x i64> %a, <2 x i64> %b, i32 %index) { 1510; KNL-LABEL: test_extractelement_varible_v2i1: 1511; KNL: ## %bb.0: 1512; KNL-NEXT: ## kill: def $edi killed $edi def $rdi 1513; KNL-NEXT: ## kill: def $xmm1 killed $xmm1 def $zmm1 1514; KNL-NEXT: ## kill: def $xmm0 killed $xmm0 def $zmm0 1515; KNL-NEXT: vpcmpnleuq %zmm1, %zmm0, %k1 1516; KNL-NEXT: vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z} 1517; KNL-NEXT: vmovdqa %xmm0, -{{[0-9]+}}(%rsp) 1518; KNL-NEXT: andl $1, %edi 1519; KNL-NEXT: movzbl -24(%rsp,%rdi,8), %eax 1520; KNL-NEXT: andl $1, %eax 1521; KNL-NEXT: vzeroupper 1522; KNL-NEXT: retq 1523; 1524; SKX-LABEL: test_extractelement_varible_v2i1: 1525; SKX: ## %bb.0: 1526; SKX-NEXT: ## kill: def $edi killed $edi def $rdi 1527; SKX-NEXT: vpcmpnleuq %xmm1, %xmm0, %k0 1528; SKX-NEXT: vpmovm2q %k0, %xmm0 1529; SKX-NEXT: vmovdqa %xmm0, -{{[0-9]+}}(%rsp) 1530; SKX-NEXT: andl $1, %edi 1531; SKX-NEXT: movzbl -24(%rsp,%rdi,8), %eax 1532; SKX-NEXT: andl $1, %eax 1533; SKX-NEXT: retq 1534 %t1 = icmp ugt <2 x i64> %a, %b 1535 %t2 = extractelement <2 x i1> %t1, i32 %index 1536 %res = zext i1 %t2 to i8 1537 ret i8 %res 1538} 1539 1540define zeroext i8 @test_extractelement_varible_v4i1(<4 x i32> %a, <4 x i32> %b, i32 %index) { 1541; KNL-LABEL: test_extractelement_varible_v4i1: 1542; KNL: ## %bb.0: 1543; KNL-NEXT: ## kill: def $edi killed $edi def $rdi 1544; KNL-NEXT: ## kill: def $xmm1 killed $xmm1 def $zmm1 1545; KNL-NEXT: ## kill: def $xmm0 killed $xmm0 def $zmm0 1546; KNL-NEXT: vpcmpnleud %zmm1, %zmm0, %k1 1547; KNL-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} 1548; KNL-NEXT: vmovdqa %xmm0, -{{[0-9]+}}(%rsp) 1549; KNL-NEXT: andl $3, %edi 1550; KNL-NEXT: movzbl -24(%rsp,%rdi,4), %eax 1551; KNL-NEXT: andl $1, %eax 1552; KNL-NEXT: vzeroupper 1553; KNL-NEXT: retq 1554; 1555; SKX-LABEL: test_extractelement_varible_v4i1: 1556; SKX: ## %bb.0: 1557; SKX-NEXT: ## kill: def $edi killed $edi def $rdi 1558; SKX-NEXT: vpcmpnleud %xmm1, %xmm0, %k0 1559; SKX-NEXT: vpmovm2d %k0, %xmm0 1560; SKX-NEXT: vmovdqa %xmm0, -{{[0-9]+}}(%rsp) 1561; SKX-NEXT: andl $3, %edi 1562; SKX-NEXT: movzbl -24(%rsp,%rdi,4), %eax 1563; SKX-NEXT: andl $1, %eax 1564; SKX-NEXT: retq 1565 %t1 = icmp ugt <4 x i32> %a, %b 1566 %t2 = extractelement <4 x i1> %t1, i32 %index 1567 %res = zext i1 %t2 to i8 1568 ret i8 %res 1569} 1570 1571define zeroext i8 @test_extractelement_varible_v8i1(<8 x i32> %a, <8 x i32> %b, i32 %index) { 1572; KNL-LABEL: test_extractelement_varible_v8i1: 1573; KNL: ## %bb.0: 1574; KNL-NEXT: ## kill: def $edi killed $edi def $rdi 1575; KNL-NEXT: ## kill: def $ymm1 killed $ymm1 def $zmm1 1576; KNL-NEXT: ## kill: def $ymm0 killed $ymm0 def $zmm0 1577; KNL-NEXT: vpcmpnleud %zmm1, %zmm0, %k1 1578; KNL-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} 1579; KNL-NEXT: vpmovdw %zmm0, %ymm0 1580; KNL-NEXT: vmovdqa %xmm0, -{{[0-9]+}}(%rsp) 1581; KNL-NEXT: andl $7, %edi 1582; KNL-NEXT: movzbl -24(%rsp,%rdi,2), %eax 1583; KNL-NEXT: andl $1, %eax 1584; KNL-NEXT: vzeroupper 1585; KNL-NEXT: retq 1586; 1587; SKX-LABEL: test_extractelement_varible_v8i1: 1588; SKX: ## %bb.0: 1589; SKX-NEXT: ## kill: def $edi killed $edi def $rdi 1590; SKX-NEXT: vpcmpnleud %ymm1, %ymm0, %k0 1591; SKX-NEXT: vpmovm2w %k0, %xmm0 1592; SKX-NEXT: vmovdqa %xmm0, -{{[0-9]+}}(%rsp) 1593; SKX-NEXT: andl $7, %edi 1594; SKX-NEXT: movzbl -24(%rsp,%rdi,2), %eax 1595; SKX-NEXT: andl $1, %eax 1596; SKX-NEXT: vzeroupper 1597; SKX-NEXT: retq 1598 %t1 = icmp ugt <8 x i32> %a, %b 1599 %t2 = extractelement <8 x i1> %t1, i32 %index 1600 %res = zext i1 %t2 to i8 1601 ret i8 %res 1602} 1603 1604define zeroext i8 @test_extractelement_varible_v16i1(<16 x i32> %a, <16 x i32> %b, i32 %index) { 1605; KNL-LABEL: test_extractelement_varible_v16i1: 1606; KNL: ## %bb.0: 1607; KNL-NEXT: ## kill: def $edi killed $edi def $rdi 1608; KNL-NEXT: vpcmpnleud %zmm1, %zmm0, %k1 1609; KNL-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} 1610; KNL-NEXT: vpmovdb %zmm0, -{{[0-9]+}}(%rsp) 1611; KNL-NEXT: andl $15, %edi 1612; KNL-NEXT: movzbl -24(%rsp,%rdi), %eax 1613; KNL-NEXT: andl $1, %eax 1614; KNL-NEXT: vzeroupper 1615; KNL-NEXT: retq 1616; 1617; SKX-LABEL: test_extractelement_varible_v16i1: 1618; SKX: ## %bb.0: 1619; SKX-NEXT: ## kill: def $edi killed $edi def $rdi 1620; SKX-NEXT: vpcmpnleud %zmm1, %zmm0, %k0 1621; SKX-NEXT: vpmovm2b %k0, %xmm0 1622; SKX-NEXT: vmovdqa %xmm0, -{{[0-9]+}}(%rsp) 1623; SKX-NEXT: andl $15, %edi 1624; SKX-NEXT: movzbl -24(%rsp,%rdi), %eax 1625; SKX-NEXT: andl $1, %eax 1626; SKX-NEXT: vzeroupper 1627; SKX-NEXT: retq 1628 %t1 = icmp ugt <16 x i32> %a, %b 1629 %t2 = extractelement <16 x i1> %t1, i32 %index 1630 %res = zext i1 %t2 to i8 1631 ret i8 %res 1632} 1633 1634define zeroext i8 @test_extractelement_varible_v32i1(<32 x i8> %a, <32 x i8> %b, i32 %index) { 1635; KNL-LABEL: test_extractelement_varible_v32i1: 1636; KNL: ## %bb.0: 1637; KNL-NEXT: vpminub %ymm1, %ymm0, %ymm1 1638; KNL-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0 1639; KNL-NEXT: vpmovmskb %ymm0, %ecx 1640; KNL-NEXT: xorl %eax, %eax 1641; KNL-NEXT: btl %edi, %ecx 1642; KNL-NEXT: setae %al 1643; KNL-NEXT: vzeroupper 1644; KNL-NEXT: retq 1645; 1646; SKX-LABEL: test_extractelement_varible_v32i1: 1647; SKX: ## %bb.0: 1648; SKX-NEXT: pushq %rbp 1649; SKX-NEXT: .cfi_def_cfa_offset 16 1650; SKX-NEXT: .cfi_offset %rbp, -16 1651; SKX-NEXT: movq %rsp, %rbp 1652; SKX-NEXT: .cfi_def_cfa_register %rbp 1653; SKX-NEXT: andq $-32, %rsp 1654; SKX-NEXT: subq $64, %rsp 1655; SKX-NEXT: ## kill: def $edi killed $edi def $rdi 1656; SKX-NEXT: vpcmpnleub %ymm1, %ymm0, %k0 1657; SKX-NEXT: vpmovm2b %k0, %ymm0 1658; SKX-NEXT: vmovdqa %ymm0, (%rsp) 1659; SKX-NEXT: andl $31, %edi 1660; SKX-NEXT: movzbl (%rsp,%rdi), %eax 1661; SKX-NEXT: andl $1, %eax 1662; SKX-NEXT: movq %rbp, %rsp 1663; SKX-NEXT: popq %rbp 1664; SKX-NEXT: vzeroupper 1665; SKX-NEXT: retq 1666 %t1 = icmp ugt <32 x i8> %a, %b 1667 %t2 = extractelement <32 x i1> %t1, i32 %index 1668 %res = zext i1 %t2 to i8 1669 ret i8 %res 1670} 1671 1672define <8 x i64> @insert_double_zero(<2 x i64> %a) nounwind { 1673; CHECK-LABEL: insert_double_zero: 1674; CHECK: ## %bb.0: 1675; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1 1676; CHECK-NEXT: vinsertf32x4 $2, %xmm0, %zmm1, %zmm0 1677; CHECK-NEXT: retq 1678 %b = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 1679 %d = shufflevector <4 x i64> %b, <4 x i64> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> 1680 %e = shufflevector <8 x i64> %d, <8 x i64> zeroinitializer, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 0, i32 1, i32 2, i32 3> 1681 ret <8 x i64> %e 1682} 1683 1684define i32 @test_insertelement_variable_v32i1(<32 x i8> %a, i8 %b, i32 %index) { 1685; KNL-LABEL: test_insertelement_variable_v32i1: 1686; KNL: ## %bb.0: 1687; KNL-NEXT: pushq %rbp 1688; KNL-NEXT: .cfi_def_cfa_offset 16 1689; KNL-NEXT: .cfi_offset %rbp, -16 1690; KNL-NEXT: movq %rsp, %rbp 1691; KNL-NEXT: .cfi_def_cfa_register %rbp 1692; KNL-NEXT: andq $-32, %rsp 1693; KNL-NEXT: subq $64, %rsp 1694; KNL-NEXT: ## kill: def $esi killed $esi def $rsi 1695; KNL-NEXT: vpxor %xmm1, %xmm1, %xmm1 1696; KNL-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0 1697; KNL-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0 1698; KNL-NEXT: andl $31, %esi 1699; KNL-NEXT: testb %dil, %dil 1700; KNL-NEXT: vmovdqa %ymm0, (%rsp) 1701; KNL-NEXT: setne (%rsp,%rsi) 1702; KNL-NEXT: vpmovsxbd (%rsp), %zmm0 1703; KNL-NEXT: vpslld $31, %zmm0, %zmm0 1704; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 1705; KNL-NEXT: kmovw %k0, %ecx 1706; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm0 1707; KNL-NEXT: vpslld $31, %zmm0, %zmm0 1708; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 1709; KNL-NEXT: kmovw %k0, %eax 1710; KNL-NEXT: shll $16, %eax 1711; KNL-NEXT: orl %ecx, %eax 1712; KNL-NEXT: movq %rbp, %rsp 1713; KNL-NEXT: popq %rbp 1714; KNL-NEXT: vzeroupper 1715; KNL-NEXT: retq 1716; 1717; SKX-LABEL: test_insertelement_variable_v32i1: 1718; SKX: ## %bb.0: 1719; SKX-NEXT: vptestmb %ymm0, %ymm0, %k0 1720; SKX-NEXT: testb %dil, %dil 1721; SKX-NEXT: setne %al 1722; SKX-NEXT: vpbroadcastb %esi, %ymm0 1723; SKX-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %k1 1724; SKX-NEXT: vpmovm2b %k0, %ymm0 1725; SKX-NEXT: vpbroadcastb %eax, %ymm0 {%k1} 1726; SKX-NEXT: vpsllw $7, %ymm0, %ymm0 1727; SKX-NEXT: vpmovb2m %ymm0, %k0 1728; SKX-NEXT: kmovd %k0, %eax 1729; SKX-NEXT: vzeroupper 1730; SKX-NEXT: retq 1731 %t1 = icmp ugt <32 x i8> %a, zeroinitializer 1732 %t2 = icmp ugt i8 %b, 0 1733 %t3 = insertelement <32 x i1> %t1, i1 %t2, i32 %index 1734 %t4 = bitcast <32 x i1> %t3 to i32 1735 ret i32 %t4 1736} 1737 1738define i64 @test_insertelement_variable_v64i1(<64 x i8> %a, i8 %b, i32 %index) { 1739; KNL-LABEL: test_insertelement_variable_v64i1: 1740; KNL: ## %bb.0: 1741; KNL-NEXT: pushq %rbp 1742; KNL-NEXT: .cfi_def_cfa_offset 16 1743; KNL-NEXT: .cfi_offset %rbp, -16 1744; KNL-NEXT: movq %rsp, %rbp 1745; KNL-NEXT: .cfi_def_cfa_register %rbp 1746; KNL-NEXT: andq $-64, %rsp 1747; KNL-NEXT: subq $128, %rsp 1748; KNL-NEXT: ## kill: def $esi killed $esi def $rsi 1749; KNL-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1750; KNL-NEXT: vpxor %xmm2, %xmm2, %xmm2 1751; KNL-NEXT: vpcmpeqb %ymm2, %ymm1, %ymm1 1752; KNL-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm0 1753; KNL-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 1754; KNL-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0 1755; KNL-NEXT: andl $63, %esi 1756; KNL-NEXT: testb %dil, %dil 1757; KNL-NEXT: vmovdqa64 %zmm0, (%rsp) 1758; KNL-NEXT: setne (%rsp,%rsi) 1759; KNL-NEXT: vpmovsxbd (%rsp), %zmm0 1760; KNL-NEXT: vpslld $31, %zmm0, %zmm0 1761; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 1762; KNL-NEXT: kmovw %k0, %eax 1763; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm0 1764; KNL-NEXT: vpslld $31, %zmm0, %zmm0 1765; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 1766; KNL-NEXT: kmovw %k0, %ecx 1767; KNL-NEXT: shll $16, %ecx 1768; KNL-NEXT: orl %eax, %ecx 1769; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm0 1770; KNL-NEXT: vpslld $31, %zmm0, %zmm0 1771; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 1772; KNL-NEXT: kmovw %k0, %edx 1773; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm0 1774; KNL-NEXT: vpslld $31, %zmm0, %zmm0 1775; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 1776; KNL-NEXT: kmovw %k0, %eax 1777; KNL-NEXT: shll $16, %eax 1778; KNL-NEXT: orl %edx, %eax 1779; KNL-NEXT: shlq $32, %rax 1780; KNL-NEXT: orq %rcx, %rax 1781; KNL-NEXT: movq %rbp, %rsp 1782; KNL-NEXT: popq %rbp 1783; KNL-NEXT: vzeroupper 1784; KNL-NEXT: retq 1785; 1786; SKX-LABEL: test_insertelement_variable_v64i1: 1787; SKX: ## %bb.0: 1788; SKX-NEXT: vptestmb %zmm0, %zmm0, %k0 1789; SKX-NEXT: testb %dil, %dil 1790; SKX-NEXT: setne %al 1791; SKX-NEXT: vpbroadcastb %esi, %zmm0 1792; SKX-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %k1 1793; SKX-NEXT: vpmovm2b %k0, %zmm0 1794; SKX-NEXT: vpbroadcastb %eax, %zmm0 {%k1} 1795; SKX-NEXT: vpsllw $7, %zmm0, %zmm0 1796; SKX-NEXT: vpmovb2m %zmm0, %k0 1797; SKX-NEXT: kmovq %k0, %rax 1798; SKX-NEXT: vzeroupper 1799; SKX-NEXT: retq 1800 %t1 = icmp ugt <64 x i8> %a, zeroinitializer 1801 %t2 = icmp ugt i8 %b, 0 1802 %t3 = insertelement <64 x i1> %t1, i1 %t2, i32 %index 1803 %t4 = bitcast <64 x i1> %t3 to i64 1804 ret i64 %t4 1805} 1806 1807define i96 @test_insertelement_variable_v96i1(<96 x i8> %a, i8 %b, i32 %index) { 1808; KNL-LABEL: test_insertelement_variable_v96i1: 1809; KNL: ## %bb.0: 1810; KNL-NEXT: pushq %rbp 1811; KNL-NEXT: .cfi_def_cfa_offset 16 1812; KNL-NEXT: .cfi_offset %rbp, -16 1813; KNL-NEXT: movq %rsp, %rbp 1814; KNL-NEXT: .cfi_def_cfa_register %rbp 1815; KNL-NEXT: andq $-64, %rsp 1816; KNL-NEXT: subq $192, %rsp 1817; KNL-NEXT: movl 744(%rbp), %eax 1818; KNL-NEXT: andl $127, %eax 1819; KNL-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero 1820; KNL-NEXT: vpinsrb $1, 232(%rbp), %xmm0, %xmm0 1821; KNL-NEXT: vpinsrb $2, 240(%rbp), %xmm0, %xmm0 1822; KNL-NEXT: vpinsrb $3, 248(%rbp), %xmm0, %xmm0 1823; KNL-NEXT: vpinsrb $4, 256(%rbp), %xmm0, %xmm0 1824; KNL-NEXT: vpinsrb $5, 264(%rbp), %xmm0, %xmm0 1825; KNL-NEXT: vpinsrb $6, 272(%rbp), %xmm0, %xmm0 1826; KNL-NEXT: vpinsrb $7, 280(%rbp), %xmm0, %xmm0 1827; KNL-NEXT: vpinsrb $8, 288(%rbp), %xmm0, %xmm0 1828; KNL-NEXT: vpinsrb $9, 296(%rbp), %xmm0, %xmm0 1829; KNL-NEXT: vpinsrb $10, 304(%rbp), %xmm0, %xmm0 1830; KNL-NEXT: vpinsrb $11, 312(%rbp), %xmm0, %xmm0 1831; KNL-NEXT: vpinsrb $12, 320(%rbp), %xmm0, %xmm0 1832; KNL-NEXT: vpinsrb $13, 328(%rbp), %xmm0, %xmm0 1833; KNL-NEXT: vpinsrb $14, 336(%rbp), %xmm0, %xmm0 1834; KNL-NEXT: vpinsrb $15, 344(%rbp), %xmm0, %xmm0 1835; KNL-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero 1836; KNL-NEXT: vpinsrb $1, 360(%rbp), %xmm1, %xmm1 1837; KNL-NEXT: vpinsrb $2, 368(%rbp), %xmm1, %xmm1 1838; KNL-NEXT: vpinsrb $3, 376(%rbp), %xmm1, %xmm1 1839; KNL-NEXT: vpinsrb $4, 384(%rbp), %xmm1, %xmm1 1840; KNL-NEXT: vpinsrb $5, 392(%rbp), %xmm1, %xmm1 1841; KNL-NEXT: vpinsrb $6, 400(%rbp), %xmm1, %xmm1 1842; KNL-NEXT: vpinsrb $7, 408(%rbp), %xmm1, %xmm1 1843; KNL-NEXT: vpinsrb $8, 416(%rbp), %xmm1, %xmm1 1844; KNL-NEXT: vpinsrb $9, 424(%rbp), %xmm1, %xmm1 1845; KNL-NEXT: vpinsrb $10, 432(%rbp), %xmm1, %xmm1 1846; KNL-NEXT: vpinsrb $11, 440(%rbp), %xmm1, %xmm1 1847; KNL-NEXT: vpinsrb $12, 448(%rbp), %xmm1, %xmm1 1848; KNL-NEXT: vpinsrb $13, 456(%rbp), %xmm1, %xmm1 1849; KNL-NEXT: vpinsrb $14, 464(%rbp), %xmm1, %xmm1 1850; KNL-NEXT: vpinsrb $15, 472(%rbp), %xmm1, %xmm1 1851; KNL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm1 1852; KNL-NEXT: vpxor %xmm0, %xmm0, %xmm0 1853; KNL-NEXT: vpcmpeqb %ymm0, %ymm1, %ymm1 1854; KNL-NEXT: vmovd %edi, %xmm2 1855; KNL-NEXT: vpinsrb $1, %esi, %xmm2, %xmm2 1856; KNL-NEXT: vpinsrb $2, %edx, %xmm2, %xmm2 1857; KNL-NEXT: vpinsrb $3, %ecx, %xmm2, %xmm2 1858; KNL-NEXT: vpinsrb $4, %r8d, %xmm2, %xmm2 1859; KNL-NEXT: vpinsrb $5, %r9d, %xmm2, %xmm2 1860; KNL-NEXT: vpinsrb $6, 16(%rbp), %xmm2, %xmm2 1861; KNL-NEXT: vpinsrb $7, 24(%rbp), %xmm2, %xmm2 1862; KNL-NEXT: vpinsrb $8, 32(%rbp), %xmm2, %xmm2 1863; KNL-NEXT: vpinsrb $9, 40(%rbp), %xmm2, %xmm2 1864; KNL-NEXT: vpinsrb $10, 48(%rbp), %xmm2, %xmm2 1865; KNL-NEXT: vpinsrb $11, 56(%rbp), %xmm2, %xmm2 1866; KNL-NEXT: vpinsrb $12, 64(%rbp), %xmm2, %xmm2 1867; KNL-NEXT: vpinsrb $13, 72(%rbp), %xmm2, %xmm2 1868; KNL-NEXT: vpinsrb $14, 80(%rbp), %xmm2, %xmm2 1869; KNL-NEXT: vpinsrb $15, 88(%rbp), %xmm2, %xmm2 1870; KNL-NEXT: vmovd {{.*#+}} xmm3 = mem[0],zero,zero,zero 1871; KNL-NEXT: vpinsrb $1, 104(%rbp), %xmm3, %xmm3 1872; KNL-NEXT: vpinsrb $2, 112(%rbp), %xmm3, %xmm3 1873; KNL-NEXT: vpinsrb $3, 120(%rbp), %xmm3, %xmm3 1874; KNL-NEXT: vpinsrb $4, 128(%rbp), %xmm3, %xmm3 1875; KNL-NEXT: vpinsrb $5, 136(%rbp), %xmm3, %xmm3 1876; KNL-NEXT: vpinsrb $6, 144(%rbp), %xmm3, %xmm3 1877; KNL-NEXT: vpinsrb $7, 152(%rbp), %xmm3, %xmm3 1878; KNL-NEXT: vpinsrb $8, 160(%rbp), %xmm3, %xmm3 1879; KNL-NEXT: vpinsrb $9, 168(%rbp), %xmm3, %xmm3 1880; KNL-NEXT: vpinsrb $10, 176(%rbp), %xmm3, %xmm3 1881; KNL-NEXT: vpinsrb $11, 184(%rbp), %xmm3, %xmm3 1882; KNL-NEXT: vpinsrb $12, 192(%rbp), %xmm3, %xmm3 1883; KNL-NEXT: vpinsrb $13, 200(%rbp), %xmm3, %xmm3 1884; KNL-NEXT: vpinsrb $14, 208(%rbp), %xmm3, %xmm3 1885; KNL-NEXT: vpinsrb $15, 216(%rbp), %xmm3, %xmm3 1886; KNL-NEXT: vinserti128 $1, %xmm3, %ymm2, %ymm2 1887; KNL-NEXT: vpcmpeqb %ymm0, %ymm2, %ymm2 1888; KNL-NEXT: vinserti64x4 $1, %ymm1, %zmm2, %zmm1 1889; KNL-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 1890; KNL-NEXT: vmovd {{.*#+}} xmm2 = mem[0],zero,zero,zero 1891; KNL-NEXT: vpinsrb $1, 488(%rbp), %xmm2, %xmm2 1892; KNL-NEXT: vpinsrb $2, 496(%rbp), %xmm2, %xmm2 1893; KNL-NEXT: vpinsrb $3, 504(%rbp), %xmm2, %xmm2 1894; KNL-NEXT: vpinsrb $4, 512(%rbp), %xmm2, %xmm2 1895; KNL-NEXT: vpinsrb $5, 520(%rbp), %xmm2, %xmm2 1896; KNL-NEXT: vpinsrb $6, 528(%rbp), %xmm2, %xmm2 1897; KNL-NEXT: vpinsrb $7, 536(%rbp), %xmm2, %xmm2 1898; KNL-NEXT: vpinsrb $8, 544(%rbp), %xmm2, %xmm2 1899; KNL-NEXT: vpinsrb $9, 552(%rbp), %xmm2, %xmm2 1900; KNL-NEXT: vpinsrb $10, 560(%rbp), %xmm2, %xmm2 1901; KNL-NEXT: vpinsrb $11, 568(%rbp), %xmm2, %xmm2 1902; KNL-NEXT: vpinsrb $12, 576(%rbp), %xmm2, %xmm2 1903; KNL-NEXT: vpinsrb $13, 584(%rbp), %xmm2, %xmm2 1904; KNL-NEXT: vpinsrb $14, 592(%rbp), %xmm2, %xmm2 1905; KNL-NEXT: vpinsrb $15, 600(%rbp), %xmm2, %xmm2 1906; KNL-NEXT: vmovd {{.*#+}} xmm3 = mem[0],zero,zero,zero 1907; KNL-NEXT: vpinsrb $1, 616(%rbp), %xmm3, %xmm3 1908; KNL-NEXT: vpinsrb $2, 624(%rbp), %xmm3, %xmm3 1909; KNL-NEXT: vpinsrb $3, 632(%rbp), %xmm3, %xmm3 1910; KNL-NEXT: vpinsrb $4, 640(%rbp), %xmm3, %xmm3 1911; KNL-NEXT: vpinsrb $5, 648(%rbp), %xmm3, %xmm3 1912; KNL-NEXT: vpinsrb $6, 656(%rbp), %xmm3, %xmm3 1913; KNL-NEXT: vpinsrb $7, 664(%rbp), %xmm3, %xmm3 1914; KNL-NEXT: vpinsrb $8, 672(%rbp), %xmm3, %xmm3 1915; KNL-NEXT: vpinsrb $9, 680(%rbp), %xmm3, %xmm3 1916; KNL-NEXT: vpinsrb $10, 688(%rbp), %xmm3, %xmm3 1917; KNL-NEXT: vpinsrb $11, 696(%rbp), %xmm3, %xmm3 1918; KNL-NEXT: vpinsrb $12, 704(%rbp), %xmm3, %xmm3 1919; KNL-NEXT: vpinsrb $13, 712(%rbp), %xmm3, %xmm3 1920; KNL-NEXT: vpinsrb $14, 720(%rbp), %xmm3, %xmm3 1921; KNL-NEXT: vpinsrb $15, 728(%rbp), %xmm3, %xmm3 1922; KNL-NEXT: vinserti128 $1, %xmm3, %ymm2, %ymm2 1923; KNL-NEXT: vpcmpeqb %ymm0, %ymm2, %ymm0 1924; KNL-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0 1925; KNL-NEXT: cmpb $0, 736(%rbp) 1926; KNL-NEXT: vmovdqa %ymm0, {{[0-9]+}}(%rsp) 1927; KNL-NEXT: vmovdqa64 %zmm1, (%rsp) 1928; KNL-NEXT: setne (%rsp,%rax) 1929; KNL-NEXT: vpmovsxbd (%rsp), %zmm0 1930; KNL-NEXT: vpslld $31, %zmm0, %zmm0 1931; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 1932; KNL-NEXT: kmovw %k0, %eax 1933; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm0 1934; KNL-NEXT: vpslld $31, %zmm0, %zmm0 1935; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 1936; KNL-NEXT: kmovw %k0, %ecx 1937; KNL-NEXT: shll $16, %ecx 1938; KNL-NEXT: orl %eax, %ecx 1939; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm0 1940; KNL-NEXT: vpslld $31, %zmm0, %zmm0 1941; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 1942; KNL-NEXT: kmovw %k0, %edx 1943; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm0 1944; KNL-NEXT: vpslld $31, %zmm0, %zmm0 1945; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 1946; KNL-NEXT: kmovw %k0, %eax 1947; KNL-NEXT: shll $16, %eax 1948; KNL-NEXT: orl %edx, %eax 1949; KNL-NEXT: shlq $32, %rax 1950; KNL-NEXT: orq %rcx, %rax 1951; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm0 1952; KNL-NEXT: vpslld $31, %zmm0, %zmm0 1953; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 1954; KNL-NEXT: kmovw %k0, %ecx 1955; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm0 1956; KNL-NEXT: vpslld $31, %zmm0, %zmm0 1957; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 1958; KNL-NEXT: kmovw %k0, %esi 1959; KNL-NEXT: shll $16, %esi 1960; KNL-NEXT: orl %ecx, %esi 1961; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm0 1962; KNL-NEXT: vpslld $31, %zmm0, %zmm0 1963; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 1964; KNL-NEXT: kmovw %k0, %ecx 1965; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm0 1966; KNL-NEXT: vpslld $31, %zmm0, %zmm0 1967; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 1968; KNL-NEXT: kmovw %k0, %edx 1969; KNL-NEXT: shll $16, %edx 1970; KNL-NEXT: orl %ecx, %edx 1971; KNL-NEXT: shlq $32, %rdx 1972; KNL-NEXT: orq %rsi, %rdx 1973; KNL-NEXT: movq %rbp, %rsp 1974; KNL-NEXT: popq %rbp 1975; KNL-NEXT: vzeroupper 1976; KNL-NEXT: retq 1977; 1978; SKX-LABEL: test_insertelement_variable_v96i1: 1979; SKX: ## %bb.0: 1980; SKX-NEXT: pushq %rbp 1981; SKX-NEXT: .cfi_def_cfa_offset 16 1982; SKX-NEXT: .cfi_offset %rbp, -16 1983; SKX-NEXT: movq %rsp, %rbp 1984; SKX-NEXT: .cfi_def_cfa_register %rbp 1985; SKX-NEXT: andq $-64, %rsp 1986; SKX-NEXT: subq $192, %rsp 1987; SKX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero 1988; SKX-NEXT: vpinsrb $1, 232(%rbp), %xmm0, %xmm0 1989; SKX-NEXT: vpinsrb $2, 240(%rbp), %xmm0, %xmm0 1990; SKX-NEXT: vpinsrb $3, 248(%rbp), %xmm0, %xmm0 1991; SKX-NEXT: vpinsrb $4, 256(%rbp), %xmm0, %xmm0 1992; SKX-NEXT: vpinsrb $5, 264(%rbp), %xmm0, %xmm0 1993; SKX-NEXT: vpinsrb $6, 272(%rbp), %xmm0, %xmm0 1994; SKX-NEXT: vpinsrb $7, 280(%rbp), %xmm0, %xmm0 1995; SKX-NEXT: vpinsrb $8, 288(%rbp), %xmm0, %xmm0 1996; SKX-NEXT: vpinsrb $9, 296(%rbp), %xmm0, %xmm0 1997; SKX-NEXT: vpinsrb $10, 304(%rbp), %xmm0, %xmm0 1998; SKX-NEXT: vpinsrb $11, 312(%rbp), %xmm0, %xmm0 1999; SKX-NEXT: vpinsrb $12, 320(%rbp), %xmm0, %xmm0 2000; SKX-NEXT: vpinsrb $13, 328(%rbp), %xmm0, %xmm0 2001; SKX-NEXT: vpinsrb $14, 336(%rbp), %xmm0, %xmm0 2002; SKX-NEXT: vpinsrb $15, 344(%rbp), %xmm0, %xmm0 2003; SKX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero 2004; SKX-NEXT: vpinsrb $1, 360(%rbp), %xmm1, %xmm1 2005; SKX-NEXT: vpinsrb $2, 368(%rbp), %xmm1, %xmm1 2006; SKX-NEXT: vpinsrb $3, 376(%rbp), %xmm1, %xmm1 2007; SKX-NEXT: vpinsrb $4, 384(%rbp), %xmm1, %xmm1 2008; SKX-NEXT: vpinsrb $5, 392(%rbp), %xmm1, %xmm1 2009; SKX-NEXT: vpinsrb $6, 400(%rbp), %xmm1, %xmm1 2010; SKX-NEXT: vpinsrb $7, 408(%rbp), %xmm1, %xmm1 2011; SKX-NEXT: vpinsrb $8, 416(%rbp), %xmm1, %xmm1 2012; SKX-NEXT: vpinsrb $9, 424(%rbp), %xmm1, %xmm1 2013; SKX-NEXT: vpinsrb $10, 432(%rbp), %xmm1, %xmm1 2014; SKX-NEXT: vpinsrb $11, 440(%rbp), %xmm1, %xmm1 2015; SKX-NEXT: vpinsrb $12, 448(%rbp), %xmm1, %xmm1 2016; SKX-NEXT: vpinsrb $13, 456(%rbp), %xmm1, %xmm1 2017; SKX-NEXT: vpinsrb $14, 464(%rbp), %xmm1, %xmm1 2018; SKX-NEXT: vpinsrb $15, 472(%rbp), %xmm1, %xmm1 2019; SKX-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 2020; SKX-NEXT: vmovd %edi, %xmm1 2021; SKX-NEXT: vpinsrb $1, %esi, %xmm1, %xmm1 2022; SKX-NEXT: vpinsrb $2, %edx, %xmm1, %xmm1 2023; SKX-NEXT: vpinsrb $3, %ecx, %xmm1, %xmm1 2024; SKX-NEXT: vpinsrb $4, %r8d, %xmm1, %xmm1 2025; SKX-NEXT: vpinsrb $5, %r9d, %xmm1, %xmm1 2026; SKX-NEXT: vpinsrb $6, 16(%rbp), %xmm1, %xmm1 2027; SKX-NEXT: vpinsrb $7, 24(%rbp), %xmm1, %xmm1 2028; SKX-NEXT: vpinsrb $8, 32(%rbp), %xmm1, %xmm1 2029; SKX-NEXT: vpinsrb $9, 40(%rbp), %xmm1, %xmm1 2030; SKX-NEXT: vpinsrb $10, 48(%rbp), %xmm1, %xmm1 2031; SKX-NEXT: vpinsrb $11, 56(%rbp), %xmm1, %xmm1 2032; SKX-NEXT: vpinsrb $12, 64(%rbp), %xmm1, %xmm1 2033; SKX-NEXT: vpinsrb $13, 72(%rbp), %xmm1, %xmm1 2034; SKX-NEXT: vpinsrb $14, 80(%rbp), %xmm1, %xmm1 2035; SKX-NEXT: vpinsrb $15, 88(%rbp), %xmm1, %xmm1 2036; SKX-NEXT: vmovd {{.*#+}} xmm2 = mem[0],zero,zero,zero 2037; SKX-NEXT: vpinsrb $1, 104(%rbp), %xmm2, %xmm2 2038; SKX-NEXT: vpinsrb $2, 112(%rbp), %xmm2, %xmm2 2039; SKX-NEXT: vpinsrb $3, 120(%rbp), %xmm2, %xmm2 2040; SKX-NEXT: vpinsrb $4, 128(%rbp), %xmm2, %xmm2 2041; SKX-NEXT: vpinsrb $5, 136(%rbp), %xmm2, %xmm2 2042; SKX-NEXT: vpinsrb $6, 144(%rbp), %xmm2, %xmm2 2043; SKX-NEXT: vpinsrb $7, 152(%rbp), %xmm2, %xmm2 2044; SKX-NEXT: vpinsrb $8, 160(%rbp), %xmm2, %xmm2 2045; SKX-NEXT: vpinsrb $9, 168(%rbp), %xmm2, %xmm2 2046; SKX-NEXT: vpinsrb $10, 176(%rbp), %xmm2, %xmm2 2047; SKX-NEXT: vpinsrb $11, 184(%rbp), %xmm2, %xmm2 2048; SKX-NEXT: vpinsrb $12, 192(%rbp), %xmm2, %xmm2 2049; SKX-NEXT: vpinsrb $13, 200(%rbp), %xmm2, %xmm2 2050; SKX-NEXT: vpinsrb $14, 208(%rbp), %xmm2, %xmm2 2051; SKX-NEXT: vpinsrb $15, 216(%rbp), %xmm2, %xmm2 2052; SKX-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 2053; SKX-NEXT: vinserti64x4 $1, %ymm0, %zmm1, %zmm0 2054; SKX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero 2055; SKX-NEXT: vpinsrb $1, 488(%rbp), %xmm1, %xmm1 2056; SKX-NEXT: vpinsrb $2, 496(%rbp), %xmm1, %xmm1 2057; SKX-NEXT: vpinsrb $3, 504(%rbp), %xmm1, %xmm1 2058; SKX-NEXT: vpinsrb $4, 512(%rbp), %xmm1, %xmm1 2059; SKX-NEXT: vpinsrb $5, 520(%rbp), %xmm1, %xmm1 2060; SKX-NEXT: vpinsrb $6, 528(%rbp), %xmm1, %xmm1 2061; SKX-NEXT: vpinsrb $7, 536(%rbp), %xmm1, %xmm1 2062; SKX-NEXT: vpinsrb $8, 544(%rbp), %xmm1, %xmm1 2063; SKX-NEXT: vpinsrb $9, 552(%rbp), %xmm1, %xmm1 2064; SKX-NEXT: vpinsrb $10, 560(%rbp), %xmm1, %xmm1 2065; SKX-NEXT: vpinsrb $11, 568(%rbp), %xmm1, %xmm1 2066; SKX-NEXT: vpinsrb $12, 576(%rbp), %xmm1, %xmm1 2067; SKX-NEXT: vpinsrb $13, 584(%rbp), %xmm1, %xmm1 2068; SKX-NEXT: vpinsrb $14, 592(%rbp), %xmm1, %xmm1 2069; SKX-NEXT: vpinsrb $15, 600(%rbp), %xmm1, %xmm1 2070; SKX-NEXT: vmovd {{.*#+}} xmm2 = mem[0],zero,zero,zero 2071; SKX-NEXT: vpinsrb $1, 616(%rbp), %xmm2, %xmm2 2072; SKX-NEXT: vpinsrb $2, 624(%rbp), %xmm2, %xmm2 2073; SKX-NEXT: vpinsrb $3, 632(%rbp), %xmm2, %xmm2 2074; SKX-NEXT: vpinsrb $4, 640(%rbp), %xmm2, %xmm2 2075; SKX-NEXT: vpinsrb $5, 648(%rbp), %xmm2, %xmm2 2076; SKX-NEXT: vpinsrb $6, 656(%rbp), %xmm2, %xmm2 2077; SKX-NEXT: vpinsrb $7, 664(%rbp), %xmm2, %xmm2 2078; SKX-NEXT: vpinsrb $8, 672(%rbp), %xmm2, %xmm2 2079; SKX-NEXT: vpinsrb $9, 680(%rbp), %xmm2, %xmm2 2080; SKX-NEXT: vpinsrb $10, 688(%rbp), %xmm2, %xmm2 2081; SKX-NEXT: vpinsrb $11, 696(%rbp), %xmm2, %xmm2 2082; SKX-NEXT: vpinsrb $12, 704(%rbp), %xmm2, %xmm2 2083; SKX-NEXT: vpinsrb $13, 712(%rbp), %xmm2, %xmm2 2084; SKX-NEXT: vpinsrb $14, 720(%rbp), %xmm2, %xmm2 2085; SKX-NEXT: vpinsrb $15, 728(%rbp), %xmm2, %xmm2 2086; SKX-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 2087; SKX-NEXT: movl 744(%rbp), %eax 2088; SKX-NEXT: andl $127, %eax 2089; SKX-NEXT: vptestmb %zmm0, %zmm0, %k0 2090; SKX-NEXT: vptestmb %zmm1, %zmm1, %k1 2091; SKX-NEXT: cmpb $0, 736(%rbp) 2092; SKX-NEXT: vpmovm2b %k1, %zmm0 2093; SKX-NEXT: vmovdqa64 %zmm0, {{[0-9]+}}(%rsp) 2094; SKX-NEXT: vpmovm2b %k0, %zmm0 2095; SKX-NEXT: vmovdqa64 %zmm0, (%rsp) 2096; SKX-NEXT: setne (%rsp,%rax) 2097; SKX-NEXT: vpsllw $7, {{[0-9]+}}(%rsp), %zmm0 2098; SKX-NEXT: vpmovb2m %zmm0, %k0 2099; SKX-NEXT: vpsllw $7, (%rsp), %zmm0 2100; SKX-NEXT: vpmovb2m %zmm0, %k1 2101; SKX-NEXT: kmovq %k1, %rax 2102; SKX-NEXT: kmovq %k0, %rdx 2103; SKX-NEXT: movq %rbp, %rsp 2104; SKX-NEXT: popq %rbp 2105; SKX-NEXT: vzeroupper 2106; SKX-NEXT: retq 2107 %t1 = icmp ugt <96 x i8> %a, zeroinitializer 2108 %t2 = icmp ugt i8 %b, 0 2109 %t3 = insertelement <96 x i1> %t1, i1 %t2, i32 %index 2110 %t4 = bitcast <96 x i1> %t3 to i96 2111 ret i96 %t4 2112} 2113 2114define i128 @test_insertelement_variable_v128i1(<128 x i8> %a, i8 %b, i32 %index) { 2115; KNL-LABEL: test_insertelement_variable_v128i1: 2116; KNL: ## %bb.0: 2117; KNL-NEXT: pushq %rbp 2118; KNL-NEXT: .cfi_def_cfa_offset 16 2119; KNL-NEXT: .cfi_offset %rbp, -16 2120; KNL-NEXT: movq %rsp, %rbp 2121; KNL-NEXT: .cfi_def_cfa_register %rbp 2122; KNL-NEXT: andq $-64, %rsp 2123; KNL-NEXT: subq $192, %rsp 2124; KNL-NEXT: ## kill: def $esi killed $esi def $rsi 2125; KNL-NEXT: vextracti64x4 $1, %zmm0, %ymm2 2126; KNL-NEXT: vpxor %xmm3, %xmm3, %xmm3 2127; KNL-NEXT: vpcmpeqb %ymm3, %ymm2, %ymm2 2128; KNL-NEXT: vpcmpeqb %ymm3, %ymm0, %ymm0 2129; KNL-NEXT: vinserti64x4 $1, %ymm2, %zmm0, %zmm0 2130; KNL-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0 2131; KNL-NEXT: vextracti64x4 $1, %zmm1, %ymm2 2132; KNL-NEXT: vpcmpeqb %ymm3, %ymm2, %ymm2 2133; KNL-NEXT: vpcmpeqb %ymm3, %ymm1, %ymm1 2134; KNL-NEXT: vinserti64x4 $1, %ymm2, %zmm1, %zmm1 2135; KNL-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 2136; KNL-NEXT: andl $127, %esi 2137; KNL-NEXT: testb %dil, %dil 2138; KNL-NEXT: vmovdqa64 %zmm1, {{[0-9]+}}(%rsp) 2139; KNL-NEXT: vmovdqa64 %zmm0, (%rsp) 2140; KNL-NEXT: setne (%rsp,%rsi) 2141; KNL-NEXT: vpmovsxbd (%rsp), %zmm0 2142; KNL-NEXT: vpslld $31, %zmm0, %zmm0 2143; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 2144; KNL-NEXT: kmovw %k0, %eax 2145; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm0 2146; KNL-NEXT: vpslld $31, %zmm0, %zmm0 2147; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 2148; KNL-NEXT: kmovw %k0, %ecx 2149; KNL-NEXT: shll $16, %ecx 2150; KNL-NEXT: orl %eax, %ecx 2151; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm0 2152; KNL-NEXT: vpslld $31, %zmm0, %zmm0 2153; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 2154; KNL-NEXT: kmovw %k0, %edx 2155; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm0 2156; KNL-NEXT: vpslld $31, %zmm0, %zmm0 2157; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 2158; KNL-NEXT: kmovw %k0, %eax 2159; KNL-NEXT: shll $16, %eax 2160; KNL-NEXT: orl %edx, %eax 2161; KNL-NEXT: shlq $32, %rax 2162; KNL-NEXT: orq %rcx, %rax 2163; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm0 2164; KNL-NEXT: vpslld $31, %zmm0, %zmm0 2165; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 2166; KNL-NEXT: kmovw %k0, %ecx 2167; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm0 2168; KNL-NEXT: vpslld $31, %zmm0, %zmm0 2169; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 2170; KNL-NEXT: kmovw %k0, %esi 2171; KNL-NEXT: shll $16, %esi 2172; KNL-NEXT: orl %ecx, %esi 2173; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm0 2174; KNL-NEXT: vpslld $31, %zmm0, %zmm0 2175; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 2176; KNL-NEXT: kmovw %k0, %ecx 2177; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm0 2178; KNL-NEXT: vpslld $31, %zmm0, %zmm0 2179; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 2180; KNL-NEXT: kmovw %k0, %edx 2181; KNL-NEXT: shll $16, %edx 2182; KNL-NEXT: orl %ecx, %edx 2183; KNL-NEXT: shlq $32, %rdx 2184; KNL-NEXT: orq %rsi, %rdx 2185; KNL-NEXT: movq %rbp, %rsp 2186; KNL-NEXT: popq %rbp 2187; KNL-NEXT: vzeroupper 2188; KNL-NEXT: retq 2189; 2190; SKX-LABEL: test_insertelement_variable_v128i1: 2191; SKX: ## %bb.0: 2192; SKX-NEXT: pushq %rbp 2193; SKX-NEXT: .cfi_def_cfa_offset 16 2194; SKX-NEXT: .cfi_offset %rbp, -16 2195; SKX-NEXT: movq %rsp, %rbp 2196; SKX-NEXT: .cfi_def_cfa_register %rbp 2197; SKX-NEXT: andq $-64, %rsp 2198; SKX-NEXT: subq $192, %rsp 2199; SKX-NEXT: ## kill: def $esi killed $esi def $rsi 2200; SKX-NEXT: vptestmb %zmm0, %zmm0, %k0 2201; SKX-NEXT: vptestmb %zmm1, %zmm1, %k1 2202; SKX-NEXT: andl $127, %esi 2203; SKX-NEXT: testb %dil, %dil 2204; SKX-NEXT: vpmovm2b %k1, %zmm0 2205; SKX-NEXT: vmovdqa64 %zmm0, {{[0-9]+}}(%rsp) 2206; SKX-NEXT: vpmovm2b %k0, %zmm0 2207; SKX-NEXT: vmovdqa64 %zmm0, (%rsp) 2208; SKX-NEXT: setne (%rsp,%rsi) 2209; SKX-NEXT: vpsllw $7, {{[0-9]+}}(%rsp), %zmm0 2210; SKX-NEXT: vpmovb2m %zmm0, %k0 2211; SKX-NEXT: vpsllw $7, (%rsp), %zmm0 2212; SKX-NEXT: vpmovb2m %zmm0, %k1 2213; SKX-NEXT: kmovq %k1, %rax 2214; SKX-NEXT: kmovq %k0, %rdx 2215; SKX-NEXT: movq %rbp, %rsp 2216; SKX-NEXT: popq %rbp 2217; SKX-NEXT: vzeroupper 2218; SKX-NEXT: retq 2219 %t1 = icmp ugt <128 x i8> %a, zeroinitializer 2220 %t2 = icmp ugt i8 %b, 0 2221 %t3 = insertelement <128 x i1> %t1, i1 %t2, i32 %index 2222 %t4 = bitcast <128 x i1> %t3 to i128 2223 ret i128 %t4 2224} 2225 2226define void @test_concat_v2i1(ptr %arg, ptr %arg1, ptr %arg2) { 2227; KNL-LABEL: test_concat_v2i1: 2228; KNL: ## %bb.0: 2229; KNL-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero 2230; KNL-NEXT: vpextrw $0, %xmm0, %eax 2231; KNL-NEXT: movzwl %ax, %eax 2232; KNL-NEXT: vmovd %eax, %xmm1 2233; KNL-NEXT: vcvtph2ps %xmm1, %xmm1 2234; KNL-NEXT: vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero 2235; KNL-NEXT: vucomiss %xmm2, %xmm1 2236; KNL-NEXT: setb %al 2237; KNL-NEXT: andl $1, %eax 2238; KNL-NEXT: kmovw %eax, %k0 2239; KNL-NEXT: vpsrld $16, %xmm0, %xmm0 2240; KNL-NEXT: vpextrw $0, %xmm0, %eax 2241; KNL-NEXT: movzwl %ax, %eax 2242; KNL-NEXT: vmovd %eax, %xmm0 2243; KNL-NEXT: vcvtph2ps %xmm0, %xmm0 2244; KNL-NEXT: vucomiss %xmm2, %xmm0 2245; KNL-NEXT: setb %al 2246; KNL-NEXT: kmovw %eax, %k1 2247; KNL-NEXT: kshiftlw $1, %k1, %k1 2248; KNL-NEXT: korw %k1, %k0, %k0 2249; KNL-NEXT: vxorps %xmm2, %xmm2, %xmm2 2250; KNL-NEXT: vucomiss %xmm2, %xmm1 2251; KNL-NEXT: seta %al 2252; KNL-NEXT: andl $1, %eax 2253; KNL-NEXT: kmovw %eax, %k1 2254; KNL-NEXT: vucomiss %xmm2, %xmm0 2255; KNL-NEXT: seta %al 2256; KNL-NEXT: kmovw %eax, %k2 2257; KNL-NEXT: kshiftlw $1, %k2, %k2 2258; KNL-NEXT: korw %k2, %k1, %k1 2259; KNL-NEXT: kandw %k1, %k0, %k1 2260; KNL-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero 2261; KNL-NEXT: vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k1} {z} 2262; KNL-NEXT: vpmovdw %zmm1, %ymm1 2263; KNL-NEXT: vpand %xmm0, %xmm1, %xmm0 2264; KNL-NEXT: vmovd %xmm0, (%rdx) 2265; KNL-NEXT: vzeroupper 2266; KNL-NEXT: retq 2267; 2268; SKX-LABEL: test_concat_v2i1: 2269; SKX: ## %bb.0: 2270; SKX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero 2271; SKX-NEXT: vpsrld $16, %xmm0, %xmm1 2272; SKX-NEXT: vpextrw $0, %xmm1, %eax 2273; SKX-NEXT: movzwl %ax, %eax 2274; SKX-NEXT: vmovd %eax, %xmm1 2275; SKX-NEXT: vcvtph2ps %xmm1, %xmm1 2276; SKX-NEXT: vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero 2277; SKX-NEXT: vucomiss %xmm2, %xmm1 2278; SKX-NEXT: setb %al 2279; SKX-NEXT: kmovd %eax, %k0 2280; SKX-NEXT: kshiftlb $1, %k0, %k0 2281; SKX-NEXT: vpextrw $0, %xmm0, %eax 2282; SKX-NEXT: movzwl %ax, %eax 2283; SKX-NEXT: vmovd %eax, %xmm0 2284; SKX-NEXT: vcvtph2ps %xmm0, %xmm0 2285; SKX-NEXT: vucomiss %xmm2, %xmm0 2286; SKX-NEXT: setb %al 2287; SKX-NEXT: kmovd %eax, %k1 2288; SKX-NEXT: kshiftlb $7, %k1, %k1 2289; SKX-NEXT: kshiftrb $7, %k1, %k1 2290; SKX-NEXT: korw %k0, %k1, %k0 2291; SKX-NEXT: vxorps %xmm2, %xmm2, %xmm2 2292; SKX-NEXT: vucomiss %xmm2, %xmm1 2293; SKX-NEXT: seta %al 2294; SKX-NEXT: kmovd %eax, %k1 2295; SKX-NEXT: kshiftlb $1, %k1, %k1 2296; SKX-NEXT: vucomiss %xmm2, %xmm0 2297; SKX-NEXT: seta %al 2298; SKX-NEXT: kmovd %eax, %k2 2299; SKX-NEXT: kshiftlb $7, %k2, %k2 2300; SKX-NEXT: kshiftrb $7, %k2, %k2 2301; SKX-NEXT: korw %k1, %k2, %k1 2302; SKX-NEXT: kandw %k1, %k0, %k1 2303; SKX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero 2304; SKX-NEXT: vmovdqu16 %xmm0, %xmm0 {%k1} {z} 2305; SKX-NEXT: vmovd %xmm0, (%rdx) 2306; SKX-NEXT: retq 2307 %tmp = load <2 x half>, ptr %arg, align 8 2308 %tmp3 = fcmp fast olt <2 x half> %tmp, <half 0xH4600, half 0xH4600> 2309 %tmp4 = fcmp fast ogt <2 x half> %tmp, zeroinitializer 2310 %tmp5 = and <2 x i1> %tmp3, %tmp4 2311 %tmp6 = load <2 x half>, ptr %arg1, align 8 2312 %tmp7 = select <2 x i1> %tmp5, <2 x half> %tmp6, <2 x half> zeroinitializer 2313 store <2 x half> %tmp7, ptr %arg2, align 8 2314 ret void 2315} 2316