4172 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSE,SSSE34; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE415; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX16; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX27; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW9;10; Just two 32-bit runs to make sure we do reasonable things there.11; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=X86-SSE,X86-SSE212; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=X86-SSE,X86-SSE4113 14define <8 x i16> @sext_16i8_to_8i16(<16 x i8> %A) nounwind uwtable readnone ssp {15; SSE2-LABEL: sext_16i8_to_8i16:16; SSE2: # %bb.0: # %entry17; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]18; SSE2-NEXT: psraw $8, %xmm019; SSE2-NEXT: retq20;21; SSSE3-LABEL: sext_16i8_to_8i16:22; SSSE3: # %bb.0: # %entry23; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]24; SSSE3-NEXT: psraw $8, %xmm025; SSSE3-NEXT: retq26;27; SSE41-LABEL: sext_16i8_to_8i16:28; SSE41: # %bb.0: # %entry29; SSE41-NEXT: pmovsxbw %xmm0, %xmm030; SSE41-NEXT: retq31;32; AVX-LABEL: sext_16i8_to_8i16:33; AVX: # %bb.0: # %entry34; AVX-NEXT: vpmovsxbw %xmm0, %xmm035; AVX-NEXT: retq36;37; X86-SSE2-LABEL: sext_16i8_to_8i16:38; X86-SSE2: # %bb.0: # %entry39; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]40; X86-SSE2-NEXT: psraw $8, %xmm041; X86-SSE2-NEXT: retl42;43; X86-SSE41-LABEL: sext_16i8_to_8i16:44; X86-SSE41: # %bb.0: # %entry45; X86-SSE41-NEXT: pmovsxbw %xmm0, %xmm046; X86-SSE41-NEXT: retl47entry:48 %B = shufflevector <16 x i8> %A, <16 x i8> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>49 %C = sext <8 x i8> %B to <8 x i16>50 ret <8 x i16> %C51}52 53define <16 x i16> @sext_16i8_to_16i16(<16 x i8> %A) nounwind uwtable readnone ssp {54; SSE2-LABEL: sext_16i8_to_16i16:55; SSE2: # %bb.0: # %entry56; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]57; SSE2-NEXT: psraw $8, %xmm258; SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]59; SSE2-NEXT: psraw $8, %xmm160; SSE2-NEXT: movdqa %xmm2, %xmm061; SSE2-NEXT: retq62;63; SSSE3-LABEL: sext_16i8_to_16i16:64; SSSE3: # %bb.0: # %entry65; SSSE3-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]66; SSSE3-NEXT: psraw $8, %xmm267; SSSE3-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]68; SSSE3-NEXT: psraw $8, %xmm169; SSSE3-NEXT: movdqa %xmm2, %xmm070; SSSE3-NEXT: retq71;72; SSE41-LABEL: sext_16i8_to_16i16:73; SSE41: # %bb.0: # %entry74; SSE41-NEXT: pmovsxbw %xmm0, %xmm275; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]76; SSE41-NEXT: pmovsxbw %xmm0, %xmm177; SSE41-NEXT: movdqa %xmm2, %xmm078; SSE41-NEXT: retq79;80; AVX1-LABEL: sext_16i8_to_16i16:81; AVX1: # %bb.0: # %entry82; AVX1-NEXT: vpmovsxbw %xmm0, %xmm183; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]84; AVX1-NEXT: vpmovsxbw %xmm0, %xmm085; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm086; AVX1-NEXT: retq87;88; AVX2-LABEL: sext_16i8_to_16i16:89; AVX2: # %bb.0: # %entry90; AVX2-NEXT: vpmovsxbw %xmm0, %ymm091; AVX2-NEXT: retq92;93; AVX512-LABEL: sext_16i8_to_16i16:94; AVX512: # %bb.0: # %entry95; AVX512-NEXT: vpmovsxbw %xmm0, %ymm096; AVX512-NEXT: retq97;98; X86-SSE2-LABEL: sext_16i8_to_16i16:99; X86-SSE2: # %bb.0: # %entry100; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]101; X86-SSE2-NEXT: psraw $8, %xmm2102; X86-SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]103; X86-SSE2-NEXT: psraw $8, %xmm1104; X86-SSE2-NEXT: movdqa %xmm2, %xmm0105; X86-SSE2-NEXT: retl106;107; X86-SSE41-LABEL: sext_16i8_to_16i16:108; X86-SSE41: # %bb.0: # %entry109; X86-SSE41-NEXT: pmovsxbw %xmm0, %xmm2110; X86-SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]111; X86-SSE41-NEXT: pmovsxbw %xmm0, %xmm1112; X86-SSE41-NEXT: movdqa %xmm2, %xmm0113; X86-SSE41-NEXT: retl114entry:115 %B = sext <16 x i8> %A to <16 x i16>116 ret <16 x i16> %B117}118 119define <32 x i16> @sext_32i8_to_32i16(<32 x i8> %A) nounwind uwtable readnone ssp {120; SSE2-LABEL: sext_32i8_to_32i16:121; SSE2: # %bb.0: # %entry122; SSE2-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3],xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]123; SSE2-NEXT: psraw $8, %xmm4124; SSE2-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]125; SSE2-NEXT: psraw $8, %xmm5126; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]127; SSE2-NEXT: psraw $8, %xmm2128; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15]129; SSE2-NEXT: psraw $8, %xmm3130; SSE2-NEXT: movdqa %xmm4, %xmm0131; SSE2-NEXT: movdqa %xmm5, %xmm1132; SSE2-NEXT: retq133;134; SSSE3-LABEL: sext_32i8_to_32i16:135; SSSE3: # %bb.0: # %entry136; SSSE3-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3],xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]137; SSSE3-NEXT: psraw $8, %xmm4138; SSSE3-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]139; SSSE3-NEXT: psraw $8, %xmm5140; SSSE3-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]141; SSSE3-NEXT: psraw $8, %xmm2142; SSSE3-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15]143; SSSE3-NEXT: psraw $8, %xmm3144; SSSE3-NEXT: movdqa %xmm4, %xmm0145; SSSE3-NEXT: movdqa %xmm5, %xmm1146; SSSE3-NEXT: retq147;148; SSE41-LABEL: sext_32i8_to_32i16:149; SSE41: # %bb.0: # %entry150; SSE41-NEXT: pmovsxbw %xmm0, %xmm5151; SSE41-NEXT: pmovsxbw %xmm1, %xmm2152; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]153; SSE41-NEXT: pmovsxbw %xmm0, %xmm4154; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]155; SSE41-NEXT: pmovsxbw %xmm0, %xmm3156; SSE41-NEXT: movdqa %xmm5, %xmm0157; SSE41-NEXT: movdqa %xmm4, %xmm1158; SSE41-NEXT: retq159;160; AVX1-LABEL: sext_32i8_to_32i16:161; AVX1: # %bb.0: # %entry162; AVX1-NEXT: vpmovsxbw %xmm0, %xmm1163; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]164; AVX1-NEXT: vpmovsxbw %xmm2, %xmm2165; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm2166; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0167; AVX1-NEXT: vpmovsxbw %xmm0, %xmm1168; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]169; AVX1-NEXT: vpmovsxbw %xmm0, %xmm0170; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm1171; AVX1-NEXT: vmovaps %ymm2, %ymm0172; AVX1-NEXT: retq173;174; AVX2-LABEL: sext_32i8_to_32i16:175; AVX2: # %bb.0: # %entry176; AVX2-NEXT: vpmovsxbw %xmm0, %ymm2177; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0178; AVX2-NEXT: vpmovsxbw %xmm0, %ymm1179; AVX2-NEXT: vmovdqa %ymm2, %ymm0180; AVX2-NEXT: retq181;182; AVX512F-LABEL: sext_32i8_to_32i16:183; AVX512F: # %bb.0: # %entry184; AVX512F-NEXT: vpmovsxbw %xmm0, %ymm1185; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0186; AVX512F-NEXT: vpmovsxbw %xmm0, %ymm0187; AVX512F-NEXT: vinserti64x4 $1, %ymm0, %zmm1, %zmm0188; AVX512F-NEXT: retq189;190; AVX512BW-LABEL: sext_32i8_to_32i16:191; AVX512BW: # %bb.0: # %entry192; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm0193; AVX512BW-NEXT: retq194;195; X86-SSE2-LABEL: sext_32i8_to_32i16:196; X86-SSE2: # %bb.0: # %entry197; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3],xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]198; X86-SSE2-NEXT: psraw $8, %xmm4199; X86-SSE2-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]200; X86-SSE2-NEXT: psraw $8, %xmm5201; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]202; X86-SSE2-NEXT: psraw $8, %xmm2203; X86-SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15]204; X86-SSE2-NEXT: psraw $8, %xmm3205; X86-SSE2-NEXT: movdqa %xmm4, %xmm0206; X86-SSE2-NEXT: movdqa %xmm5, %xmm1207; X86-SSE2-NEXT: retl208;209; X86-SSE41-LABEL: sext_32i8_to_32i16:210; X86-SSE41: # %bb.0: # %entry211; X86-SSE41-NEXT: pmovsxbw %xmm0, %xmm5212; X86-SSE41-NEXT: pmovsxbw %xmm1, %xmm2213; X86-SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]214; X86-SSE41-NEXT: pmovsxbw %xmm0, %xmm4215; X86-SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]216; X86-SSE41-NEXT: pmovsxbw %xmm0, %xmm3217; X86-SSE41-NEXT: movdqa %xmm5, %xmm0218; X86-SSE41-NEXT: movdqa %xmm4, %xmm1219; X86-SSE41-NEXT: retl220entry:221 %B = sext <32 x i8> %A to <32 x i16>222 ret <32 x i16> %B223}224 225define <4 x i32> @sext_16i8_to_4i32(<16 x i8> %A) nounwind uwtable readnone ssp {226; SSE2-LABEL: sext_16i8_to_4i32:227; SSE2: # %bb.0: # %entry228; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]229; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]230; SSE2-NEXT: psrad $24, %xmm0231; SSE2-NEXT: retq232;233; SSSE3-LABEL: sext_16i8_to_4i32:234; SSSE3: # %bb.0: # %entry235; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]236; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]237; SSSE3-NEXT: psrad $24, %xmm0238; SSSE3-NEXT: retq239;240; SSE41-LABEL: sext_16i8_to_4i32:241; SSE41: # %bb.0: # %entry242; SSE41-NEXT: pmovsxbd %xmm0, %xmm0243; SSE41-NEXT: retq244;245; AVX-LABEL: sext_16i8_to_4i32:246; AVX: # %bb.0: # %entry247; AVX-NEXT: vpmovsxbd %xmm0, %xmm0248; AVX-NEXT: retq249;250; X86-SSE2-LABEL: sext_16i8_to_4i32:251; X86-SSE2: # %bb.0: # %entry252; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]253; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]254; X86-SSE2-NEXT: psrad $24, %xmm0255; X86-SSE2-NEXT: retl256;257; X86-SSE41-LABEL: sext_16i8_to_4i32:258; X86-SSE41: # %bb.0: # %entry259; X86-SSE41-NEXT: pmovsxbd %xmm0, %xmm0260; X86-SSE41-NEXT: retl261entry:262 %B = shufflevector <16 x i8> %A, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>263 %C = sext <4 x i8> %B to <4 x i32>264 ret <4 x i32> %C265}266 267define <8 x i32> @sext_16i8_to_8i32(<16 x i8> %A) nounwind uwtable readnone ssp {268; SSE2-LABEL: sext_16i8_to_8i32:269; SSE2: # %bb.0: # %entry270; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]271; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]272; SSE2-NEXT: psrad $24, %xmm0273; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]274; SSE2-NEXT: psrad $24, %xmm1275; SSE2-NEXT: retq276;277; SSSE3-LABEL: sext_16i8_to_8i32:278; SSSE3: # %bb.0: # %entry279; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]280; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]281; SSSE3-NEXT: psrad $24, %xmm0282; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]283; SSSE3-NEXT: psrad $24, %xmm1284; SSSE3-NEXT: retq285;286; SSE41-LABEL: sext_16i8_to_8i32:287; SSE41: # %bb.0: # %entry288; SSE41-NEXT: pmovsxbd %xmm0, %xmm2289; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]290; SSE41-NEXT: pmovsxbd %xmm0, %xmm1291; SSE41-NEXT: movdqa %xmm2, %xmm0292; SSE41-NEXT: retq293;294; AVX1-LABEL: sext_16i8_to_8i32:295; AVX1: # %bb.0: # %entry296; AVX1-NEXT: vpmovsxbd %xmm0, %xmm1297; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]298; AVX1-NEXT: vpmovsxbd %xmm0, %xmm0299; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0300; AVX1-NEXT: retq301;302; AVX2-LABEL: sext_16i8_to_8i32:303; AVX2: # %bb.0: # %entry304; AVX2-NEXT: vpmovsxbd %xmm0, %ymm0305; AVX2-NEXT: retq306;307; AVX512-LABEL: sext_16i8_to_8i32:308; AVX512: # %bb.0: # %entry309; AVX512-NEXT: vpmovsxbd %xmm0, %ymm0310; AVX512-NEXT: retq311;312; X86-SSE2-LABEL: sext_16i8_to_8i32:313; X86-SSE2: # %bb.0: # %entry314; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]315; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]316; X86-SSE2-NEXT: psrad $24, %xmm0317; X86-SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]318; X86-SSE2-NEXT: psrad $24, %xmm1319; X86-SSE2-NEXT: retl320;321; X86-SSE41-LABEL: sext_16i8_to_8i32:322; X86-SSE41: # %bb.0: # %entry323; X86-SSE41-NEXT: pmovsxbd %xmm0, %xmm2324; X86-SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]325; X86-SSE41-NEXT: pmovsxbd %xmm0, %xmm1326; X86-SSE41-NEXT: movdqa %xmm2, %xmm0327; X86-SSE41-NEXT: retl328entry:329 %B = shufflevector <16 x i8> %A, <16 x i8> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>330 %C = sext <8 x i8> %B to <8 x i32>331 ret <8 x i32> %C332}333 334define <16 x i32> @sext_16i8_to_16i32(<16 x i8> %A) nounwind uwtable readnone ssp {335; SSE2-LABEL: sext_16i8_to_16i32:336; SSE2: # %bb.0: # %entry337; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]338; SSE2-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3]339; SSE2-NEXT: psrad $24, %xmm4340; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]341; SSE2-NEXT: psrad $24, %xmm1342; SSE2-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]343; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]344; SSE2-NEXT: psrad $24, %xmm2345; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]346; SSE2-NEXT: psrad $24, %xmm3347; SSE2-NEXT: movdqa %xmm4, %xmm0348; SSE2-NEXT: retq349;350; SSSE3-LABEL: sext_16i8_to_16i32:351; SSSE3: # %bb.0: # %entry352; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]353; SSSE3-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3]354; SSSE3-NEXT: psrad $24, %xmm4355; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]356; SSSE3-NEXT: psrad $24, %xmm1357; SSSE3-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]358; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]359; SSSE3-NEXT: psrad $24, %xmm2360; SSSE3-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]361; SSSE3-NEXT: psrad $24, %xmm3362; SSSE3-NEXT: movdqa %xmm4, %xmm0363; SSSE3-NEXT: retq364;365; SSE41-LABEL: sext_16i8_to_16i32:366; SSE41: # %bb.0: # %entry367; SSE41-NEXT: pmovsxbd %xmm0, %xmm4368; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]369; SSE41-NEXT: pmovsxbd %xmm1, %xmm1370; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]371; SSE41-NEXT: pmovsxbd %xmm2, %xmm2372; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]373; SSE41-NEXT: pmovsxbd %xmm0, %xmm3374; SSE41-NEXT: movdqa %xmm4, %xmm0375; SSE41-NEXT: retq376;377; AVX1-LABEL: sext_16i8_to_16i32:378; AVX1: # %bb.0: # %entry379; AVX1-NEXT: vpmovsxbd %xmm0, %xmm1380; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]381; AVX1-NEXT: vpmovsxbd %xmm2, %xmm2382; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm2383; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]384; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1385; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]386; AVX1-NEXT: vpmovsxbd %xmm0, %xmm0387; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm1388; AVX1-NEXT: vmovaps %ymm2, %ymm0389; AVX1-NEXT: retq390;391; AVX2-LABEL: sext_16i8_to_16i32:392; AVX2: # %bb.0: # %entry393; AVX2-NEXT: vpmovsxbd %xmm0, %ymm2394; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]395; AVX2-NEXT: vpmovsxbd %xmm0, %ymm1396; AVX2-NEXT: vmovdqa %ymm2, %ymm0397; AVX2-NEXT: retq398;399; AVX512-LABEL: sext_16i8_to_16i32:400; AVX512: # %bb.0: # %entry401; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0402; AVX512-NEXT: retq403;404; X86-SSE2-LABEL: sext_16i8_to_16i32:405; X86-SSE2: # %bb.0: # %entry406; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]407; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3]408; X86-SSE2-NEXT: psrad $24, %xmm4409; X86-SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]410; X86-SSE2-NEXT: psrad $24, %xmm1411; X86-SSE2-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]412; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]413; X86-SSE2-NEXT: psrad $24, %xmm2414; X86-SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]415; X86-SSE2-NEXT: psrad $24, %xmm3416; X86-SSE2-NEXT: movdqa %xmm4, %xmm0417; X86-SSE2-NEXT: retl418;419; X86-SSE41-LABEL: sext_16i8_to_16i32:420; X86-SSE41: # %bb.0: # %entry421; X86-SSE41-NEXT: pmovsxbd %xmm0, %xmm4422; X86-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]423; X86-SSE41-NEXT: pmovsxbd %xmm1, %xmm1424; X86-SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]425; X86-SSE41-NEXT: pmovsxbd %xmm2, %xmm2426; X86-SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]427; X86-SSE41-NEXT: pmovsxbd %xmm0, %xmm3428; X86-SSE41-NEXT: movdqa %xmm4, %xmm0429; X86-SSE41-NEXT: retl430entry:431 %B = sext <16 x i8> %A to <16 x i32>432 ret <16 x i32> %B433}434 435define <2 x i64> @sext_16i8_to_2i64(<16 x i8> %A) nounwind uwtable readnone ssp {436; SSE2-LABEL: sext_16i8_to_2i64:437; SSE2: # %bb.0: # %entry438; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]439; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]440; SSE2-NEXT: pxor %xmm1, %xmm1441; SSE2-NEXT: pcmpgtd %xmm0, %xmm1442; SSE2-NEXT: psrad $24, %xmm0443; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]444; SSE2-NEXT: retq445;446; SSSE3-LABEL: sext_16i8_to_2i64:447; SSSE3: # %bb.0: # %entry448; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]449; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]450; SSSE3-NEXT: pxor %xmm1, %xmm1451; SSSE3-NEXT: pcmpgtd %xmm0, %xmm1452; SSSE3-NEXT: psrad $24, %xmm0453; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]454; SSSE3-NEXT: retq455;456; SSE41-LABEL: sext_16i8_to_2i64:457; SSE41: # %bb.0: # %entry458; SSE41-NEXT: pmovsxbq %xmm0, %xmm0459; SSE41-NEXT: retq460;461; AVX-LABEL: sext_16i8_to_2i64:462; AVX: # %bb.0: # %entry463; AVX-NEXT: vpmovsxbq %xmm0, %xmm0464; AVX-NEXT: retq465;466; X86-SSE2-LABEL: sext_16i8_to_2i64:467; X86-SSE2: # %bb.0: # %entry468; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]469; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]470; X86-SSE2-NEXT: pxor %xmm1, %xmm1471; X86-SSE2-NEXT: pcmpgtd %xmm0, %xmm1472; X86-SSE2-NEXT: psrad $24, %xmm0473; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]474; X86-SSE2-NEXT: retl475;476; X86-SSE41-LABEL: sext_16i8_to_2i64:477; X86-SSE41: # %bb.0: # %entry478; X86-SSE41-NEXT: pmovsxbq %xmm0, %xmm0479; X86-SSE41-NEXT: retl480entry:481 %B = shufflevector <16 x i8> %A, <16 x i8> undef, <2 x i32> <i32 0, i32 1>482 %C = sext <2 x i8> %B to <2 x i64>483 ret <2 x i64> %C484}485 486define <4 x i64> @sext_16i8_to_4i64(<16 x i8> %A) nounwind uwtable readnone ssp {487; SSE2-LABEL: sext_16i8_to_4i64:488; SSE2: # %bb.0: # %entry489; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]490; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]491; SSE2-NEXT: psrad $24, %xmm1492; SSE2-NEXT: pxor %xmm2, %xmm2493; SSE2-NEXT: pcmpgtd %xmm1, %xmm2494; SSE2-NEXT: movdqa %xmm1, %xmm0495; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]496; SSE2-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]497; SSE2-NEXT: retq498;499; SSSE3-LABEL: sext_16i8_to_4i64:500; SSSE3: # %bb.0: # %entry501; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]502; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]503; SSSE3-NEXT: psrad $24, %xmm1504; SSSE3-NEXT: pxor %xmm2, %xmm2505; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2506; SSSE3-NEXT: movdqa %xmm1, %xmm0507; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]508; SSSE3-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]509; SSSE3-NEXT: retq510;511; SSE41-LABEL: sext_16i8_to_4i64:512; SSE41: # %bb.0: # %entry513; SSE41-NEXT: pmovsxbq %xmm0, %xmm2514; SSE41-NEXT: psrld $16, %xmm0515; SSE41-NEXT: pmovsxbq %xmm0, %xmm1516; SSE41-NEXT: movdqa %xmm2, %xmm0517; SSE41-NEXT: retq518;519; AVX1-LABEL: sext_16i8_to_4i64:520; AVX1: # %bb.0: # %entry521; AVX1-NEXT: vpmovsxbq %xmm0, %xmm1522; AVX1-NEXT: vpsrld $16, %xmm0, %xmm0523; AVX1-NEXT: vpmovsxbq %xmm0, %xmm0524; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0525; AVX1-NEXT: retq526;527; AVX2-LABEL: sext_16i8_to_4i64:528; AVX2: # %bb.0: # %entry529; AVX2-NEXT: vpmovsxbq %xmm0, %ymm0530; AVX2-NEXT: retq531;532; AVX512-LABEL: sext_16i8_to_4i64:533; AVX512: # %bb.0: # %entry534; AVX512-NEXT: vpmovsxbq %xmm0, %ymm0535; AVX512-NEXT: retq536;537; X86-SSE2-LABEL: sext_16i8_to_4i64:538; X86-SSE2: # %bb.0: # %entry539; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]540; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]541; X86-SSE2-NEXT: psrad $24, %xmm1542; X86-SSE2-NEXT: pxor %xmm2, %xmm2543; X86-SSE2-NEXT: pcmpgtd %xmm1, %xmm2544; X86-SSE2-NEXT: movdqa %xmm1, %xmm0545; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]546; X86-SSE2-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]547; X86-SSE2-NEXT: retl548;549; X86-SSE41-LABEL: sext_16i8_to_4i64:550; X86-SSE41: # %bb.0: # %entry551; X86-SSE41-NEXT: pmovsxbq %xmm0, %xmm2552; X86-SSE41-NEXT: psrld $16, %xmm0553; X86-SSE41-NEXT: pmovsxbq %xmm0, %xmm1554; X86-SSE41-NEXT: movdqa %xmm2, %xmm0555; X86-SSE41-NEXT: retl556entry:557 %B = shufflevector <16 x i8> %A, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>558 %C = sext <4 x i8> %B to <4 x i64>559 ret <4 x i64> %C560}561 562define <8 x i64> @sext_16i8_to_8i64(<16 x i8> %A) nounwind uwtable readnone ssp {563; SSE2-LABEL: sext_16i8_to_8i64:564; SSE2: # %bb.0: # %entry565; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]566; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]567; SSE2-NEXT: psrad $24, %xmm1568; SSE2-NEXT: pxor %xmm4, %xmm4569; SSE2-NEXT: pxor %xmm3, %xmm3570; SSE2-NEXT: pcmpgtd %xmm1, %xmm3571; SSE2-NEXT: movdqa %xmm1, %xmm0572; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]573; SSE2-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]574; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]575; SSE2-NEXT: psrad $24, %xmm3576; SSE2-NEXT: pcmpgtd %xmm3, %xmm4577; SSE2-NEXT: movdqa %xmm3, %xmm2578; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]579; SSE2-NEXT: punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3]580; SSE2-NEXT: retq581;582; SSSE3-LABEL: sext_16i8_to_8i64:583; SSSE3: # %bb.0: # %entry584; SSSE3-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]585; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]586; SSSE3-NEXT: psrad $24, %xmm1587; SSSE3-NEXT: pxor %xmm4, %xmm4588; SSSE3-NEXT: pxor %xmm3, %xmm3589; SSSE3-NEXT: pcmpgtd %xmm1, %xmm3590; SSSE3-NEXT: movdqa %xmm1, %xmm0591; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]592; SSSE3-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]593; SSSE3-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]594; SSSE3-NEXT: psrad $24, %xmm3595; SSSE3-NEXT: pcmpgtd %xmm3, %xmm4596; SSSE3-NEXT: movdqa %xmm3, %xmm2597; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]598; SSSE3-NEXT: punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3]599; SSSE3-NEXT: retq600;601; SSE41-LABEL: sext_16i8_to_8i64:602; SSE41: # %bb.0: # %entry603; SSE41-NEXT: pmovsxbq %xmm0, %xmm4604; SSE41-NEXT: movdqa %xmm0, %xmm1605; SSE41-NEXT: psrld $16, %xmm1606; SSE41-NEXT: pmovsxbq %xmm1, %xmm1607; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]608; SSE41-NEXT: pmovsxbq %xmm2, %xmm2609; SSE41-NEXT: psrlq $48, %xmm0610; SSE41-NEXT: pmovsxbq %xmm0, %xmm3611; SSE41-NEXT: movdqa %xmm4, %xmm0612; SSE41-NEXT: retq613;614; AVX1-LABEL: sext_16i8_to_8i64:615; AVX1: # %bb.0: # %entry616; AVX1-NEXT: vpmovsxbq %xmm0, %xmm1617; AVX1-NEXT: vpsrld $16, %xmm0, %xmm2618; AVX1-NEXT: vpmovsxbq %xmm2, %xmm2619; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm2620; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]621; AVX1-NEXT: vpmovsxbq %xmm0, %xmm1622; AVX1-NEXT: vpsrld $16, %xmm0, %xmm0623; AVX1-NEXT: vpmovsxbq %xmm0, %xmm0624; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm1625; AVX1-NEXT: vmovaps %ymm2, %ymm0626; AVX1-NEXT: retq627;628; AVX2-LABEL: sext_16i8_to_8i64:629; AVX2: # %bb.0: # %entry630; AVX2-NEXT: vpmovsxbq %xmm0, %ymm2631; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]632; AVX2-NEXT: vpmovsxbq %xmm0, %ymm1633; AVX2-NEXT: vmovdqa %ymm2, %ymm0634; AVX2-NEXT: retq635;636; AVX512-LABEL: sext_16i8_to_8i64:637; AVX512: # %bb.0: # %entry638; AVX512-NEXT: vpmovsxbq %xmm0, %zmm0639; AVX512-NEXT: retq640;641; X86-SSE2-LABEL: sext_16i8_to_8i64:642; X86-SSE2: # %bb.0: # %entry643; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]644; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]645; X86-SSE2-NEXT: psrad $24, %xmm1646; X86-SSE2-NEXT: pxor %xmm4, %xmm4647; X86-SSE2-NEXT: pxor %xmm3, %xmm3648; X86-SSE2-NEXT: pcmpgtd %xmm1, %xmm3649; X86-SSE2-NEXT: movdqa %xmm1, %xmm0650; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]651; X86-SSE2-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]652; X86-SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]653; X86-SSE2-NEXT: psrad $24, %xmm3654; X86-SSE2-NEXT: pcmpgtd %xmm3, %xmm4655; X86-SSE2-NEXT: movdqa %xmm3, %xmm2656; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]657; X86-SSE2-NEXT: punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3]658; X86-SSE2-NEXT: retl659;660; X86-SSE41-LABEL: sext_16i8_to_8i64:661; X86-SSE41: # %bb.0: # %entry662; X86-SSE41-NEXT: pmovsxbq %xmm0, %xmm4663; X86-SSE41-NEXT: movdqa %xmm0, %xmm1664; X86-SSE41-NEXT: psrld $16, %xmm1665; X86-SSE41-NEXT: pmovsxbq %xmm1, %xmm1666; X86-SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]667; X86-SSE41-NEXT: pmovsxbq %xmm2, %xmm2668; X86-SSE41-NEXT: psrlq $48, %xmm0669; X86-SSE41-NEXT: pmovsxbq %xmm0, %xmm3670; X86-SSE41-NEXT: movdqa %xmm4, %xmm0671; X86-SSE41-NEXT: retl672entry:673 %B = shufflevector <16 x i8> %A, <16 x i8> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>674 %C = sext <8 x i8> %B to <8 x i64>675 ret <8 x i64> %C676}677 678define <4 x i32> @sext_8i16_to_4i32(<8 x i16> %A) nounwind uwtable readnone ssp {679; SSE2-LABEL: sext_8i16_to_4i32:680; SSE2: # %bb.0: # %entry681; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]682; SSE2-NEXT: psrad $16, %xmm0683; SSE2-NEXT: retq684;685; SSSE3-LABEL: sext_8i16_to_4i32:686; SSSE3: # %bb.0: # %entry687; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]688; SSSE3-NEXT: psrad $16, %xmm0689; SSSE3-NEXT: retq690;691; SSE41-LABEL: sext_8i16_to_4i32:692; SSE41: # %bb.0: # %entry693; SSE41-NEXT: pmovsxwd %xmm0, %xmm0694; SSE41-NEXT: retq695;696; AVX-LABEL: sext_8i16_to_4i32:697; AVX: # %bb.0: # %entry698; AVX-NEXT: vpmovsxwd %xmm0, %xmm0699; AVX-NEXT: retq700;701; X86-SSE2-LABEL: sext_8i16_to_4i32:702; X86-SSE2: # %bb.0: # %entry703; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]704; X86-SSE2-NEXT: psrad $16, %xmm0705; X86-SSE2-NEXT: retl706;707; X86-SSE41-LABEL: sext_8i16_to_4i32:708; X86-SSE41: # %bb.0: # %entry709; X86-SSE41-NEXT: pmovsxwd %xmm0, %xmm0710; X86-SSE41-NEXT: retl711entry:712 %B = shufflevector <8 x i16> %A, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>713 %C = sext <4 x i16> %B to <4 x i32>714 ret <4 x i32> %C715}716 717define <8 x i32> @sext_8i16_to_8i32(<8 x i16> %A) nounwind uwtable readnone ssp {718; SSE2-LABEL: sext_8i16_to_8i32:719; SSE2: # %bb.0: # %entry720; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]721; SSE2-NEXT: psrad $16, %xmm2722; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]723; SSE2-NEXT: psrad $16, %xmm1724; SSE2-NEXT: movdqa %xmm2, %xmm0725; SSE2-NEXT: retq726;727; SSSE3-LABEL: sext_8i16_to_8i32:728; SSSE3: # %bb.0: # %entry729; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]730; SSSE3-NEXT: psrad $16, %xmm2731; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]732; SSSE3-NEXT: psrad $16, %xmm1733; SSSE3-NEXT: movdqa %xmm2, %xmm0734; SSSE3-NEXT: retq735;736; SSE41-LABEL: sext_8i16_to_8i32:737; SSE41: # %bb.0: # %entry738; SSE41-NEXT: pmovsxwd %xmm0, %xmm2739; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]740; SSE41-NEXT: pmovsxwd %xmm0, %xmm1741; SSE41-NEXT: movdqa %xmm2, %xmm0742; SSE41-NEXT: retq743;744; AVX1-LABEL: sext_8i16_to_8i32:745; AVX1: # %bb.0: # %entry746; AVX1-NEXT: vpmovsxwd %xmm0, %xmm1747; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]748; AVX1-NEXT: vpmovsxwd %xmm0, %xmm0749; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0750; AVX1-NEXT: retq751;752; AVX2-LABEL: sext_8i16_to_8i32:753; AVX2: # %bb.0: # %entry754; AVX2-NEXT: vpmovsxwd %xmm0, %ymm0755; AVX2-NEXT: retq756;757; AVX512-LABEL: sext_8i16_to_8i32:758; AVX512: # %bb.0: # %entry759; AVX512-NEXT: vpmovsxwd %xmm0, %ymm0760; AVX512-NEXT: retq761;762; X86-SSE2-LABEL: sext_8i16_to_8i32:763; X86-SSE2: # %bb.0: # %entry764; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]765; X86-SSE2-NEXT: psrad $16, %xmm2766; X86-SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]767; X86-SSE2-NEXT: psrad $16, %xmm1768; X86-SSE2-NEXT: movdqa %xmm2, %xmm0769; X86-SSE2-NEXT: retl770;771; X86-SSE41-LABEL: sext_8i16_to_8i32:772; X86-SSE41: # %bb.0: # %entry773; X86-SSE41-NEXT: pmovsxwd %xmm0, %xmm2774; X86-SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]775; X86-SSE41-NEXT: pmovsxwd %xmm0, %xmm1776; X86-SSE41-NEXT: movdqa %xmm2, %xmm0777; X86-SSE41-NEXT: retl778entry:779 %B = sext <8 x i16> %A to <8 x i32>780 ret <8 x i32> %B781}782 783define <16 x i32> @sext_16i16_to_16i32(<16 x i16> %A) nounwind uwtable readnone ssp {784; SSE2-LABEL: sext_16i16_to_16i32:785; SSE2: # %bb.0: # %entry786; SSE2-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3]787; SSE2-NEXT: psrad $16, %xmm4788; SSE2-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4],xmm0[4],xmm5[5],xmm0[5],xmm5[6],xmm0[6],xmm5[7],xmm0[7]789; SSE2-NEXT: psrad $16, %xmm5790; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]791; SSE2-NEXT: psrad $16, %xmm2792; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]793; SSE2-NEXT: psrad $16, %xmm3794; SSE2-NEXT: movdqa %xmm4, %xmm0795; SSE2-NEXT: movdqa %xmm5, %xmm1796; SSE2-NEXT: retq797;798; SSSE3-LABEL: sext_16i16_to_16i32:799; SSSE3: # %bb.0: # %entry800; SSSE3-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3]801; SSSE3-NEXT: psrad $16, %xmm4802; SSSE3-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4],xmm0[4],xmm5[5],xmm0[5],xmm5[6],xmm0[6],xmm5[7],xmm0[7]803; SSSE3-NEXT: psrad $16, %xmm5804; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]805; SSSE3-NEXT: psrad $16, %xmm2806; SSSE3-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]807; SSSE3-NEXT: psrad $16, %xmm3808; SSSE3-NEXT: movdqa %xmm4, %xmm0809; SSSE3-NEXT: movdqa %xmm5, %xmm1810; SSSE3-NEXT: retq811;812; SSE41-LABEL: sext_16i16_to_16i32:813; SSE41: # %bb.0: # %entry814; SSE41-NEXT: pmovsxwd %xmm0, %xmm5815; SSE41-NEXT: pmovsxwd %xmm1, %xmm2816; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]817; SSE41-NEXT: pmovsxwd %xmm0, %xmm4818; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]819; SSE41-NEXT: pmovsxwd %xmm0, %xmm3820; SSE41-NEXT: movdqa %xmm5, %xmm0821; SSE41-NEXT: movdqa %xmm4, %xmm1822; SSE41-NEXT: retq823;824; AVX1-LABEL: sext_16i16_to_16i32:825; AVX1: # %bb.0: # %entry826; AVX1-NEXT: vpmovsxwd %xmm0, %xmm1827; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]828; AVX1-NEXT: vpmovsxwd %xmm2, %xmm2829; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm2830; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0831; AVX1-NEXT: vpmovsxwd %xmm0, %xmm1832; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]833; AVX1-NEXT: vpmovsxwd %xmm0, %xmm0834; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm1835; AVX1-NEXT: vmovaps %ymm2, %ymm0836; AVX1-NEXT: retq837;838; AVX2-LABEL: sext_16i16_to_16i32:839; AVX2: # %bb.0: # %entry840; AVX2-NEXT: vpmovsxwd %xmm0, %ymm2841; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0842; AVX2-NEXT: vpmovsxwd %xmm0, %ymm1843; AVX2-NEXT: vmovdqa %ymm2, %ymm0844; AVX2-NEXT: retq845;846; AVX512-LABEL: sext_16i16_to_16i32:847; AVX512: # %bb.0: # %entry848; AVX512-NEXT: vpmovsxwd %ymm0, %zmm0849; AVX512-NEXT: retq850;851; X86-SSE2-LABEL: sext_16i16_to_16i32:852; X86-SSE2: # %bb.0: # %entry853; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3]854; X86-SSE2-NEXT: psrad $16, %xmm4855; X86-SSE2-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4],xmm0[4],xmm5[5],xmm0[5],xmm5[6],xmm0[6],xmm5[7],xmm0[7]856; X86-SSE2-NEXT: psrad $16, %xmm5857; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]858; X86-SSE2-NEXT: psrad $16, %xmm2859; X86-SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]860; X86-SSE2-NEXT: psrad $16, %xmm3861; X86-SSE2-NEXT: movdqa %xmm4, %xmm0862; X86-SSE2-NEXT: movdqa %xmm5, %xmm1863; X86-SSE2-NEXT: retl864;865; X86-SSE41-LABEL: sext_16i16_to_16i32:866; X86-SSE41: # %bb.0: # %entry867; X86-SSE41-NEXT: pmovsxwd %xmm0, %xmm5868; X86-SSE41-NEXT: pmovsxwd %xmm1, %xmm2869; X86-SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]870; X86-SSE41-NEXT: pmovsxwd %xmm0, %xmm4871; X86-SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]872; X86-SSE41-NEXT: pmovsxwd %xmm0, %xmm3873; X86-SSE41-NEXT: movdqa %xmm5, %xmm0874; X86-SSE41-NEXT: movdqa %xmm4, %xmm1875; X86-SSE41-NEXT: retl876entry:877 %B = sext <16 x i16> %A to <16 x i32>878 ret <16 x i32> %B879}880 881define <2 x i64> @sext_8i16_to_2i64(<8 x i16> %A) nounwind uwtable readnone ssp {882; SSE2-LABEL: sext_8i16_to_2i64:883; SSE2: # %bb.0: # %entry884; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]885; SSE2-NEXT: pxor %xmm1, %xmm1886; SSE2-NEXT: pcmpgtd %xmm0, %xmm1887; SSE2-NEXT: psrad $16, %xmm0888; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]889; SSE2-NEXT: retq890;891; SSSE3-LABEL: sext_8i16_to_2i64:892; SSSE3: # %bb.0: # %entry893; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]894; SSSE3-NEXT: pxor %xmm1, %xmm1895; SSSE3-NEXT: pcmpgtd %xmm0, %xmm1896; SSSE3-NEXT: psrad $16, %xmm0897; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]898; SSSE3-NEXT: retq899;900; SSE41-LABEL: sext_8i16_to_2i64:901; SSE41: # %bb.0: # %entry902; SSE41-NEXT: pmovsxwq %xmm0, %xmm0903; SSE41-NEXT: retq904;905; AVX-LABEL: sext_8i16_to_2i64:906; AVX: # %bb.0: # %entry907; AVX-NEXT: vpmovsxwq %xmm0, %xmm0908; AVX-NEXT: retq909;910; X86-SSE2-LABEL: sext_8i16_to_2i64:911; X86-SSE2: # %bb.0: # %entry912; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]913; X86-SSE2-NEXT: pxor %xmm1, %xmm1914; X86-SSE2-NEXT: pcmpgtd %xmm0, %xmm1915; X86-SSE2-NEXT: psrad $16, %xmm0916; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]917; X86-SSE2-NEXT: retl918;919; X86-SSE41-LABEL: sext_8i16_to_2i64:920; X86-SSE41: # %bb.0: # %entry921; X86-SSE41-NEXT: pmovsxwq %xmm0, %xmm0922; X86-SSE41-NEXT: retl923entry:924 %B = shufflevector <8 x i16> %A, <8 x i16> undef, <2 x i32> <i32 0, i32 1>925 %C = sext <2 x i16> %B to <2 x i64>926 ret <2 x i64> %C927}928 929define <4 x i64> @sext_8i16_to_4i64(<8 x i16> %A) nounwind uwtable readnone ssp {930; SSE2-LABEL: sext_8i16_to_4i64:931; SSE2: # %bb.0: # %entry932; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]933; SSE2-NEXT: psrad $16, %xmm1934; SSE2-NEXT: pxor %xmm2, %xmm2935; SSE2-NEXT: pcmpgtd %xmm1, %xmm2936; SSE2-NEXT: movdqa %xmm1, %xmm0937; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]938; SSE2-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]939; SSE2-NEXT: retq940;941; SSSE3-LABEL: sext_8i16_to_4i64:942; SSSE3: # %bb.0: # %entry943; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]944; SSSE3-NEXT: psrad $16, %xmm1945; SSSE3-NEXT: pxor %xmm2, %xmm2946; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2947; SSSE3-NEXT: movdqa %xmm1, %xmm0948; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]949; SSSE3-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]950; SSSE3-NEXT: retq951;952; SSE41-LABEL: sext_8i16_to_4i64:953; SSE41: # %bb.0: # %entry954; SSE41-NEXT: pmovsxwq %xmm0, %xmm2955; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]956; SSE41-NEXT: pmovsxwq %xmm0, %xmm1957; SSE41-NEXT: movdqa %xmm2, %xmm0958; SSE41-NEXT: retq959;960; AVX1-LABEL: sext_8i16_to_4i64:961; AVX1: # %bb.0: # %entry962; AVX1-NEXT: vpmovsxwq %xmm0, %xmm1963; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]964; AVX1-NEXT: vpmovsxwq %xmm0, %xmm0965; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0966; AVX1-NEXT: retq967;968; AVX2-LABEL: sext_8i16_to_4i64:969; AVX2: # %bb.0: # %entry970; AVX2-NEXT: vpmovsxwq %xmm0, %ymm0971; AVX2-NEXT: retq972;973; AVX512-LABEL: sext_8i16_to_4i64:974; AVX512: # %bb.0: # %entry975; AVX512-NEXT: vpmovsxwq %xmm0, %ymm0976; AVX512-NEXT: retq977;978; X86-SSE2-LABEL: sext_8i16_to_4i64:979; X86-SSE2: # %bb.0: # %entry980; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]981; X86-SSE2-NEXT: psrad $16, %xmm1982; X86-SSE2-NEXT: pxor %xmm2, %xmm2983; X86-SSE2-NEXT: pcmpgtd %xmm1, %xmm2984; X86-SSE2-NEXT: movdqa %xmm1, %xmm0985; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]986; X86-SSE2-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]987; X86-SSE2-NEXT: retl988;989; X86-SSE41-LABEL: sext_8i16_to_4i64:990; X86-SSE41: # %bb.0: # %entry991; X86-SSE41-NEXT: pmovsxwq %xmm0, %xmm2992; X86-SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]993; X86-SSE41-NEXT: pmovsxwq %xmm0, %xmm1994; X86-SSE41-NEXT: movdqa %xmm2, %xmm0995; X86-SSE41-NEXT: retl996entry:997 %B = shufflevector <8 x i16> %A, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>998 %C = sext <4 x i16> %B to <4 x i64>999 ret <4 x i64> %C1000}1001 1002define <8 x i64> @sext_8i16_to_8i64(<8 x i16> %A) nounwind uwtable readnone ssp {1003; SSE2-LABEL: sext_8i16_to_8i64:1004; SSE2: # %bb.0: # %entry1005; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]1006; SSE2-NEXT: psrad $16, %xmm11007; SSE2-NEXT: pxor %xmm5, %xmm51008; SSE2-NEXT: pxor %xmm2, %xmm21009; SSE2-NEXT: pcmpgtd %xmm1, %xmm21010; SSE2-NEXT: movdqa %xmm1, %xmm41011; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]1012; SSE2-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]1013; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]1014; SSE2-NEXT: psrad $16, %xmm31015; SSE2-NEXT: pcmpgtd %xmm3, %xmm51016; SSE2-NEXT: movdqa %xmm3, %xmm21017; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]1018; SSE2-NEXT: punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm5[2],xmm3[3],xmm5[3]1019; SSE2-NEXT: movdqa %xmm4, %xmm01020; SSE2-NEXT: retq1021;1022; SSSE3-LABEL: sext_8i16_to_8i64:1023; SSSE3: # %bb.0: # %entry1024; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]1025; SSSE3-NEXT: psrad $16, %xmm11026; SSSE3-NEXT: pxor %xmm5, %xmm51027; SSSE3-NEXT: pxor %xmm2, %xmm21028; SSSE3-NEXT: pcmpgtd %xmm1, %xmm21029; SSSE3-NEXT: movdqa %xmm1, %xmm41030; SSSE3-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]1031; SSSE3-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]1032; SSSE3-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]1033; SSSE3-NEXT: psrad $16, %xmm31034; SSSE3-NEXT: pcmpgtd %xmm3, %xmm51035; SSSE3-NEXT: movdqa %xmm3, %xmm21036; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]1037; SSSE3-NEXT: punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm5[2],xmm3[3],xmm5[3]1038; SSSE3-NEXT: movdqa %xmm4, %xmm01039; SSSE3-NEXT: retq1040;1041; SSE41-LABEL: sext_8i16_to_8i64:1042; SSE41: # %bb.0: # %entry1043; SSE41-NEXT: pmovsxwq %xmm0, %xmm41044; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1045; SSE41-NEXT: pmovsxwq %xmm1, %xmm11046; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]1047; SSE41-NEXT: pmovsxwq %xmm2, %xmm21048; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]1049; SSE41-NEXT: pmovsxwq %xmm0, %xmm31050; SSE41-NEXT: movdqa %xmm4, %xmm01051; SSE41-NEXT: retq1052;1053; AVX1-LABEL: sext_8i16_to_8i64:1054; AVX1: # %bb.0: # %entry1055; AVX1-NEXT: vpmovsxwq %xmm0, %xmm11056; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]1057; AVX1-NEXT: vpmovsxwq %xmm2, %xmm21058; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm21059; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1060; AVX1-NEXT: vpmovsxwq %xmm1, %xmm11061; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]1062; AVX1-NEXT: vpmovsxwq %xmm0, %xmm01063; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm11064; AVX1-NEXT: vmovaps %ymm2, %ymm01065; AVX1-NEXT: retq1066;1067; AVX2-LABEL: sext_8i16_to_8i64:1068; AVX2: # %bb.0: # %entry1069; AVX2-NEXT: vpmovsxwq %xmm0, %ymm21070; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]1071; AVX2-NEXT: vpmovsxwq %xmm0, %ymm11072; AVX2-NEXT: vmovdqa %ymm2, %ymm01073; AVX2-NEXT: retq1074;1075; AVX512-LABEL: sext_8i16_to_8i64:1076; AVX512: # %bb.0: # %entry1077; AVX512-NEXT: vpmovsxwq %xmm0, %zmm01078; AVX512-NEXT: retq1079;1080; X86-SSE2-LABEL: sext_8i16_to_8i64:1081; X86-SSE2: # %bb.0: # %entry1082; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]1083; X86-SSE2-NEXT: psrad $16, %xmm11084; X86-SSE2-NEXT: pxor %xmm5, %xmm51085; X86-SSE2-NEXT: pxor %xmm2, %xmm21086; X86-SSE2-NEXT: pcmpgtd %xmm1, %xmm21087; X86-SSE2-NEXT: movdqa %xmm1, %xmm41088; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]1089; X86-SSE2-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]1090; X86-SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]1091; X86-SSE2-NEXT: psrad $16, %xmm31092; X86-SSE2-NEXT: pcmpgtd %xmm3, %xmm51093; X86-SSE2-NEXT: movdqa %xmm3, %xmm21094; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]1095; X86-SSE2-NEXT: punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm5[2],xmm3[3],xmm5[3]1096; X86-SSE2-NEXT: movdqa %xmm4, %xmm01097; X86-SSE2-NEXT: retl1098;1099; X86-SSE41-LABEL: sext_8i16_to_8i64:1100; X86-SSE41: # %bb.0: # %entry1101; X86-SSE41-NEXT: pmovsxwq %xmm0, %xmm41102; X86-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1103; X86-SSE41-NEXT: pmovsxwq %xmm1, %xmm11104; X86-SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]1105; X86-SSE41-NEXT: pmovsxwq %xmm2, %xmm21106; X86-SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]1107; X86-SSE41-NEXT: pmovsxwq %xmm0, %xmm31108; X86-SSE41-NEXT: movdqa %xmm4, %xmm01109; X86-SSE41-NEXT: retl1110entry:1111 %B = sext <8 x i16> %A to <8 x i64>1112 ret <8 x i64> %B1113}1114 1115define <2 x i64> @sext_4i32_to_2i64(<4 x i32> %A) nounwind uwtable readnone ssp {1116; SSE2-LABEL: sext_4i32_to_2i64:1117; SSE2: # %bb.0: # %entry1118; SSE2-NEXT: pxor %xmm1, %xmm11119; SSE2-NEXT: pcmpgtd %xmm0, %xmm11120; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1121; SSE2-NEXT: retq1122;1123; SSSE3-LABEL: sext_4i32_to_2i64:1124; SSSE3: # %bb.0: # %entry1125; SSSE3-NEXT: pxor %xmm1, %xmm11126; SSSE3-NEXT: pcmpgtd %xmm0, %xmm11127; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1128; SSSE3-NEXT: retq1129;1130; SSE41-LABEL: sext_4i32_to_2i64:1131; SSE41: # %bb.0: # %entry1132; SSE41-NEXT: pmovsxdq %xmm0, %xmm01133; SSE41-NEXT: retq1134;1135; AVX-LABEL: sext_4i32_to_2i64:1136; AVX: # %bb.0: # %entry1137; AVX-NEXT: vpmovsxdq %xmm0, %xmm01138; AVX-NEXT: retq1139;1140; X86-SSE2-LABEL: sext_4i32_to_2i64:1141; X86-SSE2: # %bb.0: # %entry1142; X86-SSE2-NEXT: pxor %xmm1, %xmm11143; X86-SSE2-NEXT: pcmpgtd %xmm0, %xmm11144; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1145; X86-SSE2-NEXT: retl1146;1147; X86-SSE41-LABEL: sext_4i32_to_2i64:1148; X86-SSE41: # %bb.0: # %entry1149; X86-SSE41-NEXT: pmovsxdq %xmm0, %xmm01150; X86-SSE41-NEXT: retl1151entry:1152 %B = shufflevector <4 x i32> %A, <4 x i32> undef, <2 x i32> <i32 0, i32 1>1153 %C = sext <2 x i32> %B to <2 x i64>1154 ret <2 x i64> %C1155}1156 1157define <4 x i64> @sext_4i32_to_4i64(<4 x i32> %A) nounwind uwtable readnone ssp {1158; SSE2-LABEL: sext_4i32_to_4i64:1159; SSE2: # %bb.0: # %entry1160; SSE2-NEXT: pxor %xmm2, %xmm21161; SSE2-NEXT: pxor %xmm3, %xmm31162; SSE2-NEXT: pcmpgtd %xmm0, %xmm31163; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1164; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]1165; SSE2-NEXT: pcmpgtd %xmm1, %xmm21166; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]1167; SSE2-NEXT: retq1168;1169; SSSE3-LABEL: sext_4i32_to_4i64:1170; SSSE3: # %bb.0: # %entry1171; SSSE3-NEXT: pxor %xmm2, %xmm21172; SSSE3-NEXT: pxor %xmm3, %xmm31173; SSSE3-NEXT: pcmpgtd %xmm0, %xmm31174; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1175; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]1176; SSSE3-NEXT: pcmpgtd %xmm1, %xmm21177; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]1178; SSSE3-NEXT: retq1179;1180; SSE41-LABEL: sext_4i32_to_4i64:1181; SSE41: # %bb.0: # %entry1182; SSE41-NEXT: pmovsxdq %xmm0, %xmm21183; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]1184; SSE41-NEXT: pmovsxdq %xmm0, %xmm11185; SSE41-NEXT: movdqa %xmm2, %xmm01186; SSE41-NEXT: retq1187;1188; AVX1-LABEL: sext_4i32_to_4i64:1189; AVX1: # %bb.0: # %entry1190; AVX1-NEXT: vpmovsxdq %xmm0, %xmm11191; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]1192; AVX1-NEXT: vpmovsxdq %xmm0, %xmm01193; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01194; AVX1-NEXT: retq1195;1196; AVX2-LABEL: sext_4i32_to_4i64:1197; AVX2: # %bb.0: # %entry1198; AVX2-NEXT: vpmovsxdq %xmm0, %ymm01199; AVX2-NEXT: retq1200;1201; AVX512-LABEL: sext_4i32_to_4i64:1202; AVX512: # %bb.0: # %entry1203; AVX512-NEXT: vpmovsxdq %xmm0, %ymm01204; AVX512-NEXT: retq1205;1206; X86-SSE2-LABEL: sext_4i32_to_4i64:1207; X86-SSE2: # %bb.0: # %entry1208; X86-SSE2-NEXT: pxor %xmm2, %xmm21209; X86-SSE2-NEXT: pxor %xmm3, %xmm31210; X86-SSE2-NEXT: pcmpgtd %xmm0, %xmm31211; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1212; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]1213; X86-SSE2-NEXT: pcmpgtd %xmm1, %xmm21214; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]1215; X86-SSE2-NEXT: retl1216;1217; X86-SSE41-LABEL: sext_4i32_to_4i64:1218; X86-SSE41: # %bb.0: # %entry1219; X86-SSE41-NEXT: pmovsxdq %xmm0, %xmm21220; X86-SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]1221; X86-SSE41-NEXT: pmovsxdq %xmm0, %xmm11222; X86-SSE41-NEXT: movdqa %xmm2, %xmm01223; X86-SSE41-NEXT: retl1224entry:1225 %B = sext <4 x i32> %A to <4 x i64>1226 ret <4 x i64> %B1227}1228 1229define <8 x i64> @sext_8i32_to_8i64(<8 x i32> %A) nounwind uwtable readnone ssp {1230; SSE2-LABEL: sext_8i32_to_8i64:1231; SSE2: # %bb.0: # %entry1232; SSE2-NEXT: movdqa %xmm1, %xmm21233; SSE2-NEXT: pxor %xmm4, %xmm41234; SSE2-NEXT: pxor %xmm3, %xmm31235; SSE2-NEXT: pcmpgtd %xmm0, %xmm31236; SSE2-NEXT: pxor %xmm5, %xmm51237; SSE2-NEXT: pcmpgtd %xmm1, %xmm51238; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1239; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]1240; SSE2-NEXT: pxor %xmm3, %xmm31241; SSE2-NEXT: pcmpgtd %xmm1, %xmm31242; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]1243; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[2,3,2,3]1244; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]1245; SSE2-NEXT: pcmpgtd %xmm3, %xmm41246; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]1247; SSE2-NEXT: retq1248;1249; SSSE3-LABEL: sext_8i32_to_8i64:1250; SSSE3: # %bb.0: # %entry1251; SSSE3-NEXT: movdqa %xmm1, %xmm21252; SSSE3-NEXT: pxor %xmm4, %xmm41253; SSSE3-NEXT: pxor %xmm3, %xmm31254; SSSE3-NEXT: pcmpgtd %xmm0, %xmm31255; SSSE3-NEXT: pxor %xmm5, %xmm51256; SSSE3-NEXT: pcmpgtd %xmm1, %xmm51257; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1258; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]1259; SSSE3-NEXT: pxor %xmm3, %xmm31260; SSSE3-NEXT: pcmpgtd %xmm1, %xmm31261; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]1262; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[2,3,2,3]1263; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]1264; SSSE3-NEXT: pcmpgtd %xmm3, %xmm41265; SSSE3-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]1266; SSSE3-NEXT: retq1267;1268; SSE41-LABEL: sext_8i32_to_8i64:1269; SSE41: # %bb.0: # %entry1270; SSE41-NEXT: pmovsxdq %xmm0, %xmm51271; SSE41-NEXT: pmovsxdq %xmm1, %xmm21272; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]1273; SSE41-NEXT: pmovsxdq %xmm0, %xmm41274; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]1275; SSE41-NEXT: pmovsxdq %xmm0, %xmm31276; SSE41-NEXT: movdqa %xmm5, %xmm01277; SSE41-NEXT: movdqa %xmm4, %xmm11278; SSE41-NEXT: retq1279;1280; AVX1-LABEL: sext_8i32_to_8i64:1281; AVX1: # %bb.0: # %entry1282; AVX1-NEXT: vpmovsxdq %xmm0, %xmm11283; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]1284; AVX1-NEXT: vpmovsxdq %xmm2, %xmm21285; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm21286; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01287; AVX1-NEXT: vpmovsxdq %xmm0, %xmm11288; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]1289; AVX1-NEXT: vpmovsxdq %xmm0, %xmm01290; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm11291; AVX1-NEXT: vmovaps %ymm2, %ymm01292; AVX1-NEXT: retq1293;1294; AVX2-LABEL: sext_8i32_to_8i64:1295; AVX2: # %bb.0: # %entry1296; AVX2-NEXT: vpmovsxdq %xmm0, %ymm21297; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm01298; AVX2-NEXT: vpmovsxdq %xmm0, %ymm11299; AVX2-NEXT: vmovdqa %ymm2, %ymm01300; AVX2-NEXT: retq1301;1302; AVX512-LABEL: sext_8i32_to_8i64:1303; AVX512: # %bb.0: # %entry1304; AVX512-NEXT: vpmovsxdq %ymm0, %zmm01305; AVX512-NEXT: retq1306;1307; X86-SSE2-LABEL: sext_8i32_to_8i64:1308; X86-SSE2: # %bb.0: # %entry1309; X86-SSE2-NEXT: movdqa %xmm1, %xmm21310; X86-SSE2-NEXT: pxor %xmm4, %xmm41311; X86-SSE2-NEXT: pxor %xmm3, %xmm31312; X86-SSE2-NEXT: pcmpgtd %xmm0, %xmm31313; X86-SSE2-NEXT: pxor %xmm5, %xmm51314; X86-SSE2-NEXT: pcmpgtd %xmm1, %xmm51315; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1316; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]1317; X86-SSE2-NEXT: pxor %xmm3, %xmm31318; X86-SSE2-NEXT: pcmpgtd %xmm1, %xmm31319; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]1320; X86-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[2,3,2,3]1321; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]1322; X86-SSE2-NEXT: pcmpgtd %xmm3, %xmm41323; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]1324; X86-SSE2-NEXT: retl1325;1326; X86-SSE41-LABEL: sext_8i32_to_8i64:1327; X86-SSE41: # %bb.0: # %entry1328; X86-SSE41-NEXT: pmovsxdq %xmm0, %xmm51329; X86-SSE41-NEXT: pmovsxdq %xmm1, %xmm21330; X86-SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]1331; X86-SSE41-NEXT: pmovsxdq %xmm0, %xmm41332; X86-SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]1333; X86-SSE41-NEXT: pmovsxdq %xmm0, %xmm31334; X86-SSE41-NEXT: movdqa %xmm5, %xmm01335; X86-SSE41-NEXT: movdqa %xmm4, %xmm11336; X86-SSE41-NEXT: retl1337entry:1338 %B = sext <8 x i32> %A to <8 x i64>1339 ret <8 x i64> %B1340}1341 1342define <2 x i64> @load_sext_2i1_to_2i64(ptr%ptr) {1343; SSE-LABEL: load_sext_2i1_to_2i64:1344; SSE: # %bb.0: # %entry1345; SSE-NEXT: movzbl (%rdi), %eax1346; SSE-NEXT: movzbl %al, %ecx1347; SSE-NEXT: shrb %al1348; SSE-NEXT: movzbl %al, %eax1349; SSE-NEXT: negq %rax1350; SSE-NEXT: movq %rax, %xmm11351; SSE-NEXT: andl $1, %ecx1352; SSE-NEXT: negq %rcx1353; SSE-NEXT: movq %rcx, %xmm01354; SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1355; SSE-NEXT: retq1356;1357; AVX1-LABEL: load_sext_2i1_to_2i64:1358; AVX1: # %bb.0: # %entry1359; AVX1-NEXT: movzbl (%rdi), %eax1360; AVX1-NEXT: movzbl %al, %ecx1361; AVX1-NEXT: shrb %al1362; AVX1-NEXT: movzbl %al, %eax1363; AVX1-NEXT: negq %rax1364; AVX1-NEXT: vmovq %rax, %xmm01365; AVX1-NEXT: andl $1, %ecx1366; AVX1-NEXT: negq %rcx1367; AVX1-NEXT: vmovq %rcx, %xmm11368; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]1369; AVX1-NEXT: retq1370;1371; AVX2-LABEL: load_sext_2i1_to_2i64:1372; AVX2: # %bb.0: # %entry1373; AVX2-NEXT: movzbl (%rdi), %eax1374; AVX2-NEXT: movzbl %al, %ecx1375; AVX2-NEXT: shrb %al1376; AVX2-NEXT: movzbl %al, %eax1377; AVX2-NEXT: negq %rax1378; AVX2-NEXT: vmovq %rax, %xmm01379; AVX2-NEXT: andl $1, %ecx1380; AVX2-NEXT: negq %rcx1381; AVX2-NEXT: vmovq %rcx, %xmm11382; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]1383; AVX2-NEXT: retq1384;1385; AVX512F-LABEL: load_sext_2i1_to_2i64:1386; AVX512F: # %bb.0: # %entry1387; AVX512F-NEXT: movzbl (%rdi), %eax1388; AVX512F-NEXT: kmovw %eax, %k11389; AVX512F-NEXT: vpternlogq {{.*#+}} zmm0 {%k1} {z} = -11390; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01391; AVX512F-NEXT: vzeroupper1392; AVX512F-NEXT: retq1393;1394; AVX512BW-LABEL: load_sext_2i1_to_2i64:1395; AVX512BW: # %bb.0: # %entry1396; AVX512BW-NEXT: movzbl (%rdi), %eax1397; AVX512BW-NEXT: kmovd %eax, %k11398; AVX512BW-NEXT: vpternlogq {{.*#+}} zmm0 {%k1} {z} = -11399; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01400; AVX512BW-NEXT: vzeroupper1401; AVX512BW-NEXT: retq1402;1403; X86-SSE2-LABEL: load_sext_2i1_to_2i64:1404; X86-SSE2: # %bb.0: # %entry1405; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax1406; X86-SSE2-NEXT: movzbl (%eax), %eax1407; X86-SSE2-NEXT: movzbl %al, %ecx1408; X86-SSE2-NEXT: shrb %al1409; X86-SSE2-NEXT: movzbl %al, %eax1410; X86-SSE2-NEXT: negl %eax1411; X86-SSE2-NEXT: movd %eax, %xmm01412; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,0,0]1413; X86-SSE2-NEXT: andl $1, %ecx1414; X86-SSE2-NEXT: negl %ecx1415; X86-SSE2-NEXT: movd %ecx, %xmm01416; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]1417; X86-SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1418; X86-SSE2-NEXT: retl1419;1420; X86-SSE41-LABEL: load_sext_2i1_to_2i64:1421; X86-SSE41: # %bb.0: # %entry1422; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax1423; X86-SSE41-NEXT: movzbl (%eax), %eax1424; X86-SSE41-NEXT: movzbl %al, %ecx1425; X86-SSE41-NEXT: andl $1, %ecx1426; X86-SSE41-NEXT: negl %ecx1427; X86-SSE41-NEXT: movd %ecx, %xmm01428; X86-SSE41-NEXT: pinsrd $1, %ecx, %xmm01429; X86-SSE41-NEXT: shrb %al1430; X86-SSE41-NEXT: movzbl %al, %eax1431; X86-SSE41-NEXT: negl %eax1432; X86-SSE41-NEXT: pinsrd $2, %eax, %xmm01433; X86-SSE41-NEXT: pinsrd $3, %eax, %xmm01434; X86-SSE41-NEXT: retl1435entry:1436 %X = load <2 x i1>, ptr %ptr1437 %Y = sext <2 x i1> %X to <2 x i64>1438 ret <2 x i64> %Y1439}1440 1441define <2 x i64> @load_sext_2i8_to_2i64(ptr%ptr) {1442; SSE2-LABEL: load_sext_2i8_to_2i64:1443; SSE2: # %bb.0: # %entry1444; SSE2-NEXT: movzwl (%rdi), %eax1445; SSE2-NEXT: movd %eax, %xmm01446; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1447; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]1448; SSE2-NEXT: pxor %xmm1, %xmm11449; SSE2-NEXT: pcmpgtd %xmm0, %xmm11450; SSE2-NEXT: psrad $24, %xmm01451; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1452; SSE2-NEXT: retq1453;1454; SSSE3-LABEL: load_sext_2i8_to_2i64:1455; SSSE3: # %bb.0: # %entry1456; SSSE3-NEXT: movzwl (%rdi), %eax1457; SSSE3-NEXT: movd %eax, %xmm01458; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1459; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]1460; SSSE3-NEXT: pxor %xmm1, %xmm11461; SSSE3-NEXT: pcmpgtd %xmm0, %xmm11462; SSSE3-NEXT: psrad $24, %xmm01463; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1464; SSSE3-NEXT: retq1465;1466; SSE41-LABEL: load_sext_2i8_to_2i64:1467; SSE41: # %bb.0: # %entry1468; SSE41-NEXT: pmovsxbq (%rdi), %xmm01469; SSE41-NEXT: retq1470;1471; AVX-LABEL: load_sext_2i8_to_2i64:1472; AVX: # %bb.0: # %entry1473; AVX-NEXT: vpmovsxbq (%rdi), %xmm01474; AVX-NEXT: retq1475;1476; X86-SSE2-LABEL: load_sext_2i8_to_2i64:1477; X86-SSE2: # %bb.0: # %entry1478; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax1479; X86-SSE2-NEXT: movzwl (%eax), %eax1480; X86-SSE2-NEXT: movd %eax, %xmm01481; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1482; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]1483; X86-SSE2-NEXT: pxor %xmm1, %xmm11484; X86-SSE2-NEXT: pcmpgtd %xmm0, %xmm11485; X86-SSE2-NEXT: psrad $24, %xmm01486; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1487; X86-SSE2-NEXT: retl1488;1489; X86-SSE41-LABEL: load_sext_2i8_to_2i64:1490; X86-SSE41: # %bb.0: # %entry1491; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax1492; X86-SSE41-NEXT: pmovsxbq (%eax), %xmm01493; X86-SSE41-NEXT: retl1494entry:1495 %X = load <2 x i8>, ptr %ptr1496 %Y = sext <2 x i8> %X to <2 x i64>1497 ret <2 x i64> %Y1498}1499 1500define <4 x i32> @load_sext_4i1_to_4i32(ptr%ptr) {1501; SSE2-LABEL: load_sext_4i1_to_4i32:1502; SSE2: # %bb.0: # %entry1503; SSE2-NEXT: movzbl (%rdi), %eax1504; SSE2-NEXT: movl %eax, %ecx1505; SSE2-NEXT: shrb $3, %cl1506; SSE2-NEXT: movzbl %cl, %ecx1507; SSE2-NEXT: negl %ecx1508; SSE2-NEXT: movd %ecx, %xmm01509; SSE2-NEXT: movzbl %al, %ecx1510; SSE2-NEXT: shrb $2, %al1511; SSE2-NEXT: movzbl %al, %eax1512; SSE2-NEXT: andl $1, %eax1513; SSE2-NEXT: negl %eax1514; SSE2-NEXT: movd %eax, %xmm11515; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]1516; SSE2-NEXT: movl %ecx, %eax1517; SSE2-NEXT: andl $1, %eax1518; SSE2-NEXT: negl %eax1519; SSE2-NEXT: movd %eax, %xmm01520; SSE2-NEXT: shrb %cl1521; SSE2-NEXT: movzbl %cl, %eax1522; SSE2-NEXT: andl $1, %eax1523; SSE2-NEXT: negl %eax1524; SSE2-NEXT: movd %eax, %xmm21525; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]1526; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1527; SSE2-NEXT: retq1528;1529; SSSE3-LABEL: load_sext_4i1_to_4i32:1530; SSSE3: # %bb.0: # %entry1531; SSSE3-NEXT: movzbl (%rdi), %eax1532; SSSE3-NEXT: movl %eax, %ecx1533; SSSE3-NEXT: shrb $3, %cl1534; SSSE3-NEXT: movzbl %cl, %ecx1535; SSSE3-NEXT: negl %ecx1536; SSSE3-NEXT: movd %ecx, %xmm01537; SSSE3-NEXT: movzbl %al, %ecx1538; SSSE3-NEXT: shrb $2, %al1539; SSSE3-NEXT: movzbl %al, %eax1540; SSSE3-NEXT: andl $1, %eax1541; SSSE3-NEXT: negl %eax1542; SSSE3-NEXT: movd %eax, %xmm11543; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]1544; SSSE3-NEXT: movl %ecx, %eax1545; SSSE3-NEXT: andl $1, %eax1546; SSSE3-NEXT: negl %eax1547; SSSE3-NEXT: movd %eax, %xmm01548; SSSE3-NEXT: shrb %cl1549; SSSE3-NEXT: movzbl %cl, %eax1550; SSSE3-NEXT: andl $1, %eax1551; SSSE3-NEXT: negl %eax1552; SSSE3-NEXT: movd %eax, %xmm21553; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]1554; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1555; SSSE3-NEXT: retq1556;1557; SSE41-LABEL: load_sext_4i1_to_4i32:1558; SSE41: # %bb.0: # %entry1559; SSE41-NEXT: movzbl (%rdi), %eax1560; SSE41-NEXT: movzbl %al, %ecx1561; SSE41-NEXT: shrb %al1562; SSE41-NEXT: movzbl %al, %eax1563; SSE41-NEXT: andl $1, %eax1564; SSE41-NEXT: negl %eax1565; SSE41-NEXT: movl %ecx, %edx1566; SSE41-NEXT: andl $1, %edx1567; SSE41-NEXT: negl %edx1568; SSE41-NEXT: movd %edx, %xmm01569; SSE41-NEXT: pinsrd $1, %eax, %xmm01570; SSE41-NEXT: movl %ecx, %eax1571; SSE41-NEXT: shrb $2, %al1572; SSE41-NEXT: movzbl %al, %eax1573; SSE41-NEXT: andl $1, %eax1574; SSE41-NEXT: negl %eax1575; SSE41-NEXT: pinsrd $2, %eax, %xmm01576; SSE41-NEXT: shrb $3, %cl1577; SSE41-NEXT: movzbl %cl, %eax1578; SSE41-NEXT: negl %eax1579; SSE41-NEXT: pinsrd $3, %eax, %xmm01580; SSE41-NEXT: retq1581;1582; AVX1-LABEL: load_sext_4i1_to_4i32:1583; AVX1: # %bb.0: # %entry1584; AVX1-NEXT: movzbl (%rdi), %eax1585; AVX1-NEXT: movzbl %al, %ecx1586; AVX1-NEXT: shrb %al1587; AVX1-NEXT: movzbl %al, %eax1588; AVX1-NEXT: andl $1, %eax1589; AVX1-NEXT: negl %eax1590; AVX1-NEXT: movl %ecx, %edx1591; AVX1-NEXT: andl $1, %edx1592; AVX1-NEXT: negl %edx1593; AVX1-NEXT: vmovd %edx, %xmm01594; AVX1-NEXT: vpinsrd $1, %eax, %xmm0, %xmm01595; AVX1-NEXT: movl %ecx, %eax1596; AVX1-NEXT: shrb $2, %al1597; AVX1-NEXT: movzbl %al, %eax1598; AVX1-NEXT: andl $1, %eax1599; AVX1-NEXT: negl %eax1600; AVX1-NEXT: vpinsrd $2, %eax, %xmm0, %xmm01601; AVX1-NEXT: shrb $3, %cl1602; AVX1-NEXT: movzbl %cl, %eax1603; AVX1-NEXT: negl %eax1604; AVX1-NEXT: vpinsrd $3, %eax, %xmm0, %xmm01605; AVX1-NEXT: retq1606;1607; AVX2-LABEL: load_sext_4i1_to_4i32:1608; AVX2: # %bb.0: # %entry1609; AVX2-NEXT: movzbl (%rdi), %eax1610; AVX2-NEXT: movzbl %al, %ecx1611; AVX2-NEXT: shrb %al1612; AVX2-NEXT: movzbl %al, %eax1613; AVX2-NEXT: andl $1, %eax1614; AVX2-NEXT: negl %eax1615; AVX2-NEXT: movl %ecx, %edx1616; AVX2-NEXT: andl $1, %edx1617; AVX2-NEXT: negl %edx1618; AVX2-NEXT: vmovd %edx, %xmm01619; AVX2-NEXT: vpinsrd $1, %eax, %xmm0, %xmm01620; AVX2-NEXT: movl %ecx, %eax1621; AVX2-NEXT: shrb $2, %al1622; AVX2-NEXT: movzbl %al, %eax1623; AVX2-NEXT: andl $1, %eax1624; AVX2-NEXT: negl %eax1625; AVX2-NEXT: vpinsrd $2, %eax, %xmm0, %xmm01626; AVX2-NEXT: shrb $3, %cl1627; AVX2-NEXT: movzbl %cl, %eax1628; AVX2-NEXT: negl %eax1629; AVX2-NEXT: vpinsrd $3, %eax, %xmm0, %xmm01630; AVX2-NEXT: retq1631;1632; AVX512F-LABEL: load_sext_4i1_to_4i32:1633; AVX512F: # %bb.0: # %entry1634; AVX512F-NEXT: movzbl (%rdi), %eax1635; AVX512F-NEXT: kmovw %eax, %k11636; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -11637; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01638; AVX512F-NEXT: vzeroupper1639; AVX512F-NEXT: retq1640;1641; AVX512BW-LABEL: load_sext_4i1_to_4i32:1642; AVX512BW: # %bb.0: # %entry1643; AVX512BW-NEXT: movzbl (%rdi), %eax1644; AVX512BW-NEXT: kmovd %eax, %k11645; AVX512BW-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -11646; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01647; AVX512BW-NEXT: vzeroupper1648; AVX512BW-NEXT: retq1649;1650; X86-SSE2-LABEL: load_sext_4i1_to_4i32:1651; X86-SSE2: # %bb.0: # %entry1652; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax1653; X86-SSE2-NEXT: movzbl (%eax), %eax1654; X86-SSE2-NEXT: movl %eax, %ecx1655; X86-SSE2-NEXT: shrb $3, %cl1656; X86-SSE2-NEXT: movzbl %cl, %ecx1657; X86-SSE2-NEXT: negl %ecx1658; X86-SSE2-NEXT: movd %ecx, %xmm01659; X86-SSE2-NEXT: movl %eax, %ecx1660; X86-SSE2-NEXT: shrb $2, %cl1661; X86-SSE2-NEXT: movzbl %cl, %ecx1662; X86-SSE2-NEXT: andl $1, %ecx1663; X86-SSE2-NEXT: negl %ecx1664; X86-SSE2-NEXT: movd %ecx, %xmm11665; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]1666; X86-SSE2-NEXT: movzbl %al, %ecx1667; X86-SSE2-NEXT: andl $1, %ecx1668; X86-SSE2-NEXT: negl %ecx1669; X86-SSE2-NEXT: movd %ecx, %xmm01670; X86-SSE2-NEXT: shrb %al1671; X86-SSE2-NEXT: movzbl %al, %eax1672; X86-SSE2-NEXT: andl $1, %eax1673; X86-SSE2-NEXT: negl %eax1674; X86-SSE2-NEXT: movd %eax, %xmm21675; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]1676; X86-SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1677; X86-SSE2-NEXT: retl1678;1679; X86-SSE41-LABEL: load_sext_4i1_to_4i32:1680; X86-SSE41: # %bb.0: # %entry1681; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax1682; X86-SSE41-NEXT: movzbl (%eax), %eax1683; X86-SSE41-NEXT: movl %eax, %ecx1684; X86-SSE41-NEXT: shrb %cl1685; X86-SSE41-NEXT: movzbl %cl, %ecx1686; X86-SSE41-NEXT: andl $1, %ecx1687; X86-SSE41-NEXT: negl %ecx1688; X86-SSE41-NEXT: movzbl %al, %edx1689; X86-SSE41-NEXT: andl $1, %edx1690; X86-SSE41-NEXT: negl %edx1691; X86-SSE41-NEXT: movd %edx, %xmm01692; X86-SSE41-NEXT: pinsrd $1, %ecx, %xmm01693; X86-SSE41-NEXT: movl %eax, %ecx1694; X86-SSE41-NEXT: shrb $2, %cl1695; X86-SSE41-NEXT: movzbl %cl, %ecx1696; X86-SSE41-NEXT: andl $1, %ecx1697; X86-SSE41-NEXT: negl %ecx1698; X86-SSE41-NEXT: pinsrd $2, %ecx, %xmm01699; X86-SSE41-NEXT: shrb $3, %al1700; X86-SSE41-NEXT: movzbl %al, %eax1701; X86-SSE41-NEXT: negl %eax1702; X86-SSE41-NEXT: pinsrd $3, %eax, %xmm01703; X86-SSE41-NEXT: retl1704entry:1705 %X = load <4 x i1>, ptr %ptr1706 %Y = sext <4 x i1> %X to <4 x i32>1707 ret <4 x i32> %Y1708}1709 1710define <4 x i32> @load_sext_4i8_to_4i32(ptr%ptr) {1711; SSE2-LABEL: load_sext_4i8_to_4i32:1712; SSE2: # %bb.0: # %entry1713; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero1714; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1715; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]1716; SSE2-NEXT: psrad $24, %xmm01717; SSE2-NEXT: retq1718;1719; SSSE3-LABEL: load_sext_4i8_to_4i32:1720; SSSE3: # %bb.0: # %entry1721; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero1722; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1723; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]1724; SSSE3-NEXT: psrad $24, %xmm01725; SSSE3-NEXT: retq1726;1727; SSE41-LABEL: load_sext_4i8_to_4i32:1728; SSE41: # %bb.0: # %entry1729; SSE41-NEXT: pmovsxbd (%rdi), %xmm01730; SSE41-NEXT: retq1731;1732; AVX-LABEL: load_sext_4i8_to_4i32:1733; AVX: # %bb.0: # %entry1734; AVX-NEXT: vpmovsxbd (%rdi), %xmm01735; AVX-NEXT: retq1736;1737; X86-SSE2-LABEL: load_sext_4i8_to_4i32:1738; X86-SSE2: # %bb.0: # %entry1739; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax1740; X86-SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero1741; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1742; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]1743; X86-SSE2-NEXT: psrad $24, %xmm01744; X86-SSE2-NEXT: retl1745;1746; X86-SSE41-LABEL: load_sext_4i8_to_4i32:1747; X86-SSE41: # %bb.0: # %entry1748; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax1749; X86-SSE41-NEXT: pmovsxbd (%eax), %xmm01750; X86-SSE41-NEXT: retl1751entry:1752 %X = load <4 x i8>, ptr %ptr1753 %Y = sext <4 x i8> %X to <4 x i32>1754 ret <4 x i32> %Y1755}1756 1757define <4 x i64> @load_sext_4i1_to_4i64(ptr%ptr) {1758; SSE2-LABEL: load_sext_4i1_to_4i64:1759; SSE2: # %bb.0: # %entry1760; SSE2-NEXT: movzbl (%rdi), %eax1761; SSE2-NEXT: movl %eax, %ecx1762; SSE2-NEXT: shrb %cl1763; SSE2-NEXT: andb $1, %cl1764; SSE2-NEXT: movzbl %cl, %ecx1765; SSE2-NEXT: movl %eax, %edx1766; SSE2-NEXT: andb $1, %dl1767; SSE2-NEXT: movzbl %dl, %edx1768; SSE2-NEXT: movd %edx, %xmm11769; SSE2-NEXT: pinsrw $2, %ecx, %xmm11770; SSE2-NEXT: movl %eax, %ecx1771; SSE2-NEXT: shrb $2, %cl1772; SSE2-NEXT: andb $1, %cl1773; SSE2-NEXT: movzbl %cl, %ecx1774; SSE2-NEXT: pinsrw $4, %ecx, %xmm11775; SSE2-NEXT: shrb $3, %al1776; SSE2-NEXT: movzbl %al, %eax1777; SSE2-NEXT: pinsrw $6, %eax, %xmm11778; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,1,1]1779; SSE2-NEXT: pslld $31, %xmm01780; SSE2-NEXT: psrad $31, %xmm01781; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]1782; SSE2-NEXT: pslld $31, %xmm11783; SSE2-NEXT: psrad $31, %xmm11784; SSE2-NEXT: retq1785;1786; SSSE3-LABEL: load_sext_4i1_to_4i64:1787; SSSE3: # %bb.0: # %entry1788; SSSE3-NEXT: movzbl (%rdi), %eax1789; SSSE3-NEXT: movl %eax, %ecx1790; SSSE3-NEXT: shrb %cl1791; SSSE3-NEXT: andb $1, %cl1792; SSSE3-NEXT: movzbl %cl, %ecx1793; SSSE3-NEXT: movl %eax, %edx1794; SSSE3-NEXT: andb $1, %dl1795; SSSE3-NEXT: movzbl %dl, %edx1796; SSSE3-NEXT: movd %edx, %xmm11797; SSSE3-NEXT: pinsrw $2, %ecx, %xmm11798; SSSE3-NEXT: movl %eax, %ecx1799; SSSE3-NEXT: shrb $2, %cl1800; SSSE3-NEXT: andb $1, %cl1801; SSSE3-NEXT: movzbl %cl, %ecx1802; SSSE3-NEXT: pinsrw $4, %ecx, %xmm11803; SSSE3-NEXT: shrb $3, %al1804; SSSE3-NEXT: movzbl %al, %eax1805; SSSE3-NEXT: pinsrw $6, %eax, %xmm11806; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,1,1]1807; SSSE3-NEXT: pslld $31, %xmm01808; SSSE3-NEXT: psrad $31, %xmm01809; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]1810; SSSE3-NEXT: pslld $31, %xmm11811; SSSE3-NEXT: psrad $31, %xmm11812; SSSE3-NEXT: retq1813;1814; SSE41-LABEL: load_sext_4i1_to_4i64:1815; SSE41: # %bb.0: # %entry1816; SSE41-NEXT: movzbl (%rdi), %eax1817; SSE41-NEXT: movl %eax, %ecx1818; SSE41-NEXT: shrb %cl1819; SSE41-NEXT: andb $1, %cl1820; SSE41-NEXT: movzbl %cl, %ecx1821; SSE41-NEXT: movl %eax, %edx1822; SSE41-NEXT: andb $1, %dl1823; SSE41-NEXT: movzbl %dl, %edx1824; SSE41-NEXT: movd %edx, %xmm11825; SSE41-NEXT: pinsrb $4, %ecx, %xmm11826; SSE41-NEXT: movl %eax, %ecx1827; SSE41-NEXT: shrb $2, %cl1828; SSE41-NEXT: andb $1, %cl1829; SSE41-NEXT: movzbl %cl, %ecx1830; SSE41-NEXT: pinsrb $8, %ecx, %xmm11831; SSE41-NEXT: shrb $3, %al1832; SSE41-NEXT: movzbl %al, %eax1833; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,1,1]1834; SSE41-NEXT: pinsrb $12, %eax, %xmm11835; SSE41-NEXT: pslld $31, %xmm01836; SSE41-NEXT: psrad $31, %xmm01837; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]1838; SSE41-NEXT: pslld $31, %xmm11839; SSE41-NEXT: psrad $31, %xmm11840; SSE41-NEXT: retq1841;1842; AVX1-LABEL: load_sext_4i1_to_4i64:1843; AVX1: # %bb.0: # %entry1844; AVX1-NEXT: movzbl (%rdi), %eax1845; AVX1-NEXT: movzbl %al, %ecx1846; AVX1-NEXT: shrb %al1847; AVX1-NEXT: movzbl %al, %eax1848; AVX1-NEXT: andl $1, %eax1849; AVX1-NEXT: negl %eax1850; AVX1-NEXT: movl %ecx, %edx1851; AVX1-NEXT: andl $1, %edx1852; AVX1-NEXT: negl %edx1853; AVX1-NEXT: vmovd %edx, %xmm01854; AVX1-NEXT: vpinsrd $1, %eax, %xmm0, %xmm01855; AVX1-NEXT: movl %ecx, %eax1856; AVX1-NEXT: shrb $2, %al1857; AVX1-NEXT: movzbl %al, %eax1858; AVX1-NEXT: andl $1, %eax1859; AVX1-NEXT: negl %eax1860; AVX1-NEXT: vpinsrd $2, %eax, %xmm0, %xmm01861; AVX1-NEXT: shrb $3, %cl1862; AVX1-NEXT: movzbl %cl, %eax1863; AVX1-NEXT: negl %eax1864; AVX1-NEXT: vpinsrd $3, %eax, %xmm0, %xmm01865; AVX1-NEXT: vpmovsxdq %xmm0, %xmm11866; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]1867; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01868; AVX1-NEXT: retq1869;1870; AVX2-LABEL: load_sext_4i1_to_4i64:1871; AVX2: # %bb.0: # %entry1872; AVX2-NEXT: movzbl (%rdi), %eax1873; AVX2-NEXT: movl %eax, %ecx1874; AVX2-NEXT: shrb $3, %cl1875; AVX2-NEXT: movzbl %cl, %ecx1876; AVX2-NEXT: negq %rcx1877; AVX2-NEXT: vmovq %rcx, %xmm01878; AVX2-NEXT: movzbl %al, %ecx1879; AVX2-NEXT: shrb $2, %al1880; AVX2-NEXT: movzbl %al, %eax1881; AVX2-NEXT: andl $1, %eax1882; AVX2-NEXT: negq %rax1883; AVX2-NEXT: vmovq %rax, %xmm11884; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]1885; AVX2-NEXT: movl %ecx, %eax1886; AVX2-NEXT: andl $1, %eax1887; AVX2-NEXT: negq %rax1888; AVX2-NEXT: vmovq %rax, %xmm11889; AVX2-NEXT: shrb %cl1890; AVX2-NEXT: movzbl %cl, %eax1891; AVX2-NEXT: andl $1, %eax1892; AVX2-NEXT: negq %rax1893; AVX2-NEXT: vmovq %rax, %xmm21894; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]1895; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm01896; AVX2-NEXT: retq1897;1898; AVX512F-LABEL: load_sext_4i1_to_4i64:1899; AVX512F: # %bb.0: # %entry1900; AVX512F-NEXT: movzbl (%rdi), %eax1901; AVX512F-NEXT: kmovw %eax, %k11902; AVX512F-NEXT: vpternlogq {{.*#+}} zmm0 {%k1} {z} = -11903; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01904; AVX512F-NEXT: retq1905;1906; AVX512BW-LABEL: load_sext_4i1_to_4i64:1907; AVX512BW: # %bb.0: # %entry1908; AVX512BW-NEXT: movzbl (%rdi), %eax1909; AVX512BW-NEXT: kmovd %eax, %k11910; AVX512BW-NEXT: vpternlogq {{.*#+}} zmm0 {%k1} {z} = -11911; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01912; AVX512BW-NEXT: retq1913;1914; X86-SSE2-LABEL: load_sext_4i1_to_4i64:1915; X86-SSE2: # %bb.0: # %entry1916; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax1917; X86-SSE2-NEXT: movzbl (%eax), %eax1918; X86-SSE2-NEXT: movl %eax, %ecx1919; X86-SSE2-NEXT: shrb %cl1920; X86-SSE2-NEXT: andb $1, %cl1921; X86-SSE2-NEXT: movzbl %cl, %ecx1922; X86-SSE2-NEXT: movl %eax, %edx1923; X86-SSE2-NEXT: andb $1, %dl1924; X86-SSE2-NEXT: movzbl %dl, %edx1925; X86-SSE2-NEXT: movd %edx, %xmm11926; X86-SSE2-NEXT: pinsrw $2, %ecx, %xmm11927; X86-SSE2-NEXT: movl %eax, %ecx1928; X86-SSE2-NEXT: shrb $2, %cl1929; X86-SSE2-NEXT: andb $1, %cl1930; X86-SSE2-NEXT: movzbl %cl, %ecx1931; X86-SSE2-NEXT: pinsrw $4, %ecx, %xmm11932; X86-SSE2-NEXT: shrb $3, %al1933; X86-SSE2-NEXT: movzbl %al, %eax1934; X86-SSE2-NEXT: pinsrw $6, %eax, %xmm11935; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,1,1]1936; X86-SSE2-NEXT: pslld $31, %xmm01937; X86-SSE2-NEXT: psrad $31, %xmm01938; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]1939; X86-SSE2-NEXT: pslld $31, %xmm11940; X86-SSE2-NEXT: psrad $31, %xmm11941; X86-SSE2-NEXT: retl1942;1943; X86-SSE41-LABEL: load_sext_4i1_to_4i64:1944; X86-SSE41: # %bb.0: # %entry1945; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax1946; X86-SSE41-NEXT: movzbl (%eax), %eax1947; X86-SSE41-NEXT: movl %eax, %ecx1948; X86-SSE41-NEXT: shrb %cl1949; X86-SSE41-NEXT: andb $1, %cl1950; X86-SSE41-NEXT: movzbl %cl, %ecx1951; X86-SSE41-NEXT: movl %eax, %edx1952; X86-SSE41-NEXT: andb $1, %dl1953; X86-SSE41-NEXT: movzbl %dl, %edx1954; X86-SSE41-NEXT: movd %edx, %xmm11955; X86-SSE41-NEXT: pinsrb $4, %ecx, %xmm11956; X86-SSE41-NEXT: movl %eax, %ecx1957; X86-SSE41-NEXT: shrb $2, %cl1958; X86-SSE41-NEXT: andb $1, %cl1959; X86-SSE41-NEXT: movzbl %cl, %ecx1960; X86-SSE41-NEXT: pinsrb $8, %ecx, %xmm11961; X86-SSE41-NEXT: shrb $3, %al1962; X86-SSE41-NEXT: movzbl %al, %eax1963; X86-SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,1,1]1964; X86-SSE41-NEXT: pinsrb $12, %eax, %xmm11965; X86-SSE41-NEXT: pslld $31, %xmm01966; X86-SSE41-NEXT: psrad $31, %xmm01967; X86-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]1968; X86-SSE41-NEXT: pslld $31, %xmm11969; X86-SSE41-NEXT: psrad $31, %xmm11970; X86-SSE41-NEXT: retl1971entry:1972 %X = load <4 x i1>, ptr %ptr1973 %Y = sext <4 x i1> %X to <4 x i64>1974 ret <4 x i64> %Y1975}1976 1977define <4 x i64> @load_sext_4i8_to_4i64(ptr%ptr) {1978; SSE2-LABEL: load_sext_4i8_to_4i64:1979; SSE2: # %bb.0: # %entry1980; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero1981; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1982; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]1983; SSE2-NEXT: psrad $24, %xmm11984; SSE2-NEXT: pxor %xmm2, %xmm21985; SSE2-NEXT: pcmpgtd %xmm1, %xmm21986; SSE2-NEXT: movdqa %xmm1, %xmm01987; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]1988; SSE2-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]1989; SSE2-NEXT: retq1990;1991; SSSE3-LABEL: load_sext_4i8_to_4i64:1992; SSSE3: # %bb.0: # %entry1993; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero1994; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1995; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]1996; SSSE3-NEXT: psrad $24, %xmm11997; SSSE3-NEXT: pxor %xmm2, %xmm21998; SSSE3-NEXT: pcmpgtd %xmm1, %xmm21999; SSSE3-NEXT: movdqa %xmm1, %xmm02000; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]2001; SSSE3-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]2002; SSSE3-NEXT: retq2003;2004; SSE41-LABEL: load_sext_4i8_to_4i64:2005; SSE41: # %bb.0: # %entry2006; SSE41-NEXT: pmovsxbq (%rdi), %xmm02007; SSE41-NEXT: pmovsxbq 2(%rdi), %xmm12008; SSE41-NEXT: retq2009;2010; AVX1-LABEL: load_sext_4i8_to_4i64:2011; AVX1: # %bb.0: # %entry2012; AVX1-NEXT: vpmovsxbq 2(%rdi), %xmm02013; AVX1-NEXT: vpmovsxbq (%rdi), %xmm12014; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm02015; AVX1-NEXT: retq2016;2017; AVX2-LABEL: load_sext_4i8_to_4i64:2018; AVX2: # %bb.0: # %entry2019; AVX2-NEXT: vpmovsxbq (%rdi), %ymm02020; AVX2-NEXT: retq2021;2022; AVX512-LABEL: load_sext_4i8_to_4i64:2023; AVX512: # %bb.0: # %entry2024; AVX512-NEXT: vpmovsxbq (%rdi), %ymm02025; AVX512-NEXT: retq2026;2027; X86-SSE2-LABEL: load_sext_4i8_to_4i64:2028; X86-SSE2: # %bb.0: # %entry2029; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax2030; X86-SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero2031; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2032; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]2033; X86-SSE2-NEXT: psrad $24, %xmm12034; X86-SSE2-NEXT: pxor %xmm2, %xmm22035; X86-SSE2-NEXT: pcmpgtd %xmm1, %xmm22036; X86-SSE2-NEXT: movdqa %xmm1, %xmm02037; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]2038; X86-SSE2-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]2039; X86-SSE2-NEXT: retl2040;2041; X86-SSE41-LABEL: load_sext_4i8_to_4i64:2042; X86-SSE41: # %bb.0: # %entry2043; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax2044; X86-SSE41-NEXT: pmovsxbq (%eax), %xmm02045; X86-SSE41-NEXT: pmovsxbq 2(%eax), %xmm12046; X86-SSE41-NEXT: retl2047entry:2048 %X = load <4 x i8>, ptr %ptr2049 %Y = sext <4 x i8> %X to <4 x i64>2050 ret <4 x i64> %Y2051}2052 2053define <2 x i64> @load_sext_4i8_to_4i64_extract(ptr%ptr) {2054; SSE2-LABEL: load_sext_4i8_to_4i64_extract:2055; SSE2: # %bb.0:2056; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero2057; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2058; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]2059; SSE2-NEXT: psrad $24, %xmm02060; SSE2-NEXT: pxor %xmm1, %xmm12061; SSE2-NEXT: pcmpgtd %xmm0, %xmm12062; SSE2-NEXT: punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]2063; SSE2-NEXT: retq2064;2065; SSSE3-LABEL: load_sext_4i8_to_4i64_extract:2066; SSSE3: # %bb.0:2067; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero2068; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2069; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]2070; SSSE3-NEXT: psrad $24, %xmm02071; SSSE3-NEXT: pxor %xmm1, %xmm12072; SSSE3-NEXT: pcmpgtd %xmm0, %xmm12073; SSSE3-NEXT: punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]2074; SSSE3-NEXT: retq2075;2076; SSE41-LABEL: load_sext_4i8_to_4i64_extract:2077; SSE41: # %bb.0:2078; SSE41-NEXT: pmovsxbq 2(%rdi), %xmm02079; SSE41-NEXT: retq2080;2081; AVX1-LABEL: load_sext_4i8_to_4i64_extract:2082; AVX1: # %bb.0:2083; AVX1-NEXT: vpmovsxbq 2(%rdi), %xmm02084; AVX1-NEXT: retq2085;2086; AVX2-LABEL: load_sext_4i8_to_4i64_extract:2087; AVX2: # %bb.0:2088; AVX2-NEXT: vpmovsxbq (%rdi), %ymm02089; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm02090; AVX2-NEXT: vzeroupper2091; AVX2-NEXT: retq2092;2093; AVX512-LABEL: load_sext_4i8_to_4i64_extract:2094; AVX512: # %bb.0:2095; AVX512-NEXT: vpmovsxbq (%rdi), %ymm02096; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm02097; AVX512-NEXT: vzeroupper2098; AVX512-NEXT: retq2099;2100; X86-SSE2-LABEL: load_sext_4i8_to_4i64_extract:2101; X86-SSE2: # %bb.0:2102; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax2103; X86-SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero2104; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2105; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]2106; X86-SSE2-NEXT: psrad $24, %xmm02107; X86-SSE2-NEXT: pxor %xmm1, %xmm12108; X86-SSE2-NEXT: pcmpgtd %xmm0, %xmm12109; X86-SSE2-NEXT: punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]2110; X86-SSE2-NEXT: retl2111;2112; X86-SSE41-LABEL: load_sext_4i8_to_4i64_extract:2113; X86-SSE41: # %bb.0:2114; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax2115; X86-SSE41-NEXT: pmovsxbq 2(%eax), %xmm02116; X86-SSE41-NEXT: retl2117 %ld = load <4 x i8>, ptr %ptr2118 %sext = sext <4 x i8> %ld to <4 x i64>2119 %extract = shufflevector <4 x i64> %sext, <4 x i64> undef, <2 x i32> <i32 2, i32 3>2120 ret <2 x i64> %extract2121}2122 2123define <8 x i16> @load_sext_8i1_to_8i16(ptr%ptr) {2124; SSE2-LABEL: load_sext_8i1_to_8i16:2125; SSE2: # %bb.0: # %entry2126; SSE2-NEXT: movzbl (%rdi), %eax2127; SSE2-NEXT: movd %eax, %xmm02128; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]2129; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]2130; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]2131; SSE2-NEXT: pand %xmm1, %xmm02132; SSE2-NEXT: pcmpeqw %xmm1, %xmm02133; SSE2-NEXT: retq2134;2135; SSSE3-LABEL: load_sext_8i1_to_8i16:2136; SSSE3: # %bb.0: # %entry2137; SSSE3-NEXT: movzbl (%rdi), %eax2138; SSSE3-NEXT: movd %eax, %xmm02139; SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]2140; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]2141; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]2142; SSSE3-NEXT: pand %xmm1, %xmm02143; SSSE3-NEXT: pcmpeqw %xmm1, %xmm02144; SSSE3-NEXT: retq2145;2146; SSE41-LABEL: load_sext_8i1_to_8i16:2147; SSE41: # %bb.0: # %entry2148; SSE41-NEXT: movzbl (%rdi), %eax2149; SSE41-NEXT: movd %eax, %xmm02150; SSE41-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]2151; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]2152; SSE41-NEXT: pmovzxbw {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]2153; SSE41-NEXT: pand %xmm1, %xmm02154; SSE41-NEXT: pcmpeqw %xmm1, %xmm02155; SSE41-NEXT: retq2156;2157; AVX1-LABEL: load_sext_8i1_to_8i16:2158; AVX1: # %bb.0: # %entry2159; AVX1-NEXT: movzbl (%rdi), %eax2160; AVX1-NEXT: vmovd %eax, %xmm02161; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]2162; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]2163; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]2164; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm02165; AVX1-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm02166; AVX1-NEXT: retq2167;2168; AVX2-LABEL: load_sext_8i1_to_8i16:2169; AVX2: # %bb.0: # %entry2170; AVX2-NEXT: vpbroadcastb (%rdi), %xmm02171; AVX2-NEXT: vpmovzxbw {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]2172; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm02173; AVX2-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm02174; AVX2-NEXT: retq2175;2176; AVX512F-LABEL: load_sext_8i1_to_8i16:2177; AVX512F: # %bb.0: # %entry2178; AVX512F-NEXT: movzbl (%rdi), %eax2179; AVX512F-NEXT: kmovw %eax, %k12180; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -12181; AVX512F-NEXT: vpmovdw %zmm0, %ymm02182; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm02183; AVX512F-NEXT: vzeroupper2184; AVX512F-NEXT: retq2185;2186; AVX512BW-LABEL: load_sext_8i1_to_8i16:2187; AVX512BW: # %bb.0: # %entry2188; AVX512BW-NEXT: movzbl (%rdi), %eax2189; AVX512BW-NEXT: kmovd %eax, %k02190; AVX512BW-NEXT: vpmovm2w %k0, %zmm02191; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm02192; AVX512BW-NEXT: vzeroupper2193; AVX512BW-NEXT: retq2194;2195; X86-SSE2-LABEL: load_sext_8i1_to_8i16:2196; X86-SSE2: # %bb.0: # %entry2197; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax2198; X86-SSE2-NEXT: movzbl (%eax), %eax2199; X86-SSE2-NEXT: movd %eax, %xmm02200; X86-SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]2201; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]2202; X86-SSE2-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]2203; X86-SSE2-NEXT: pand %xmm1, %xmm02204; X86-SSE2-NEXT: pcmpeqw %xmm1, %xmm02205; X86-SSE2-NEXT: retl2206;2207; X86-SSE41-LABEL: load_sext_8i1_to_8i16:2208; X86-SSE41: # %bb.0: # %entry2209; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax2210; X86-SSE41-NEXT: movzbl (%eax), %eax2211; X86-SSE41-NEXT: movd %eax, %xmm02212; X86-SSE41-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]2213; X86-SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]2214; X86-SSE41-NEXT: pmovzxbw {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]2215; X86-SSE41-NEXT: pand %xmm1, %xmm02216; X86-SSE41-NEXT: pcmpeqw %xmm1, %xmm02217; X86-SSE41-NEXT: retl2218entry:2219 %X = load <8 x i1>, ptr %ptr2220 %Y = sext <8 x i1> %X to <8 x i16>2221 ret <8 x i16> %Y2222}2223 2224define <8 x i16> @load_sext_8i8_to_8i16(ptr%ptr) {2225; SSE2-LABEL: load_sext_8i8_to_8i16:2226; SSE2: # %bb.0: # %entry2227; SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero2228; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2229; SSE2-NEXT: psraw $8, %xmm02230; SSE2-NEXT: retq2231;2232; SSSE3-LABEL: load_sext_8i8_to_8i16:2233; SSSE3: # %bb.0: # %entry2234; SSSE3-NEXT: movq {{.*#+}} xmm0 = mem[0],zero2235; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2236; SSSE3-NEXT: psraw $8, %xmm02237; SSSE3-NEXT: retq2238;2239; SSE41-LABEL: load_sext_8i8_to_8i16:2240; SSE41: # %bb.0: # %entry2241; SSE41-NEXT: pmovsxbw (%rdi), %xmm02242; SSE41-NEXT: retq2243;2244; AVX-LABEL: load_sext_8i8_to_8i16:2245; AVX: # %bb.0: # %entry2246; AVX-NEXT: vpmovsxbw (%rdi), %xmm02247; AVX-NEXT: retq2248;2249; X86-SSE2-LABEL: load_sext_8i8_to_8i16:2250; X86-SSE2: # %bb.0: # %entry2251; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax2252; X86-SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero2253; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2254; X86-SSE2-NEXT: psraw $8, %xmm02255; X86-SSE2-NEXT: retl2256;2257; X86-SSE41-LABEL: load_sext_8i8_to_8i16:2258; X86-SSE41: # %bb.0: # %entry2259; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax2260; X86-SSE41-NEXT: pmovsxbw (%eax), %xmm02261; X86-SSE41-NEXT: retl2262entry:2263 %X = load <8 x i8>, ptr %ptr2264 %Y = sext <8 x i8> %X to <8 x i16>2265 ret <8 x i16> %Y2266}2267 2268define <8 x i64> @load_sext_8i8_to_8i64(ptr%ptr) {2269; SSE2-LABEL: load_sext_8i8_to_8i64:2270; SSE2: # %bb.0: # %entry2271; SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero2272; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]2273; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]2274; SSE2-NEXT: psrad $24, %xmm12275; SSE2-NEXT: pxor %xmm4, %xmm42276; SSE2-NEXT: pxor %xmm3, %xmm32277; SSE2-NEXT: pcmpgtd %xmm1, %xmm32278; SSE2-NEXT: movdqa %xmm1, %xmm02279; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]2280; SSE2-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]2281; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]2282; SSE2-NEXT: psrad $24, %xmm32283; SSE2-NEXT: pcmpgtd %xmm3, %xmm42284; SSE2-NEXT: movdqa %xmm3, %xmm22285; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]2286; SSE2-NEXT: punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3]2287; SSE2-NEXT: retq2288;2289; SSSE3-LABEL: load_sext_8i8_to_8i64:2290; SSSE3: # %bb.0: # %entry2291; SSSE3-NEXT: movq {{.*#+}} xmm0 = mem[0],zero2292; SSSE3-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]2293; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]2294; SSSE3-NEXT: psrad $24, %xmm12295; SSSE3-NEXT: pxor %xmm4, %xmm42296; SSSE3-NEXT: pxor %xmm3, %xmm32297; SSSE3-NEXT: pcmpgtd %xmm1, %xmm32298; SSSE3-NEXT: movdqa %xmm1, %xmm02299; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]2300; SSSE3-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]2301; SSSE3-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]2302; SSSE3-NEXT: psrad $24, %xmm32303; SSSE3-NEXT: pcmpgtd %xmm3, %xmm42304; SSSE3-NEXT: movdqa %xmm3, %xmm22305; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]2306; SSSE3-NEXT: punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3]2307; SSSE3-NEXT: retq2308;2309; SSE41-LABEL: load_sext_8i8_to_8i64:2310; SSE41: # %bb.0: # %entry2311; SSE41-NEXT: pmovsxbq (%rdi), %xmm02312; SSE41-NEXT: pmovsxbq 2(%rdi), %xmm12313; SSE41-NEXT: pmovsxbq 4(%rdi), %xmm22314; SSE41-NEXT: pmovsxbq 6(%rdi), %xmm32315; SSE41-NEXT: retq2316;2317; AVX1-LABEL: load_sext_8i8_to_8i64:2318; AVX1: # %bb.0: # %entry2319; AVX1-NEXT: vpmovsxbq 6(%rdi), %xmm12320; AVX1-NEXT: vpmovsxbq 4(%rdi), %xmm22321; AVX1-NEXT: vpmovsxbq 2(%rdi), %xmm02322; AVX1-NEXT: vpmovsxbq (%rdi), %xmm32323; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm3, %ymm02324; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm12325; AVX1-NEXT: retq2326;2327; AVX2-LABEL: load_sext_8i8_to_8i64:2328; AVX2: # %bb.0: # %entry2329; AVX2-NEXT: vpmovsxbq (%rdi), %ymm02330; AVX2-NEXT: vpmovsxbq 4(%rdi), %ymm12331; AVX2-NEXT: retq2332;2333; AVX512-LABEL: load_sext_8i8_to_8i64:2334; AVX512: # %bb.0: # %entry2335; AVX512-NEXT: vpmovsxbq (%rdi), %zmm02336; AVX512-NEXT: retq2337;2338; X86-SSE2-LABEL: load_sext_8i8_to_8i64:2339; X86-SSE2: # %bb.0: # %entry2340; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax2341; X86-SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero2342; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]2343; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]2344; X86-SSE2-NEXT: psrad $24, %xmm12345; X86-SSE2-NEXT: pxor %xmm4, %xmm42346; X86-SSE2-NEXT: pxor %xmm3, %xmm32347; X86-SSE2-NEXT: pcmpgtd %xmm1, %xmm32348; X86-SSE2-NEXT: movdqa %xmm1, %xmm02349; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]2350; X86-SSE2-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]2351; X86-SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]2352; X86-SSE2-NEXT: psrad $24, %xmm32353; X86-SSE2-NEXT: pcmpgtd %xmm3, %xmm42354; X86-SSE2-NEXT: movdqa %xmm3, %xmm22355; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]2356; X86-SSE2-NEXT: punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3]2357; X86-SSE2-NEXT: retl2358;2359; X86-SSE41-LABEL: load_sext_8i8_to_8i64:2360; X86-SSE41: # %bb.0: # %entry2361; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax2362; X86-SSE41-NEXT: pmovsxbq (%eax), %xmm02363; X86-SSE41-NEXT: pmovsxbq 2(%eax), %xmm12364; X86-SSE41-NEXT: pmovsxbq 4(%eax), %xmm22365; X86-SSE41-NEXT: pmovsxbq 6(%eax), %xmm32366; X86-SSE41-NEXT: retl2367entry:2368 %X = load <8 x i8>, ptr %ptr2369 %Y = sext <8 x i8> %X to <8 x i64>2370 ret <8 x i64> %Y2371}2372 2373define <8 x i32> @load_sext_8i1_to_8i32(ptr%ptr) {2374; SSE2-LABEL: load_sext_8i1_to_8i32:2375; SSE2: # %bb.0: # %entry2376; SSE2-NEXT: movzbl (%rdi), %eax2377; SSE2-NEXT: movd %eax, %xmm02378; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,0,0]2379; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [1,2,4,8]2380; SSE2-NEXT: movdqa %xmm1, %xmm02381; SSE2-NEXT: pand %xmm2, %xmm02382; SSE2-NEXT: pcmpeqd %xmm2, %xmm02383; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [16,32,64,128]2384; SSE2-NEXT: pand %xmm2, %xmm12385; SSE2-NEXT: pcmpeqd %xmm2, %xmm12386; SSE2-NEXT: retq2387;2388; SSSE3-LABEL: load_sext_8i1_to_8i32:2389; SSSE3: # %bb.0: # %entry2390; SSSE3-NEXT: movzbl (%rdi), %eax2391; SSSE3-NEXT: movd %eax, %xmm02392; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,0,0]2393; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [1,2,4,8]2394; SSSE3-NEXT: movdqa %xmm1, %xmm02395; SSSE3-NEXT: pand %xmm2, %xmm02396; SSSE3-NEXT: pcmpeqd %xmm2, %xmm02397; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [16,32,64,128]2398; SSSE3-NEXT: pand %xmm2, %xmm12399; SSSE3-NEXT: pcmpeqd %xmm2, %xmm12400; SSSE3-NEXT: retq2401;2402; SSE41-LABEL: load_sext_8i1_to_8i32:2403; SSE41: # %bb.0: # %entry2404; SSE41-NEXT: movzbl (%rdi), %eax2405; SSE41-NEXT: movd %eax, %xmm02406; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,0,0]2407; SSE41-NEXT: pmovsxbd {{.*#+}} xmm2 = [1,2,4,8]2408; SSE41-NEXT: movdqa %xmm1, %xmm02409; SSE41-NEXT: pand %xmm2, %xmm02410; SSE41-NEXT: pcmpeqd %xmm2, %xmm02411; SSE41-NEXT: pmovzxbd {{.*#+}} xmm2 = [16,32,64,128]2412; SSE41-NEXT: pand %xmm2, %xmm12413; SSE41-NEXT: pcmpeqd %xmm2, %xmm12414; SSE41-NEXT: retq2415;2416; AVX1-LABEL: load_sext_8i1_to_8i32:2417; AVX1: # %bb.0: # %entry2418; AVX1-NEXT: movzbl (%rdi), %eax2419; AVX1-NEXT: vmovd %eax, %xmm02420; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]2421; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm02422; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02423; AVX1-NEXT: vcvtdq2ps %ymm0, %ymm02424; AVX1-NEXT: vcmpeqps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02425; AVX1-NEXT: retq2426;2427; AVX2-LABEL: load_sext_8i1_to_8i32:2428; AVX2: # %bb.0: # %entry2429; AVX2-NEXT: vpbroadcastb (%rdi), %ymm02430; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128]2431; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm02432; AVX2-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm02433; AVX2-NEXT: retq2434;2435; AVX512F-LABEL: load_sext_8i1_to_8i32:2436; AVX512F: # %bb.0: # %entry2437; AVX512F-NEXT: movzbl (%rdi), %eax2438; AVX512F-NEXT: kmovw %eax, %k12439; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -12440; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm02441; AVX512F-NEXT: retq2442;2443; AVX512BW-LABEL: load_sext_8i1_to_8i32:2444; AVX512BW: # %bb.0: # %entry2445; AVX512BW-NEXT: movzbl (%rdi), %eax2446; AVX512BW-NEXT: kmovd %eax, %k12447; AVX512BW-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -12448; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm02449; AVX512BW-NEXT: retq2450;2451; X86-SSE2-LABEL: load_sext_8i1_to_8i32:2452; X86-SSE2: # %bb.0: # %entry2453; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax2454; X86-SSE2-NEXT: movzbl (%eax), %eax2455; X86-SSE2-NEXT: movd %eax, %xmm02456; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,0,0]2457; X86-SSE2-NEXT: movdqa {{.*#+}} xmm2 = [1,2,4,8]2458; X86-SSE2-NEXT: movdqa %xmm1, %xmm02459; X86-SSE2-NEXT: pand %xmm2, %xmm02460; X86-SSE2-NEXT: pcmpeqd %xmm2, %xmm02461; X86-SSE2-NEXT: movdqa {{.*#+}} xmm2 = [16,32,64,128]2462; X86-SSE2-NEXT: pand %xmm2, %xmm12463; X86-SSE2-NEXT: pcmpeqd %xmm2, %xmm12464; X86-SSE2-NEXT: retl2465;2466; X86-SSE41-LABEL: load_sext_8i1_to_8i32:2467; X86-SSE41: # %bb.0: # %entry2468; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax2469; X86-SSE41-NEXT: movzbl (%eax), %eax2470; X86-SSE41-NEXT: movd %eax, %xmm02471; X86-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,0,0]2472; X86-SSE41-NEXT: pmovsxbd {{.*#+}} xmm2 = [1,2,4,8]2473; X86-SSE41-NEXT: movdqa %xmm1, %xmm02474; X86-SSE41-NEXT: pand %xmm2, %xmm02475; X86-SSE41-NEXT: pcmpeqd %xmm2, %xmm02476; X86-SSE41-NEXT: pmovzxbd {{.*#+}} xmm2 = [16,32,64,128]2477; X86-SSE41-NEXT: pand %xmm2, %xmm12478; X86-SSE41-NEXT: pcmpeqd %xmm2, %xmm12479; X86-SSE41-NEXT: retl2480entry:2481 %X = load <8 x i1>, ptr %ptr2482 %Y = sext <8 x i1> %X to <8 x i32>2483 ret <8 x i32> %Y2484}2485 2486define <8 x i32> @load_sext_8i8_to_8i32(ptr%ptr) {2487; SSE2-LABEL: load_sext_8i8_to_8i32:2488; SSE2: # %bb.0: # %entry2489; SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero2490; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]2491; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]2492; SSE2-NEXT: psrad $24, %xmm02493; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]2494; SSE2-NEXT: psrad $24, %xmm12495; SSE2-NEXT: retq2496;2497; SSSE3-LABEL: load_sext_8i8_to_8i32:2498; SSSE3: # %bb.0: # %entry2499; SSSE3-NEXT: movq {{.*#+}} xmm0 = mem[0],zero2500; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]2501; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]2502; SSSE3-NEXT: psrad $24, %xmm02503; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]2504; SSSE3-NEXT: psrad $24, %xmm12505; SSSE3-NEXT: retq2506;2507; SSE41-LABEL: load_sext_8i8_to_8i32:2508; SSE41: # %bb.0: # %entry2509; SSE41-NEXT: pmovsxbd (%rdi), %xmm02510; SSE41-NEXT: pmovsxbd 4(%rdi), %xmm12511; SSE41-NEXT: retq2512;2513; AVX1-LABEL: load_sext_8i8_to_8i32:2514; AVX1: # %bb.0: # %entry2515; AVX1-NEXT: vpmovsxbd 4(%rdi), %xmm02516; AVX1-NEXT: vpmovsxbd (%rdi), %xmm12517; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm02518; AVX1-NEXT: retq2519;2520; AVX2-LABEL: load_sext_8i8_to_8i32:2521; AVX2: # %bb.0: # %entry2522; AVX2-NEXT: vpmovsxbd (%rdi), %ymm02523; AVX2-NEXT: retq2524;2525; AVX512-LABEL: load_sext_8i8_to_8i32:2526; AVX512: # %bb.0: # %entry2527; AVX512-NEXT: vpmovsxbd (%rdi), %ymm02528; AVX512-NEXT: retq2529;2530; X86-SSE2-LABEL: load_sext_8i8_to_8i32:2531; X86-SSE2: # %bb.0: # %entry2532; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax2533; X86-SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero2534; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]2535; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]2536; X86-SSE2-NEXT: psrad $24, %xmm02537; X86-SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]2538; X86-SSE2-NEXT: psrad $24, %xmm12539; X86-SSE2-NEXT: retl2540;2541; X86-SSE41-LABEL: load_sext_8i8_to_8i32:2542; X86-SSE41: # %bb.0: # %entry2543; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax2544; X86-SSE41-NEXT: pmovsxbd (%eax), %xmm02545; X86-SSE41-NEXT: pmovsxbd 4(%eax), %xmm12546; X86-SSE41-NEXT: retl2547entry:2548 %X = load <8 x i8>, ptr %ptr2549 %Y = sext <8 x i8> %X to <8 x i32>2550 ret <8 x i32> %Y2551}2552 2553define <16 x i8> @load_sext_16i1_to_16i8(ptr%ptr) nounwind readnone {2554; SSE2-LABEL: load_sext_16i1_to_16i8:2555; SSE2: # %bb.0: # %entry2556; SSE2-NEXT: movzwl (%rdi), %eax2557; SSE2-NEXT: movd %eax, %xmm02558; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2559; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,1,1,4,5,6,7]2560; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]2561; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]2562; SSE2-NEXT: pand %xmm1, %xmm02563; SSE2-NEXT: pcmpeqb %xmm1, %xmm02564; SSE2-NEXT: retq2565;2566; SSSE3-LABEL: load_sext_16i1_to_16i8:2567; SSSE3: # %bb.0: # %entry2568; SSSE3-NEXT: movzwl (%rdi), %eax2569; SSSE3-NEXT: movd %eax, %xmm02570; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]2571; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]2572; SSSE3-NEXT: pand %xmm1, %xmm02573; SSSE3-NEXT: pcmpeqb %xmm1, %xmm02574; SSSE3-NEXT: retq2575;2576; SSE41-LABEL: load_sext_16i1_to_16i8:2577; SSE41: # %bb.0: # %entry2578; SSE41-NEXT: movzwl (%rdi), %eax2579; SSE41-NEXT: movd %eax, %xmm02580; SSE41-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]2581; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]2582; SSE41-NEXT: pand %xmm1, %xmm02583; SSE41-NEXT: pcmpeqb %xmm1, %xmm02584; SSE41-NEXT: retq2585;2586; AVX1-LABEL: load_sext_16i1_to_16i8:2587; AVX1: # %bb.0: # %entry2588; AVX1-NEXT: movzwl (%rdi), %eax2589; AVX1-NEXT: vmovd %eax, %xmm02590; AVX1-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]2591; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]2592; AVX1-NEXT: # xmm1 = mem[0,0]2593; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm02594; AVX1-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm02595; AVX1-NEXT: retq2596;2597; AVX2-LABEL: load_sext_16i1_to_16i8:2598; AVX2: # %bb.0: # %entry2599; AVX2-NEXT: vpbroadcastw (%rdi), %xmm02600; AVX2-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3]2601; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]2602; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm02603; AVX2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm02604; AVX2-NEXT: retq2605;2606; AVX512F-LABEL: load_sext_16i1_to_16i8:2607; AVX512F: # %bb.0: # %entry2608; AVX512F-NEXT: kmovw (%rdi), %k12609; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -12610; AVX512F-NEXT: vpmovdb %zmm0, %xmm02611; AVX512F-NEXT: vzeroupper2612; AVX512F-NEXT: retq2613;2614; AVX512BW-LABEL: load_sext_16i1_to_16i8:2615; AVX512BW: # %bb.0: # %entry2616; AVX512BW-NEXT: kmovw (%rdi), %k02617; AVX512BW-NEXT: vpmovm2b %k0, %zmm02618; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm02619; AVX512BW-NEXT: vzeroupper2620; AVX512BW-NEXT: retq2621;2622; X86-SSE2-LABEL: load_sext_16i1_to_16i8:2623; X86-SSE2: # %bb.0: # %entry2624; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax2625; X86-SSE2-NEXT: movzwl (%eax), %eax2626; X86-SSE2-NEXT: movd %eax, %xmm02627; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2628; X86-SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,1,1,4,5,6,7]2629; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]2630; X86-SSE2-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]2631; X86-SSE2-NEXT: pand %xmm1, %xmm02632; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm02633; X86-SSE2-NEXT: retl2634;2635; X86-SSE41-LABEL: load_sext_16i1_to_16i8:2636; X86-SSE41: # %bb.0: # %entry2637; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax2638; X86-SSE41-NEXT: movzwl (%eax), %eax2639; X86-SSE41-NEXT: movd %eax, %xmm02640; X86-SSE41-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]2641; X86-SSE41-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]2642; X86-SSE41-NEXT: pand %xmm1, %xmm02643; X86-SSE41-NEXT: pcmpeqb %xmm1, %xmm02644; X86-SSE41-NEXT: retl2645entry:2646 %X = load <16 x i1>, ptr %ptr2647 %Y = sext <16 x i1> %X to <16 x i8>2648 ret <16 x i8> %Y2649}2650 2651define <16 x i16> @load_sext_16i1_to_16i16(ptr%ptr) {2652; SSE2-LABEL: load_sext_16i1_to_16i16:2653; SSE2: # %bb.0: # %entry2654; SSE2-NEXT: movzwl (%rdi), %eax2655; SSE2-NEXT: movd %eax, %xmm02656; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]2657; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]2658; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128]2659; SSE2-NEXT: movdqa %xmm1, %xmm02660; SSE2-NEXT: pand %xmm2, %xmm02661; SSE2-NEXT: pcmpeqw %xmm2, %xmm02662; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [256,512,1024,2048,4096,8192,16384,32768]2663; SSE2-NEXT: pand %xmm2, %xmm12664; SSE2-NEXT: pcmpeqw %xmm2, %xmm12665; SSE2-NEXT: retq2666;2667; SSSE3-LABEL: load_sext_16i1_to_16i16:2668; SSSE3: # %bb.0: # %entry2669; SSSE3-NEXT: movzwl (%rdi), %eax2670; SSSE3-NEXT: movd %eax, %xmm02671; SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]2672; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]2673; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128]2674; SSSE3-NEXT: movdqa %xmm1, %xmm02675; SSSE3-NEXT: pand %xmm2, %xmm02676; SSSE3-NEXT: pcmpeqw %xmm2, %xmm02677; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [256,512,1024,2048,4096,8192,16384,32768]2678; SSSE3-NEXT: pand %xmm2, %xmm12679; SSSE3-NEXT: pcmpeqw %xmm2, %xmm12680; SSSE3-NEXT: retq2681;2682; SSE41-LABEL: load_sext_16i1_to_16i16:2683; SSE41: # %bb.0: # %entry2684; SSE41-NEXT: movzwl (%rdi), %eax2685; SSE41-NEXT: movd %eax, %xmm02686; SSE41-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]2687; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]2688; SSE41-NEXT: pmovzxbw {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128]2689; SSE41-NEXT: movdqa %xmm1, %xmm02690; SSE41-NEXT: pand %xmm2, %xmm02691; SSE41-NEXT: pcmpeqw %xmm2, %xmm02692; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [256,512,1024,2048,4096,8192,16384,32768]2693; SSE41-NEXT: pand %xmm2, %xmm12694; SSE41-NEXT: pcmpeqw %xmm2, %xmm12695; SSE41-NEXT: retq2696;2697; AVX1-LABEL: load_sext_16i1_to_16i16:2698; AVX1: # %bb.0: # %entry2699; AVX1-NEXT: movzwl (%rdi), %eax2700; AVX1-NEXT: vmovd %eax, %xmm02701; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]2702; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]2703; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm02704; AVX1-NEXT: vmovaps {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]2705; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm02706; AVX1-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm12707; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm02708; AVX1-NEXT: vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02709; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm02710; AVX1-NEXT: retq2711;2712; AVX2-LABEL: load_sext_16i1_to_16i16:2713; AVX2: # %bb.0: # %entry2714; AVX2-NEXT: vpbroadcastw (%rdi), %ymm02715; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]2716; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm02717; AVX2-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm02718; AVX2-NEXT: retq2719;2720; AVX512F-LABEL: load_sext_16i1_to_16i16:2721; AVX512F: # %bb.0: # %entry2722; AVX512F-NEXT: kmovw (%rdi), %k12723; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -12724; AVX512F-NEXT: vpmovdw %zmm0, %ymm02725; AVX512F-NEXT: retq2726;2727; AVX512BW-LABEL: load_sext_16i1_to_16i16:2728; AVX512BW: # %bb.0: # %entry2729; AVX512BW-NEXT: kmovw (%rdi), %k02730; AVX512BW-NEXT: vpmovm2w %k0, %zmm02731; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm02732; AVX512BW-NEXT: retq2733;2734; X86-SSE2-LABEL: load_sext_16i1_to_16i16:2735; X86-SSE2: # %bb.0: # %entry2736; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax2737; X86-SSE2-NEXT: movzwl (%eax), %eax2738; X86-SSE2-NEXT: movd %eax, %xmm02739; X86-SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]2740; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]2741; X86-SSE2-NEXT: movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128]2742; X86-SSE2-NEXT: movdqa %xmm1, %xmm02743; X86-SSE2-NEXT: pand %xmm2, %xmm02744; X86-SSE2-NEXT: pcmpeqw %xmm2, %xmm02745; X86-SSE2-NEXT: movdqa {{.*#+}} xmm2 = [256,512,1024,2048,4096,8192,16384,32768]2746; X86-SSE2-NEXT: pand %xmm2, %xmm12747; X86-SSE2-NEXT: pcmpeqw %xmm2, %xmm12748; X86-SSE2-NEXT: retl2749;2750; X86-SSE41-LABEL: load_sext_16i1_to_16i16:2751; X86-SSE41: # %bb.0: # %entry2752; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax2753; X86-SSE41-NEXT: movzwl (%eax), %eax2754; X86-SSE41-NEXT: movd %eax, %xmm02755; X86-SSE41-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]2756; X86-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]2757; X86-SSE41-NEXT: pmovzxbw {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128]2758; X86-SSE41-NEXT: movdqa %xmm1, %xmm02759; X86-SSE41-NEXT: pand %xmm2, %xmm02760; X86-SSE41-NEXT: pcmpeqw %xmm2, %xmm02761; X86-SSE41-NEXT: movdqa {{.*#+}} xmm2 = [256,512,1024,2048,4096,8192,16384,32768]2762; X86-SSE41-NEXT: pand %xmm2, %xmm12763; X86-SSE41-NEXT: pcmpeqw %xmm2, %xmm12764; X86-SSE41-NEXT: retl2765entry:2766 %X = load <16 x i1>, ptr %ptr2767 %Y = sext <16 x i1> %X to <16 x i16>2768 ret <16 x i16> %Y2769}2770 2771define <32 x i8> @load_sext_32i1_to_32i8(ptr%ptr) nounwind readnone {2772; SSE-LABEL: load_sext_32i1_to_32i8:2773; SSE: # %bb.0: # %entry2774; SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero2775; SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2776; SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm1[0,0,1,1,4,5,6,7]2777; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]2778; SSE-NEXT: movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]2779; SSE-NEXT: pand %xmm2, %xmm02780; SSE-NEXT: pcmpeqb %xmm2, %xmm02781; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[2,2,3,3,4,5,6,7]2782; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]2783; SSE-NEXT: pand %xmm2, %xmm12784; SSE-NEXT: pcmpeqb %xmm2, %xmm12785; SSE-NEXT: retq2786;2787; AVX1-LABEL: load_sext_32i1_to_32i8:2788; AVX1: # %bb.0: # %entry2789; AVX1-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero2790; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2791; AVX1-NEXT: vpshuflw {{.*#+}} xmm1 = xmm0[0,0,1,1,4,5,6,7]2792; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[2,2,3,3,4,5,6,7]2793; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm02794; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,0,1,1,4,4,5,5]2795; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02796; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm12797; AVX1-NEXT: vmovddup {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]2798; AVX1-NEXT: # xmm2 = mem[0,0]2799; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm12800; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm02801; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm02802; AVX1-NEXT: retq2803;2804; AVX2-LABEL: load_sext_32i1_to_32i8:2805; AVX2: # %bb.0: # %entry2806; AVX2-NEXT: vpbroadcastd (%rdi), %ymm02807; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,0,0,0,0,0,0,0,9,9,9,9,9,9,9,9,18,18,18,18,18,18,18,18,27,27,27,27,27,27,27,27]2808; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]2809; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm02810; AVX2-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm02811; AVX2-NEXT: retq2812;2813; AVX512F-LABEL: load_sext_32i1_to_32i8:2814; AVX512F: # %bb.0: # %entry2815; AVX512F-NEXT: kmovw (%rdi), %k12816; AVX512F-NEXT: kmovw 2(%rdi), %k22817; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -12818; AVX512F-NEXT: vpmovdb %zmm0, %xmm02819; AVX512F-NEXT: vpternlogd {{.*#+}} zmm1 {%k2} {z} = -12820; AVX512F-NEXT: vpmovdb %zmm1, %xmm12821; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm02822; AVX512F-NEXT: retq2823;2824; AVX512BW-LABEL: load_sext_32i1_to_32i8:2825; AVX512BW: # %bb.0: # %entry2826; AVX512BW-NEXT: kmovd (%rdi), %k02827; AVX512BW-NEXT: vpmovm2b %k0, %zmm02828; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm02829; AVX512BW-NEXT: retq2830;2831; X86-SSE-LABEL: load_sext_32i1_to_32i8:2832; X86-SSE: # %bb.0: # %entry2833; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax2834; X86-SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero2835; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2836; X86-SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm1[0,0,1,1,4,5,6,7]2837; X86-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]2838; X86-SSE-NEXT: movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]2839; X86-SSE-NEXT: pand %xmm2, %xmm02840; X86-SSE-NEXT: pcmpeqb %xmm2, %xmm02841; X86-SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[2,2,3,3,4,5,6,7]2842; X86-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]2843; X86-SSE-NEXT: pand %xmm2, %xmm12844; X86-SSE-NEXT: pcmpeqb %xmm2, %xmm12845; X86-SSE-NEXT: retl2846entry:2847 %X = load <32 x i1>, ptr %ptr2848 %Y = sext <32 x i1> %X to <32 x i8>2849 ret <32 x i8> %Y2850}2851 2852define <16 x i16> @load_sext_16i8_to_16i16(ptr%ptr) {2853; SSE2-LABEL: load_sext_16i8_to_16i16:2854; SSE2: # %bb.0: # %entry2855; SSE2-NEXT: movdqa (%rdi), %xmm12856; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]2857; SSE2-NEXT: psraw $8, %xmm02858; SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]2859; SSE2-NEXT: psraw $8, %xmm12860; SSE2-NEXT: retq2861;2862; SSSE3-LABEL: load_sext_16i8_to_16i16:2863; SSSE3: # %bb.0: # %entry2864; SSSE3-NEXT: movdqa (%rdi), %xmm12865; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]2866; SSSE3-NEXT: psraw $8, %xmm02867; SSSE3-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]2868; SSSE3-NEXT: psraw $8, %xmm12869; SSSE3-NEXT: retq2870;2871; SSE41-LABEL: load_sext_16i8_to_16i16:2872; SSE41: # %bb.0: # %entry2873; SSE41-NEXT: pmovsxbw (%rdi), %xmm02874; SSE41-NEXT: pmovsxbw 8(%rdi), %xmm12875; SSE41-NEXT: retq2876;2877; AVX1-LABEL: load_sext_16i8_to_16i16:2878; AVX1: # %bb.0: # %entry2879; AVX1-NEXT: vpmovsxbw 8(%rdi), %xmm02880; AVX1-NEXT: vpmovsxbw (%rdi), %xmm12881; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm02882; AVX1-NEXT: retq2883;2884; AVX2-LABEL: load_sext_16i8_to_16i16:2885; AVX2: # %bb.0: # %entry2886; AVX2-NEXT: vpmovsxbw (%rdi), %ymm02887; AVX2-NEXT: retq2888;2889; AVX512-LABEL: load_sext_16i8_to_16i16:2890; AVX512: # %bb.0: # %entry2891; AVX512-NEXT: vpmovsxbw (%rdi), %ymm02892; AVX512-NEXT: retq2893;2894; X86-SSE2-LABEL: load_sext_16i8_to_16i16:2895; X86-SSE2: # %bb.0: # %entry2896; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax2897; X86-SSE2-NEXT: movdqa (%eax), %xmm12898; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]2899; X86-SSE2-NEXT: psraw $8, %xmm02900; X86-SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]2901; X86-SSE2-NEXT: psraw $8, %xmm12902; X86-SSE2-NEXT: retl2903;2904; X86-SSE41-LABEL: load_sext_16i8_to_16i16:2905; X86-SSE41: # %bb.0: # %entry2906; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax2907; X86-SSE41-NEXT: pmovsxbw (%eax), %xmm02908; X86-SSE41-NEXT: pmovsxbw 8(%eax), %xmm12909; X86-SSE41-NEXT: retl2910entry:2911 %X = load <16 x i8>, ptr %ptr2912 %Y = sext <16 x i8> %X to <16 x i16>2913 ret <16 x i16> %Y2914}2915 2916define <2 x i64> @load_sext_2i16_to_2i64(ptr%ptr) {2917; SSE2-LABEL: load_sext_2i16_to_2i64:2918; SSE2: # %bb.0: # %entry2919; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero2920; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]2921; SSE2-NEXT: pxor %xmm1, %xmm12922; SSE2-NEXT: pcmpgtd %xmm0, %xmm12923; SSE2-NEXT: psrad $16, %xmm02924; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]2925; SSE2-NEXT: retq2926;2927; SSSE3-LABEL: load_sext_2i16_to_2i64:2928; SSSE3: # %bb.0: # %entry2929; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero2930; SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]2931; SSSE3-NEXT: pxor %xmm1, %xmm12932; SSSE3-NEXT: pcmpgtd %xmm0, %xmm12933; SSSE3-NEXT: psrad $16, %xmm02934; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]2935; SSSE3-NEXT: retq2936;2937; SSE41-LABEL: load_sext_2i16_to_2i64:2938; SSE41: # %bb.0: # %entry2939; SSE41-NEXT: pmovsxwq (%rdi), %xmm02940; SSE41-NEXT: retq2941;2942; AVX-LABEL: load_sext_2i16_to_2i64:2943; AVX: # %bb.0: # %entry2944; AVX-NEXT: vpmovsxwq (%rdi), %xmm02945; AVX-NEXT: retq2946;2947; X86-SSE2-LABEL: load_sext_2i16_to_2i64:2948; X86-SSE2: # %bb.0: # %entry2949; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax2950; X86-SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero2951; X86-SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]2952; X86-SSE2-NEXT: pxor %xmm1, %xmm12953; X86-SSE2-NEXT: pcmpgtd %xmm0, %xmm12954; X86-SSE2-NEXT: psrad $16, %xmm02955; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]2956; X86-SSE2-NEXT: retl2957;2958; X86-SSE41-LABEL: load_sext_2i16_to_2i64:2959; X86-SSE41: # %bb.0: # %entry2960; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax2961; X86-SSE41-NEXT: pmovsxwq (%eax), %xmm02962; X86-SSE41-NEXT: retl2963entry:2964 %X = load <2 x i16>, ptr %ptr2965 %Y = sext <2 x i16> %X to <2 x i64>2966 ret <2 x i64> %Y2967}2968 2969define <4 x i32> @load_sext_4i16_to_4i32(ptr%ptr) {2970; SSE2-LABEL: load_sext_4i16_to_4i32:2971; SSE2: # %bb.0: # %entry2972; SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero2973; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]2974; SSE2-NEXT: psrad $16, %xmm02975; SSE2-NEXT: retq2976;2977; SSSE3-LABEL: load_sext_4i16_to_4i32:2978; SSSE3: # %bb.0: # %entry2979; SSSE3-NEXT: movq {{.*#+}} xmm0 = mem[0],zero2980; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]2981; SSSE3-NEXT: psrad $16, %xmm02982; SSSE3-NEXT: retq2983;2984; SSE41-LABEL: load_sext_4i16_to_4i32:2985; SSE41: # %bb.0: # %entry2986; SSE41-NEXT: pmovsxwd (%rdi), %xmm02987; SSE41-NEXT: retq2988;2989; AVX-LABEL: load_sext_4i16_to_4i32:2990; AVX: # %bb.0: # %entry2991; AVX-NEXT: vpmovsxwd (%rdi), %xmm02992; AVX-NEXT: retq2993;2994; X86-SSE2-LABEL: load_sext_4i16_to_4i32:2995; X86-SSE2: # %bb.0: # %entry2996; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax2997; X86-SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero2998; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]2999; X86-SSE2-NEXT: psrad $16, %xmm03000; X86-SSE2-NEXT: retl3001;3002; X86-SSE41-LABEL: load_sext_4i16_to_4i32:3003; X86-SSE41: # %bb.0: # %entry3004; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax3005; X86-SSE41-NEXT: pmovsxwd (%eax), %xmm03006; X86-SSE41-NEXT: retl3007entry:3008 %X = load <4 x i16>, ptr %ptr3009 %Y = sext <4 x i16> %X to <4 x i32>3010 ret <4 x i32> %Y3011}3012 3013define <4 x i64> @load_sext_4i16_to_4i64(ptr%ptr) {3014; SSE2-LABEL: load_sext_4i16_to_4i64:3015; SSE2: # %bb.0: # %entry3016; SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero3017; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]3018; SSE2-NEXT: psrad $16, %xmm13019; SSE2-NEXT: pxor %xmm2, %xmm23020; SSE2-NEXT: pcmpgtd %xmm1, %xmm23021; SSE2-NEXT: movdqa %xmm1, %xmm03022; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]3023; SSE2-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]3024; SSE2-NEXT: retq3025;3026; SSSE3-LABEL: load_sext_4i16_to_4i64:3027; SSSE3: # %bb.0: # %entry3028; SSSE3-NEXT: movq {{.*#+}} xmm0 = mem[0],zero3029; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]3030; SSSE3-NEXT: psrad $16, %xmm13031; SSSE3-NEXT: pxor %xmm2, %xmm23032; SSSE3-NEXT: pcmpgtd %xmm1, %xmm23033; SSSE3-NEXT: movdqa %xmm1, %xmm03034; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]3035; SSSE3-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]3036; SSSE3-NEXT: retq3037;3038; SSE41-LABEL: load_sext_4i16_to_4i64:3039; SSE41: # %bb.0: # %entry3040; SSE41-NEXT: pmovsxwq (%rdi), %xmm03041; SSE41-NEXT: pmovsxwq 4(%rdi), %xmm13042; SSE41-NEXT: retq3043;3044; AVX1-LABEL: load_sext_4i16_to_4i64:3045; AVX1: # %bb.0: # %entry3046; AVX1-NEXT: vpmovsxwq 4(%rdi), %xmm03047; AVX1-NEXT: vpmovsxwq (%rdi), %xmm13048; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm03049; AVX1-NEXT: retq3050;3051; AVX2-LABEL: load_sext_4i16_to_4i64:3052; AVX2: # %bb.0: # %entry3053; AVX2-NEXT: vpmovsxwq (%rdi), %ymm03054; AVX2-NEXT: retq3055;3056; AVX512-LABEL: load_sext_4i16_to_4i64:3057; AVX512: # %bb.0: # %entry3058; AVX512-NEXT: vpmovsxwq (%rdi), %ymm03059; AVX512-NEXT: retq3060;3061; X86-SSE2-LABEL: load_sext_4i16_to_4i64:3062; X86-SSE2: # %bb.0: # %entry3063; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax3064; X86-SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero3065; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]3066; X86-SSE2-NEXT: psrad $16, %xmm13067; X86-SSE2-NEXT: pxor %xmm2, %xmm23068; X86-SSE2-NEXT: pcmpgtd %xmm1, %xmm23069; X86-SSE2-NEXT: movdqa %xmm1, %xmm03070; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]3071; X86-SSE2-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]3072; X86-SSE2-NEXT: retl3073;3074; X86-SSE41-LABEL: load_sext_4i16_to_4i64:3075; X86-SSE41: # %bb.0: # %entry3076; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax3077; X86-SSE41-NEXT: pmovsxwq (%eax), %xmm03078; X86-SSE41-NEXT: pmovsxwq 4(%eax), %xmm13079; X86-SSE41-NEXT: retl3080entry:3081 %X = load <4 x i16>, ptr %ptr3082 %Y = sext <4 x i16> %X to <4 x i64>3083 ret <4 x i64> %Y3084}3085 3086define <8 x i32> @load_sext_8i16_to_8i32(ptr%ptr) {3087; SSE2-LABEL: load_sext_8i16_to_8i32:3088; SSE2: # %bb.0: # %entry3089; SSE2-NEXT: movdqa (%rdi), %xmm13090; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]3091; SSE2-NEXT: psrad $16, %xmm03092; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]3093; SSE2-NEXT: psrad $16, %xmm13094; SSE2-NEXT: retq3095;3096; SSSE3-LABEL: load_sext_8i16_to_8i32:3097; SSSE3: # %bb.0: # %entry3098; SSSE3-NEXT: movdqa (%rdi), %xmm13099; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]3100; SSSE3-NEXT: psrad $16, %xmm03101; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]3102; SSSE3-NEXT: psrad $16, %xmm13103; SSSE3-NEXT: retq3104;3105; SSE41-LABEL: load_sext_8i16_to_8i32:3106; SSE41: # %bb.0: # %entry3107; SSE41-NEXT: pmovsxwd (%rdi), %xmm03108; SSE41-NEXT: pmovsxwd 8(%rdi), %xmm13109; SSE41-NEXT: retq3110;3111; AVX1-LABEL: load_sext_8i16_to_8i32:3112; AVX1: # %bb.0: # %entry3113; AVX1-NEXT: vpmovsxwd 8(%rdi), %xmm03114; AVX1-NEXT: vpmovsxwd (%rdi), %xmm13115; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm03116; AVX1-NEXT: retq3117;3118; AVX2-LABEL: load_sext_8i16_to_8i32:3119; AVX2: # %bb.0: # %entry3120; AVX2-NEXT: vpmovsxwd (%rdi), %ymm03121; AVX2-NEXT: retq3122;3123; AVX512-LABEL: load_sext_8i16_to_8i32:3124; AVX512: # %bb.0: # %entry3125; AVX512-NEXT: vpmovsxwd (%rdi), %ymm03126; AVX512-NEXT: retq3127;3128; X86-SSE2-LABEL: load_sext_8i16_to_8i32:3129; X86-SSE2: # %bb.0: # %entry3130; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax3131; X86-SSE2-NEXT: movdqa (%eax), %xmm13132; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]3133; X86-SSE2-NEXT: psrad $16, %xmm03134; X86-SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]3135; X86-SSE2-NEXT: psrad $16, %xmm13136; X86-SSE2-NEXT: retl3137;3138; X86-SSE41-LABEL: load_sext_8i16_to_8i32:3139; X86-SSE41: # %bb.0: # %entry3140; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax3141; X86-SSE41-NEXT: pmovsxwd (%eax), %xmm03142; X86-SSE41-NEXT: pmovsxwd 8(%eax), %xmm13143; X86-SSE41-NEXT: retl3144entry:3145 %X = load <8 x i16>, ptr %ptr3146 %Y = sext <8 x i16> %X to <8 x i32>3147 ret <8 x i32> %Y3148}3149 3150define <2 x i64> @load_sext_2i32_to_2i64(ptr%ptr) {3151; SSE2-LABEL: load_sext_2i32_to_2i64:3152; SSE2: # %bb.0: # %entry3153; SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero3154; SSE2-NEXT: pxor %xmm1, %xmm13155; SSE2-NEXT: pcmpgtd %xmm0, %xmm13156; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]3157; SSE2-NEXT: retq3158;3159; SSSE3-LABEL: load_sext_2i32_to_2i64:3160; SSSE3: # %bb.0: # %entry3161; SSSE3-NEXT: movq {{.*#+}} xmm0 = mem[0],zero3162; SSSE3-NEXT: pxor %xmm1, %xmm13163; SSSE3-NEXT: pcmpgtd %xmm0, %xmm13164; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]3165; SSSE3-NEXT: retq3166;3167; SSE41-LABEL: load_sext_2i32_to_2i64:3168; SSE41: # %bb.0: # %entry3169; SSE41-NEXT: pmovsxdq (%rdi), %xmm03170; SSE41-NEXT: retq3171;3172; AVX-LABEL: load_sext_2i32_to_2i64:3173; AVX: # %bb.0: # %entry3174; AVX-NEXT: vpmovsxdq (%rdi), %xmm03175; AVX-NEXT: retq3176;3177; X86-SSE2-LABEL: load_sext_2i32_to_2i64:3178; X86-SSE2: # %bb.0: # %entry3179; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax3180; X86-SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero3181; X86-SSE2-NEXT: pxor %xmm1, %xmm13182; X86-SSE2-NEXT: pcmpgtd %xmm0, %xmm13183; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]3184; X86-SSE2-NEXT: retl3185;3186; X86-SSE41-LABEL: load_sext_2i32_to_2i64:3187; X86-SSE41: # %bb.0: # %entry3188; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax3189; X86-SSE41-NEXT: pmovsxdq (%eax), %xmm03190; X86-SSE41-NEXT: retl3191entry:3192 %X = load <2 x i32>, ptr %ptr3193 %Y = sext <2 x i32> %X to <2 x i64>3194 ret <2 x i64> %Y3195}3196 3197define <4 x i64> @load_sext_4i32_to_4i64(ptr%ptr) {3198; SSE2-LABEL: load_sext_4i32_to_4i64:3199; SSE2: # %bb.0: # %entry3200; SSE2-NEXT: movdqa (%rdi), %xmm03201; SSE2-NEXT: pxor %xmm2, %xmm23202; SSE2-NEXT: pxor %xmm3, %xmm33203; SSE2-NEXT: pcmpgtd %xmm0, %xmm33204; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]3205; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]3206; SSE2-NEXT: pcmpgtd %xmm1, %xmm23207; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]3208; SSE2-NEXT: retq3209;3210; SSSE3-LABEL: load_sext_4i32_to_4i64:3211; SSSE3: # %bb.0: # %entry3212; SSSE3-NEXT: movdqa (%rdi), %xmm03213; SSSE3-NEXT: pxor %xmm2, %xmm23214; SSSE3-NEXT: pxor %xmm3, %xmm33215; SSSE3-NEXT: pcmpgtd %xmm0, %xmm33216; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]3217; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]3218; SSSE3-NEXT: pcmpgtd %xmm1, %xmm23219; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]3220; SSSE3-NEXT: retq3221;3222; SSE41-LABEL: load_sext_4i32_to_4i64:3223; SSE41: # %bb.0: # %entry3224; SSE41-NEXT: pmovsxdq (%rdi), %xmm03225; SSE41-NEXT: pmovsxdq 8(%rdi), %xmm13226; SSE41-NEXT: retq3227;3228; AVX1-LABEL: load_sext_4i32_to_4i64:3229; AVX1: # %bb.0: # %entry3230; AVX1-NEXT: vpmovsxdq 8(%rdi), %xmm03231; AVX1-NEXT: vpmovsxdq (%rdi), %xmm13232; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm03233; AVX1-NEXT: retq3234;3235; AVX2-LABEL: load_sext_4i32_to_4i64:3236; AVX2: # %bb.0: # %entry3237; AVX2-NEXT: vpmovsxdq (%rdi), %ymm03238; AVX2-NEXT: retq3239;3240; AVX512-LABEL: load_sext_4i32_to_4i64:3241; AVX512: # %bb.0: # %entry3242; AVX512-NEXT: vpmovsxdq (%rdi), %ymm03243; AVX512-NEXT: retq3244;3245; X86-SSE2-LABEL: load_sext_4i32_to_4i64:3246; X86-SSE2: # %bb.0: # %entry3247; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax3248; X86-SSE2-NEXT: movdqa (%eax), %xmm03249; X86-SSE2-NEXT: pxor %xmm2, %xmm23250; X86-SSE2-NEXT: pxor %xmm3, %xmm33251; X86-SSE2-NEXT: pcmpgtd %xmm0, %xmm33252; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]3253; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]3254; X86-SSE2-NEXT: pcmpgtd %xmm1, %xmm23255; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]3256; X86-SSE2-NEXT: retl3257;3258; X86-SSE41-LABEL: load_sext_4i32_to_4i64:3259; X86-SSE41: # %bb.0: # %entry3260; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax3261; X86-SSE41-NEXT: pmovsxdq (%eax), %xmm03262; X86-SSE41-NEXT: pmovsxdq 8(%eax), %xmm13263; X86-SSE41-NEXT: retl3264entry:3265 %X = load <4 x i32>, ptr %ptr3266 %Y = sext <4 x i32> %X to <4 x i64>3267 ret <4 x i64> %Y3268}3269 3270define i32 @sext_2i8_to_i32(<16 x i8> %A) nounwind uwtable readnone ssp {3271; SSE2-LABEL: sext_2i8_to_i32:3272; SSE2: # %bb.0: # %entry3273; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]3274; SSE2-NEXT: psraw $8, %xmm03275; SSE2-NEXT: movd %xmm0, %eax3276; SSE2-NEXT: retq3277;3278; SSSE3-LABEL: sext_2i8_to_i32:3279; SSSE3: # %bb.0: # %entry3280; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]3281; SSSE3-NEXT: psraw $8, %xmm03282; SSSE3-NEXT: movd %xmm0, %eax3283; SSSE3-NEXT: retq3284;3285; SSE41-LABEL: sext_2i8_to_i32:3286; SSE41: # %bb.0: # %entry3287; SSE41-NEXT: pmovsxbw %xmm0, %xmm03288; SSE41-NEXT: movd %xmm0, %eax3289; SSE41-NEXT: retq3290;3291; AVX-LABEL: sext_2i8_to_i32:3292; AVX: # %bb.0: # %entry3293; AVX-NEXT: vpmovsxbw %xmm0, %xmm03294; AVX-NEXT: vmovd %xmm0, %eax3295; AVX-NEXT: retq3296;3297; X86-SSE2-LABEL: sext_2i8_to_i32:3298; X86-SSE2: # %bb.0: # %entry3299; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]3300; X86-SSE2-NEXT: psraw $8, %xmm03301; X86-SSE2-NEXT: movd %xmm0, %eax3302; X86-SSE2-NEXT: retl3303;3304; X86-SSE41-LABEL: sext_2i8_to_i32:3305; X86-SSE41: # %bb.0: # %entry3306; X86-SSE41-NEXT: pmovsxbw %xmm0, %xmm03307; X86-SSE41-NEXT: movd %xmm0, %eax3308; X86-SSE41-NEXT: retl3309entry:3310 %Shuf = shufflevector <16 x i8> %A, <16 x i8> undef, <2 x i32> <i32 0, i32 1>3311 %Ex = sext <2 x i8> %Shuf to <2 x i16>3312 %Bc = bitcast <2 x i16> %Ex to i323313 ret i32 %Bc3314}3315 3316define <4 x i64> @sext_4i1_to_4i64(<4 x i1> %mask) {3317; SSE2-LABEL: sext_4i1_to_4i64:3318; SSE2: # %bb.0:3319; SSE2-NEXT: pslld $31, %xmm03320; SSE2-NEXT: psrad $31, %xmm03321; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,0,1,1]3322; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,2,3,3]3323; SSE2-NEXT: movdqa %xmm2, %xmm03324; SSE2-NEXT: retq3325;3326; SSSE3-LABEL: sext_4i1_to_4i64:3327; SSSE3: # %bb.0:3328; SSSE3-NEXT: pslld $31, %xmm03329; SSSE3-NEXT: psrad $31, %xmm03330; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,0,1,1]3331; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,2,3,3]3332; SSSE3-NEXT: movdqa %xmm2, %xmm03333; SSSE3-NEXT: retq3334;3335; SSE41-LABEL: sext_4i1_to_4i64:3336; SSE41: # %bb.0:3337; SSE41-NEXT: pslld $31, %xmm03338; SSE41-NEXT: psrad $31, %xmm03339; SSE41-NEXT: pmovsxdq %xmm0, %xmm23340; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,2,3,3]3341; SSE41-NEXT: movdqa %xmm2, %xmm03342; SSE41-NEXT: retq3343;3344; AVX1-LABEL: sext_4i1_to_4i64:3345; AVX1: # %bb.0:3346; AVX1-NEXT: vpslld $31, %xmm0, %xmm03347; AVX1-NEXT: vpsrad $31, %xmm0, %xmm03348; AVX1-NEXT: vpmovsxdq %xmm0, %xmm13349; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]3350; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm03351; AVX1-NEXT: retq3352;3353; AVX2-LABEL: sext_4i1_to_4i64:3354; AVX2: # %bb.0:3355; AVX2-NEXT: vpslld $31, %xmm0, %xmm03356; AVX2-NEXT: vpsrad $31, %xmm0, %xmm03357; AVX2-NEXT: vpmovsxdq %xmm0, %ymm03358; AVX2-NEXT: retq3359;3360; AVX512-LABEL: sext_4i1_to_4i64:3361; AVX512: # %bb.0:3362; AVX512-NEXT: vpslld $31, %xmm0, %xmm03363; AVX512-NEXT: vpsrad $31, %xmm0, %xmm03364; AVX512-NEXT: vpmovsxdq %xmm0, %ymm03365; AVX512-NEXT: retq3366;3367; X86-SSE2-LABEL: sext_4i1_to_4i64:3368; X86-SSE2: # %bb.0:3369; X86-SSE2-NEXT: pslld $31, %xmm03370; X86-SSE2-NEXT: psrad $31, %xmm03371; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,0,1,1]3372; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,2,3,3]3373; X86-SSE2-NEXT: movdqa %xmm2, %xmm03374; X86-SSE2-NEXT: retl3375;3376; X86-SSE41-LABEL: sext_4i1_to_4i64:3377; X86-SSE41: # %bb.0:3378; X86-SSE41-NEXT: pslld $31, %xmm03379; X86-SSE41-NEXT: psrad $31, %xmm03380; X86-SSE41-NEXT: pmovsxdq %xmm0, %xmm23381; X86-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,2,3,3]3382; X86-SSE41-NEXT: movdqa %xmm2, %xmm03383; X86-SSE41-NEXT: retl3384 %extmask = sext <4 x i1> %mask to <4 x i64>3385 ret <4 x i64> %extmask3386}3387 3388define <4 x i64> @sext_4i8_to_4i64(<4 x i8> %mask) {3389; SSE2-LABEL: sext_4i8_to_4i64:3390; SSE2: # %bb.0:3391; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]3392; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]3393; SSE2-NEXT: psrad $24, %xmm13394; SSE2-NEXT: pxor %xmm2, %xmm23395; SSE2-NEXT: pcmpgtd %xmm1, %xmm23396; SSE2-NEXT: movdqa %xmm1, %xmm03397; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]3398; SSE2-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]3399; SSE2-NEXT: retq3400;3401; SSSE3-LABEL: sext_4i8_to_4i64:3402; SSSE3: # %bb.0:3403; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]3404; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]3405; SSSE3-NEXT: psrad $24, %xmm13406; SSSE3-NEXT: pxor %xmm2, %xmm23407; SSSE3-NEXT: pcmpgtd %xmm1, %xmm23408; SSSE3-NEXT: movdqa %xmm1, %xmm03409; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]3410; SSSE3-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]3411; SSSE3-NEXT: retq3412;3413; SSE41-LABEL: sext_4i8_to_4i64:3414; SSE41: # %bb.0:3415; SSE41-NEXT: pmovsxbq %xmm0, %xmm23416; SSE41-NEXT: psrld $16, %xmm03417; SSE41-NEXT: pmovsxbq %xmm0, %xmm13418; SSE41-NEXT: movdqa %xmm2, %xmm03419; SSE41-NEXT: retq3420;3421; AVX1-LABEL: sext_4i8_to_4i64:3422; AVX1: # %bb.0:3423; AVX1-NEXT: vpmovsxbq %xmm0, %xmm13424; AVX1-NEXT: vpsrld $16, %xmm0, %xmm03425; AVX1-NEXT: vpmovsxbq %xmm0, %xmm03426; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm03427; AVX1-NEXT: retq3428;3429; AVX2-LABEL: sext_4i8_to_4i64:3430; AVX2: # %bb.0:3431; AVX2-NEXT: vpmovsxbq %xmm0, %ymm03432; AVX2-NEXT: retq3433;3434; AVX512-LABEL: sext_4i8_to_4i64:3435; AVX512: # %bb.0:3436; AVX512-NEXT: vpmovsxbq %xmm0, %ymm03437; AVX512-NEXT: retq3438;3439; X86-SSE2-LABEL: sext_4i8_to_4i64:3440; X86-SSE2: # %bb.0:3441; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]3442; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]3443; X86-SSE2-NEXT: psrad $24, %xmm13444; X86-SSE2-NEXT: pxor %xmm2, %xmm23445; X86-SSE2-NEXT: pcmpgtd %xmm1, %xmm23446; X86-SSE2-NEXT: movdqa %xmm1, %xmm03447; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]3448; X86-SSE2-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]3449; X86-SSE2-NEXT: retl3450;3451; X86-SSE41-LABEL: sext_4i8_to_4i64:3452; X86-SSE41: # %bb.0:3453; X86-SSE41-NEXT: pmovsxbq %xmm0, %xmm23454; X86-SSE41-NEXT: psrld $16, %xmm03455; X86-SSE41-NEXT: pmovsxbq %xmm0, %xmm13456; X86-SSE41-NEXT: movdqa %xmm2, %xmm03457; X86-SSE41-NEXT: retl3458 %extmask = sext <4 x i8> %mask to <4 x i64>3459 ret <4 x i64> %extmask3460}3461 3462define <32 x i8> @sext_32xi1_to_32xi8(<32 x i16> %c1, <32 x i16> %c2)nounwind {3463; SSE-LABEL: sext_32xi1_to_32xi8:3464; SSE: # %bb.0:3465; SSE-NEXT: pcmpeqw %xmm5, %xmm13466; SSE-NEXT: pcmpeqw %xmm4, %xmm03467; SSE-NEXT: packsswb %xmm1, %xmm03468; SSE-NEXT: pcmpeqw %xmm7, %xmm33469; SSE-NEXT: pcmpeqw %xmm6, %xmm23470; SSE-NEXT: packsswb %xmm3, %xmm23471; SSE-NEXT: movdqa %xmm2, %xmm13472; SSE-NEXT: retq3473;3474; AVX1-LABEL: sext_32xi1_to_32xi8:3475; AVX1: # %bb.0:3476; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm43477; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm53478; AVX1-NEXT: vpcmpeqw %xmm4, %xmm5, %xmm43479; AVX1-NEXT: vpcmpeqw %xmm3, %xmm1, %xmm13480; AVX1-NEXT: vpacksswb %xmm4, %xmm1, %xmm13481; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm33482; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm43483; AVX1-NEXT: vpcmpeqw %xmm3, %xmm4, %xmm33484; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm03485; AVX1-NEXT: vpacksswb %xmm3, %xmm0, %xmm03486; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm03487; AVX1-NEXT: retq3488;3489; AVX2-LABEL: sext_32xi1_to_32xi8:3490; AVX2: # %bb.0:3491; AVX2-NEXT: vpcmpeqw %ymm3, %ymm1, %ymm13492; AVX2-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm03493; AVX2-NEXT: vpacksswb %ymm1, %ymm0, %ymm03494; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]3495; AVX2-NEXT: retq3496;3497; AVX512F-LABEL: sext_32xi1_to_32xi8:3498; AVX512F: # %bb.0:3499; AVX512F-NEXT: vextracti64x4 $1, %zmm1, %ymm23500; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm33501; AVX512F-NEXT: vpcmpeqw %ymm2, %ymm3, %ymm23502; AVX512F-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm03503; AVX512F-NEXT: vpacksswb %ymm2, %ymm0, %ymm03504; AVX512F-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]3505; AVX512F-NEXT: retq3506;3507; AVX512BW-LABEL: sext_32xi1_to_32xi8:3508; AVX512BW: # %bb.0:3509; AVX512BW-NEXT: vpcmpeqw %zmm1, %zmm0, %k03510; AVX512BW-NEXT: vpmovm2b %k0, %zmm03511; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm03512; AVX512BW-NEXT: retq3513;3514; X86-SSE-LABEL: sext_32xi1_to_32xi8:3515; X86-SSE: # %bb.0:3516; X86-SSE-NEXT: pushl %ebp3517; X86-SSE-NEXT: movl %esp, %ebp3518; X86-SSE-NEXT: andl $-16, %esp3519; X86-SSE-NEXT: subl $16, %esp3520; X86-SSE-NEXT: movdqa 8(%ebp), %xmm33521; X86-SSE-NEXT: pcmpeqw 40(%ebp), %xmm13522; X86-SSE-NEXT: pcmpeqw 24(%ebp), %xmm03523; X86-SSE-NEXT: packsswb %xmm1, %xmm03524; X86-SSE-NEXT: pcmpeqw 72(%ebp), %xmm33525; X86-SSE-NEXT: pcmpeqw 56(%ebp), %xmm23526; X86-SSE-NEXT: packsswb %xmm3, %xmm23527; X86-SSE-NEXT: movdqa %xmm2, %xmm13528; X86-SSE-NEXT: movl %ebp, %esp3529; X86-SSE-NEXT: popl %ebp3530; X86-SSE-NEXT: retl3531 %a = icmp eq <32 x i16> %c1, %c23532 %b = sext <32 x i1> %a to <32 x i8>3533 ret <32 x i8> %b3534}3535 3536define <2 x i32> @sext_2i8_to_2i32(ptr %addr) {3537; SSE2-LABEL: sext_2i8_to_2i32:3538; SSE2: # %bb.0:3539; SSE2-NEXT: movzwl (%rdi), %eax3540; SSE2-NEXT: movd %eax, %xmm03541; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]3542; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]3543; SSE2-NEXT: psrad $24, %xmm03544; SSE2-NEXT: paddd %xmm0, %xmm03545; SSE2-NEXT: retq3546;3547; SSSE3-LABEL: sext_2i8_to_2i32:3548; SSSE3: # %bb.0:3549; SSSE3-NEXT: movzwl (%rdi), %eax3550; SSSE3-NEXT: movd %eax, %xmm03551; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]3552; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]3553; SSSE3-NEXT: psrad $24, %xmm03554; SSSE3-NEXT: paddd %xmm0, %xmm03555; SSSE3-NEXT: retq3556;3557; SSE41-LABEL: sext_2i8_to_2i32:3558; SSE41: # %bb.0:3559; SSE41-NEXT: movzwl (%rdi), %eax3560; SSE41-NEXT: movd %eax, %xmm03561; SSE41-NEXT: pmovsxbd %xmm0, %xmm03562; SSE41-NEXT: paddd %xmm0, %xmm03563; SSE41-NEXT: retq3564;3565; AVX-LABEL: sext_2i8_to_2i32:3566; AVX: # %bb.0:3567; AVX-NEXT: movzwl (%rdi), %eax3568; AVX-NEXT: vmovd %eax, %xmm03569; AVX-NEXT: vpmovsxbd %xmm0, %xmm03570; AVX-NEXT: vpaddd %xmm0, %xmm0, %xmm03571; AVX-NEXT: retq3572;3573; X86-SSE2-LABEL: sext_2i8_to_2i32:3574; X86-SSE2: # %bb.0:3575; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax3576; X86-SSE2-NEXT: movzwl (%eax), %eax3577; X86-SSE2-NEXT: movd %eax, %xmm03578; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]3579; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]3580; X86-SSE2-NEXT: psrad $24, %xmm03581; X86-SSE2-NEXT: paddd %xmm0, %xmm03582; X86-SSE2-NEXT: retl3583;3584; X86-SSE41-LABEL: sext_2i8_to_2i32:3585; X86-SSE41: # %bb.0:3586; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax3587; X86-SSE41-NEXT: movzwl (%eax), %eax3588; X86-SSE41-NEXT: movd %eax, %xmm03589; X86-SSE41-NEXT: pmovsxbd %xmm0, %xmm03590; X86-SSE41-NEXT: paddd %xmm0, %xmm03591; X86-SSE41-NEXT: retl3592 %x = load <2 x i8>, ptr %addr, align 13593 %y = sext <2 x i8> %x to <2 x i32>3594 %z = add <2 x i32>%y, %y3595 ret <2 x i32>%z3596}3597 3598define <4 x i32> @sext_4i17_to_4i32(ptr %ptr) {3599; SSE2-LABEL: sext_4i17_to_4i32:3600; SSE2: # %bb.0:3601; SSE2-NEXT: movq (%rdi), %rax3602; SSE2-NEXT: movd %eax, %xmm03603; SSE2-NEXT: pslld $15, %xmm03604; SSE2-NEXT: psrad $15, %xmm03605; SSE2-NEXT: movq %rax, %rcx3606; SSE2-NEXT: shrq $17, %rcx3607; SSE2-NEXT: movd %ecx, %xmm13608; SSE2-NEXT: pslld $15, %xmm13609; SSE2-NEXT: psrad $15, %xmm13610; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]3611; SSE2-NEXT: movl 8(%rdi), %ecx3612; SSE2-NEXT: shll $28, %ecx3613; SSE2-NEXT: movq %rax, %rdx3614; SSE2-NEXT: shrq $51, %rdx3615; SSE2-NEXT: shll $15, %edx3616; SSE2-NEXT: orl %ecx, %edx3617; SSE2-NEXT: movd %edx, %xmm13618; SSE2-NEXT: psrad $15, %xmm13619; SSE2-NEXT: shrq $34, %rax3620; SSE2-NEXT: movd %eax, %xmm23621; SSE2-NEXT: pslld $15, %xmm23622; SSE2-NEXT: psrad $15, %xmm23623; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]3624; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]3625; SSE2-NEXT: retq3626;3627; SSSE3-LABEL: sext_4i17_to_4i32:3628; SSSE3: # %bb.0:3629; SSSE3-NEXT: movq (%rdi), %rax3630; SSSE3-NEXT: movd %eax, %xmm03631; SSSE3-NEXT: pslld $15, %xmm03632; SSSE3-NEXT: psrad $15, %xmm03633; SSSE3-NEXT: movq %rax, %rcx3634; SSSE3-NEXT: shrq $17, %rcx3635; SSSE3-NEXT: movd %ecx, %xmm13636; SSSE3-NEXT: pslld $15, %xmm13637; SSSE3-NEXT: psrad $15, %xmm13638; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]3639; SSSE3-NEXT: movl 8(%rdi), %ecx3640; SSSE3-NEXT: shll $28, %ecx3641; SSSE3-NEXT: movq %rax, %rdx3642; SSSE3-NEXT: shrq $51, %rdx3643; SSSE3-NEXT: shll $15, %edx3644; SSSE3-NEXT: orl %ecx, %edx3645; SSSE3-NEXT: movd %edx, %xmm13646; SSSE3-NEXT: psrad $15, %xmm13647; SSSE3-NEXT: shrq $34, %rax3648; SSSE3-NEXT: movd %eax, %xmm23649; SSSE3-NEXT: pslld $15, %xmm23650; SSSE3-NEXT: psrad $15, %xmm23651; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]3652; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]3653; SSSE3-NEXT: retq3654;3655; SSE41-LABEL: sext_4i17_to_4i32:3656; SSE41: # %bb.0:3657; SSE41-NEXT: movq (%rdi), %rax3658; SSE41-NEXT: movq %rax, %rcx3659; SSE41-NEXT: shrq $17, %rcx3660; SSE41-NEXT: shll $15, %ecx3661; SSE41-NEXT: sarl $15, %ecx3662; SSE41-NEXT: movd %eax, %xmm03663; SSE41-NEXT: pslld $15, %xmm03664; SSE41-NEXT: psrad $15, %xmm03665; SSE41-NEXT: pinsrd $1, %ecx, %xmm03666; SSE41-NEXT: movq %rax, %rcx3667; SSE41-NEXT: shrq $34, %rcx3668; SSE41-NEXT: shll $15, %ecx3669; SSE41-NEXT: sarl $15, %ecx3670; SSE41-NEXT: pinsrd $2, %ecx, %xmm03671; SSE41-NEXT: movl 8(%rdi), %ecx3672; SSE41-NEXT: shll $28, %ecx3673; SSE41-NEXT: shrq $51, %rax3674; SSE41-NEXT: shll $15, %eax3675; SSE41-NEXT: orl %ecx, %eax3676; SSE41-NEXT: sarl $15, %eax3677; SSE41-NEXT: pinsrd $3, %eax, %xmm03678; SSE41-NEXT: retq3679;3680; AVX-LABEL: sext_4i17_to_4i32:3681; AVX: # %bb.0:3682; AVX-NEXT: movq (%rdi), %rax3683; AVX-NEXT: movq %rax, %rcx3684; AVX-NEXT: shrq $17, %rcx3685; AVX-NEXT: shll $15, %ecx3686; AVX-NEXT: sarl $15, %ecx3687; AVX-NEXT: vmovd %eax, %xmm03688; AVX-NEXT: vpslld $15, %xmm0, %xmm03689; AVX-NEXT: vpsrad $15, %xmm0, %xmm03690; AVX-NEXT: vpinsrd $1, %ecx, %xmm0, %xmm03691; AVX-NEXT: movq %rax, %rcx3692; AVX-NEXT: shrq $34, %rcx3693; AVX-NEXT: shll $15, %ecx3694; AVX-NEXT: sarl $15, %ecx3695; AVX-NEXT: vpinsrd $2, %ecx, %xmm0, %xmm03696; AVX-NEXT: movl 8(%rdi), %ecx3697; AVX-NEXT: shll $28, %ecx3698; AVX-NEXT: shrq $51, %rax3699; AVX-NEXT: shll $15, %eax3700; AVX-NEXT: orl %ecx, %eax3701; AVX-NEXT: sarl $15, %eax3702; AVX-NEXT: vpinsrd $3, %eax, %xmm0, %xmm03703; AVX-NEXT: retq3704;3705; X86-SSE2-LABEL: sext_4i17_to_4i32:3706; X86-SSE2: # %bb.0:3707; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %edx3708; X86-SSE2-NEXT: movl (%edx), %eax3709; X86-SSE2-NEXT: movl 4(%edx), %ecx3710; X86-SSE2-NEXT: movl 8(%edx), %edx3711; X86-SSE2-NEXT: shldl $13, %ecx, %edx3712; X86-SSE2-NEXT: movd %edx, %xmm03713; X86-SSE2-NEXT: pslld $15, %xmm03714; X86-SSE2-NEXT: psrad $15, %xmm03715; X86-SSE2-NEXT: movd %ecx, %xmm13716; X86-SSE2-NEXT: pslld $13, %xmm13717; X86-SSE2-NEXT: psrad $15, %xmm13718; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]3719; X86-SSE2-NEXT: movd %eax, %xmm03720; X86-SSE2-NEXT: pslld $15, %xmm03721; X86-SSE2-NEXT: psrad $15, %xmm03722; X86-SSE2-NEXT: shldl $15, %eax, %ecx3723; X86-SSE2-NEXT: movd %ecx, %xmm23724; X86-SSE2-NEXT: pslld $15, %xmm23725; X86-SSE2-NEXT: psrad $15, %xmm23726; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]3727; X86-SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]3728; X86-SSE2-NEXT: retl3729;3730; X86-SSE41-LABEL: sext_4i17_to_4i32:3731; X86-SSE41: # %bb.0:3732; X86-SSE41-NEXT: pushl %esi3733; X86-SSE41-NEXT: .cfi_def_cfa_offset 83734; X86-SSE41-NEXT: .cfi_offset %esi, -83735; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %edx3736; X86-SSE41-NEXT: movl (%edx), %eax3737; X86-SSE41-NEXT: movl 4(%edx), %ecx3738; X86-SSE41-NEXT: movl %ecx, %esi3739; X86-SSE41-NEXT: movl 8(%edx), %edx3740; X86-SSE41-NEXT: shldl $13, %ecx, %edx3741; X86-SSE41-NEXT: shldl $15, %eax, %ecx3742; X86-SSE41-NEXT: shll $15, %ecx3743; X86-SSE41-NEXT: sarl $15, %ecx3744; X86-SSE41-NEXT: movd %eax, %xmm03745; X86-SSE41-NEXT: pslld $15, %xmm03746; X86-SSE41-NEXT: psrad $15, %xmm03747; X86-SSE41-NEXT: pinsrd $1, %ecx, %xmm03748; X86-SSE41-NEXT: shll $13, %esi3749; X86-SSE41-NEXT: sarl $15, %esi3750; X86-SSE41-NEXT: pinsrd $2, %esi, %xmm03751; X86-SSE41-NEXT: shll $15, %edx3752; X86-SSE41-NEXT: sarl $15, %edx3753; X86-SSE41-NEXT: pinsrd $3, %edx, %xmm03754; X86-SSE41-NEXT: popl %esi3755; X86-SSE41-NEXT: .cfi_def_cfa_offset 43756; X86-SSE41-NEXT: retl3757 %a = load <4 x i17>, ptr %ptr3758 %b = sext <4 x i17> %a to <4 x i32>3759 ret <4 x i32> %b3760}3761 3762define <8 x i64> @sext_8i6_to_8i64(i32 %x) nounwind uwtable readnone ssp {3763; SSE2-LABEL: sext_8i6_to_8i64:3764; SSE2: # %bb.0: # %entry3765; SSE2-NEXT: movd %edi, %xmm03766; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]3767; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,1,0,1]3768; SSE2-NEXT: paddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm33769; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,0,0]3770; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,5,5,5]3771; SSE2-NEXT: psllq $58, %xmm03772; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]3773; SSE2-NEXT: movdqa %xmm0, %xmm13774; SSE2-NEXT: psrad $31, %xmm13775; SSE2-NEXT: psrad $26, %xmm03776; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]3777; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,1,1]3778; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,5,5,5,5]3779; SSE2-NEXT: psllq $58, %xmm13780; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]3781; SSE2-NEXT: movdqa %xmm1, %xmm23782; SSE2-NEXT: psrad $31, %xmm23783; SSE2-NEXT: psrad $26, %xmm13784; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]3785; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[2,2,2,2]3786; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,5,5,5]3787; SSE2-NEXT: psllq $58, %xmm23788; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]3789; SSE2-NEXT: movdqa %xmm2, %xmm43790; SSE2-NEXT: psrad $31, %xmm43791; SSE2-NEXT: psrad $26, %xmm23792; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]3793; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[3,3,3,3]3794; SSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,5,5,5,5]3795; SSE2-NEXT: psllq $58, %xmm33796; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]3797; SSE2-NEXT: movdqa %xmm3, %xmm43798; SSE2-NEXT: psrad $31, %xmm43799; SSE2-NEXT: psrad $26, %xmm33800; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]3801; SSE2-NEXT: retq3802;3803; SSSE3-LABEL: sext_8i6_to_8i64:3804; SSSE3: # %bb.0: # %entry3805; SSSE3-NEXT: movd %edi, %xmm03806; SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]3807; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,1,0,1]3808; SSSE3-NEXT: paddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm33809; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,0,0]3810; SSSE3-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,5,5,5]3811; SSSE3-NEXT: psllq $58, %xmm03812; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]3813; SSSE3-NEXT: movdqa %xmm0, %xmm13814; SSSE3-NEXT: psrad $31, %xmm13815; SSSE3-NEXT: psrad $26, %xmm03816; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]3817; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,1,1]3818; SSSE3-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,5,5,5,5]3819; SSSE3-NEXT: psllq $58, %xmm13820; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]3821; SSSE3-NEXT: movdqa %xmm1, %xmm23822; SSSE3-NEXT: psrad $31, %xmm23823; SSSE3-NEXT: psrad $26, %xmm13824; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]3825; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[2,2,2,2]3826; SSSE3-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,5,5,5]3827; SSSE3-NEXT: psllq $58, %xmm23828; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]3829; SSSE3-NEXT: movdqa %xmm2, %xmm43830; SSSE3-NEXT: psrad $31, %xmm43831; SSSE3-NEXT: psrad $26, %xmm23832; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]3833; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[3,3,3,3]3834; SSSE3-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,5,5,5,5]3835; SSSE3-NEXT: psllq $58, %xmm33836; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]3837; SSSE3-NEXT: movdqa %xmm3, %xmm43838; SSSE3-NEXT: psrad $31, %xmm43839; SSSE3-NEXT: psrad $26, %xmm33840; SSSE3-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]3841; SSSE3-NEXT: retq3842;3843; SSE41-LABEL: sext_8i6_to_8i64:3844; SSE41: # %bb.0: # %entry3845; SSE41-NEXT: movd %edi, %xmm03846; SSE41-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]3847; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,1,0,1]3848; SSE41-NEXT: paddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm33849; SSE41-NEXT: pmovzxwq {{.*#+}} xmm1 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero3850; SSE41-NEXT: psllq $58, %xmm13851; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]3852; SSE41-NEXT: psrad $31, %xmm13853; SSE41-NEXT: psrad $26, %xmm03854; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]3855; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,1,1]3856; SSE41-NEXT: pmovzxwq {{.*#+}} xmm2 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero3857; SSE41-NEXT: psllq $58, %xmm23858; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]3859; SSE41-NEXT: psrad $31, %xmm23860; SSE41-NEXT: psrad $26, %xmm13861; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]3862; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm3[2,3,2,3]3863; SSE41-NEXT: pmovzxwq {{.*#+}} xmm4 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero3864; SSE41-NEXT: psllq $58, %xmm43865; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]3866; SSE41-NEXT: psrad $31, %xmm43867; SSE41-NEXT: psrad $26, %xmm23868; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]3869; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[3,3,3,3]3870; SSE41-NEXT: pmovzxwq {{.*#+}} xmm4 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero3871; SSE41-NEXT: psllq $58, %xmm43872; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]3873; SSE41-NEXT: psrad $31, %xmm43874; SSE41-NEXT: psrad $26, %xmm33875; SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm4[2,3],xmm3[4,5],xmm4[6,7]3876; SSE41-NEXT: retq3877;3878; AVX1-LABEL: sext_8i6_to_8i64:3879; AVX1: # %bb.0: # %entry3880; AVX1-NEXT: vmovd %edi, %xmm03881; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]3882; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]3883; AVX1-NEXT: vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03884; AVX1-NEXT: vpsllw $10, %xmm0, %xmm03885; AVX1-NEXT: vpsraw $10, %xmm0, %xmm13886; AVX1-NEXT: vpmovsxwq %xmm1, %xmm03887; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,1,1]3888; AVX1-NEXT: vpmovsxwq %xmm2, %xmm23889; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm03890; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]3891; AVX1-NEXT: vpmovsxwq %xmm2, %xmm23892; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[3,3,3,3]3893; AVX1-NEXT: vpmovsxwq %xmm1, %xmm13894; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm13895; AVX1-NEXT: retq3896;3897; AVX2-LABEL: sext_8i6_to_8i64:3898; AVX2: # %bb.0: # %entry3899; AVX2-NEXT: vmovd %edi, %xmm03900; AVX2-NEXT: vpbroadcastw %xmm0, %xmm03901; AVX2-NEXT: vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03902; AVX2-NEXT: vpsllw $10, %xmm0, %xmm03903; AVX2-NEXT: vpsraw $10, %xmm0, %xmm13904; AVX2-NEXT: vpmovsxwq %xmm1, %ymm03905; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]3906; AVX2-NEXT: vpmovsxwq %xmm1, %ymm13907; AVX2-NEXT: retq3908;3909; AVX512-LABEL: sext_8i6_to_8i64:3910; AVX512: # %bb.0: # %entry3911; AVX512-NEXT: vmovd %edi, %xmm03912; AVX512-NEXT: vpbroadcastw %xmm0, %xmm03913; AVX512-NEXT: vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03914; AVX512-NEXT: vpmovzxwq {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero3915; AVX512-NEXT: vpsllq $58, %zmm0, %zmm03916; AVX512-NEXT: vpsraq $58, %zmm0, %zmm03917; AVX512-NEXT: retq3918;3919; X86-SSE2-LABEL: sext_8i6_to_8i64:3920; X86-SSE2: # %bb.0: # %entry3921; X86-SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero3922; X86-SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]3923; X86-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,1,0,1]3924; X86-SSE2-NEXT: paddw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm33925; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,0,0]3926; X86-SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,5,5,5]3927; X86-SSE2-NEXT: psllq $58, %xmm03928; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]3929; X86-SSE2-NEXT: movdqa %xmm0, %xmm13930; X86-SSE2-NEXT: psrad $31, %xmm13931; X86-SSE2-NEXT: psrad $26, %xmm03932; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]3933; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,1,1]3934; X86-SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,5,5,5,5]3935; X86-SSE2-NEXT: psllq $58, %xmm13936; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]3937; X86-SSE2-NEXT: movdqa %xmm1, %xmm23938; X86-SSE2-NEXT: psrad $31, %xmm23939; X86-SSE2-NEXT: psrad $26, %xmm13940; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]3941; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[2,2,2,2]3942; X86-SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,5,5,5]3943; X86-SSE2-NEXT: psllq $58, %xmm23944; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]3945; X86-SSE2-NEXT: movdqa %xmm2, %xmm43946; X86-SSE2-NEXT: psrad $31, %xmm43947; X86-SSE2-NEXT: psrad $26, %xmm23948; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]3949; X86-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[3,3,3,3]3950; X86-SSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,5,5,5,5]3951; X86-SSE2-NEXT: psllq $58, %xmm33952; X86-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]3953; X86-SSE2-NEXT: movdqa %xmm3, %xmm43954; X86-SSE2-NEXT: psrad $31, %xmm43955; X86-SSE2-NEXT: psrad $26, %xmm33956; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]3957; X86-SSE2-NEXT: retl3958;3959; X86-SSE41-LABEL: sext_8i6_to_8i64:3960; X86-SSE41: # %bb.0: # %entry3961; X86-SSE41-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero3962; X86-SSE41-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]3963; X86-SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,1,0,1]3964; X86-SSE41-NEXT: paddw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm33965; X86-SSE41-NEXT: pmovzxwq {{.*#+}} xmm1 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero3966; X86-SSE41-NEXT: psllq $58, %xmm13967; X86-SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]3968; X86-SSE41-NEXT: psrad $31, %xmm13969; X86-SSE41-NEXT: psrad $26, %xmm03970; X86-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]3971; X86-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,1,1]3972; X86-SSE41-NEXT: pmovzxwq {{.*#+}} xmm2 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero3973; X86-SSE41-NEXT: psllq $58, %xmm23974; X86-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]3975; X86-SSE41-NEXT: psrad $31, %xmm23976; X86-SSE41-NEXT: psrad $26, %xmm13977; X86-SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]3978; X86-SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm3[2,3,2,3]3979; X86-SSE41-NEXT: pmovzxwq {{.*#+}} xmm4 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero3980; X86-SSE41-NEXT: psllq $58, %xmm43981; X86-SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]3982; X86-SSE41-NEXT: psrad $31, %xmm43983; X86-SSE41-NEXT: psrad $26, %xmm23984; X86-SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]3985; X86-SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[3,3,3,3]3986; X86-SSE41-NEXT: pmovzxwq {{.*#+}} xmm4 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero3987; X86-SSE41-NEXT: psllq $58, %xmm43988; X86-SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]3989; X86-SSE41-NEXT: psrad $31, %xmm43990; X86-SSE41-NEXT: psrad $26, %xmm33991; X86-SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm4[2,3],xmm3[4,5],xmm4[6,7]3992; X86-SSE41-NEXT: retl3993entry:3994 %a = trunc i32 %x to i63995 %b = insertelement <8 x i6> undef, i6 %a, i32 03996 %c = shufflevector <8 x i6> %b, <8 x i6> undef, <8 x i32> zeroinitializer3997 %d = add <8 x i6> %c, <i6 0, i6 1, i6 2, i6 3, i6 4, i6 5, i6 6, i6 7>3998 %e = sext <8 x i6> %d to <8 x i64>3999 ret <8 x i64> %e4000}4001 4002define <8 x i32> @zext_negate_sext(<8 x i8> %x) {4003; SSE2-LABEL: zext_negate_sext:4004; SSE2: # %bb.0:4005; SSE2-NEXT: pxor %xmm1, %xmm14006; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]4007; SSE2-NEXT: psubw %xmm0, %xmm14008; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]4009; SSE2-NEXT: psrad $16, %xmm04010; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]4011; SSE2-NEXT: psrad $16, %xmm14012; SSE2-NEXT: retq4013;4014; SSSE3-LABEL: zext_negate_sext:4015; SSSE3: # %bb.0:4016; SSSE3-NEXT: pxor %xmm1, %xmm14017; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]4018; SSSE3-NEXT: psubw %xmm0, %xmm14019; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]4020; SSSE3-NEXT: psrad $16, %xmm04021; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]4022; SSSE3-NEXT: psrad $16, %xmm14023; SSSE3-NEXT: retq4024;4025; SSE41-LABEL: zext_negate_sext:4026; SSE41: # %bb.0:4027; SSE41-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero4028; SSE41-NEXT: pxor %xmm1, %xmm14029; SSE41-NEXT: psubw %xmm0, %xmm14030; SSE41-NEXT: pmovsxwd %xmm1, %xmm04031; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]4032; SSE41-NEXT: pmovsxwd %xmm1, %xmm14033; SSE41-NEXT: retq4034;4035; AVX1-LABEL: zext_negate_sext:4036; AVX1: # %bb.0:4037; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]4038; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero4039; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm24040; AVX1-NEXT: vpsubd %xmm1, %xmm2, %xmm14041; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero4042; AVX1-NEXT: vpsubd %xmm0, %xmm2, %xmm04043; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm04044; AVX1-NEXT: retq4045;4046; AVX2-LABEL: zext_negate_sext:4047; AVX2: # %bb.0:4048; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero4049; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm14050; AVX2-NEXT: vpsubd %ymm0, %ymm1, %ymm04051; AVX2-NEXT: retq4052;4053; AVX512-LABEL: zext_negate_sext:4054; AVX512: # %bb.0:4055; AVX512-NEXT: vpmovzxbd {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero4056; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm14057; AVX512-NEXT: vpsubd %ymm0, %ymm1, %ymm04058; AVX512-NEXT: retq4059;4060; X86-SSE2-LABEL: zext_negate_sext:4061; X86-SSE2: # %bb.0:4062; X86-SSE2-NEXT: pxor %xmm1, %xmm14063; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]4064; X86-SSE2-NEXT: psubw %xmm0, %xmm14065; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]4066; X86-SSE2-NEXT: psrad $16, %xmm04067; X86-SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]4068; X86-SSE2-NEXT: psrad $16, %xmm14069; X86-SSE2-NEXT: retl4070;4071; X86-SSE41-LABEL: zext_negate_sext:4072; X86-SSE41: # %bb.0:4073; X86-SSE41-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero4074; X86-SSE41-NEXT: pxor %xmm1, %xmm14075; X86-SSE41-NEXT: psubw %xmm0, %xmm14076; X86-SSE41-NEXT: pmovsxwd %xmm1, %xmm04077; X86-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]4078; X86-SSE41-NEXT: pmovsxwd %xmm1, %xmm14079; X86-SSE41-NEXT: retl4080 %z = zext <8 x i8> %x to <8 x i16>4081 %neg = sub nsw <8 x i16> zeroinitializer, %z4082 %r = sext <8 x i16> %neg to <8 x i32>4083 ret <8 x i32> %r4084}4085 4086define <8 x i32> @zext_decremenet_sext(<8 x i8> %x) {4087; SSE2-LABEL: zext_decremenet_sext:4088; SSE2: # %bb.0:4089; SSE2-NEXT: pxor %xmm1, %xmm14090; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]4091; SSE2-NEXT: pcmpeqd %xmm1, %xmm14092; SSE2-NEXT: paddw %xmm0, %xmm14093; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]4094; SSE2-NEXT: psrad $16, %xmm04095; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]4096; SSE2-NEXT: psrad $16, %xmm14097; SSE2-NEXT: retq4098;4099; SSSE3-LABEL: zext_decremenet_sext:4100; SSSE3: # %bb.0:4101; SSSE3-NEXT: pxor %xmm1, %xmm14102; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]4103; SSSE3-NEXT: pcmpeqd %xmm1, %xmm14104; SSSE3-NEXT: paddw %xmm0, %xmm14105; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]4106; SSSE3-NEXT: psrad $16, %xmm04107; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]4108; SSSE3-NEXT: psrad $16, %xmm14109; SSSE3-NEXT: retq4110;4111; SSE41-LABEL: zext_decremenet_sext:4112; SSE41: # %bb.0:4113; SSE41-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero4114; SSE41-NEXT: pcmpeqd %xmm1, %xmm14115; SSE41-NEXT: paddw %xmm0, %xmm14116; SSE41-NEXT: pmovsxwd %xmm1, %xmm04117; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]4118; SSE41-NEXT: pmovsxwd %xmm1, %xmm14119; SSE41-NEXT: retq4120;4121; AVX1-LABEL: zext_decremenet_sext:4122; AVX1: # %bb.0:4123; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]4124; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero4125; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm24126; AVX1-NEXT: vpaddd %xmm2, %xmm1, %xmm14127; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero4128; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm04129; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm04130; AVX1-NEXT: retq4131;4132; AVX2-LABEL: zext_decremenet_sext:4133; AVX2: # %bb.0:4134; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero4135; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm14136; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm04137; AVX2-NEXT: retq4138;4139; AVX512-LABEL: zext_decremenet_sext:4140; AVX512: # %bb.0:4141; AVX512-NEXT: vpmovzxbd {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero4142; AVX512-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm14143; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm04144; AVX512-NEXT: retq4145;4146; X86-SSE2-LABEL: zext_decremenet_sext:4147; X86-SSE2: # %bb.0:4148; X86-SSE2-NEXT: pxor %xmm1, %xmm14149; X86-SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]4150; X86-SSE2-NEXT: pcmpeqd %xmm1, %xmm14151; X86-SSE2-NEXT: paddw %xmm0, %xmm14152; X86-SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]4153; X86-SSE2-NEXT: psrad $16, %xmm04154; X86-SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]4155; X86-SSE2-NEXT: psrad $16, %xmm14156; X86-SSE2-NEXT: retl4157;4158; X86-SSE41-LABEL: zext_decremenet_sext:4159; X86-SSE41: # %bb.0:4160; X86-SSE41-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero4161; X86-SSE41-NEXT: pcmpeqd %xmm1, %xmm14162; X86-SSE41-NEXT: paddw %xmm0, %xmm14163; X86-SSE41-NEXT: pmovsxwd %xmm1, %xmm04164; X86-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]4165; X86-SSE41-NEXT: pmovsxwd %xmm1, %xmm14166; X86-SSE41-NEXT: retl4167 %z = zext <8 x i8> %x to <8 x i16>4168 %dec = add <8 x i16> %z, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>4169 %r = sext <8 x i16> %dec to <8 x i32>4170 ret <8 x i32> %r4171}4172