1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -march=x86-64 -mtriple=x86_64-apple-darwin -mcpu=knl | FileCheck --check-prefix=KNL %s 3; RUN: llc < %s -march=x86-64 -mtriple=x86_64-apple-darwin -mcpu=skx | FileCheck --check-prefix=SKX %s 4 5define <16 x float> @test1(<16 x float> %x, float* %br, float %y) nounwind { 6; KNL-LABEL: test1: 7; KNL: ## BB#0: 8; KNL-NEXT: vinsertps {{.*#+}} xmm2 = xmm0[0],mem[0],xmm0[2,3] 9; KNL-NEXT: vinsertf32x4 $0, %xmm2, %zmm0, %zmm0 10; KNL-NEXT: vextractf32x4 $3, %zmm0, %xmm2 11; KNL-NEXT: vinsertps {{.*#+}} xmm1 = xmm2[0,1],xmm1[0],xmm2[3] 12; KNL-NEXT: vinsertf32x4 $3, %xmm1, %zmm0, %zmm0 13; KNL-NEXT: retq 14; 15; SKX-LABEL: test1: 16; SKX: ## BB#0: 17; SKX-NEXT: vinsertps {{.*#+}} xmm2 = xmm0[0],mem[0],xmm0[2,3] 18; SKX-NEXT: vinsertf32x4 $0, %xmm2, %zmm0, %zmm0 19; SKX-NEXT: vextractf32x4 $3, %zmm0, %xmm2 20; SKX-NEXT: vinsertps {{.*#+}} xmm1 = xmm2[0,1],xmm1[0],xmm2[3] 21; SKX-NEXT: vinsertf32x4 $3, %xmm1, %zmm0, %zmm0 22; SKX-NEXT: retq 23 %rrr = load float, float* %br 24 %rrr2 = insertelement <16 x float> %x, float %rrr, i32 1 25 %rrr3 = insertelement <16 x float> %rrr2, float %y, i32 14 26 ret <16 x float> %rrr3 27} 28 29define <8 x double> @test2(<8 x double> %x, double* %br, double %y) nounwind { 30; KNL-LABEL: test2: 31; KNL: ## BB#0: 32; KNL-NEXT: vmovhpd {{.*#+}} xmm2 = xmm0[0],mem[0] 33; KNL-NEXT: vinsertf32x4 $0, %xmm2, %zmm0, %zmm0 34; KNL-NEXT: vextractf32x4 $3, %zmm0, %xmm2 35; KNL-NEXT: vmovsd {{.*#+}} xmm1 = xmm1[0],xmm2[1] 36; KNL-NEXT: vinsertf32x4 $3, %xmm1, %zmm0, %zmm0 37; KNL-NEXT: retq 38; 39; SKX-LABEL: test2: 40; SKX: ## BB#0: 41; SKX-NEXT: vmovhpd {{.*#+}} xmm2 = xmm0[0],mem[0] 42; SKX-NEXT: vinsertf64x2 $0, %xmm2, %zmm0, %zmm0 43; SKX-NEXT: vextractf64x2 $3, %zmm0, %xmm2 44; SKX-NEXT: vmovsd {{.*#+}} xmm1 = xmm1[0],xmm2[1] 45; SKX-NEXT: vinsertf64x2 $3, %xmm1, %zmm0, %zmm0 46; SKX-NEXT: retq 47 %rrr = load double, double* %br 48 %rrr2 = insertelement <8 x double> %x, double %rrr, i32 1 49 %rrr3 = insertelement <8 x double> %rrr2, double %y, i32 6 50 ret <8 x double> %rrr3 51} 52 53define <16 x float> @test3(<16 x float> %x) nounwind { 54; KNL-LABEL: test3: 55; KNL: ## BB#0: 56; KNL-NEXT: vextractf32x4 $1, %zmm0, %xmm1 57; KNL-NEXT: vinsertps {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[2,3] 58; KNL-NEXT: vinsertf32x4 $0, %xmm1, %zmm0, %zmm0 59; KNL-NEXT: retq 60; 61; SKX-LABEL: test3: 62; SKX: ## BB#0: 63; SKX-NEXT: vextractf32x4 $1, %zmm0, %xmm1 64; SKX-NEXT: vinsertps {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[2,3] 65; SKX-NEXT: vinsertf32x4 $0, %xmm1, %zmm0, %zmm0 66; SKX-NEXT: retq 67 %eee = extractelement <16 x float> %x, i32 4 68 %rrr2 = insertelement <16 x float> %x, float %eee, i32 1 69 ret <16 x float> %rrr2 70} 71 72define <8 x i64> @test4(<8 x i64> %x) nounwind { 73; KNL-LABEL: test4: 74; KNL: ## BB#0: 75; KNL-NEXT: vextracti32x4 $2, %zmm0, %xmm1 76; KNL-NEXT: vmovq %xmm1, %rax 77; KNL-NEXT: vpinsrq $1, %rax, %xmm0, %xmm1 78; KNL-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm0 79; KNL-NEXT: retq 80; 81; SKX-LABEL: test4: 82; SKX: ## BB#0: 83; SKX-NEXT: vextracti64x2 $2, %zmm0, %xmm1 84; SKX-NEXT: vmovq %xmm1, %rax 85; SKX-NEXT: vpinsrq $1, %rax, %xmm0, %xmm1 86; SKX-NEXT: vinserti64x2 $0, %xmm1, %zmm0, %zmm0 87; SKX-NEXT: retq 88 %eee = extractelement <8 x i64> %x, i32 4 89 %rrr2 = insertelement <8 x i64> %x, i64 %eee, i32 1 90 ret <8 x i64> %rrr2 91} 92 93define i32 @test5(<4 x float> %x) nounwind { 94; KNL-LABEL: test5: 95; KNL: ## BB#0: 96; KNL-NEXT: vextractps $3, %xmm0, %eax 97; KNL-NEXT: retq 98; 99; SKX-LABEL: test5: 100; SKX: ## BB#0: 101; SKX-NEXT: vextractps $3, %xmm0, %eax 102; SKX-NEXT: retq 103 %ef = extractelement <4 x float> %x, i32 3 104 %ei = bitcast float %ef to i32 105 ret i32 %ei 106} 107 108define void @test6(<4 x float> %x, float* %out) nounwind { 109; KNL-LABEL: test6: 110; KNL: ## BB#0: 111; KNL-NEXT: vextractps $3, %xmm0, (%rdi) 112; KNL-NEXT: retq 113; 114; SKX-LABEL: test6: 115; SKX: ## BB#0: 116; SKX-NEXT: vextractps $3, %xmm0, (%rdi) 117; SKX-NEXT: retq 118 %ef = extractelement <4 x float> %x, i32 3 119 store float %ef, float* %out, align 4 120 ret void 121} 122 123define float @test7(<16 x float> %x, i32 %ind) nounwind { 124; KNL-LABEL: test7: 125; KNL: ## BB#0: 126; KNL-NEXT: vmovd %edi, %xmm1 127; KNL-NEXT: vpermps %zmm0, %zmm1, %zmm0 128; KNL-NEXT: ## kill: %XMM0<def> %XMM0<kill> %ZMM0<kill> 129; KNL-NEXT: retq 130; 131; SKX-LABEL: test7: 132; SKX: ## BB#0: 133; SKX-NEXT: vmovd %edi, %xmm1 134; SKX-NEXT: vpermps %zmm0, %zmm1, %zmm0 135; SKX-NEXT: ## kill: %XMM0<def> %XMM0<kill> %ZMM0<kill> 136; SKX-NEXT: retq 137 %e = extractelement <16 x float> %x, i32 %ind 138 ret float %e 139} 140 141define double @test8(<8 x double> %x, i32 %ind) nounwind { 142; KNL-LABEL: test8: 143; KNL: ## BB#0: 144; KNL-NEXT: movslq %edi, %rax 145; KNL-NEXT: vmovq %rax, %xmm1 146; KNL-NEXT: vpermpd %zmm0, %zmm1, %zmm0 147; KNL-NEXT: ## kill: %XMM0<def> %XMM0<kill> %ZMM0<kill> 148; KNL-NEXT: retq 149; 150; SKX-LABEL: test8: 151; SKX: ## BB#0: 152; SKX-NEXT: movslq %edi, %rax 153; SKX-NEXT: vmovq %rax, %xmm1 154; SKX-NEXT: vpermpd %zmm0, %zmm1, %zmm0 155; SKX-NEXT: ## kill: %XMM0<def> %XMM0<kill> %ZMM0<kill> 156; SKX-NEXT: retq 157 %e = extractelement <8 x double> %x, i32 %ind 158 ret double %e 159} 160 161define float @test9(<8 x float> %x, i32 %ind) nounwind { 162; KNL-LABEL: test9: 163; KNL: ## BB#0: 164; KNL-NEXT: vmovd %edi, %xmm1 165; KNL-NEXT: vpermps %ymm0, %ymm1, %ymm0 166; KNL-NEXT: ## kill: %XMM0<def> %XMM0<kill> %YMM0<kill> 167; KNL-NEXT: retq 168; 169; SKX-LABEL: test9: 170; SKX: ## BB#0: 171; SKX-NEXT: vmovd %edi, %xmm1 172; SKX-NEXT: vpermps %ymm0, %ymm1, %ymm0 173; SKX-NEXT: ## kill: %XMM0<def> %XMM0<kill> %YMM0<kill> 174; SKX-NEXT: retq 175 %e = extractelement <8 x float> %x, i32 %ind 176 ret float %e 177} 178 179define i32 @test10(<16 x i32> %x, i32 %ind) nounwind { 180; KNL-LABEL: test10: 181; KNL: ## BB#0: 182; KNL-NEXT: vmovd %edi, %xmm1 183; KNL-NEXT: vpermd %zmm0, %zmm1, %zmm0 184; KNL-NEXT: vmovd %xmm0, %eax 185; KNL-NEXT: retq 186; 187; SKX-LABEL: test10: 188; SKX: ## BB#0: 189; SKX-NEXT: vmovd %edi, %xmm1 190; SKX-NEXT: vpermd %zmm0, %zmm1, %zmm0 191; SKX-NEXT: vmovd %xmm0, %eax 192; SKX-NEXT: retq 193 %e = extractelement <16 x i32> %x, i32 %ind 194 ret i32 %e 195} 196 197define <16 x i32> @test11(<16 x i32>%a, <16 x i32>%b) { 198; KNL-LABEL: test11: 199; KNL: ## BB#0: 200; KNL-NEXT: vpcmpltud %zmm1, %zmm0, %k0 201; KNL-NEXT: kshiftlw $11, %k0, %k0 202; KNL-NEXT: kshiftrw $15, %k0, %k0 203; KNL-NEXT: kmovw %k0, %eax 204; KNL-NEXT: andl $1, %eax 205; KNL-NEXT: testb %al, %al 206; KNL-NEXT: je LBB10_2 207; KNL-NEXT: ## BB#1: ## %A 208; KNL-NEXT: vmovdqa64 %zmm1, %zmm0 209; KNL-NEXT: retq 210; KNL-NEXT: LBB10_2: ## %B 211; KNL-NEXT: vpaddd %zmm0, %zmm1, %zmm0 212; KNL-NEXT: retq 213; 214; SKX-LABEL: test11: 215; SKX: ## BB#0: 216; SKX-NEXT: vpcmpltud %zmm1, %zmm0, %k0 217; SKX-NEXT: kshiftlw $11, %k0, %k0 218; SKX-NEXT: kshiftrw $15, %k0, %k0 219; SKX-NEXT: kmovw %k0, %eax 220; SKX-NEXT: andl $1, %eax 221; SKX-NEXT: testb %al, %al 222; SKX-NEXT: je LBB10_2 223; SKX-NEXT: ## BB#1: ## %A 224; SKX-NEXT: vmovdqa64 %zmm1, %zmm0 225; SKX-NEXT: retq 226; SKX-NEXT: LBB10_2: ## %B 227; SKX-NEXT: vpaddd %zmm0, %zmm1, %zmm0 228; SKX-NEXT: retq 229 %cmp_res = icmp ult <16 x i32> %a, %b 230 %ia = extractelement <16 x i1> %cmp_res, i32 4 231 br i1 %ia, label %A, label %B 232 A: 233 ret <16 x i32>%b 234 B: 235 %c = add <16 x i32>%b, %a 236 ret <16 x i32>%c 237} 238 239define i64 @test12(<16 x i64>%a, <16 x i64>%b, i64 %a1, i64 %b1) { 240; KNL-LABEL: test12: 241; KNL: ## BB#0: 242; KNL-NEXT: vpcmpgtq %zmm0, %zmm2, %k0 243; KNL-NEXT: vpcmpgtq %zmm1, %zmm3, %k1 244; KNL-NEXT: kunpckbw %k0, %k1, %k0 245; KNL-NEXT: kshiftlw $15, %k0, %k0 246; KNL-NEXT: kshiftrw $15, %k0, %k0 247; KNL-NEXT: kmovw %k0, %eax 248; KNL-NEXT: andl $1, %eax 249; KNL-NEXT: testb %al, %al 250; KNL-NEXT: cmoveq %rsi, %rdi 251; KNL-NEXT: movq %rdi, %rax 252; KNL-NEXT: retq 253; 254; SKX-LABEL: test12: 255; SKX: ## BB#0: 256; SKX-NEXT: vpcmpgtq %zmm0, %zmm2, %k0 257; SKX-NEXT: vpcmpgtq %zmm1, %zmm3, %k1 258; SKX-NEXT: kunpckbw %k0, %k1, %k0 259; SKX-NEXT: kshiftlw $15, %k0, %k0 260; SKX-NEXT: kshiftrw $15, %k0, %k0 261; SKX-NEXT: kmovw %k0, %eax 262; SKX-NEXT: andl $1, %eax 263; SKX-NEXT: testb %al, %al 264; SKX-NEXT: cmoveq %rsi, %rdi 265; SKX-NEXT: movq %rdi, %rax 266; SKX-NEXT: retq 267 %cmpvector_func.i = icmp slt <16 x i64> %a, %b 268 %extract24vector_func.i = extractelement <16 x i1> %cmpvector_func.i, i32 0 269 %res = select i1 %extract24vector_func.i, i64 %a1, i64 %b1 270 ret i64 %res 271} 272 273define i16 @test13(i32 %a, i32 %b) { 274; KNL-LABEL: test13: 275; KNL: ## BB#0: 276; KNL-NEXT: cmpl %esi, %edi 277; KNL-NEXT: setb %al 278; KNL-NEXT: andl $1, %eax 279; KNL-NEXT: kmovw %eax, %k0 280; KNL-NEXT: movw $-4, %ax 281; KNL-NEXT: kmovw %eax, %k1 282; KNL-NEXT: kshiftrw $1, %k1, %k1 283; KNL-NEXT: kshiftlw $1, %k1, %k1 284; KNL-NEXT: korw %k0, %k1, %k0 285; KNL-NEXT: kmovw %k0, %eax 286; KNL-NEXT: retq 287; 288; SKX-LABEL: test13: 289; SKX: ## BB#0: 290; SKX-NEXT: cmpl %esi, %edi 291; SKX-NEXT: setb %al 292; SKX-NEXT: andl $1, %eax 293; SKX-NEXT: kmovw %eax, %k0 294; SKX-NEXT: movw $-4, %ax 295; SKX-NEXT: kmovw %eax, %k1 296; SKX-NEXT: kshiftrw $1, %k1, %k1 297; SKX-NEXT: kshiftlw $1, %k1, %k1 298; SKX-NEXT: korw %k0, %k1, %k0 299; SKX-NEXT: kmovw %k0, %eax 300; SKX-NEXT: retq 301 %cmp_res = icmp ult i32 %a, %b 302 %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 303 %res = bitcast <16 x i1> %maskv to i16 304 ret i16 %res 305} 306 307define i64 @test14(<8 x i64>%a, <8 x i64>%b, i64 %a1, i64 %b1) { 308; KNL-LABEL: test14: 309; KNL: ## BB#0: 310; KNL-NEXT: vpcmpgtq %zmm0, %zmm1, %k0 311; KNL-NEXT: kshiftlw $11, %k0, %k0 312; KNL-NEXT: kshiftrw $15, %k0, %k0 313; KNL-NEXT: kmovw %k0, %eax 314; KNL-NEXT: andl $1, %eax 315; KNL-NEXT: testb %al, %al 316; KNL-NEXT: cmoveq %rsi, %rdi 317; KNL-NEXT: movq %rdi, %rax 318; KNL-NEXT: retq 319; 320; SKX-LABEL: test14: 321; SKX: ## BB#0: 322; SKX-NEXT: vpcmpgtq %zmm0, %zmm1, %k0 323; SKX-NEXT: kshiftlb $3, %k0, %k0 324; SKX-NEXT: kshiftrb $7, %k0, %k0 325; SKX-NEXT: kmovw %k0, %eax 326; SKX-NEXT: andl $1, %eax 327; SKX-NEXT: testb %al, %al 328; SKX-NEXT: cmoveq %rsi, %rdi 329; SKX-NEXT: movq %rdi, %rax 330; SKX-NEXT: retq 331 %cmpvector_func.i = icmp slt <8 x i64> %a, %b 332 %extract24vector_func.i = extractelement <8 x i1> %cmpvector_func.i, i32 4 333 %res = select i1 %extract24vector_func.i, i64 %a1, i64 %b1 334 ret i64 %res 335} 336 337define i16 @test15(i1 *%addr) { 338; KNL-LABEL: test15: 339; KNL: ## BB#0: 340; KNL-NEXT: movb (%rdi), %al 341; KNL-NEXT: xorl %ecx, %ecx 342; KNL-NEXT: testb %al, %al 343; KNL-NEXT: movw $-1, %ax 344; KNL-NEXT: cmovew %cx, %ax 345; KNL-NEXT: retq 346; 347; SKX-LABEL: test15: 348; SKX: ## BB#0: 349; SKX-NEXT: movb (%rdi), %al 350; SKX-NEXT: xorl %ecx, %ecx 351; SKX-NEXT: testb %al, %al 352; SKX-NEXT: movw $-1, %ax 353; SKX-NEXT: cmovew %cx, %ax 354; SKX-NEXT: retq 355 %x = load i1 , i1 * %addr, align 1 356 %x1 = insertelement <16 x i1> undef, i1 %x, i32 10 357 %x2 = bitcast <16 x i1>%x1 to i16 358 ret i16 %x2 359} 360 361define i16 @test16(i1 *%addr, i16 %a) { 362; KNL-LABEL: test16: 363; KNL: ## BB#0: 364; KNL-NEXT: movzbl (%rdi), %eax 365; KNL-NEXT: andl $1, %eax 366; KNL-NEXT: kmovw %eax, %k1 367; KNL-NEXT: kmovw %esi, %k2 368; KNL-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 369; KNL-NEXT: vmovdqa32 %zmm0, %zmm1 {%k2} {z} 370; KNL-NEXT: vmovdqa32 %zmm0, %zmm0 {%k1} {z} 371; KNL-NEXT: vmovdqa32 {{.*#+}} zmm2 = [0,1,2,3,4,5,6,7,8,9,16,11,12,13,14,15] 372; KNL-NEXT: vpermi2d %zmm0, %zmm1, %zmm2 373; KNL-NEXT: vpslld $31, %zmm2, %zmm0 374; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 375; KNL-NEXT: kmovw %k0, %eax 376; KNL-NEXT: retq 377; 378; SKX-LABEL: test16: 379; SKX: ## BB#0: 380; SKX-NEXT: movzbl (%rdi), %eax 381; SKX-NEXT: andl $1, %eax 382; SKX-NEXT: kmovd %eax, %k0 383; SKX-NEXT: kmovw %esi, %k1 384; SKX-NEXT: vpmovm2d %k1, %zmm0 385; SKX-NEXT: vpmovm2d %k0, %zmm1 386; SKX-NEXT: vmovdqa32 {{.*#+}} zmm2 = [0,1,2,3,4,5,6,7,8,9,16,11,12,13,14,15] 387; SKX-NEXT: vpermi2d %zmm1, %zmm0, %zmm2 388; SKX-NEXT: vpmovd2m %zmm2, %k0 389; SKX-NEXT: kmovw %k0, %eax 390; SKX-NEXT: retq 391 %x = load i1 , i1 * %addr, align 128 392 %a1 = bitcast i16 %a to <16 x i1> 393 %x1 = insertelement <16 x i1> %a1, i1 %x, i32 10 394 %x2 = bitcast <16 x i1>%x1 to i16 395 ret i16 %x2 396} 397 398define i8 @test17(i1 *%addr, i8 %a) { 399; KNL-LABEL: test17: 400; KNL: ## BB#0: 401; KNL-NEXT: movzbl (%rdi), %eax 402; KNL-NEXT: andl $1, %eax 403; KNL-NEXT: kmovw %eax, %k1 404; KNL-NEXT: kmovw %esi, %k2 405; KNL-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 406; KNL-NEXT: vmovdqa64 %zmm0, %zmm1 {%k2} {z} 407; KNL-NEXT: vmovdqa64 %zmm0, %zmm0 {%k1} {z} 408; KNL-NEXT: vmovdqa64 {{.*#+}} zmm2 = [0,1,2,3,8,5,6,7] 409; KNL-NEXT: vpermi2q %zmm0, %zmm1, %zmm2 410; KNL-NEXT: vpsllq $63, %zmm2, %zmm0 411; KNL-NEXT: vptestmq %zmm0, %zmm0, %k0 412; KNL-NEXT: kmovw %k0, %eax 413; KNL-NEXT: retq 414; 415; SKX-LABEL: test17: 416; SKX: ## BB#0: 417; SKX-NEXT: movzbl (%rdi), %eax 418; SKX-NEXT: andl $1, %eax 419; SKX-NEXT: kmovd %eax, %k0 420; SKX-NEXT: kmovb %esi, %k1 421; SKX-NEXT: vpmovm2q %k1, %zmm0 422; SKX-NEXT: vpmovm2q %k0, %zmm1 423; SKX-NEXT: vmovdqa64 {{.*#+}} zmm2 = [0,1,2,3,8,5,6,7] 424; SKX-NEXT: vpermi2q %zmm1, %zmm0, %zmm2 425; SKX-NEXT: vpmovq2m %zmm2, %k0 426; SKX-NEXT: kmovb %k0, %eax 427; SKX-NEXT: retq 428 %x = load i1 , i1 * %addr, align 128 429 %a1 = bitcast i8 %a to <8 x i1> 430 %x1 = insertelement <8 x i1> %a1, i1 %x, i32 4 431 %x2 = bitcast <8 x i1>%x1 to i8 432 ret i8 %x2 433} 434 435define i64 @extract_v8i64(<8 x i64> %x, i64* %dst) { 436; KNL-LABEL: extract_v8i64: 437; KNL: ## BB#0: 438; KNL-NEXT: vpextrq $1, %xmm0, %rax 439; KNL-NEXT: vextracti32x4 $1, %zmm0, %xmm0 440; KNL-NEXT: vpextrq $1, %xmm0, (%rdi) 441; KNL-NEXT: retq 442; 443; SKX-LABEL: extract_v8i64: 444; SKX: ## BB#0: 445; SKX-NEXT: vpextrq $1, %xmm0, %rax 446; SKX-NEXT: vextracti64x2 $1, %zmm0, %xmm0 447; SKX-NEXT: vpextrq $1, %xmm0, (%rdi) 448; SKX-NEXT: retq 449 %r1 = extractelement <8 x i64> %x, i32 1 450 %r2 = extractelement <8 x i64> %x, i32 3 451 store i64 %r2, i64* %dst, align 1 452 ret i64 %r1 453} 454 455define i64 @extract_v4i64(<4 x i64> %x, i64* %dst) { 456; KNL-LABEL: extract_v4i64: 457; KNL: ## BB#0: 458; KNL-NEXT: vpextrq $1, %xmm0, %rax 459; KNL-NEXT: vextracti128 $1, %ymm0, %xmm0 460; KNL-NEXT: vpextrq $1, %xmm0, (%rdi) 461; KNL-NEXT: retq 462; 463; SKX-LABEL: extract_v4i64: 464; SKX: ## BB#0: 465; SKX-NEXT: vpextrq $1, %xmm0, %rax 466; SKX-NEXT: vextracti64x2 $1, %ymm0, %xmm0 467; SKX-NEXT: vpextrq $1, %xmm0, (%rdi) 468; SKX-NEXT: retq 469 %r1 = extractelement <4 x i64> %x, i32 1 470 %r2 = extractelement <4 x i64> %x, i32 3 471 store i64 %r2, i64* %dst, align 1 472 ret i64 %r1 473} 474 475define i64 @extract_v2i64(<2 x i64> %x, i64* %dst) { 476; KNL-LABEL: extract_v2i64: 477; KNL: ## BB#0: 478; KNL-NEXT: vmovq %xmm0, %rax 479; KNL-NEXT: vpextrq $1, %xmm0, (%rdi) 480; KNL-NEXT: retq 481; 482; SKX-LABEL: extract_v2i64: 483; SKX: ## BB#0: 484; SKX-NEXT: vmovq %xmm0, %rax 485; SKX-NEXT: vpextrq $1, %xmm0, (%rdi) 486; SKX-NEXT: retq 487 %r1 = extractelement <2 x i64> %x, i32 0 488 %r2 = extractelement <2 x i64> %x, i32 1 489 store i64 %r2, i64* %dst, align 1 490 ret i64 %r1 491} 492 493define i32 @extract_v16i32(<16 x i32> %x, i32* %dst) { 494; KNL-LABEL: extract_v16i32: 495; KNL: ## BB#0: 496; KNL-NEXT: vpextrd $1, %xmm0, %eax 497; KNL-NEXT: vextracti32x4 $1, %zmm0, %xmm0 498; KNL-NEXT: vpextrd $1, %xmm0, (%rdi) 499; KNL-NEXT: retq 500; 501; SKX-LABEL: extract_v16i32: 502; SKX: ## BB#0: 503; SKX-NEXT: vpextrd $1, %xmm0, %eax 504; SKX-NEXT: vextracti32x4 $1, %zmm0, %xmm0 505; SKX-NEXT: vpextrd $1, %xmm0, (%rdi) 506; SKX-NEXT: retq 507 %r1 = extractelement <16 x i32> %x, i32 1 508 %r2 = extractelement <16 x i32> %x, i32 5 509 store i32 %r2, i32* %dst, align 1 510 ret i32 %r1 511} 512 513define i32 @extract_v8i32(<8 x i32> %x, i32* %dst) { 514; KNL-LABEL: extract_v8i32: 515; KNL: ## BB#0: 516; KNL-NEXT: vpextrd $1, %xmm0, %eax 517; KNL-NEXT: vextracti128 $1, %ymm0, %xmm0 518; KNL-NEXT: vpextrd $1, %xmm0, (%rdi) 519; KNL-NEXT: retq 520; 521; SKX-LABEL: extract_v8i32: 522; SKX: ## BB#0: 523; SKX-NEXT: vpextrd $1, %xmm0, %eax 524; SKX-NEXT: vextracti32x4 $1, %ymm0, %xmm0 525; SKX-NEXT: vpextrd $1, %xmm0, (%rdi) 526; SKX-NEXT: retq 527 %r1 = extractelement <8 x i32> %x, i32 1 528 %r2 = extractelement <8 x i32> %x, i32 5 529 store i32 %r2, i32* %dst, align 1 530 ret i32 %r1 531} 532 533define i32 @extract_v4i32(<4 x i32> %x, i32* %dst) { 534; KNL-LABEL: extract_v4i32: 535; KNL: ## BB#0: 536; KNL-NEXT: vpextrd $1, %xmm0, %eax 537; KNL-NEXT: vpextrd $3, %xmm0, (%rdi) 538; KNL-NEXT: retq 539; 540; SKX-LABEL: extract_v4i32: 541; SKX: ## BB#0: 542; SKX-NEXT: vpextrd $1, %xmm0, %eax 543; SKX-NEXT: vpextrd $3, %xmm0, (%rdi) 544; SKX-NEXT: retq 545 %r1 = extractelement <4 x i32> %x, i32 1 546 %r2 = extractelement <4 x i32> %x, i32 3 547 store i32 %r2, i32* %dst, align 1 548 ret i32 %r1 549} 550 551define i16 @extract_v32i16(<32 x i16> %x, i16* %dst) { 552; KNL-LABEL: extract_v32i16: 553; KNL: ## BB#0: 554; KNL-NEXT: vpextrw $1, %xmm0, %eax 555; KNL-NEXT: vextracti128 $1, %ymm0, %xmm0 556; KNL-NEXT: vpextrw $1, %xmm0, (%rdi) 557; KNL-NEXT: ## kill: %AX<def> %AX<kill> %EAX<kill> 558; KNL-NEXT: retq 559; 560; SKX-LABEL: extract_v32i16: 561; SKX: ## BB#0: 562; SKX-NEXT: vpextrw $1, %xmm0, %eax 563; SKX-NEXT: vextracti32x4 $1, %zmm0, %xmm0 564; SKX-NEXT: vpextrw $1, %xmm0, (%rdi) 565; SKX-NEXT: ## kill: %AX<def> %AX<kill> %EAX<kill> 566; SKX-NEXT: retq 567 %r1 = extractelement <32 x i16> %x, i32 1 568 %r2 = extractelement <32 x i16> %x, i32 9 569 store i16 %r2, i16* %dst, align 1 570 ret i16 %r1 571} 572 573define i16 @extract_v16i16(<16 x i16> %x, i16* %dst) { 574; KNL-LABEL: extract_v16i16: 575; KNL: ## BB#0: 576; KNL-NEXT: vpextrw $1, %xmm0, %eax 577; KNL-NEXT: vextracti128 $1, %ymm0, %xmm0 578; KNL-NEXT: vpextrw $1, %xmm0, (%rdi) 579; KNL-NEXT: ## kill: %AX<def> %AX<kill> %EAX<kill> 580; KNL-NEXT: retq 581; 582; SKX-LABEL: extract_v16i16: 583; SKX: ## BB#0: 584; SKX-NEXT: vpextrw $1, %xmm0, %eax 585; SKX-NEXT: vextracti32x4 $1, %ymm0, %xmm0 586; SKX-NEXT: vpextrw $1, %xmm0, (%rdi) 587; SKX-NEXT: ## kill: %AX<def> %AX<kill> %EAX<kill> 588; SKX-NEXT: retq 589 %r1 = extractelement <16 x i16> %x, i32 1 590 %r2 = extractelement <16 x i16> %x, i32 9 591 store i16 %r2, i16* %dst, align 1 592 ret i16 %r1 593} 594 595define i16 @extract_v8i16(<8 x i16> %x, i16* %dst) { 596; KNL-LABEL: extract_v8i16: 597; KNL: ## BB#0: 598; KNL-NEXT: vpextrw $1, %xmm0, %eax 599; KNL-NEXT: vpextrw $3, %xmm0, (%rdi) 600; KNL-NEXT: ## kill: %AX<def> %AX<kill> %EAX<kill> 601; KNL-NEXT: retq 602; 603; SKX-LABEL: extract_v8i16: 604; SKX: ## BB#0: 605; SKX-NEXT: vpextrw $1, %xmm0, %eax 606; SKX-NEXT: vpextrw $3, %xmm0, (%rdi) 607; SKX-NEXT: ## kill: %AX<def> %AX<kill> %EAX<kill> 608; SKX-NEXT: retq 609 %r1 = extractelement <8 x i16> %x, i32 1 610 %r2 = extractelement <8 x i16> %x, i32 3 611 store i16 %r2, i16* %dst, align 1 612 ret i16 %r1 613} 614 615define i8 @extract_v64i8(<64 x i8> %x, i8* %dst) { 616; KNL-LABEL: extract_v64i8: 617; KNL: ## BB#0: 618; KNL-NEXT: vpextrb $1, %xmm0, %eax 619; KNL-NEXT: vextracti128 $1, %ymm0, %xmm0 620; KNL-NEXT: vpextrb $1, %xmm0, (%rdi) 621; KNL-NEXT: ## kill: %AL<def> %AL<kill> %EAX<kill> 622; KNL-NEXT: retq 623; 624; SKX-LABEL: extract_v64i8: 625; SKX: ## BB#0: 626; SKX-NEXT: vpextrb $1, %xmm0, %eax 627; SKX-NEXT: vextracti32x4 $1, %zmm0, %xmm0 628; SKX-NEXT: vpextrb $1, %xmm0, (%rdi) 629; SKX-NEXT: ## kill: %AL<def> %AL<kill> %EAX<kill> 630; SKX-NEXT: retq 631 %r1 = extractelement <64 x i8> %x, i32 1 632 %r2 = extractelement <64 x i8> %x, i32 17 633 store i8 %r2, i8* %dst, align 1 634 ret i8 %r1 635} 636 637define i8 @extract_v32i8(<32 x i8> %x, i8* %dst) { 638; KNL-LABEL: extract_v32i8: 639; KNL: ## BB#0: 640; KNL-NEXT: vpextrb $1, %xmm0, %eax 641; KNL-NEXT: vextracti128 $1, %ymm0, %xmm0 642; KNL-NEXT: vpextrb $1, %xmm0, (%rdi) 643; KNL-NEXT: ## kill: %AL<def> %AL<kill> %EAX<kill> 644; KNL-NEXT: retq 645; 646; SKX-LABEL: extract_v32i8: 647; SKX: ## BB#0: 648; SKX-NEXT: vpextrb $1, %xmm0, %eax 649; SKX-NEXT: vextracti32x4 $1, %ymm0, %xmm0 650; SKX-NEXT: vpextrb $1, %xmm0, (%rdi) 651; SKX-NEXT: ## kill: %AL<def> %AL<kill> %EAX<kill> 652; SKX-NEXT: retq 653 %r1 = extractelement <32 x i8> %x, i32 1 654 %r2 = extractelement <32 x i8> %x, i32 17 655 store i8 %r2, i8* %dst, align 1 656 ret i8 %r1 657} 658 659define i8 @extract_v16i8(<16 x i8> %x, i8* %dst) { 660; KNL-LABEL: extract_v16i8: 661; KNL: ## BB#0: 662; KNL-NEXT: vpextrb $1, %xmm0, %eax 663; KNL-NEXT: vpextrb $3, %xmm0, (%rdi) 664; KNL-NEXT: ## kill: %AL<def> %AL<kill> %EAX<kill> 665; KNL-NEXT: retq 666; 667; SKX-LABEL: extract_v16i8: 668; SKX: ## BB#0: 669; SKX-NEXT: vpextrb $1, %xmm0, %eax 670; SKX-NEXT: vpextrb $3, %xmm0, (%rdi) 671; SKX-NEXT: ## kill: %AL<def> %AL<kill> %EAX<kill> 672; SKX-NEXT: retq 673 %r1 = extractelement <16 x i8> %x, i32 1 674 %r2 = extractelement <16 x i8> %x, i32 3 675 store i8 %r2, i8* %dst, align 1 676 ret i8 %r1 677} 678 679define <8 x i64> @insert_v8i64(<8 x i64> %x, i64 %y , i64* %ptr) { 680; KNL-LABEL: insert_v8i64: 681; KNL: ## BB#0: 682; KNL-NEXT: vpinsrq $1, (%rsi), %xmm0, %xmm1 683; KNL-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm0 684; KNL-NEXT: vextracti32x4 $1, %zmm0, %xmm1 685; KNL-NEXT: vpinsrq $1, %rdi, %xmm1, %xmm1 686; KNL-NEXT: vinserti32x4 $1, %xmm1, %zmm0, %zmm0 687; KNL-NEXT: retq 688; 689; SKX-LABEL: insert_v8i64: 690; SKX: ## BB#0: 691; SKX-NEXT: vpinsrq $1, (%rsi), %xmm0, %xmm1 692; SKX-NEXT: vinserti64x2 $0, %xmm1, %zmm0, %zmm0 693; SKX-NEXT: vextracti64x2 $1, %zmm0, %xmm1 694; SKX-NEXT: vpinsrq $1, %rdi, %xmm1, %xmm1 695; SKX-NEXT: vinserti64x2 $1, %xmm1, %zmm0, %zmm0 696; SKX-NEXT: retq 697 %val = load i64, i64* %ptr 698 %r1 = insertelement <8 x i64> %x, i64 %val, i32 1 699 %r2 = insertelement <8 x i64> %r1, i64 %y, i32 3 700 ret <8 x i64> %r2 701} 702 703define <4 x i64> @insert_v4i64(<4 x i64> %x, i64 %y , i64* %ptr) { 704; KNL-LABEL: insert_v4i64: 705; KNL: ## BB#0: 706; KNL-NEXT: vpinsrq $1, (%rsi), %xmm0, %xmm1 707; KNL-NEXT: vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7] 708; KNL-NEXT: vextracti128 $1, %ymm0, %xmm1 709; KNL-NEXT: vpinsrq $1, %rdi, %xmm1, %xmm1 710; KNL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 711; KNL-NEXT: retq 712; 713; SKX-LABEL: insert_v4i64: 714; SKX: ## BB#0: 715; SKX-NEXT: vpinsrq $1, (%rsi), %xmm0, %xmm1 716; SKX-NEXT: vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7] 717; SKX-NEXT: vextracti64x2 $1, %ymm0, %xmm1 718; SKX-NEXT: vpinsrq $1, %rdi, %xmm1, %xmm1 719; SKX-NEXT: vinserti64x2 $1, %xmm1, %ymm0, %ymm0 720; SKX-NEXT: retq 721 %val = load i64, i64* %ptr 722 %r1 = insertelement <4 x i64> %x, i64 %val, i32 1 723 %r2 = insertelement <4 x i64> %r1, i64 %y, i32 3 724 ret <4 x i64> %r2 725} 726 727define <2 x i64> @insert_v2i64(<2 x i64> %x, i64 %y , i64* %ptr) { 728; KNL-LABEL: insert_v2i64: 729; KNL: ## BB#0: 730; KNL-NEXT: vpinsrq $0, %rdi, %xmm0, %xmm0 731; KNL-NEXT: vpinsrq $1, (%rsi), %xmm0, %xmm0 732; KNL-NEXT: retq 733; 734; SKX-LABEL: insert_v2i64: 735; SKX: ## BB#0: 736; SKX-NEXT: vpinsrq $0, %rdi, %xmm0, %xmm0 737; SKX-NEXT: vpinsrq $1, (%rsi), %xmm0, %xmm0 738; SKX-NEXT: retq 739 %val = load i64, i64* %ptr 740 %r1 = insertelement <2 x i64> %x, i64 %val, i32 1 741 %r2 = insertelement <2 x i64> %r1, i64 %y, i32 0 742 ret <2 x i64> %r2 743} 744 745define <16 x i32> @insert_v16i32(<16 x i32> %x, i32 %y, i32* %ptr) { 746; KNL-LABEL: insert_v16i32: 747; KNL: ## BB#0: 748; KNL-NEXT: vpinsrd $1, (%rsi), %xmm0, %xmm1 749; KNL-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm0 750; KNL-NEXT: vextracti32x4 $1, %zmm0, %xmm1 751; KNL-NEXT: vpinsrd $1, %edi, %xmm1, %xmm1 752; KNL-NEXT: vinserti32x4 $1, %xmm1, %zmm0, %zmm0 753; KNL-NEXT: retq 754; 755; SKX-LABEL: insert_v16i32: 756; SKX: ## BB#0: 757; SKX-NEXT: vpinsrd $1, (%rsi), %xmm0, %xmm1 758; SKX-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm0 759; SKX-NEXT: vextracti32x4 $1, %zmm0, %xmm1 760; SKX-NEXT: vpinsrd $1, %edi, %xmm1, %xmm1 761; SKX-NEXT: vinserti32x4 $1, %xmm1, %zmm0, %zmm0 762; SKX-NEXT: retq 763 %val = load i32, i32* %ptr 764 %r1 = insertelement <16 x i32> %x, i32 %val, i32 1 765 %r2 = insertelement <16 x i32> %r1, i32 %y, i32 5 766 ret <16 x i32> %r2 767} 768 769define <8 x i32> @insert_v8i32(<8 x i32> %x, i32 %y, i32* %ptr) { 770; KNL-LABEL: insert_v8i32: 771; KNL: ## BB#0: 772; KNL-NEXT: vpinsrd $1, (%rsi), %xmm0, %xmm1 773; KNL-NEXT: vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7] 774; KNL-NEXT: vextracti128 $1, %ymm0, %xmm1 775; KNL-NEXT: vpinsrd $1, %edi, %xmm1, %xmm1 776; KNL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 777; KNL-NEXT: retq 778; 779; SKX-LABEL: insert_v8i32: 780; SKX: ## BB#0: 781; SKX-NEXT: vpinsrd $1, (%rsi), %xmm0, %xmm1 782; SKX-NEXT: vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7] 783; SKX-NEXT: vextracti32x4 $1, %ymm0, %xmm1 784; SKX-NEXT: vpinsrd $1, %edi, %xmm1, %xmm1 785; SKX-NEXT: vinserti32x4 $1, %xmm1, %ymm0, %ymm0 786; SKX-NEXT: retq 787 %val = load i32, i32* %ptr 788 %r1 = insertelement <8 x i32> %x, i32 %val, i32 1 789 %r2 = insertelement <8 x i32> %r1, i32 %y, i32 5 790 ret <8 x i32> %r2 791} 792 793define <4 x i32> @insert_v4i32(<4 x i32> %x, i32 %y, i32* %ptr) { 794; KNL-LABEL: insert_v4i32: 795; KNL: ## BB#0: 796; KNL-NEXT: vpinsrd $1, (%rsi), %xmm0, %xmm0 797; KNL-NEXT: vpinsrd $3, %edi, %xmm0, %xmm0 798; KNL-NEXT: retq 799; 800; SKX-LABEL: insert_v4i32: 801; SKX: ## BB#0: 802; SKX-NEXT: vpinsrd $1, (%rsi), %xmm0, %xmm0 803; SKX-NEXT: vpinsrd $3, %edi, %xmm0, %xmm0 804; SKX-NEXT: retq 805 %val = load i32, i32* %ptr 806 %r1 = insertelement <4 x i32> %x, i32 %val, i32 1 807 %r2 = insertelement <4 x i32> %r1, i32 %y, i32 3 808 ret <4 x i32> %r2 809} 810 811define <32 x i16> @insert_v32i16(<32 x i16> %x, i16 %y, i16* %ptr) { 812; KNL-LABEL: insert_v32i16: 813; KNL: ## BB#0: 814; KNL-NEXT: vpinsrw $1, (%rsi), %xmm0, %xmm2 815; KNL-NEXT: vpblendd {{.*#+}} ymm0 = ymm2[0,1,2,3],ymm0[4,5,6,7] 816; KNL-NEXT: vextracti128 $1, %ymm0, %xmm2 817; KNL-NEXT: vpinsrw $1, %edi, %xmm2, %xmm2 818; KNL-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 819; KNL-NEXT: retq 820; 821; SKX-LABEL: insert_v32i16: 822; SKX: ## BB#0: 823; SKX-NEXT: vpinsrw $1, (%rsi), %xmm0, %xmm1 824; SKX-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm0 825; SKX-NEXT: vextracti32x4 $1, %zmm0, %xmm1 826; SKX-NEXT: vpinsrw $1, %edi, %xmm1, %xmm1 827; SKX-NEXT: vinserti32x4 $1, %xmm1, %zmm0, %zmm0 828; SKX-NEXT: retq 829 %val = load i16, i16* %ptr 830 %r1 = insertelement <32 x i16> %x, i16 %val, i32 1 831 %r2 = insertelement <32 x i16> %r1, i16 %y, i32 9 832 ret <32 x i16> %r2 833} 834 835define <16 x i16> @insert_v16i16(<16 x i16> %x, i16 %y, i16* %ptr) { 836; KNL-LABEL: insert_v16i16: 837; KNL: ## BB#0: 838; KNL-NEXT: vpinsrw $1, (%rsi), %xmm0, %xmm1 839; KNL-NEXT: vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7] 840; KNL-NEXT: vextracti128 $1, %ymm0, %xmm1 841; KNL-NEXT: vpinsrw $1, %edi, %xmm1, %xmm1 842; KNL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 843; KNL-NEXT: retq 844; 845; SKX-LABEL: insert_v16i16: 846; SKX: ## BB#0: 847; SKX-NEXT: vpinsrw $1, (%rsi), %xmm0, %xmm1 848; SKX-NEXT: vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7] 849; SKX-NEXT: vextracti32x4 $1, %ymm0, %xmm1 850; SKX-NEXT: vpinsrw $1, %edi, %xmm1, %xmm1 851; SKX-NEXT: vinserti32x4 $1, %xmm1, %ymm0, %ymm0 852; SKX-NEXT: retq 853 %val = load i16, i16* %ptr 854 %r1 = insertelement <16 x i16> %x, i16 %val, i32 1 855 %r2 = insertelement <16 x i16> %r1, i16 %y, i32 9 856 ret <16 x i16> %r2 857} 858 859define <8 x i16> @insert_v8i16(<8 x i16> %x, i16 %y, i16* %ptr) { 860; KNL-LABEL: insert_v8i16: 861; KNL: ## BB#0: 862; KNL-NEXT: vpinsrw $1, (%rsi), %xmm0, %xmm0 863; KNL-NEXT: vpinsrw $5, %edi, %xmm0, %xmm0 864; KNL-NEXT: retq 865; 866; SKX-LABEL: insert_v8i16: 867; SKX: ## BB#0: 868; SKX-NEXT: vpinsrw $1, (%rsi), %xmm0, %xmm0 869; SKX-NEXT: vpinsrw $5, %edi, %xmm0, %xmm0 870; SKX-NEXT: retq 871 %val = load i16, i16* %ptr 872 %r1 = insertelement <8 x i16> %x, i16 %val, i32 1 873 %r2 = insertelement <8 x i16> %r1, i16 %y, i32 5 874 ret <8 x i16> %r2 875} 876 877define <64 x i8> @insert_v64i8(<64 x i8> %x, i8 %y, i8* %ptr) { 878; KNL-LABEL: insert_v64i8: 879; KNL: ## BB#0: 880; KNL-NEXT: vpinsrb $1, (%rsi), %xmm0, %xmm2 881; KNL-NEXT: vpblendd {{.*#+}} ymm0 = ymm2[0,1,2,3],ymm0[4,5,6,7] 882; KNL-NEXT: vextracti128 $1, %ymm1, %xmm2 883; KNL-NEXT: vpinsrb $2, %edi, %xmm2, %xmm2 884; KNL-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 885; KNL-NEXT: retq 886; 887; SKX-LABEL: insert_v64i8: 888; SKX: ## BB#0: 889; SKX-NEXT: vpinsrb $1, (%rsi), %xmm0, %xmm1 890; SKX-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm0 891; SKX-NEXT: vextracti32x4 $3, %zmm0, %xmm1 892; SKX-NEXT: vpinsrb $2, %edi, %xmm1, %xmm1 893; SKX-NEXT: vinserti32x4 $3, %xmm1, %zmm0, %zmm0 894; SKX-NEXT: retq 895 %val = load i8, i8* %ptr 896 %r1 = insertelement <64 x i8> %x, i8 %val, i32 1 897 %r2 = insertelement <64 x i8> %r1, i8 %y, i32 50 898 ret <64 x i8> %r2 899} 900 901define <32 x i8> @insert_v32i8(<32 x i8> %x, i8 %y, i8* %ptr) { 902; KNL-LABEL: insert_v32i8: 903; KNL: ## BB#0: 904; KNL-NEXT: vpinsrb $1, (%rsi), %xmm0, %xmm1 905; KNL-NEXT: vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7] 906; KNL-NEXT: vextracti128 $1, %ymm0, %xmm1 907; KNL-NEXT: vpinsrb $1, %edi, %xmm1, %xmm1 908; KNL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 909; KNL-NEXT: retq 910; 911; SKX-LABEL: insert_v32i8: 912; SKX: ## BB#0: 913; SKX-NEXT: vpinsrb $1, (%rsi), %xmm0, %xmm1 914; SKX-NEXT: vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7] 915; SKX-NEXT: vextracti32x4 $1, %ymm0, %xmm1 916; SKX-NEXT: vpinsrb $1, %edi, %xmm1, %xmm1 917; SKX-NEXT: vinserti32x4 $1, %xmm1, %ymm0, %ymm0 918; SKX-NEXT: retq 919 %val = load i8, i8* %ptr 920 %r1 = insertelement <32 x i8> %x, i8 %val, i32 1 921 %r2 = insertelement <32 x i8> %r1, i8 %y, i32 17 922 ret <32 x i8> %r2 923} 924 925define <16 x i8> @insert_v16i8(<16 x i8> %x, i8 %y, i8* %ptr) { 926; KNL-LABEL: insert_v16i8: 927; KNL: ## BB#0: 928; KNL-NEXT: vpinsrb $3, (%rsi), %xmm0, %xmm0 929; KNL-NEXT: vpinsrb $10, %edi, %xmm0, %xmm0 930; KNL-NEXT: retq 931; 932; SKX-LABEL: insert_v16i8: 933; SKX: ## BB#0: 934; SKX-NEXT: vpinsrb $3, (%rsi), %xmm0, %xmm0 935; SKX-NEXT: vpinsrb $10, %edi, %xmm0, %xmm0 936; SKX-NEXT: retq 937 %val = load i8, i8* %ptr 938 %r1 = insertelement <16 x i8> %x, i8 %val, i32 3 939 %r2 = insertelement <16 x i8> %r1, i8 %y, i32 10 940 ret <16 x i8> %r2 941} 942 943define <8 x i64> @test_insert_128_v8i64(<8 x i64> %x, i64 %y) { 944; KNL-LABEL: test_insert_128_v8i64: 945; KNL: ## BB#0: 946; KNL-NEXT: vpinsrq $1, %rdi, %xmm0, %xmm1 947; KNL-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm0 948; KNL-NEXT: retq 949; 950; SKX-LABEL: test_insert_128_v8i64: 951; SKX: ## BB#0: 952; SKX-NEXT: vpinsrq $1, %rdi, %xmm0, %xmm1 953; SKX-NEXT: vinserti64x2 $0, %xmm1, %zmm0, %zmm0 954; SKX-NEXT: retq 955 %r = insertelement <8 x i64> %x, i64 %y, i32 1 956 ret <8 x i64> %r 957} 958 959define <16 x i32> @test_insert_128_v16i32(<16 x i32> %x, i32 %y) { 960; KNL-LABEL: test_insert_128_v16i32: 961; KNL: ## BB#0: 962; KNL-NEXT: vpinsrd $1, %edi, %xmm0, %xmm1 963; KNL-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm0 964; KNL-NEXT: retq 965; 966; SKX-LABEL: test_insert_128_v16i32: 967; SKX: ## BB#0: 968; SKX-NEXT: vpinsrd $1, %edi, %xmm0, %xmm1 969; SKX-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm0 970; SKX-NEXT: retq 971 %r = insertelement <16 x i32> %x, i32 %y, i32 1 972 ret <16 x i32> %r 973} 974 975define <8 x double> @test_insert_128_v8f64(<8 x double> %x, double %y) { 976; KNL-LABEL: test_insert_128_v8f64: 977; KNL: ## BB#0: 978; KNL-NEXT: vunpcklpd {{.*#+}} xmm1 = xmm0[0],xmm1[0] 979; KNL-NEXT: vinsertf32x4 $0, %xmm1, %zmm0, %zmm0 980; KNL-NEXT: retq 981; 982; SKX-LABEL: test_insert_128_v8f64: 983; SKX: ## BB#0: 984; SKX-NEXT: vunpcklpd {{.*#+}} xmm1 = xmm0[0],xmm1[0] 985; SKX-NEXT: vinsertf64x2 $0, %xmm1, %zmm0, %zmm0 986; SKX-NEXT: retq 987 %r = insertelement <8 x double> %x, double %y, i32 1 988 ret <8 x double> %r 989} 990 991define <16 x float> @test_insert_128_v16f32(<16 x float> %x, float %y) { 992; KNL-LABEL: test_insert_128_v16f32: 993; KNL: ## BB#0: 994; KNL-NEXT: vinsertps {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[2,3] 995; KNL-NEXT: vinsertf32x4 $0, %xmm1, %zmm0, %zmm0 996; KNL-NEXT: retq 997; 998; SKX-LABEL: test_insert_128_v16f32: 999; SKX: ## BB#0: 1000; SKX-NEXT: vinsertps {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[2,3] 1001; SKX-NEXT: vinsertf32x4 $0, %xmm1, %zmm0, %zmm0 1002; SKX-NEXT: retq 1003 %r = insertelement <16 x float> %x, float %y, i32 1 1004 ret <16 x float> %r 1005} 1006 1007define <16 x i16> @test_insert_128_v16i16(<16 x i16> %x, i16 %y) { 1008; KNL-LABEL: test_insert_128_v16i16: 1009; KNL: ## BB#0: 1010; KNL-NEXT: vextracti128 $1, %ymm0, %xmm1 1011; KNL-NEXT: vpinsrw $2, %edi, %xmm1, %xmm1 1012; KNL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1013; KNL-NEXT: retq 1014; 1015; SKX-LABEL: test_insert_128_v16i16: 1016; SKX: ## BB#0: 1017; SKX-NEXT: vextracti32x4 $1, %ymm0, %xmm1 1018; SKX-NEXT: vpinsrw $2, %edi, %xmm1, %xmm1 1019; SKX-NEXT: vinserti32x4 $1, %xmm1, %ymm0, %ymm0 1020; SKX-NEXT: retq 1021 %r = insertelement <16 x i16> %x, i16 %y, i32 10 1022 ret <16 x i16> %r 1023} 1024 1025define <32 x i8> @test_insert_128_v32i8(<32 x i8> %x, i8 %y) { 1026; KNL-LABEL: test_insert_128_v32i8: 1027; KNL: ## BB#0: 1028; KNL-NEXT: vextracti128 $1, %ymm0, %xmm1 1029; KNL-NEXT: vpinsrb $4, %edi, %xmm1, %xmm1 1030; KNL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1031; KNL-NEXT: retq 1032; 1033; SKX-LABEL: test_insert_128_v32i8: 1034; SKX: ## BB#0: 1035; SKX-NEXT: vextracti32x4 $1, %ymm0, %xmm1 1036; SKX-NEXT: vpinsrb $4, %edi, %xmm1, %xmm1 1037; SKX-NEXT: vinserti32x4 $1, %xmm1, %ymm0, %ymm0 1038; SKX-NEXT: retq 1039 %r = insertelement <32 x i8> %x, i8 %y, i32 20 1040 ret <32 x i8> %r 1041} 1042 1043define i32 @test_insertelement_v32i1(i32 %a, i32 %b, <32 x i32> %x , <32 x i32> %y) { 1044; KNL-LABEL: test_insertelement_v32i1: 1045; KNL: ## BB#0: 1046; KNL-NEXT: pushq %rbp 1047; KNL-NEXT: Lcfi0: 1048; KNL-NEXT: .cfi_def_cfa_offset 16 1049; KNL-NEXT: Lcfi1: 1050; KNL-NEXT: .cfi_offset %rbp, -16 1051; KNL-NEXT: movq %rsp, %rbp 1052; KNL-NEXT: Lcfi2: 1053; KNL-NEXT: .cfi_def_cfa_register %rbp 1054; KNL-NEXT: andq $-32, %rsp 1055; KNL-NEXT: subq $32, %rsp 1056; KNL-NEXT: cmpl %esi, %edi 1057; KNL-NEXT: vpcmpltud %zmm3, %zmm1, %k0 1058; KNL-NEXT: kshiftlw $14, %k0, %k1 1059; KNL-NEXT: kshiftrw $15, %k1, %k1 1060; KNL-NEXT: kmovw %k1, %eax 1061; KNL-NEXT: kshiftlw $15, %k0, %k1 1062; KNL-NEXT: kshiftrw $15, %k1, %k1 1063; KNL-NEXT: kmovw %k1, %ecx 1064; KNL-NEXT: vmovd %ecx, %xmm1 1065; KNL-NEXT: vpinsrb $1, %eax, %xmm1, %xmm1 1066; KNL-NEXT: kshiftlw $13, %k0, %k1 1067; KNL-NEXT: kshiftrw $15, %k1, %k1 1068; KNL-NEXT: kmovw %k1, %eax 1069; KNL-NEXT: vpinsrb $2, %eax, %xmm1, %xmm1 1070; KNL-NEXT: kshiftlw $12, %k0, %k1 1071; KNL-NEXT: kshiftrw $15, %k1, %k1 1072; KNL-NEXT: kmovw %k1, %eax 1073; KNL-NEXT: vpinsrb $3, %eax, %xmm1, %xmm1 1074; KNL-NEXT: kshiftlw $11, %k0, %k1 1075; KNL-NEXT: kshiftrw $15, %k1, %k1 1076; KNL-NEXT: kmovw %k1, %eax 1077; KNL-NEXT: vpinsrb $4, %eax, %xmm1, %xmm1 1078; KNL-NEXT: kshiftlw $10, %k0, %k1 1079; KNL-NEXT: kshiftrw $15, %k1, %k1 1080; KNL-NEXT: kmovw %k1, %eax 1081; KNL-NEXT: vpinsrb $5, %eax, %xmm1, %xmm1 1082; KNL-NEXT: kshiftlw $9, %k0, %k1 1083; KNL-NEXT: kshiftrw $15, %k1, %k1 1084; KNL-NEXT: kmovw %k1, %eax 1085; KNL-NEXT: vpinsrb $6, %eax, %xmm1, %xmm1 1086; KNL-NEXT: kshiftlw $8, %k0, %k1 1087; KNL-NEXT: kshiftrw $15, %k1, %k1 1088; KNL-NEXT: kmovw %k1, %eax 1089; KNL-NEXT: vpinsrb $7, %eax, %xmm1, %xmm1 1090; KNL-NEXT: kshiftlw $7, %k0, %k1 1091; KNL-NEXT: kshiftrw $15, %k1, %k1 1092; KNL-NEXT: kmovw %k1, %eax 1093; KNL-NEXT: vpinsrb $8, %eax, %xmm1, %xmm1 1094; KNL-NEXT: kshiftlw $6, %k0, %k1 1095; KNL-NEXT: kshiftrw $15, %k1, %k1 1096; KNL-NEXT: kmovw %k1, %eax 1097; KNL-NEXT: vpinsrb $9, %eax, %xmm1, %xmm1 1098; KNL-NEXT: kshiftlw $5, %k0, %k1 1099; KNL-NEXT: kshiftrw $15, %k1, %k1 1100; KNL-NEXT: kmovw %k1, %eax 1101; KNL-NEXT: vpinsrb $10, %eax, %xmm1, %xmm1 1102; KNL-NEXT: kshiftlw $4, %k0, %k1 1103; KNL-NEXT: kshiftrw $15, %k1, %k1 1104; KNL-NEXT: kmovw %k1, %eax 1105; KNL-NEXT: vpinsrb $11, %eax, %xmm1, %xmm1 1106; KNL-NEXT: kshiftlw $3, %k0, %k1 1107; KNL-NEXT: kshiftrw $15, %k1, %k1 1108; KNL-NEXT: kmovw %k1, %eax 1109; KNL-NEXT: vpinsrb $12, %eax, %xmm1, %xmm1 1110; KNL-NEXT: kshiftlw $2, %k0, %k1 1111; KNL-NEXT: kshiftrw $15, %k1, %k1 1112; KNL-NEXT: kmovw %k1, %eax 1113; KNL-NEXT: vpinsrb $13, %eax, %xmm1, %xmm1 1114; KNL-NEXT: kshiftlw $1, %k0, %k1 1115; KNL-NEXT: kshiftrw $15, %k1, %k1 1116; KNL-NEXT: kmovw %k1, %eax 1117; KNL-NEXT: vpinsrb $14, %eax, %xmm1, %xmm1 1118; KNL-NEXT: kshiftrw $15, %k0, %k0 1119; KNL-NEXT: kmovw %k0, %eax 1120; KNL-NEXT: vpinsrb $15, %eax, %xmm1, %xmm1 1121; KNL-NEXT: vpcmpltud %zmm2, %zmm0, %k0 1122; KNL-NEXT: kshiftlw $14, %k0, %k1 1123; KNL-NEXT: kshiftrw $15, %k1, %k1 1124; KNL-NEXT: kmovw %k1, %eax 1125; KNL-NEXT: kshiftlw $15, %k0, %k1 1126; KNL-NEXT: kshiftrw $15, %k1, %k1 1127; KNL-NEXT: kmovw %k1, %ecx 1128; KNL-NEXT: vmovd %ecx, %xmm0 1129; KNL-NEXT: vpinsrb $1, %eax, %xmm0, %xmm0 1130; KNL-NEXT: kshiftlw $13, %k0, %k1 1131; KNL-NEXT: kshiftrw $15, %k1, %k1 1132; KNL-NEXT: kmovw %k1, %eax 1133; KNL-NEXT: vpinsrb $2, %eax, %xmm0, %xmm0 1134; KNL-NEXT: kshiftlw $12, %k0, %k1 1135; KNL-NEXT: kshiftrw $15, %k1, %k1 1136; KNL-NEXT: kmovw %k1, %eax 1137; KNL-NEXT: vpinsrb $3, %eax, %xmm0, %xmm0 1138; KNL-NEXT: kshiftlw $11, %k0, %k1 1139; KNL-NEXT: kshiftrw $15, %k1, %k1 1140; KNL-NEXT: kmovw %k1, %eax 1141; KNL-NEXT: vpinsrb $4, %eax, %xmm0, %xmm0 1142; KNL-NEXT: kshiftlw $10, %k0, %k1 1143; KNL-NEXT: kshiftrw $15, %k1, %k1 1144; KNL-NEXT: kmovw %k1, %eax 1145; KNL-NEXT: vpinsrb $5, %eax, %xmm0, %xmm0 1146; KNL-NEXT: kshiftlw $9, %k0, %k1 1147; KNL-NEXT: kshiftrw $15, %k1, %k1 1148; KNL-NEXT: kmovw %k1, %eax 1149; KNL-NEXT: vpinsrb $6, %eax, %xmm0, %xmm0 1150; KNL-NEXT: kshiftlw $8, %k0, %k1 1151; KNL-NEXT: kshiftrw $15, %k1, %k1 1152; KNL-NEXT: kmovw %k1, %eax 1153; KNL-NEXT: vpinsrb $7, %eax, %xmm0, %xmm0 1154; KNL-NEXT: kshiftlw $7, %k0, %k1 1155; KNL-NEXT: kshiftrw $15, %k1, %k1 1156; KNL-NEXT: kmovw %k1, %eax 1157; KNL-NEXT: vpinsrb $8, %eax, %xmm0, %xmm0 1158; KNL-NEXT: kshiftlw $6, %k0, %k1 1159; KNL-NEXT: kshiftrw $15, %k1, %k1 1160; KNL-NEXT: kmovw %k1, %eax 1161; KNL-NEXT: vpinsrb $9, %eax, %xmm0, %xmm0 1162; KNL-NEXT: kshiftlw $5, %k0, %k1 1163; KNL-NEXT: kshiftrw $15, %k1, %k1 1164; KNL-NEXT: kmovw %k1, %eax 1165; KNL-NEXT: vpinsrb $10, %eax, %xmm0, %xmm0 1166; KNL-NEXT: kshiftlw $4, %k0, %k1 1167; KNL-NEXT: kshiftrw $15, %k1, %k1 1168; KNL-NEXT: kmovw %k1, %eax 1169; KNL-NEXT: vpinsrb $11, %eax, %xmm0, %xmm0 1170; KNL-NEXT: kshiftlw $3, %k0, %k1 1171; KNL-NEXT: kshiftrw $15, %k1, %k1 1172; KNL-NEXT: kmovw %k1, %eax 1173; KNL-NEXT: vpinsrb $12, %eax, %xmm0, %xmm0 1174; KNL-NEXT: kshiftlw $2, %k0, %k1 1175; KNL-NEXT: kshiftrw $15, %k1, %k1 1176; KNL-NEXT: kmovw %k1, %eax 1177; KNL-NEXT: vpinsrb $13, %eax, %xmm0, %xmm0 1178; KNL-NEXT: kshiftlw $1, %k0, %k1 1179; KNL-NEXT: kshiftrw $15, %k1, %k1 1180; KNL-NEXT: kmovw %k1, %eax 1181; KNL-NEXT: vpinsrb $14, %eax, %xmm0, %xmm0 1182; KNL-NEXT: kshiftrw $15, %k0, %k0 1183; KNL-NEXT: kmovw %k0, %eax 1184; KNL-NEXT: vpinsrb $15, %eax, %xmm0, %xmm0 1185; KNL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1186; KNL-NEXT: vpsllw $7, %ymm0, %ymm0 1187; KNL-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0 1188; KNL-NEXT: vpxor %ymm1, %ymm1, %ymm1 1189; KNL-NEXT: vpcmpgtb %ymm0, %ymm1, %ymm0 1190; KNL-NEXT: sbbl %eax, %eax 1191; KNL-NEXT: andl $1, %eax 1192; KNL-NEXT: vpinsrb $4, %eax, %xmm0, %xmm1 1193; KNL-NEXT: vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7] 1194; KNL-NEXT: vextracti128 $1, %ymm0, %xmm1 1195; KNL-NEXT: vpmovsxbd %xmm1, %zmm1 1196; KNL-NEXT: vpslld $31, %zmm1, %zmm1 1197; KNL-NEXT: vptestmd %zmm1, %zmm1, %k0 1198; KNL-NEXT: kmovw %k0, {{[0-9]+}}(%rsp) 1199; KNL-NEXT: vpmovsxbd %xmm0, %zmm0 1200; KNL-NEXT: vpslld $31, %zmm0, %zmm0 1201; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 1202; KNL-NEXT: kmovw %k0, (%rsp) 1203; KNL-NEXT: movl (%rsp), %eax 1204; KNL-NEXT: movq %rbp, %rsp 1205; KNL-NEXT: popq %rbp 1206; KNL-NEXT: retq 1207; 1208; SKX-LABEL: test_insertelement_v32i1: 1209; SKX: ## BB#0: 1210; SKX-NEXT: cmpl %esi, %edi 1211; SKX-NEXT: setb %al 1212; SKX-NEXT: andl $1, %eax 1213; SKX-NEXT: kmovw %eax, %k0 1214; SKX-NEXT: vpcmpltud %zmm2, %zmm0, %k1 1215; SKX-NEXT: vpcmpltud %zmm3, %zmm1, %k2 1216; SKX-NEXT: kunpckwd %k1, %k2, %k1 1217; SKX-NEXT: vpmovm2w %k1, %zmm0 1218; SKX-NEXT: vpmovm2w %k0, %zmm1 1219; SKX-NEXT: vmovdqu16 {{.*#+}} zmm2 = [0,1,2,3,32,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31] 1220; SKX-NEXT: vpermi2w %zmm1, %zmm0, %zmm2 1221; SKX-NEXT: vpmovw2m %zmm2, %k0 1222; SKX-NEXT: kmovd %k0, %eax 1223; SKX-NEXT: retq 1224 %cmp_res_i1 = icmp ult i32 %a, %b 1225 %cmp_cmp_vec = icmp ult <32 x i32> %x, %y 1226 %maskv = insertelement <32 x i1> %cmp_cmp_vec, i1 %cmp_res_i1, i32 4 1227 %res = bitcast <32 x i1> %maskv to i32 1228 ret i32 %res 1229} 1230 1231define i8 @test_iinsertelement_v4i1(i32 %a, i32 %b, <4 x i32> %x , <4 x i32> %y) { 1232; KNL-LABEL: test_iinsertelement_v4i1: 1233; KNL: ## BB#0: 1234; KNL-NEXT: cmpl %esi, %edi 1235; KNL-NEXT: setb %al 1236; KNL-NEXT: andl $1, %eax 1237; KNL-NEXT: kmovw %eax, %k1 1238; KNL-NEXT: vpbroadcastd {{.*}}(%rip), %xmm2 1239; KNL-NEXT: vpxor %xmm2, %xmm0, %xmm0 1240; KNL-NEXT: vpxor %xmm2, %xmm1, %xmm1 1241; KNL-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm0 1242; KNL-NEXT: vpextrd $1, %xmm0, %eax 1243; KNL-NEXT: andl $1, %eax 1244; KNL-NEXT: kmovw %eax, %k2 1245; KNL-NEXT: vpternlogd $255, %zmm1, %zmm1, %zmm1 1246; KNL-NEXT: vmovdqa64 %zmm1, %zmm2 {%k2} {z} 1247; KNL-NEXT: vmovd %xmm0, %eax 1248; KNL-NEXT: andl $1, %eax 1249; KNL-NEXT: kmovw %eax, %k2 1250; KNL-NEXT: vmovdqa64 %zmm1, %zmm3 {%k2} {z} 1251; KNL-NEXT: vmovdqa64 {{.*#+}} zmm4 = [0,8,2,3,4,5,6,7] 1252; KNL-NEXT: vpermi2q %zmm2, %zmm3, %zmm4 1253; KNL-NEXT: vpsllq $63, %zmm4, %zmm2 1254; KNL-NEXT: vptestmq %zmm2, %zmm2, %k2 1255; KNL-NEXT: vmovdqa64 %zmm1, %zmm2 {%k2} {z} 1256; KNL-NEXT: vmovdqa64 %zmm1, %zmm3 {%k1} {z} 1257; KNL-NEXT: vmovdqa64 {{.*#+}} zmm4 = [0,1,8,3,4,5,6,7] 1258; KNL-NEXT: vpermi2q %zmm3, %zmm2, %zmm4 1259; KNL-NEXT: vpsllq $63, %zmm4, %zmm2 1260; KNL-NEXT: vptestmq %zmm2, %zmm2, %k1 1261; KNL-NEXT: vmovdqa64 %zmm1, %zmm2 {%k1} {z} 1262; KNL-NEXT: vpextrd $3, %xmm0, %eax 1263; KNL-NEXT: andl $1, %eax 1264; KNL-NEXT: kmovw %eax, %k1 1265; KNL-NEXT: vmovdqa64 %zmm1, %zmm0 {%k1} {z} 1266; KNL-NEXT: vmovdqa64 {{.*#+}} zmm1 = [0,1,2,8,4,5,6,7] 1267; KNL-NEXT: vpermi2q %zmm0, %zmm2, %zmm1 1268; KNL-NEXT: vpsllq $63, %zmm1, %zmm0 1269; KNL-NEXT: vptestmq %zmm0, %zmm0, %k0 1270; KNL-NEXT: kmovw %k0, %eax 1271; KNL-NEXT: retq 1272; 1273; SKX-LABEL: test_iinsertelement_v4i1: 1274; SKX: ## BB#0: 1275; SKX-NEXT: cmpl %esi, %edi 1276; SKX-NEXT: setb %al 1277; SKX-NEXT: andl $1, %eax 1278; SKX-NEXT: kmovw %eax, %k0 1279; SKX-NEXT: vpcmpltud %xmm1, %xmm0, %k1 1280; SKX-NEXT: vpmovm2d %k1, %xmm0 1281; SKX-NEXT: vpmovm2d %k0, %xmm1 1282; SKX-NEXT: vpbroadcastq %xmm1, %xmm1 1283; SKX-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3] 1284; SKX-NEXT: vpmovd2m %xmm0, %k0 1285; SKX-NEXT: kmovb %k0, %eax 1286; SKX-NEXT: retq 1287 %cmp_res_i1 = icmp ult i32 %a, %b 1288 %cmp_cmp_vec = icmp ult <4 x i32> %x, %y 1289 %maskv = insertelement <4 x i1> %cmp_cmp_vec, i1 %cmp_res_i1, i32 2 1290 %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> 1291 %res = bitcast <8 x i1> %res0 to i8 1292 ret i8 %res 1293} 1294 1295define i8 @test_iinsertelement_v2i1(i32 %a, i32 %b, <2 x i64> %x , <2 x i64> %y) { 1296; KNL-LABEL: test_iinsertelement_v2i1: 1297; KNL: ## BB#0: 1298; KNL-NEXT: cmpl %esi, %edi 1299; KNL-NEXT: setb %al 1300; KNL-NEXT: andl $1, %eax 1301; KNL-NEXT: kmovw %eax, %k1 1302; KNL-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 1303; KNL-NEXT: vpxor %xmm2, %xmm0, %xmm0 1304; KNL-NEXT: vpxor %xmm2, %xmm1, %xmm1 1305; KNL-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0 1306; KNL-NEXT: vmovq %xmm0, %rax 1307; KNL-NEXT: andl $1, %eax 1308; KNL-NEXT: kmovw %eax, %k2 1309; KNL-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 1310; KNL-NEXT: vmovdqa64 %zmm0, %zmm1 {%k2} {z} 1311; KNL-NEXT: vmovdqa64 %zmm0, %zmm0 {%k1} {z} 1312; KNL-NEXT: vmovdqa64 {{.*#+}} zmm2 = [0,8,2,3,4,5,6,7] 1313; KNL-NEXT: vpermi2q %zmm0, %zmm1, %zmm2 1314; KNL-NEXT: vpsllq $63, %zmm2, %zmm0 1315; KNL-NEXT: vptestmq %zmm0, %zmm0, %k0 1316; KNL-NEXT: kmovw %k0, %eax 1317; KNL-NEXT: retq 1318; 1319; SKX-LABEL: test_iinsertelement_v2i1: 1320; SKX: ## BB#0: 1321; SKX-NEXT: cmpl %esi, %edi 1322; SKX-NEXT: setb %al 1323; SKX-NEXT: andl $1, %eax 1324; SKX-NEXT: kmovw %eax, %k0 1325; SKX-NEXT: vpcmpltuq %xmm1, %xmm0, %k1 1326; SKX-NEXT: kshiftlw $1, %k1, %k1 1327; SKX-NEXT: kshiftrw $1, %k1, %k1 1328; SKX-NEXT: kshiftlw $1, %k0, %k0 1329; SKX-NEXT: korw %k0, %k1, %k0 1330; SKX-NEXT: kmovb %k0, %eax 1331; SKX-NEXT: retq 1332 %cmp_res_i1 = icmp ult i32 %a, %b 1333 %cmp_cmp_vec = icmp ult <2 x i64> %x, %y 1334 %maskv = insertelement <2 x i1> %cmp_cmp_vec, i1 %cmp_res_i1, i32 1 1335 %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> 1336 %res = bitcast <8 x i1> %res0 to i8 1337 ret i8 %res 1338} 1339 1340define zeroext i8 @test_extractelement_v2i1(<2 x i64> %a, <2 x i64> %b) { 1341; KNL-LABEL: test_extractelement_v2i1: 1342; KNL: ## BB#0: 1343; KNL-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 1344; KNL-NEXT: vpxor %xmm2, %xmm1, %xmm1 1345; KNL-NEXT: vpxor %xmm2, %xmm0, %xmm0 1346; KNL-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0 1347; KNL-NEXT: vmovq %xmm0, %rax 1348; KNL-NEXT: testb $1, %al 1349; KNL-NEXT: sete %al 1350; KNL-NEXT: addb $3, %al 1351; KNL-NEXT: movzbl %al, %eax 1352; KNL-NEXT: retq 1353; 1354; SKX-LABEL: test_extractelement_v2i1: 1355; SKX: ## BB#0: 1356; SKX-NEXT: vpcmpnleuq %xmm1, %xmm0, %k0 1357; SKX-NEXT: kshiftlw $15, %k0, %k0 1358; SKX-NEXT: kshiftrw $15, %k0, %k0 1359; SKX-NEXT: kmovw %k0, %eax 1360; SKX-NEXT: andl $1, %eax 1361; SKX-NEXT: testb %al, %al 1362; SKX-NEXT: sete %al 1363; SKX-NEXT: addb $3, %al 1364; SKX-NEXT: movzbl %al, %eax 1365; SKX-NEXT: retq 1366 %t1 = icmp ugt <2 x i64> %a, %b 1367 %t2 = extractelement <2 x i1> %t1, i32 0 1368 %res = select i1 %t2, i8 3, i8 4 1369 ret i8 %res 1370} 1371 1372define zeroext i8 @test_extractelement_v4i1(<4 x i32> %a, <4 x i32> %b) { 1373; KNL-LABEL: test_extractelement_v4i1: 1374; KNL: ## BB#0: 1375; KNL-NEXT: vpbroadcastd {{.*}}(%rip), %xmm2 1376; KNL-NEXT: vpxor %xmm2, %xmm1, %xmm1 1377; KNL-NEXT: vpxor %xmm2, %xmm0, %xmm0 1378; KNL-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0 1379; KNL-NEXT: vpextrd $3, %xmm0, %eax 1380; KNL-NEXT: andl $1, %eax 1381; KNL-NEXT: retq 1382; 1383; SKX-LABEL: test_extractelement_v4i1: 1384; SKX: ## BB#0: 1385; SKX-NEXT: vpcmpnleud %xmm1, %xmm0, %k0 1386; SKX-NEXT: kshiftlw $12, %k0, %k0 1387; SKX-NEXT: kshiftrw $15, %k0, %k0 1388; SKX-NEXT: kmovw %k0, %eax 1389; SKX-NEXT: andl $1, %eax 1390; SKX-NEXT: retq 1391 %t1 = icmp ugt <4 x i32> %a, %b 1392 %t2 = extractelement <4 x i1> %t1, i32 3 1393 %res = zext i1 %t2 to i8 1394 ret i8 %res 1395} 1396 1397define zeroext i8 @test_extractelement_v32i1(<32 x i8> %a, <32 x i8> %b) { 1398; KNL-LABEL: test_extractelement_v32i1: 1399; KNL: ## BB#0: 1400; KNL-NEXT: vmovdqa {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 1401; KNL-NEXT: vpxor %ymm2, %ymm1, %ymm1 1402; KNL-NEXT: vpxor %ymm2, %ymm0, %ymm0 1403; KNL-NEXT: vpcmpgtb %ymm1, %ymm0, %ymm0 1404; KNL-NEXT: vpextrb $2, %xmm0, %eax 1405; KNL-NEXT: andl $1, %eax 1406; KNL-NEXT: retq 1407; 1408; SKX-LABEL: test_extractelement_v32i1: 1409; SKX: ## BB#0: 1410; SKX-NEXT: vpcmpnleub %ymm1, %ymm0, %k0 1411; SKX-NEXT: kshiftld $29, %k0, %k0 1412; SKX-NEXT: kshiftrd $31, %k0, %k0 1413; SKX-NEXT: kmovw %k0, %eax 1414; SKX-NEXT: andl $1, %eax 1415; SKX-NEXT: retq 1416 %t1 = icmp ugt <32 x i8> %a, %b 1417 %t2 = extractelement <32 x i1> %t1, i32 2 1418 %res = zext i1 %t2 to i8 1419 ret i8 %res 1420} 1421 1422define zeroext i8 @test_extractelement_v64i1(<64 x i8> %a, <64 x i8> %b) { 1423; KNL-LABEL: test_extractelement_v64i1: 1424; KNL: ## BB#0: 1425; KNL-NEXT: vmovdqa {{.*#+}} ymm0 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 1426; KNL-NEXT: vpxor %ymm0, %ymm3, %ymm2 1427; KNL-NEXT: vpxor %ymm0, %ymm1, %ymm0 1428; KNL-NEXT: vpcmpgtb %ymm2, %ymm0, %ymm0 1429; KNL-NEXT: vextracti128 $1, %ymm0, %xmm0 1430; KNL-NEXT: vpextrb $15, %xmm0, %eax 1431; KNL-NEXT: testb $1, %al 1432; KNL-NEXT: sete %al 1433; KNL-NEXT: addb $3, %al 1434; KNL-NEXT: movzbl %al, %eax 1435; KNL-NEXT: retq 1436; 1437; SKX-LABEL: test_extractelement_v64i1: 1438; SKX: ## BB#0: 1439; SKX-NEXT: vpcmpnleub %zmm1, %zmm0, %k0 1440; SKX-NEXT: kshiftrq $63, %k0, %k0 1441; SKX-NEXT: kmovw %k0, %eax 1442; SKX-NEXT: andl $1, %eax 1443; SKX-NEXT: testb %al, %al 1444; SKX-NEXT: sete %al 1445; SKX-NEXT: addb $3, %al 1446; SKX-NEXT: movzbl %al, %eax 1447; SKX-NEXT: retq 1448 %t1 = icmp ugt <64 x i8> %a, %b 1449 %t2 = extractelement <64 x i1> %t1, i32 63 1450 %res = select i1 %t2, i8 3, i8 4 1451 ret i8 %res 1452} 1453