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