brintos

brintos / llvm-project-archived public Read only

0
0
Text · 26.4 KiB · 9d856ed Raw
700 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse2   | FileCheck %s --check-prefixes=SSE,SSE23; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE414; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx    | FileCheck %s --check-prefix=AVX5 6define <2 x i64> @extract0_i32_zext_insert0_i64_undef(<4 x i32> %x) {7; SSE2-LABEL: extract0_i32_zext_insert0_i64_undef:8; SSE2:       # %bb.0:9; SSE2-NEXT:    xorps %xmm1, %xmm110; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]11; SSE2-NEXT:    retq12;13; SSE41-LABEL: extract0_i32_zext_insert0_i64_undef:14; SSE41:       # %bb.0:15; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero16; SSE41-NEXT:    retq17;18; AVX-LABEL: extract0_i32_zext_insert0_i64_undef:19; AVX:       # %bb.0:20; AVX-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero21; AVX-NEXT:    retq22  %e = extractelement <4 x i32> %x, i32 023  %z = zext i32 %e to i6424  %r = insertelement <2 x i64> undef, i64 %z, i32 025  ret <2 x i64> %r26}27 28define <2 x i64> @extract0_i32_zext_insert0_i64_zero(<4 x i32> %x) {29; SSE2-LABEL: extract0_i32_zext_insert0_i64_zero:30; SSE2:       # %bb.0:31; SSE2-NEXT:    xorps %xmm1, %xmm132; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]33; SSE2-NEXT:    movaps %xmm1, %xmm034; SSE2-NEXT:    retq35;36; SSE41-LABEL: extract0_i32_zext_insert0_i64_zero:37; SSE41:       # %bb.0:38; SSE41-NEXT:    xorps %xmm1, %xmm139; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]40; SSE41-NEXT:    retq41;42; AVX-LABEL: extract0_i32_zext_insert0_i64_zero:43; AVX:       # %bb.0:44; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm145; AVX-NEXT:    vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]46; AVX-NEXT:    retq47  %e = extractelement <4 x i32> %x, i32 048  %z = zext i32 %e to i6449  %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 050  ret <2 x i64> %r51}52 53define <2 x i64> @extract1_i32_zext_insert0_i64_undef(<4 x i32> %x) {54; SSE-LABEL: extract1_i32_zext_insert0_i64_undef:55; SSE:       # %bb.0:56; SSE-NEXT:    psrlq $32, %xmm057; SSE-NEXT:    retq58;59; AVX-LABEL: extract1_i32_zext_insert0_i64_undef:60; AVX:       # %bb.0:61; AVX-NEXT:    vpsrlq $32, %xmm0, %xmm062; AVX-NEXT:    retq63  %e = extractelement <4 x i32> %x, i32 164  %z = zext i32 %e to i6465  %r = insertelement <2 x i64> undef, i64 %z, i32 066  ret <2 x i64> %r67}68 69define <2 x i64> @extract1_i32_zext_insert0_i64_zero(<4 x i32> %x) {70; SSE2-LABEL: extract1_i32_zext_insert0_i64_zero:71; SSE2:       # %bb.0:72; SSE2-NEXT:    xorps %xmm1, %xmm173; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,0],xmm1[1,0]74; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3]75; SSE2-NEXT:    retq76;77; SSE41-LABEL: extract1_i32_zext_insert0_i64_zero:78; SSE41:       # %bb.0:79; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]80; SSE41-NEXT:    pxor %xmm0, %xmm081; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3,4,5,6,7]82; SSE41-NEXT:    retq83;84; AVX-LABEL: extract1_i32_zext_insert0_i64_zero:85; AVX:       # %bb.0:86; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[1,1,1,1]87; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm188; AVX-NEXT:    vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]89; AVX-NEXT:    retq90  %e = extractelement <4 x i32> %x, i32 191  %z = zext i32 %e to i6492  %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 093  ret <2 x i64> %r94}95 96define <2 x i64> @extract2_i32_zext_insert0_i64_undef(<4 x i32> %x) {97; SSE-LABEL: extract2_i32_zext_insert0_i64_undef:98; SSE:       # %bb.0:99; SSE-NEXT:    xorps %xmm1, %xmm1100; SSE-NEXT:    unpckhps {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]101; SSE-NEXT:    retq102;103; AVX-LABEL: extract2_i32_zext_insert0_i64_undef:104; AVX:       # %bb.0:105; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1106; AVX-NEXT:    vunpckhps {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]107; AVX-NEXT:    retq108  %e = extractelement <4 x i32> %x, i32 2109  %z = zext i32 %e to i64110  %r = insertelement <2 x i64> undef, i64 %z, i32 0111  ret <2 x i64> %r112}113 114define <2 x i64> @extract2_i32_zext_insert0_i64_zero(<4 x i32> %x) {115; SSE2-LABEL: extract2_i32_zext_insert0_i64_zero:116; SSE2:       # %bb.0:117; SSE2-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero118; SSE2-NEXT:    xorps %xmm1, %xmm1119; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3]120; SSE2-NEXT:    retq121;122; SSE41-LABEL: extract2_i32_zext_insert0_i64_zero:123; SSE41:       # %bb.0:124; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]125; SSE41-NEXT:    pxor %xmm0, %xmm0126; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3,4,5,6,7]127; SSE41-NEXT:    retq128;129; AVX-LABEL: extract2_i32_zext_insert0_i64_zero:130; AVX:       # %bb.0:131; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[2,3,2,3]132; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1133; AVX-NEXT:    vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]134; AVX-NEXT:    retq135  %e = extractelement <4 x i32> %x, i32 2136  %z = zext i32 %e to i64137  %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0138  ret <2 x i64> %r139}140 141define <2 x i64> @extract3_i32_zext_insert0_i64_undef(<4 x i32> %x) {142; SSE-LABEL: extract3_i32_zext_insert0_i64_undef:143; SSE:       # %bb.0:144; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero145; SSE-NEXT:    retq146;147; AVX-LABEL: extract3_i32_zext_insert0_i64_undef:148; AVX:       # %bb.0:149; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero150; AVX-NEXT:    retq151  %e = extractelement <4 x i32> %x, i32 3152  %z = zext i32 %e to i64153  %r = insertelement <2 x i64> undef, i64 %z, i32 0154  ret <2 x i64> %r155}156 157define <2 x i64> @extract3_i32_zext_insert0_i64_zero(<4 x i32> %x) {158; SSE-LABEL: extract3_i32_zext_insert0_i64_zero:159; SSE:       # %bb.0:160; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero161; SSE-NEXT:    retq162;163; AVX-LABEL: extract3_i32_zext_insert0_i64_zero:164; AVX:       # %bb.0:165; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero166; AVX-NEXT:    retq167  %e = extractelement <4 x i32> %x, i32 3168  %z = zext i32 %e to i64169  %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0170  ret <2 x i64> %r171}172 173define <2 x i64> @extract0_i32_zext_insert1_i64_undef(<4 x i32> %x) {174; SSE2-LABEL: extract0_i32_zext_insert1_i64_undef:175; SSE2:       # %bb.0:176; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]177; SSE2-NEXT:    pxor %xmm1, %xmm1178; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]179; SSE2-NEXT:    retq180;181; SSE41-LABEL: extract0_i32_zext_insert1_i64_undef:182; SSE41:       # %bb.0:183; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]184; SSE41-NEXT:    pxor %xmm0, %xmm0185; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3,4,5],xmm0[6,7]186; SSE41-NEXT:    retq187;188; AVX-LABEL: extract0_i32_zext_insert1_i64_undef:189; AVX:       # %bb.0:190; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1,0,1]191; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1192; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[3]193; AVX-NEXT:    retq194  %e = extractelement <4 x i32> %x, i32 0195  %z = zext i32 %e to i64196  %r = insertelement <2 x i64> undef, i64 %z, i32 1197  ret <2 x i64> %r198}199 200define <2 x i64> @extract0_i32_zext_insert1_i64_zero(<4 x i32> %x) {201; SSE2-LABEL: extract0_i32_zext_insert1_i64_zero:202; SSE2:       # %bb.0:203; SSE2-NEXT:    xorps %xmm1, %xmm1204; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]205; SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1,2,3,4,5,6,7]206; SSE2-NEXT:    movdqa %xmm1, %xmm0207; SSE2-NEXT:    retq208;209; SSE41-LABEL: extract0_i32_zext_insert1_i64_zero:210; SSE41:       # %bb.0:211; SSE41-NEXT:    pxor %xmm1, %xmm1212; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]213; SSE41-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]214; SSE41-NEXT:    retq215;216; AVX-LABEL: extract0_i32_zext_insert1_i64_zero:217; AVX:       # %bb.0:218; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1219; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]220; AVX-NEXT:    vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]221; AVX-NEXT:    retq222  %e = extractelement <4 x i32> %x, i32 0223  %z = zext i32 %e to i64224  %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1225  ret <2 x i64> %r226}227 228define <2 x i64> @extract1_i32_zext_insert1_i64_undef(<4 x i32> %x) {229; SSE2-LABEL: extract1_i32_zext_insert1_i64_undef:230; SSE2:       # %bb.0:231; SSE2-NEXT:    xorps %xmm1, %xmm1232; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]233; SSE2-NEXT:    retq234;235; SSE41-LABEL: extract1_i32_zext_insert1_i64_undef:236; SSE41:       # %bb.0:237; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero238; SSE41-NEXT:    retq239;240; AVX-LABEL: extract1_i32_zext_insert1_i64_undef:241; AVX:       # %bb.0:242; AVX-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero243; AVX-NEXT:    retq244  %e = extractelement <4 x i32> %x, i32 1245  %z = zext i32 %e to i64246  %r = insertelement <2 x i64> undef, i64 %z, i32 1247  ret <2 x i64> %r248}249 250define <2 x i64> @extract1_i32_zext_insert1_i64_zero(<4 x i32> %x) {251; SSE2-LABEL: extract1_i32_zext_insert1_i64_zero:252; SSE2:       # %bb.0:253; SSE2-NEXT:    psrlq $32, %xmm0254; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]255; SSE2-NEXT:    retq256;257; SSE41-LABEL: extract1_i32_zext_insert1_i64_zero:258; SSE41:       # %bb.0:259; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[4,5,6,7],zero,zero,zero,zero260; SSE41-NEXT:    retq261;262; AVX-LABEL: extract1_i32_zext_insert1_i64_zero:263; AVX:       # %bb.0:264; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[4,5,6,7],zero,zero,zero,zero265; AVX-NEXT:    retq266  %e = extractelement <4 x i32> %x, i32 1267  %z = zext i32 %e to i64268  %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1269  ret <2 x i64> %r270}271 272define <2 x i64> @extract2_i32_zext_insert1_i64_undef(<4 x i32> %x) {273; SSE2-LABEL: extract2_i32_zext_insert1_i64_undef:274; SSE2:       # %bb.0:275; SSE2-NEXT:    andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0276; SSE2-NEXT:    retq277;278; SSE41-LABEL: extract2_i32_zext_insert1_i64_undef:279; SSE41:       # %bb.0:280; SSE41-NEXT:    xorps %xmm1, %xmm1281; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[3]282; SSE41-NEXT:    retq283;284; AVX-LABEL: extract2_i32_zext_insert1_i64_undef:285; AVX:       # %bb.0:286; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1287; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[3]288; AVX-NEXT:    retq289  %e = extractelement <4 x i32> %x, i32 2290  %z = zext i32 %e to i64291  %r = insertelement <2 x i64> undef, i64 %z, i32 1292  ret <2 x i64> %r293}294 295define <2 x i64> @extract2_i32_zext_insert1_i64_zero(<4 x i32> %x) {296; SSE2-LABEL: extract2_i32_zext_insert1_i64_zero:297; SSE2:       # %bb.0:298; SSE2-NEXT:    andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0299; SSE2-NEXT:    retq300;301; SSE41-LABEL: extract2_i32_zext_insert1_i64_zero:302; SSE41:       # %bb.0:303; SSE41-NEXT:    xorps %xmm1, %xmm1304; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm1[0,1],xmm0[2],xmm1[3]305; SSE41-NEXT:    retq306;307; AVX-LABEL: extract2_i32_zext_insert1_i64_zero:308; AVX:       # %bb.0:309; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1310; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0,1],xmm0[2],xmm1[3]311; AVX-NEXT:    retq312  %e = extractelement <4 x i32> %x, i32 2313  %z = zext i32 %e to i64314  %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1315  ret <2 x i64> %r316}317 318define <2 x i64> @extract3_i32_zext_insert1_i64_undef(<4 x i32> %x) {319; SSE-LABEL: extract3_i32_zext_insert1_i64_undef:320; SSE:       # %bb.0:321; SSE-NEXT:    psrlq $32, %xmm0322; SSE-NEXT:    retq323;324; AVX-LABEL: extract3_i32_zext_insert1_i64_undef:325; AVX:       # %bb.0:326; AVX-NEXT:    vpsrlq $32, %xmm0, %xmm0327; AVX-NEXT:    retq328  %e = extractelement <4 x i32> %x, i32 3329  %z = zext i32 %e to i64330  %r = insertelement <2 x i64> undef, i64 %z, i32 1331  ret <2 x i64> %r332}333 334define <2 x i64> @extract3_i32_zext_insert1_i64_zero(<4 x i32> %x) {335; SSE-LABEL: extract3_i32_zext_insert1_i64_zero:336; SSE:       # %bb.0:337; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero338; SSE-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]339; SSE-NEXT:    retq340;341; AVX-LABEL: extract3_i32_zext_insert1_i64_zero:342; AVX:       # %bb.0:343; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero344; AVX-NEXT:    vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]345; AVX-NEXT:    retq346  %e = extractelement <4 x i32> %x, i32 3347  %z = zext i32 %e to i64348  %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1349  ret <2 x i64> %r350}351 352define <2 x i64> @extract0_i16_zext_insert0_i64_undef(<8 x i16> %x) {353; SSE2-LABEL: extract0_i16_zext_insert0_i64_undef:354; SSE2:       # %bb.0:355; SSE2-NEXT:    pxor %xmm1, %xmm1356; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]357; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]358; SSE2-NEXT:    retq359;360; SSE41-LABEL: extract0_i16_zext_insert0_i64_undef:361; SSE41:       # %bb.0:362; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero363; SSE41-NEXT:    retq364;365; AVX-LABEL: extract0_i16_zext_insert0_i64_undef:366; AVX:       # %bb.0:367; AVX-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero368; AVX-NEXT:    retq369  %e = extractelement <8 x i16> %x, i32 0370  %z = zext i16 %e to i64371  %r = insertelement <2 x i64> undef, i64 %z, i32 0372  ret <2 x i64> %r373}374 375define <2 x i64> @extract0_i16_zext_insert0_i64_zero(<8 x i16> %x) {376; SSE2-LABEL: extract0_i16_zext_insert0_i64_zero:377; SSE2:       # %bb.0:378; SSE2-NEXT:    andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0379; SSE2-NEXT:    retq380;381; SSE41-LABEL: extract0_i16_zext_insert0_i64_zero:382; SSE41:       # %bb.0:383; SSE41-NEXT:    pxor %xmm1, %xmm1384; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]385; SSE41-NEXT:    retq386;387; AVX-LABEL: extract0_i16_zext_insert0_i64_zero:388; AVX:       # %bb.0:389; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1390; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]391; AVX-NEXT:    retq392  %e = extractelement <8 x i16> %x, i32 0393  %z = zext i16 %e to i64394  %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0395  ret <2 x i64> %r396}397 398define <2 x i64> @extract1_i16_zext_insert0_i64_undef(<8 x i16> %x) {399; SSE-LABEL: extract1_i16_zext_insert0_i64_undef:400; SSE:       # %bb.0:401; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]402; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero403; SSE-NEXT:    retq404;405; AVX-LABEL: extract1_i16_zext_insert0_i64_undef:406; AVX:       # %bb.0:407; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]408; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero409; AVX-NEXT:    retq410  %e = extractelement <8 x i16> %x, i32 1411  %z = zext i16 %e to i64412  %r = insertelement <2 x i64> undef, i64 %z, i32 0413  ret <2 x i64> %r414}415 416define <2 x i64> @extract1_i16_zext_insert0_i64_zero(<8 x i16> %x) {417; SSE-LABEL: extract1_i16_zext_insert0_i64_zero:418; SSE:       # %bb.0:419; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]420; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero421; SSE-NEXT:    retq422;423; AVX-LABEL: extract1_i16_zext_insert0_i64_zero:424; AVX:       # %bb.0:425; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]426; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero427; AVX-NEXT:    retq428  %e = extractelement <8 x i16> %x, i32 1429  %z = zext i16 %e to i64430  %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0431  ret <2 x i64> %r432}433 434define <2 x i64> @extract2_i16_zext_insert0_i64_undef(<8 x i16> %x) {435; SSE-LABEL: extract2_i16_zext_insert0_i64_undef:436; SSE:       # %bb.0:437; SSE-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5]438; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero439; SSE-NEXT:    retq440;441; AVX-LABEL: extract2_i16_zext_insert0_i64_undef:442; AVX:       # %bb.0:443; AVX-NEXT:    vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5]444; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero445; AVX-NEXT:    retq446  %e = extractelement <8 x i16> %x, i32 2447  %z = zext i16 %e to i64448  %r = insertelement <2 x i64> undef, i64 %z, i32 0449  ret <2 x i64> %r450}451 452define <2 x i64> @extract2_i16_zext_insert0_i64_zero(<8 x i16> %x) {453; SSE-LABEL: extract2_i16_zext_insert0_i64_zero:454; SSE:       # %bb.0:455; SSE-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5]456; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero457; SSE-NEXT:    retq458;459; AVX-LABEL: extract2_i16_zext_insert0_i64_zero:460; AVX:       # %bb.0:461; AVX-NEXT:    vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5]462; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero463; AVX-NEXT:    retq464  %e = extractelement <8 x i16> %x, i32 2465  %z = zext i16 %e to i64466  %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0467  ret <2 x i64> %r468}469 470define <2 x i64> @extract3_i16_zext_insert0_i64_undef(<8 x i16> %x) {471; SSE-LABEL: extract3_i16_zext_insert0_i64_undef:472; SSE:       # %bb.0:473; SSE-NEXT:    psrlq $48, %xmm0474; SSE-NEXT:    retq475;476; AVX-LABEL: extract3_i16_zext_insert0_i64_undef:477; AVX:       # %bb.0:478; AVX-NEXT:    vpsrlq $48, %xmm0, %xmm0479; AVX-NEXT:    retq480  %e = extractelement <8 x i16> %x, i32 3481  %z = zext i16 %e to i64482  %r = insertelement <2 x i64> undef, i64 %z, i32 0483  ret <2 x i64> %r484}485 486define <2 x i64> @extract3_i16_zext_insert0_i64_zero(<8 x i16> %x) {487; SSE-LABEL: extract3_i16_zext_insert0_i64_zero:488; SSE:       # %bb.0:489; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]490; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero491; SSE-NEXT:    retq492;493; AVX-LABEL: extract3_i16_zext_insert0_i64_zero:494; AVX:       # %bb.0:495; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]496; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero497; AVX-NEXT:    retq498  %e = extractelement <8 x i16> %x, i32 3499  %z = zext i16 %e to i64500  %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0501  ret <2 x i64> %r502}503 504define <2 x i64> @extract0_i16_zext_insert1_i64_undef(<8 x i16> %x) {505; SSE2-LABEL: extract0_i16_zext_insert1_i64_undef:506; SSE2:       # %bb.0:507; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1]508; SSE2-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero509; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]510; SSE2-NEXT:    retq511;512; SSE41-LABEL: extract0_i16_zext_insert1_i64_undef:513; SSE41:       # %bb.0:514; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]515; SSE41-NEXT:    pxor %xmm0, %xmm0516; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4],xmm0[5,6,7]517; SSE41-NEXT:    retq518;519; AVX-LABEL: extract0_i16_zext_insert1_i64_undef:520; AVX:       # %bb.0:521; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]522; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1523; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4],xmm1[5,6,7]524; AVX-NEXT:    retq525  %e = extractelement <8 x i16> %x, i32 0526  %z = zext i16 %e to i64527  %r = insertelement <2 x i64> undef, i64 %z, i32 1528  ret <2 x i64> %r529}530 531define <2 x i64> @extract0_i16_zext_insert1_i64_zero(<8 x i16> %x) {532; SSE2-LABEL: extract0_i16_zext_insert1_i64_zero:533; SSE2:       # %bb.0:534; SSE2-NEXT:    pextrw $0, %xmm0, %eax535; SSE2-NEXT:    movd %eax, %xmm0536; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]537; SSE2-NEXT:    retq538;539; SSE41-LABEL: extract0_i16_zext_insert1_i64_zero:540; SSE41:       # %bb.0:541; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero542; SSE41-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]543; SSE41-NEXT:    retq544;545; AVX-LABEL: extract0_i16_zext_insert1_i64_zero:546; AVX:       # %bb.0:547; AVX-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero548; AVX-NEXT:    vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]549; AVX-NEXT:    retq550  %e = extractelement <8 x i16> %x, i32 0551  %z = zext i16 %e to i64552  %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1553  ret <2 x i64> %r554}555 556define <2 x i64> @extract1_i16_zext_insert1_i64_undef(<8 x i16> %x) {557; SSE2-LABEL: extract1_i16_zext_insert1_i64_undef:558; SSE2:       # %bb.0:559; SSE2-NEXT:    pxor %xmm1, %xmm1560; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]561; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]562; SSE2-NEXT:    retq563;564; SSE41-LABEL: extract1_i16_zext_insert1_i64_undef:565; SSE41:       # %bb.0:566; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero567; SSE41-NEXT:    retq568;569; AVX-LABEL: extract1_i16_zext_insert1_i64_undef:570; AVX:       # %bb.0:571; AVX-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero572; AVX-NEXT:    retq573  %e = extractelement <8 x i16> %x, i32 1574  %z = zext i16 %e to i64575  %r = insertelement <2 x i64> undef, i64 %z, i32 1576  ret <2 x i64> %r577}578 579define <2 x i64> @extract1_i16_zext_insert1_i64_zero(<8 x i16> %x) {580; SSE2-LABEL: extract1_i16_zext_insert1_i64_zero:581; SSE2:       # %bb.0:582; SSE2-NEXT:    pextrw $1, %xmm0, %eax583; SSE2-NEXT:    movd %eax, %xmm0584; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]585; SSE2-NEXT:    retq586;587; SSE41-LABEL: extract1_i16_zext_insert1_i64_zero:588; SSE41:       # %bb.0:589; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[2,3],zero,zero,zero,zero,zero,zero590; SSE41-NEXT:    retq591;592; AVX-LABEL: extract1_i16_zext_insert1_i64_zero:593; AVX:       # %bb.0:594; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[2,3],zero,zero,zero,zero,zero,zero595; AVX-NEXT:    retq596  %e = extractelement <8 x i16> %x, i32 1597  %z = zext i16 %e to i64598  %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1599  ret <2 x i64> %r600}601 602define <2 x i64> @extract2_i16_zext_insert1_i64_undef(<8 x i16> %x) {603; SSE2-LABEL: extract2_i16_zext_insert1_i64_undef:604; SSE2:       # %bb.0:605; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5]606; SSE2-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero607; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]608; SSE2-NEXT:    retq609;610; SSE41-LABEL: extract2_i16_zext_insert1_i64_undef:611; SSE41:       # %bb.0:612; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero613; SSE41-NEXT:    pxor %xmm0, %xmm0614; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4],xmm0[5,6,7]615; SSE41-NEXT:    retq616;617; AVX-LABEL: extract2_i16_zext_insert1_i64_undef:618; AVX:       # %bb.0:619; AVX-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero620; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1621; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4],xmm1[5,6,7]622; AVX-NEXT:    retq623  %e = extractelement <8 x i16> %x, i32 2624  %z = zext i16 %e to i64625  %r = insertelement <2 x i64> undef, i64 %z, i32 1626  ret <2 x i64> %r627}628 629define <2 x i64> @extract2_i16_zext_insert1_i64_zero(<8 x i16> %x) {630; SSE2-LABEL: extract2_i16_zext_insert1_i64_zero:631; SSE2:       # %bb.0:632; SSE2-NEXT:    pextrw $2, %xmm0, %eax633; SSE2-NEXT:    movd %eax, %xmm0634; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]635; SSE2-NEXT:    retq636;637; SSE41-LABEL: extract2_i16_zext_insert1_i64_zero:638; SSE41:       # %bb.0:639; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[4,5],zero,zero,zero,zero,zero,zero640; SSE41-NEXT:    retq641;642; AVX-LABEL: extract2_i16_zext_insert1_i64_zero:643; AVX:       # %bb.0:644; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[4,5],zero,zero,zero,zero,zero,zero645; AVX-NEXT:    retq646  %e = extractelement <8 x i16> %x, i32 2647  %z = zext i16 %e to i64648  %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1649  ret <2 x i64> %r650}651 652define <2 x i64> @extract3_i16_zext_insert1_i64_undef(<8 x i16> %x) {653; SSE2-LABEL: extract3_i16_zext_insert1_i64_undef:654; SSE2:       # %bb.0:655; SSE2-NEXT:    psrlq $48, %xmm0656; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]657; SSE2-NEXT:    retq658;659; SSE41-LABEL: extract3_i16_zext_insert1_i64_undef:660; SSE41:       # %bb.0:661; SSE41-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13]662; SSE41-NEXT:    pxor %xmm1, %xmm1663; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4],xmm1[5,6,7]664; SSE41-NEXT:    retq665;666; AVX-LABEL: extract3_i16_zext_insert1_i64_undef:667; AVX:       # %bb.0:668; AVX-NEXT:    vpslldq {{.*#+}} xmm0 = zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13]669; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1670; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4],xmm1[5,6,7]671; AVX-NEXT:    retq672  %e = extractelement <8 x i16> %x, i32 3673  %z = zext i16 %e to i64674  %r = insertelement <2 x i64> undef, i64 %z, i32 1675  ret <2 x i64> %r676}677 678define <2 x i64> @extract3_i16_zext_insert1_i64_zero(<8 x i16> %x) {679; SSE2-LABEL: extract3_i16_zext_insert1_i64_zero:680; SSE2:       # %bb.0:681; SSE2-NEXT:    psrlq $48, %xmm0682; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]683; SSE2-NEXT:    retq684;685; SSE41-LABEL: extract3_i16_zext_insert1_i64_zero:686; SSE41:       # %bb.0:687; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[6,7],zero,zero,zero,zero,zero,zero688; SSE41-NEXT:    retq689;690; AVX-LABEL: extract3_i16_zext_insert1_i64_zero:691; AVX:       # %bb.0:692; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[6,7],zero,zero,zero,zero,zero,zero693; AVX-NEXT:    retq694  %e = extractelement <8 x i16> %x, i32 3695  %z = zext i16 %e to i64696  %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1697  ret <2 x i64> %r698}699 700