1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefix=SSE --check-prefix=SSSE3 4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1 6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2 --check-prefix=AVX2-SLOW 7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-shuffle | FileCheck %s --check-prefix=AVX --check-prefix=AVX2 --check-prefix=AVX2-FAST 8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512F 9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW 10 11define <8 x i16> @zext_16i8_to_8i16(<16 x i8> %A) nounwind uwtable readnone ssp { 12; SSE2-LABEL: zext_16i8_to_8i16: 13; SSE2: # %bb.0: # %entry 14; SSE2-NEXT: pxor %xmm1, %xmm1 15; 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] 16; SSE2-NEXT: retq 17; 18; SSSE3-LABEL: zext_16i8_to_8i16: 19; SSSE3: # %bb.0: # %entry 20; SSSE3-NEXT: pxor %xmm1, %xmm1 21; 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] 22; SSSE3-NEXT: retq 23; 24; SSE41-LABEL: zext_16i8_to_8i16: 25; SSE41: # %bb.0: # %entry 26; 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],zero 27; SSE41-NEXT: retq 28; 29; AVX-LABEL: zext_16i8_to_8i16: 30; AVX: # %bb.0: # %entry 31; AVX-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 32; AVX-NEXT: retq 33entry: 34 %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> 35 %C = zext <8 x i8> %B to <8 x i16> 36 ret <8 x i16> %C 37} 38 39; PR17654 40define <16 x i16> @zext_16i8_to_16i16(<16 x i8> %A) { 41; SSE2-LABEL: zext_16i8_to_16i16: 42; SSE2: # %bb.0: # %entry 43; SSE2-NEXT: movdqa %xmm0, %xmm1 44; SSE2-NEXT: pxor %xmm2, %xmm2 45; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7] 46; SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15] 47; SSE2-NEXT: retq 48; 49; SSSE3-LABEL: zext_16i8_to_16i16: 50; SSSE3: # %bb.0: # %entry 51; SSSE3-NEXT: movdqa %xmm0, %xmm1 52; SSSE3-NEXT: pxor %xmm2, %xmm2 53; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7] 54; SSSE3-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15] 55; SSSE3-NEXT: retq 56; 57; SSE41-LABEL: zext_16i8_to_16i16: 58; SSE41: # %bb.0: # %entry 59; SSE41-NEXT: movdqa %xmm0, %xmm1 60; SSE41-NEXT: pxor %xmm2, %xmm2 61; 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],zero 62; SSE41-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15] 63; SSE41-NEXT: retq 64; 65; AVX1-LABEL: zext_16i8_to_16i16: 66; AVX1: # %bb.0: # %entry 67; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 68; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15] 69; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 70; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 71; AVX1-NEXT: retq 72; 73; AVX2-LABEL: zext_16i8_to_16i16: 74; AVX2: # %bb.0: # %entry 75; AVX2-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero 76; AVX2-NEXT: retq 77; 78; AVX512-LABEL: zext_16i8_to_16i16: 79; AVX512: # %bb.0: # %entry 80; AVX512-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero 81; AVX512-NEXT: retq 82entry: 83 %B = zext <16 x i8> %A to <16 x i16> 84 ret <16 x i16> %B 85} 86 87define <32 x i16> @zext_32i8_to_32i16(<32 x i8> %A) { 88; SSE2-LABEL: zext_32i8_to_32i16: 89; SSE2: # %bb.0: # %entry 90; SSE2-NEXT: movdqa %xmm1, %xmm3 91; SSE2-NEXT: movdqa %xmm0, %xmm1 92; SSE2-NEXT: pxor %xmm4, %xmm4 93; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7] 94; SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm4[8],xmm1[9],xmm4[9],xmm1[10],xmm4[10],xmm1[11],xmm4[11],xmm1[12],xmm4[12],xmm1[13],xmm4[13],xmm1[14],xmm4[14],xmm1[15],xmm4[15] 95; SSE2-NEXT: movdqa %xmm3, %xmm2 96; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3],xmm2[4],xmm4[4],xmm2[5],xmm4[5],xmm2[6],xmm4[6],xmm2[7],xmm4[7] 97; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm4[8],xmm3[9],xmm4[9],xmm3[10],xmm4[10],xmm3[11],xmm4[11],xmm3[12],xmm4[12],xmm3[13],xmm4[13],xmm3[14],xmm4[14],xmm3[15],xmm4[15] 98; SSE2-NEXT: retq 99; 100; SSSE3-LABEL: zext_32i8_to_32i16: 101; SSSE3: # %bb.0: # %entry 102; SSSE3-NEXT: movdqa %xmm1, %xmm3 103; SSSE3-NEXT: movdqa %xmm0, %xmm1 104; SSSE3-NEXT: pxor %xmm4, %xmm4 105; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7] 106; SSSE3-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm4[8],xmm1[9],xmm4[9],xmm1[10],xmm4[10],xmm1[11],xmm4[11],xmm1[12],xmm4[12],xmm1[13],xmm4[13],xmm1[14],xmm4[14],xmm1[15],xmm4[15] 107; SSSE3-NEXT: movdqa %xmm3, %xmm2 108; SSSE3-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3],xmm2[4],xmm4[4],xmm2[5],xmm4[5],xmm2[6],xmm4[6],xmm2[7],xmm4[7] 109; SSSE3-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm4[8],xmm3[9],xmm4[9],xmm3[10],xmm4[10],xmm3[11],xmm4[11],xmm3[12],xmm4[12],xmm3[13],xmm4[13],xmm3[14],xmm4[14],xmm3[15],xmm4[15] 110; SSSE3-NEXT: retq 111; 112; SSE41-LABEL: zext_32i8_to_32i16: 113; SSE41: # %bb.0: # %entry 114; SSE41-NEXT: movdqa %xmm1, %xmm3 115; SSE41-NEXT: movdqa %xmm0, %xmm1 116; SSE41-NEXT: pxor %xmm4, %xmm4 117; 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],zero 118; SSE41-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm4[8],xmm1[9],xmm4[9],xmm1[10],xmm4[10],xmm1[11],xmm4[11],xmm1[12],xmm4[12],xmm1[13],xmm4[13],xmm1[14],xmm4[14],xmm1[15],xmm4[15] 119; SSE41-NEXT: pmovzxbw {{.*#+}} xmm2 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero 120; SSE41-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm4[8],xmm3[9],xmm4[9],xmm3[10],xmm4[10],xmm3[11],xmm4[11],xmm3[12],xmm4[12],xmm3[13],xmm4[13],xmm3[14],xmm4[14],xmm3[15],xmm4[15] 121; SSE41-NEXT: retq 122; 123; AVX1-LABEL: zext_32i8_to_32i16: 124; AVX1: # %bb.0: # %entry 125; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 126; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15] 127; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 128; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2 129; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 130; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15] 131; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 132; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm1 133; AVX1-NEXT: vmovaps %ymm2, %ymm0 134; AVX1-NEXT: retq 135; 136; AVX2-LABEL: zext_32i8_to_32i16: 137; AVX2: # %bb.0: # %entry 138; AVX2-NEXT: vpmovzxbw {{.*#+}} ymm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero 139; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 140; AVX2-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero 141; AVX2-NEXT: vmovdqa %ymm2, %ymm0 142; AVX2-NEXT: retq 143; 144; AVX512F-LABEL: zext_32i8_to_32i16: 145; AVX512F: # %bb.0: # %entry 146; AVX512F-NEXT: vpmovzxbw {{.*#+}} ymm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero 147; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0 148; AVX512F-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero 149; AVX512F-NEXT: vmovdqa %ymm2, %ymm0 150; AVX512F-NEXT: retq 151; 152; AVX512BW-LABEL: zext_32i8_to_32i16: 153; AVX512BW: # %bb.0: # %entry 154; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero 155; AVX512BW-NEXT: retq 156entry: 157 %B = zext <32 x i8> %A to <32 x i16> 158 ret <32 x i16> %B 159} 160 161define <4 x i32> @zext_16i8_to_4i32(<16 x i8> %A) nounwind uwtable readnone ssp { 162; SSE2-LABEL: zext_16i8_to_4i32: 163; SSE2: # %bb.0: # %entry 164; SSE2-NEXT: pxor %xmm1, %xmm1 165; 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] 166; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 167; SSE2-NEXT: retq 168; 169; SSSE3-LABEL: zext_16i8_to_4i32: 170; SSSE3: # %bb.0: # %entry 171; SSSE3-NEXT: pxor %xmm1, %xmm1 172; 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] 173; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 174; SSSE3-NEXT: retq 175; 176; SSE41-LABEL: zext_16i8_to_4i32: 177; SSE41: # %bb.0: # %entry 178; SSE41-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 179; SSE41-NEXT: retq 180; 181; AVX-LABEL: zext_16i8_to_4i32: 182; AVX: # %bb.0: # %entry 183; AVX-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 184; AVX-NEXT: retq 185entry: 186 %B = shufflevector <16 x i8> %A, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 187 %C = zext <4 x i8> %B to <4 x i32> 188 ret <4 x i32> %C 189} 190 191define <8 x i32> @zext_16i8_to_8i32(<16 x i8> %A) nounwind uwtable readnone ssp { 192; SSE2-LABEL: zext_16i8_to_8i32: 193; SSE2: # %bb.0: # %entry 194; SSE2-NEXT: movdqa %xmm0, %xmm1 195; SSE2-NEXT: pxor %xmm2, %xmm2 196; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 197; SSE2-NEXT: movdqa %xmm1, %xmm0 198; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 199; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 200; SSE2-NEXT: retq 201; 202; SSSE3-LABEL: zext_16i8_to_8i32: 203; SSSE3: # %bb.0: # %entry 204; SSSE3-NEXT: movdqa %xmm0, %xmm1 205; SSSE3-NEXT: pxor %xmm2, %xmm2 206; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 207; SSSE3-NEXT: movdqa %xmm1, %xmm0 208; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 209; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 210; SSSE3-NEXT: retq 211; 212; SSE41-LABEL: zext_16i8_to_8i32: 213; SSE41: # %bb.0: # %entry 214; SSE41-NEXT: pmovzxbd {{.*#+}} xmm2 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 215; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 216; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 217; SSE41-NEXT: movdqa %xmm2, %xmm0 218; SSE41-NEXT: retq 219; 220; AVX1-LABEL: zext_16i8_to_8i32: 221; AVX1: # %bb.0: # %entry 222; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 223; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 224; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 225; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 226; AVX1-NEXT: retq 227; 228; AVX2-LABEL: zext_16i8_to_8i32: 229; AVX2: # %bb.0: # %entry 230; 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,zero 231; AVX2-NEXT: retq 232; 233; AVX512-LABEL: zext_16i8_to_8i32: 234; AVX512: # %bb.0: # %entry 235; 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,zero 236; AVX512-NEXT: retq 237entry: 238 %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> 239 %C = zext <8 x i8> %B to <8 x i32> 240 ret <8 x i32> %C 241} 242 243define <16 x i32> @zext_16i8_to_16i32(<16 x i8> %A) nounwind uwtable readnone ssp { 244; SSE2-LABEL: zext_16i8_to_16i32: 245; SSE2: # %bb.0: # %entry 246; SSE2-NEXT: movdqa %xmm0, %xmm3 247; SSE2-NEXT: pxor %xmm4, %xmm4 248; SSE2-NEXT: movdqa %xmm0, %xmm1 249; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3],xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7] 250; SSE2-NEXT: movdqa %xmm1, %xmm0 251; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3] 252; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7] 253; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm4[8],xmm3[9],xmm4[9],xmm3[10],xmm4[10],xmm3[11],xmm4[11],xmm3[12],xmm4[12],xmm3[13],xmm4[13],xmm3[14],xmm4[14],xmm3[15],xmm4[15] 254; SSE2-NEXT: movdqa %xmm3, %xmm2 255; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3] 256; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7] 257; SSE2-NEXT: retq 258; 259; SSSE3-LABEL: zext_16i8_to_16i32: 260; SSSE3: # %bb.0: # %entry 261; SSSE3-NEXT: movdqa %xmm0, %xmm3 262; SSSE3-NEXT: pxor %xmm4, %xmm4 263; SSSE3-NEXT: movdqa %xmm0, %xmm1 264; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3],xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7] 265; SSSE3-NEXT: movdqa %xmm1, %xmm0 266; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3] 267; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7] 268; SSSE3-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm4[8],xmm3[9],xmm4[9],xmm3[10],xmm4[10],xmm3[11],xmm4[11],xmm3[12],xmm4[12],xmm3[13],xmm4[13],xmm3[14],xmm4[14],xmm3[15],xmm4[15] 269; SSSE3-NEXT: movdqa %xmm3, %xmm2 270; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3] 271; SSSE3-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7] 272; SSSE3-NEXT: retq 273; 274; SSE41-LABEL: zext_16i8_to_16i32: 275; SSE41: # %bb.0: # %entry 276; SSE41-NEXT: pmovzxbd {{.*#+}} xmm4 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 277; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 278; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero 279; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1] 280; SSE41-NEXT: pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero 281; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3] 282; SSE41-NEXT: pmovzxbd {{.*#+}} xmm3 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 283; SSE41-NEXT: movdqa %xmm4, %xmm0 284; SSE41-NEXT: retq 285; 286; AVX1-LABEL: zext_16i8_to_16i32: 287; AVX1: # %bb.0: # %entry 288; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 289; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[1,1,2,3] 290; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero 291; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm2 292; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 293; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero 294; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,3,0,1] 295; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 296; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm1 297; AVX1-NEXT: vmovaps %ymm2, %ymm0 298; AVX1-NEXT: retq 299; 300; AVX2-LABEL: zext_16i8_to_16i32: 301; AVX2: # %bb.0: # %entry 302; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm2 = 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,zero 303; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 304; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm1 = 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,zero 305; AVX2-NEXT: vmovdqa %ymm2, %ymm0 306; AVX2-NEXT: retq 307; 308; AVX512-LABEL: zext_16i8_to_16i32: 309; AVX512: # %bb.0: # %entry 310; AVX512-NEXT: vpmovzxbd {{.*#+}} 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,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero 311; AVX512-NEXT: retq 312entry: 313 %B = zext <16 x i8> %A to <16 x i32> 314 ret <16 x i32> %B 315} 316 317define <2 x i64> @zext_16i8_to_2i64(<16 x i8> %A) nounwind uwtable readnone ssp { 318; SSE2-LABEL: zext_16i8_to_2i64: 319; SSE2: # %bb.0: # %entry 320; SSE2-NEXT: pxor %xmm1, %xmm1 321; 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] 322; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 323; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 324; SSE2-NEXT: retq 325; 326; SSSE3-LABEL: zext_16i8_to_2i64: 327; SSSE3: # %bb.0: # %entry 328; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 329; SSSE3-NEXT: retq 330; 331; SSE41-LABEL: zext_16i8_to_2i64: 332; SSE41: # %bb.0: # %entry 333; SSE41-NEXT: pmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 334; SSE41-NEXT: retq 335; 336; AVX-LABEL: zext_16i8_to_2i64: 337; AVX: # %bb.0: # %entry 338; AVX-NEXT: vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 339; AVX-NEXT: retq 340entry: 341 %B = shufflevector <16 x i8> %A, <16 x i8> undef, <2 x i32> <i32 0, i32 1> 342 %C = zext <2 x i8> %B to <2 x i64> 343 ret <2 x i64> %C 344} 345 346define <4 x i64> @zext_16i8_to_4i64(<16 x i8> %A) nounwind uwtable readnone ssp { 347; SSE2-LABEL: zext_16i8_to_4i64: 348; SSE2: # %bb.0: # %entry 349; SSE2-NEXT: movdqa %xmm0, %xmm1 350; SSE2-NEXT: pxor %xmm2, %xmm2 351; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 352; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3] 353; SSE2-NEXT: movdqa %xmm1, %xmm0 354; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 355; SSE2-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3] 356; SSE2-NEXT: retq 357; 358; SSSE3-LABEL: zext_16i8_to_4i64: 359; SSSE3: # %bb.0: # %entry 360; SSSE3-NEXT: movdqa %xmm0, %xmm1 361; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 362; SSSE3-NEXT: pshufb {{.*#+}} xmm1 = xmm1[2],zero,zero,zero,zero,zero,zero,zero,xmm1[3],zero,zero,zero,zero,zero,zero,zero 363; SSSE3-NEXT: retq 364; 365; SSE41-LABEL: zext_16i8_to_4i64: 366; SSE41: # %bb.0: # %entry 367; SSE41-NEXT: pmovzxbq {{.*#+}} xmm2 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 368; SSE41-NEXT: psrld $16, %xmm0 369; SSE41-NEXT: pmovzxbq {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 370; SSE41-NEXT: movdqa %xmm2, %xmm0 371; SSE41-NEXT: retq 372; 373; AVX1-LABEL: zext_16i8_to_4i64: 374; AVX1: # %bb.0: # %entry 375; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 376; AVX1-NEXT: vpsrld $16, %xmm0, %xmm0 377; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 378; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 379; AVX1-NEXT: retq 380; 381; AVX2-LABEL: zext_16i8_to_4i64: 382; AVX2: # %bb.0: # %entry 383; AVX2-NEXT: vpmovzxbq {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero,xmm0[2],zero,zero,zero,zero,zero,zero,zero,xmm0[3],zero,zero,zero,zero,zero,zero,zero 384; AVX2-NEXT: retq 385; 386; AVX512-LABEL: zext_16i8_to_4i64: 387; AVX512: # %bb.0: # %entry 388; AVX512-NEXT: vpmovzxbq {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero,xmm0[2],zero,zero,zero,zero,zero,zero,zero,xmm0[3],zero,zero,zero,zero,zero,zero,zero 389; AVX512-NEXT: retq 390entry: 391 %B = shufflevector <16 x i8> %A, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 392 %C = zext <4 x i8> %B to <4 x i64> 393 ret <4 x i64> %C 394} 395 396define <8 x i64> @zext_16i8_to_8i64(<16 x i8> %A) nounwind uwtable readnone ssp { 397; SSE2-LABEL: zext_16i8_to_8i64: 398; SSE2: # %bb.0: # %entry 399; SSE2-NEXT: movdqa %xmm0, %xmm1 400; SSE2-NEXT: pxor %xmm4, %xmm4 401; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,2,3] 402; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3],xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7] 403; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3] 404; SSE2-NEXT: movdqa %xmm1, %xmm0 405; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1] 406; SSE2-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm4[2],xmm1[3],xmm4[3] 407; SSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7] 408; SSE2-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3] 409; SSE2-NEXT: movdqa %xmm3, %xmm2 410; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1] 411; SSE2-NEXT: punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3] 412; SSE2-NEXT: retq 413; 414; SSSE3-LABEL: zext_16i8_to_8i64: 415; SSSE3: # %bb.0: # %entry 416; SSSE3-NEXT: movdqa %xmm0, %xmm1 417; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [0,128,128,128,128,128,128,128,1,128,128,128,128,128,128,128] 418; SSSE3-NEXT: pshufb %xmm4, %xmm0 419; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2,128,128,128,128,128,128,128,3,128,128,128,128,128,128,128] 420; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,1,2,3] 421; SSSE3-NEXT: pshufb %xmm5, %xmm1 422; SSSE3-NEXT: movdqa %xmm3, %xmm2 423; SSSE3-NEXT: pshufb %xmm4, %xmm2 424; SSSE3-NEXT: pshufb %xmm5, %xmm3 425; SSSE3-NEXT: retq 426; 427; SSE41-LABEL: zext_16i8_to_8i64: 428; SSE41: # %bb.0: # %entry 429; SSE41-NEXT: pmovzxbq {{.*#+}} xmm4 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 430; SSE41-NEXT: movdqa %xmm0, %xmm1 431; SSE41-NEXT: psrld $16, %xmm1 432; SSE41-NEXT: pmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero 433; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,2,3] 434; SSE41-NEXT: pmovzxbq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,zero,zero,zero,zero,xmm2[1],zero,zero,zero,zero,zero,zero,zero 435; SSE41-NEXT: psrlq $48, %xmm0 436; SSE41-NEXT: pmovzxbq {{.*#+}} xmm3 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 437; SSE41-NEXT: movdqa %xmm4, %xmm0 438; SSE41-NEXT: retq 439; 440; AVX1-LABEL: zext_16i8_to_8i64: 441; AVX1: # %bb.0: # %entry 442; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 443; AVX1-NEXT: vpsrld $16, %xmm0, %xmm2 444; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,zero,zero,zero,zero,xmm2[1],zero,zero,zero,zero,zero,zero,zero 445; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm2 446; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 447; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 448; AVX1-NEXT: vpsrld $16, %xmm0, %xmm0 449; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 450; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm1 451; AVX1-NEXT: vmovaps %ymm2, %ymm0 452; AVX1-NEXT: retq 453; 454; AVX2-LABEL: zext_16i8_to_8i64: 455; AVX2: # %bb.0: # %entry 456; AVX2-NEXT: vpmovzxbq {{.*#+}} ymm2 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero,xmm0[2],zero,zero,zero,zero,zero,zero,zero,xmm0[3],zero,zero,zero,zero,zero,zero,zero 457; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 458; AVX2-NEXT: vpmovzxbq {{.*#+}} ymm1 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero,xmm0[2],zero,zero,zero,zero,zero,zero,zero,xmm0[3],zero,zero,zero,zero,zero,zero,zero 459; AVX2-NEXT: vmovdqa %ymm2, %ymm0 460; AVX2-NEXT: retq 461; 462; AVX512-LABEL: zext_16i8_to_8i64: 463; AVX512: # %bb.0: # %entry 464; AVX512-NEXT: vpmovzxbq {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero,xmm0[2],zero,zero,zero,zero,zero,zero,zero,xmm0[3],zero,zero,zero,zero,zero,zero,zero,xmm0[4],zero,zero,zero,zero,zero,zero,zero,xmm0[5],zero,zero,zero,zero,zero,zero,zero,xmm0[6],zero,zero,zero,zero,zero,zero,zero,xmm0[7],zero,zero,zero,zero,zero,zero,zero 465; AVX512-NEXT: retq 466entry: 467 %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> 468 %C = zext <8 x i8> %B to <8 x i64> 469 ret <8 x i64> %C 470} 471 472define <4 x i32> @zext_8i16_to_4i32(<8 x i16> %A) nounwind uwtable readnone ssp { 473; SSE2-LABEL: zext_8i16_to_4i32: 474; SSE2: # %bb.0: # %entry 475; SSE2-NEXT: pxor %xmm1, %xmm1 476; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 477; SSE2-NEXT: retq 478; 479; SSSE3-LABEL: zext_8i16_to_4i32: 480; SSSE3: # %bb.0: # %entry 481; SSSE3-NEXT: pxor %xmm1, %xmm1 482; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 483; SSSE3-NEXT: retq 484; 485; SSE41-LABEL: zext_8i16_to_4i32: 486; SSE41: # %bb.0: # %entry 487; SSE41-NEXT: pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 488; SSE41-NEXT: retq 489; 490; AVX-LABEL: zext_8i16_to_4i32: 491; AVX: # %bb.0: # %entry 492; AVX-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 493; AVX-NEXT: retq 494entry: 495 %B = shufflevector <8 x i16> %A, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 496 %C = zext <4 x i16> %B to <4 x i32> 497 ret <4 x i32> %C 498} 499 500define <8 x i32> @zext_8i16_to_8i32(<8 x i16> %A) nounwind uwtable readnone ssp { 501; SSE2-LABEL: zext_8i16_to_8i32: 502; SSE2: # %bb.0: # %entry 503; SSE2-NEXT: movdqa %xmm0, %xmm1 504; SSE2-NEXT: pxor %xmm2, %xmm2 505; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 506; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 507; SSE2-NEXT: retq 508; 509; SSSE3-LABEL: zext_8i16_to_8i32: 510; SSSE3: # %bb.0: # %entry 511; SSSE3-NEXT: movdqa %xmm0, %xmm1 512; SSSE3-NEXT: pxor %xmm2, %xmm2 513; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 514; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 515; SSSE3-NEXT: retq 516; 517; SSE41-LABEL: zext_8i16_to_8i32: 518; SSE41: # %bb.0: # %entry 519; SSE41-NEXT: movdqa %xmm0, %xmm1 520; SSE41-NEXT: pxor %xmm2, %xmm2 521; SSE41-NEXT: pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 522; SSE41-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 523; SSE41-NEXT: retq 524; 525; AVX1-LABEL: zext_8i16_to_8i32: 526; AVX1: # %bb.0: # %entry 527; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 528; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm1 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] 529; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 530; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 531; AVX1-NEXT: retq 532; 533; AVX2-LABEL: zext_8i16_to_8i32: 534; AVX2: # %bb.0: # %entry 535; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 536; AVX2-NEXT: retq 537; 538; AVX512-LABEL: zext_8i16_to_8i32: 539; AVX512: # %bb.0: # %entry 540; AVX512-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 541; AVX512-NEXT: retq 542entry: 543 %B = zext <8 x i16> %A to <8 x i32> 544 ret <8 x i32>%B 545} 546 547define <16 x i32> @zext_16i16_to_16i32(<16 x i16> %A) nounwind uwtable readnone ssp { 548; SSE2-LABEL: zext_16i16_to_16i32: 549; SSE2: # %bb.0: # %entry 550; SSE2-NEXT: movdqa %xmm1, %xmm3 551; SSE2-NEXT: movdqa %xmm0, %xmm1 552; SSE2-NEXT: pxor %xmm4, %xmm4 553; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3] 554; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7] 555; SSE2-NEXT: movdqa %xmm3, %xmm2 556; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3] 557; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7] 558; SSE2-NEXT: retq 559; 560; SSSE3-LABEL: zext_16i16_to_16i32: 561; SSSE3: # %bb.0: # %entry 562; SSSE3-NEXT: movdqa %xmm1, %xmm3 563; SSSE3-NEXT: movdqa %xmm0, %xmm1 564; SSSE3-NEXT: pxor %xmm4, %xmm4 565; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3] 566; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7] 567; SSSE3-NEXT: movdqa %xmm3, %xmm2 568; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3] 569; SSSE3-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7] 570; SSSE3-NEXT: retq 571; 572; SSE41-LABEL: zext_16i16_to_16i32: 573; SSE41: # %bb.0: # %entry 574; SSE41-NEXT: movdqa %xmm1, %xmm3 575; SSE41-NEXT: movdqa %xmm0, %xmm1 576; SSE41-NEXT: pxor %xmm4, %xmm4 577; SSE41-NEXT: pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 578; SSE41-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7] 579; SSE41-NEXT: pmovzxwd {{.*#+}} xmm2 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero 580; SSE41-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7] 581; SSE41-NEXT: retq 582; 583; AVX1-LABEL: zext_16i16_to_16i32: 584; AVX1: # %bb.0: # %entry 585; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 586; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm2 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] 587; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 588; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2 589; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 590; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm1 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] 591; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 592; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm1 593; AVX1-NEXT: vmovaps %ymm2, %ymm0 594; AVX1-NEXT: retq 595; 596; AVX2-LABEL: zext_16i16_to_16i32: 597; AVX2: # %bb.0: # %entry 598; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 599; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 600; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 601; AVX2-NEXT: vmovdqa %ymm2, %ymm0 602; AVX2-NEXT: retq 603; 604; AVX512-LABEL: zext_16i16_to_16i32: 605; AVX512: # %bb.0: # %entry 606; AVX512-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero 607; AVX512-NEXT: retq 608entry: 609 %B = zext <16 x i16> %A to <16 x i32> 610 ret <16 x i32> %B 611} 612 613define <2 x i64> @zext_8i16_to_2i64(<8 x i16> %A) nounwind uwtable readnone ssp { 614; SSE2-LABEL: zext_8i16_to_2i64: 615; SSE2: # %bb.0: # %entry 616; SSE2-NEXT: pxor %xmm1, %xmm1 617; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 618; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 619; SSE2-NEXT: retq 620; 621; SSSE3-LABEL: zext_8i16_to_2i64: 622; SSSE3: # %bb.0: # %entry 623; SSSE3-NEXT: pxor %xmm1, %xmm1 624; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 625; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 626; SSSE3-NEXT: retq 627; 628; SSE41-LABEL: zext_8i16_to_2i64: 629; SSE41: # %bb.0: # %entry 630; SSE41-NEXT: pmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero 631; SSE41-NEXT: retq 632; 633; AVX-LABEL: zext_8i16_to_2i64: 634; AVX: # %bb.0: # %entry 635; AVX-NEXT: vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero 636; AVX-NEXT: retq 637entry: 638 %B = shufflevector <8 x i16> %A, <8 x i16> undef, <2 x i32> <i32 0, i32 1> 639 %C = zext <2 x i16> %B to <2 x i64> 640 ret <2 x i64> %C 641} 642 643define <4 x i64> @zext_8i16_to_4i64(<8 x i16> %A) nounwind uwtable readnone ssp { 644; SSE2-LABEL: zext_8i16_to_4i64: 645; SSE2: # %bb.0: # %entry 646; SSE2-NEXT: movdqa %xmm0, %xmm1 647; SSE2-NEXT: pxor %xmm2, %xmm2 648; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3] 649; SSE2-NEXT: movdqa %xmm1, %xmm0 650; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 651; SSE2-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3] 652; SSE2-NEXT: retq 653; 654; SSSE3-LABEL: zext_8i16_to_4i64: 655; SSSE3: # %bb.0: # %entry 656; SSSE3-NEXT: movdqa %xmm0, %xmm1 657; SSSE3-NEXT: pxor %xmm2, %xmm2 658; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3] 659; SSSE3-NEXT: movdqa %xmm1, %xmm0 660; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 661; SSSE3-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3] 662; SSSE3-NEXT: retq 663; 664; SSE41-LABEL: zext_8i16_to_4i64: 665; SSE41: # %bb.0: # %entry 666; SSE41-NEXT: pmovzxwq {{.*#+}} xmm2 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero 667; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 668; SSE41-NEXT: pmovzxwq {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero 669; SSE41-NEXT: movdqa %xmm2, %xmm0 670; SSE41-NEXT: retq 671; 672; AVX1-LABEL: zext_8i16_to_4i64: 673; AVX1: # %bb.0: # %entry 674; AVX1-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero 675; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 676; AVX1-NEXT: vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero 677; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 678; AVX1-NEXT: retq 679; 680; AVX2-LABEL: zext_8i16_to_4i64: 681; AVX2: # %bb.0: # %entry 682; AVX2-NEXT: vpmovzxwq {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 683; AVX2-NEXT: retq 684; 685; AVX512-LABEL: zext_8i16_to_4i64: 686; AVX512: # %bb.0: # %entry 687; AVX512-NEXT: vpmovzxwq {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 688; AVX512-NEXT: retq 689entry: 690 %B = shufflevector <8 x i16> %A, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 691 %C = zext <4 x i16> %B to <4 x i64> 692 ret <4 x i64> %C 693} 694 695define <8 x i64> @zext_8i16_to_8i64(<8 x i16> %A) nounwind uwtable readnone ssp { 696; SSE2-LABEL: zext_8i16_to_8i64: 697; SSE2: # %bb.0: # %entry 698; SSE2-NEXT: movdqa %xmm0, %xmm3 699; SSE2-NEXT: pxor %xmm4, %xmm4 700; SSE2-NEXT: movdqa %xmm0, %xmm1 701; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3] 702; SSE2-NEXT: movdqa %xmm1, %xmm0 703; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1] 704; SSE2-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm4[2],xmm1[3],xmm4[3] 705; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7] 706; SSE2-NEXT: movdqa %xmm3, %xmm2 707; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1] 708; SSE2-NEXT: punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3] 709; SSE2-NEXT: retq 710; 711; SSSE3-LABEL: zext_8i16_to_8i64: 712; SSSE3: # %bb.0: # %entry 713; SSSE3-NEXT: movdqa %xmm0, %xmm3 714; SSSE3-NEXT: pxor %xmm4, %xmm4 715; SSSE3-NEXT: movdqa %xmm0, %xmm1 716; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3] 717; SSSE3-NEXT: movdqa %xmm1, %xmm0 718; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1] 719; SSSE3-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm4[2],xmm1[3],xmm4[3] 720; SSSE3-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7] 721; SSSE3-NEXT: movdqa %xmm3, %xmm2 722; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1] 723; SSSE3-NEXT: punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3] 724; SSSE3-NEXT: retq 725; 726; SSE41-LABEL: zext_8i16_to_8i64: 727; SSE41: # %bb.0: # %entry 728; SSE41-NEXT: pmovzxwq {{.*#+}} xmm4 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero 729; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 730; SSE41-NEXT: pmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero 731; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1] 732; SSE41-NEXT: pmovzxwq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero 733; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3] 734; SSE41-NEXT: pmovzxwq {{.*#+}} xmm3 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero 735; SSE41-NEXT: movdqa %xmm4, %xmm0 736; SSE41-NEXT: retq 737; 738; AVX1-LABEL: zext_8i16_to_8i64: 739; AVX1: # %bb.0: # %entry 740; AVX1-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero 741; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[1,1,2,3] 742; AVX1-NEXT: vpmovzxwq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero 743; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm2 744; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 745; AVX1-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero 746; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,3,0,1] 747; AVX1-NEXT: vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero 748; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm1 749; AVX1-NEXT: vmovaps %ymm2, %ymm0 750; AVX1-NEXT: retq 751; 752; AVX2-LABEL: zext_8i16_to_8i64: 753; AVX2: # %bb.0: # %entry 754; AVX2-NEXT: vpmovzxwq {{.*#+}} ymm2 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 755; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 756; AVX2-NEXT: vpmovzxwq {{.*#+}} ymm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 757; AVX2-NEXT: vmovdqa %ymm2, %ymm0 758; AVX2-NEXT: retq 759; 760; AVX512-LABEL: zext_8i16_to_8i64: 761; AVX512: # %bb.0: # %entry 762; 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,zero 763; AVX512-NEXT: retq 764entry: 765 %B = zext <8 x i16> %A to <8 x i64> 766 ret <8 x i64> %B 767} 768 769define <2 x i64> @zext_4i32_to_2i64(<4 x i32> %A) nounwind uwtable readnone ssp { 770; SSE2-LABEL: zext_4i32_to_2i64: 771; SSE2: # %bb.0: # %entry 772; SSE2-NEXT: xorps %xmm1, %xmm1 773; SSE2-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 774; SSE2-NEXT: retq 775; 776; SSSE3-LABEL: zext_4i32_to_2i64: 777; SSSE3: # %bb.0: # %entry 778; SSSE3-NEXT: xorps %xmm1, %xmm1 779; SSSE3-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 780; SSSE3-NEXT: retq 781; 782; SSE41-LABEL: zext_4i32_to_2i64: 783; SSE41: # %bb.0: # %entry 784; SSE41-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero 785; SSE41-NEXT: retq 786; 787; AVX-LABEL: zext_4i32_to_2i64: 788; AVX: # %bb.0: # %entry 789; AVX-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero 790; AVX-NEXT: retq 791entry: 792 %B = shufflevector <4 x i32> %A, <4 x i32> undef, <2 x i32> <i32 0, i32 1> 793 %C = zext <2 x i32> %B to <2 x i64> 794 ret <2 x i64> %C 795} 796 797define <4 x i64> @zext_4i32_to_4i64(<4 x i32> %A) nounwind uwtable readnone ssp { 798; SSE2-LABEL: zext_4i32_to_4i64: 799; SSE2: # %bb.0: # %entry 800; SSE2-NEXT: movaps %xmm0, %xmm1 801; SSE2-NEXT: xorps %xmm2, %xmm2 802; SSE2-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 803; SSE2-NEXT: unpckhps {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3] 804; SSE2-NEXT: retq 805; 806; SSSE3-LABEL: zext_4i32_to_4i64: 807; SSSE3: # %bb.0: # %entry 808; SSSE3-NEXT: movaps %xmm0, %xmm1 809; SSSE3-NEXT: xorps %xmm2, %xmm2 810; SSSE3-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 811; SSSE3-NEXT: unpckhps {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3] 812; SSSE3-NEXT: retq 813; 814; SSE41-LABEL: zext_4i32_to_4i64: 815; SSE41: # %bb.0: # %entry 816; SSE41-NEXT: movdqa %xmm0, %xmm1 817; SSE41-NEXT: pxor %xmm2, %xmm2 818; SSE41-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero 819; SSE41-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3] 820; SSE41-NEXT: retq 821; 822; AVX1-LABEL: zext_4i32_to_4i64: 823; AVX1: # %bb.0: # %entry 824; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 825; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm1 = xmm0[2],xmm1[2],xmm0[3],xmm1[3] 826; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero 827; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 828; AVX1-NEXT: retq 829; 830; AVX2-LABEL: zext_4i32_to_4i64: 831; AVX2: # %bb.0: # %entry 832; AVX2-NEXT: vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 833; AVX2-NEXT: retq 834; 835; AVX512-LABEL: zext_4i32_to_4i64: 836; AVX512: # %bb.0: # %entry 837; AVX512-NEXT: vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 838; AVX512-NEXT: retq 839entry: 840 %B = zext <4 x i32> %A to <4 x i64> 841 ret <4 x i64>%B 842} 843 844define <8 x i64> @zext_8i32_to_8i64(<8 x i32> %A) nounwind uwtable readnone ssp { 845; SSE2-LABEL: zext_8i32_to_8i64: 846; SSE2: # %bb.0: # %entry 847; SSE2-NEXT: movaps %xmm1, %xmm3 848; SSE2-NEXT: movaps %xmm0, %xmm1 849; SSE2-NEXT: xorps %xmm4, %xmm4 850; SSE2-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1] 851; SSE2-NEXT: unpckhps {{.*#+}} xmm1 = xmm1[2],xmm4[2],xmm1[3],xmm4[3] 852; SSE2-NEXT: movaps %xmm3, %xmm2 853; SSE2-NEXT: unpcklps {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1] 854; SSE2-NEXT: unpckhps {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3] 855; SSE2-NEXT: retq 856; 857; SSSE3-LABEL: zext_8i32_to_8i64: 858; SSSE3: # %bb.0: # %entry 859; SSSE3-NEXT: movaps %xmm1, %xmm3 860; SSSE3-NEXT: movaps %xmm0, %xmm1 861; SSSE3-NEXT: xorps %xmm4, %xmm4 862; SSSE3-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1] 863; SSSE3-NEXT: unpckhps {{.*#+}} xmm1 = xmm1[2],xmm4[2],xmm1[3],xmm4[3] 864; SSSE3-NEXT: movaps %xmm3, %xmm2 865; SSSE3-NEXT: unpcklps {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1] 866; SSSE3-NEXT: unpckhps {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3] 867; SSSE3-NEXT: retq 868; 869; SSE41-LABEL: zext_8i32_to_8i64: 870; SSE41: # %bb.0: # %entry 871; SSE41-NEXT: movdqa %xmm1, %xmm3 872; SSE41-NEXT: movdqa %xmm0, %xmm1 873; SSE41-NEXT: pxor %xmm4, %xmm4 874; SSE41-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero 875; SSE41-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm4[2],xmm1[3],xmm4[3] 876; SSE41-NEXT: pmovzxdq {{.*#+}} xmm2 = xmm3[0],zero,xmm3[1],zero 877; SSE41-NEXT: punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3] 878; SSE41-NEXT: retq 879; 880; AVX1-LABEL: zext_8i32_to_8i64: 881; AVX1: # %bb.0: # %entry 882; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 883; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3] 884; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero 885; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2 886; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 887; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm1 = xmm0[2],xmm1[2],xmm0[3],xmm1[3] 888; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero 889; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm1 890; AVX1-NEXT: vmovaps %ymm2, %ymm0 891; AVX1-NEXT: retq 892; 893; AVX2-LABEL: zext_8i32_to_8i64: 894; AVX2: # %bb.0: # %entry 895; AVX2-NEXT: vpmovzxdq {{.*#+}} ymm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 896; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 897; AVX2-NEXT: vpmovzxdq {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 898; AVX2-NEXT: vmovdqa %ymm2, %ymm0 899; AVX2-NEXT: retq 900; 901; AVX512-LABEL: zext_8i32_to_8i64: 902; AVX512: # %bb.0: # %entry 903; AVX512-NEXT: vpmovzxdq {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero 904; AVX512-NEXT: retq 905entry: 906 %B = zext <8 x i32> %A to <8 x i64> 907 ret <8 x i64>%B 908} 909 910define <2 x i64> @load_zext_2i8_to_2i64(<2 x i8> *%ptr) { 911; SSE2-LABEL: load_zext_2i8_to_2i64: 912; SSE2: # %bb.0: # %entry 913; SSE2-NEXT: movzwl (%rdi), %eax 914; SSE2-NEXT: movd %eax, %xmm0 915; SSE2-NEXT: pxor %xmm1, %xmm1 916; 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] 917; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 918; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 919; SSE2-NEXT: retq 920; 921; SSSE3-LABEL: load_zext_2i8_to_2i64: 922; SSSE3: # %bb.0: # %entry 923; SSSE3-NEXT: movzwl (%rdi), %eax 924; SSSE3-NEXT: movd %eax, %xmm0 925; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 926; SSSE3-NEXT: retq 927; 928; SSE41-LABEL: load_zext_2i8_to_2i64: 929; SSE41: # %bb.0: # %entry 930; SSE41-NEXT: pmovzxbq {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero 931; SSE41-NEXT: retq 932; 933; AVX-LABEL: load_zext_2i8_to_2i64: 934; AVX: # %bb.0: # %entry 935; AVX-NEXT: vpmovzxbq {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero 936; AVX-NEXT: retq 937entry: 938 %X = load <2 x i8>, <2 x i8>* %ptr 939 %Y = zext <2 x i8> %X to <2 x i64> 940 ret <2 x i64> %Y 941} 942 943define <4 x i32> @load_zext_4i8_to_4i32(<4 x i8> *%ptr) { 944; SSE2-LABEL: load_zext_4i8_to_4i32: 945; SSE2: # %bb.0: # %entry 946; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 947; SSE2-NEXT: pxor %xmm1, %xmm1 948; 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] 949; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 950; SSE2-NEXT: retq 951; 952; SSSE3-LABEL: load_zext_4i8_to_4i32: 953; SSSE3: # %bb.0: # %entry 954; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 955; SSSE3-NEXT: pxor %xmm1, %xmm1 956; 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] 957; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 958; SSSE3-NEXT: retq 959; 960; SSE41-LABEL: load_zext_4i8_to_4i32: 961; SSE41: # %bb.0: # %entry 962; SSE41-NEXT: pmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero 963; SSE41-NEXT: retq 964; 965; AVX-LABEL: load_zext_4i8_to_4i32: 966; AVX: # %bb.0: # %entry 967; AVX-NEXT: vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero 968; AVX-NEXT: retq 969entry: 970 %X = load <4 x i8>, <4 x i8>* %ptr 971 %Y = zext <4 x i8> %X to <4 x i32> 972 ret <4 x i32> %Y 973} 974 975define <4 x i64> @load_zext_4i8_to_4i64(<4 x i8> *%ptr) { 976; SSE2-LABEL: load_zext_4i8_to_4i64: 977; SSE2: # %bb.0: # %entry 978; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 979; SSE2-NEXT: pxor %xmm2, %xmm2 980; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 981; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3] 982; SSE2-NEXT: movdqa %xmm1, %xmm0 983; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 984; SSE2-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3] 985; SSE2-NEXT: retq 986; 987; SSSE3-LABEL: load_zext_4i8_to_4i64: 988; SSSE3: # %bb.0: # %entry 989; SSSE3-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 990; SSSE3-NEXT: movdqa %xmm1, %xmm0 991; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 992; SSSE3-NEXT: pshufb {{.*#+}} xmm1 = xmm1[2],zero,zero,zero,zero,zero,zero,zero,xmm1[3],zero,zero,zero,zero,zero,zero,zero 993; SSSE3-NEXT: retq 994; 995; SSE41-LABEL: load_zext_4i8_to_4i64: 996; SSE41: # %bb.0: # %entry 997; SSE41-NEXT: pmovzxbq {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero 998; SSE41-NEXT: pmovzxbq {{.*#+}} xmm1 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero 999; SSE41-NEXT: retq 1000; 1001; AVX1-LABEL: load_zext_4i8_to_4i64: 1002; AVX1: # %bb.0: # %entry 1003; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero 1004; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm1 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero 1005; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1006; AVX1-NEXT: retq 1007; 1008; AVX2-LABEL: load_zext_4i8_to_4i64: 1009; AVX2: # %bb.0: # %entry 1010; AVX2-NEXT: vpmovzxbq {{.*#+}} ymm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero,mem[2],zero,zero,zero,zero,zero,zero,zero,mem[3],zero,zero,zero,zero,zero,zero,zero 1011; AVX2-NEXT: retq 1012; 1013; AVX512-LABEL: load_zext_4i8_to_4i64: 1014; AVX512: # %bb.0: # %entry 1015; AVX512-NEXT: vpmovzxbq {{.*#+}} ymm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero,mem[2],zero,zero,zero,zero,zero,zero,zero,mem[3],zero,zero,zero,zero,zero,zero,zero 1016; AVX512-NEXT: retq 1017entry: 1018 %X = load <4 x i8>, <4 x i8>* %ptr 1019 %Y = zext <4 x i8> %X to <4 x i64> 1020 ret <4 x i64> %Y 1021} 1022 1023define <8 x i16> @load_zext_8i8_to_8i16(<8 x i8> *%ptr) { 1024; SSE2-LABEL: load_zext_8i8_to_8i16: 1025; SSE2: # %bb.0: # %entry 1026; SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero 1027; SSE2-NEXT: pxor %xmm1, %xmm1 1028; 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] 1029; SSE2-NEXT: retq 1030; 1031; SSSE3-LABEL: load_zext_8i8_to_8i16: 1032; SSSE3: # %bb.0: # %entry 1033; SSSE3-NEXT: movq {{.*#+}} xmm0 = mem[0],zero 1034; SSSE3-NEXT: pxor %xmm1, %xmm1 1035; 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] 1036; SSSE3-NEXT: retq 1037; 1038; SSE41-LABEL: load_zext_8i8_to_8i16: 1039; SSE41: # %bb.0: # %entry 1040; SSE41-NEXT: pmovzxbw {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero 1041; SSE41-NEXT: retq 1042; 1043; AVX-LABEL: load_zext_8i8_to_8i16: 1044; AVX: # %bb.0: # %entry 1045; AVX-NEXT: vpmovzxbw {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero 1046; AVX-NEXT: retq 1047entry: 1048 %X = load <8 x i8>, <8 x i8>* %ptr 1049 %Y = zext <8 x i8> %X to <8 x i16> 1050 ret <8 x i16> %Y 1051} 1052 1053define <8 x i32> @load_zext_8i8_to_8i32(<8 x i8> *%ptr) { 1054; SSE2-LABEL: load_zext_8i8_to_8i32: 1055; SSE2: # %bb.0: # %entry 1056; SSE2-NEXT: movq {{.*#+}} xmm1 = mem[0],zero 1057; SSE2-NEXT: pxor %xmm2, %xmm2 1058; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 1059; SSE2-NEXT: movdqa %xmm1, %xmm0 1060; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 1061; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 1062; SSE2-NEXT: retq 1063; 1064; SSSE3-LABEL: load_zext_8i8_to_8i32: 1065; SSSE3: # %bb.0: # %entry 1066; SSSE3-NEXT: movq {{.*#+}} xmm1 = mem[0],zero 1067; SSSE3-NEXT: pxor %xmm2, %xmm2 1068; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 1069; SSSE3-NEXT: movdqa %xmm1, %xmm0 1070; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 1071; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 1072; SSSE3-NEXT: retq 1073; 1074; SSE41-LABEL: load_zext_8i8_to_8i32: 1075; SSE41: # %bb.0: # %entry 1076; SSE41-NEXT: pmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero 1077; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero 1078; SSE41-NEXT: retq 1079; 1080; AVX1-LABEL: load_zext_8i8_to_8i32: 1081; AVX1: # %bb.0: # %entry 1082; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero 1083; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero 1084; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1085; AVX1-NEXT: retq 1086; 1087; AVX2-LABEL: load_zext_8i8_to_8i32: 1088; AVX2: # %bb.0: # %entry 1089; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero 1090; AVX2-NEXT: retq 1091; 1092; AVX512-LABEL: load_zext_8i8_to_8i32: 1093; AVX512: # %bb.0: # %entry 1094; AVX512-NEXT: vpmovzxbd {{.*#+}} ymm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero 1095; AVX512-NEXT: retq 1096entry: 1097 %X = load <8 x i8>, <8 x i8>* %ptr 1098 %Y = zext <8 x i8> %X to <8 x i32> 1099 ret <8 x i32> %Y 1100} 1101 1102define <8 x i32> @load_zext_16i8_to_8i32(<16 x i8> *%ptr) { 1103; SSE2-LABEL: load_zext_16i8_to_8i32: 1104; SSE2: # %bb.0: # %entry 1105; SSE2-NEXT: movdqa (%rdi), %xmm1 1106; SSE2-NEXT: pxor %xmm2, %xmm2 1107; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 1108; SSE2-NEXT: movdqa %xmm1, %xmm0 1109; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 1110; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 1111; SSE2-NEXT: retq 1112; 1113; SSSE3-LABEL: load_zext_16i8_to_8i32: 1114; SSSE3: # %bb.0: # %entry 1115; SSSE3-NEXT: movdqa (%rdi), %xmm1 1116; SSSE3-NEXT: pxor %xmm2, %xmm2 1117; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 1118; SSSE3-NEXT: movdqa %xmm1, %xmm0 1119; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 1120; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 1121; SSSE3-NEXT: retq 1122; 1123; SSE41-LABEL: load_zext_16i8_to_8i32: 1124; SSE41: # %bb.0: # %entry 1125; SSE41-NEXT: movdqa (%rdi), %xmm1 1126; SSE41-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero 1127; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,2,3] 1128; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero 1129; SSE41-NEXT: retq 1130; 1131; AVX1-LABEL: load_zext_16i8_to_8i32: 1132; AVX1: # %bb.0: # %entry 1133; AVX1-NEXT: vmovdqa (%rdi), %xmm0 1134; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 1135; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 1136; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 1137; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1138; AVX1-NEXT: retq 1139; 1140; AVX2-LABEL: load_zext_16i8_to_8i32: 1141; AVX2: # %bb.0: # %entry 1142; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero 1143; AVX2-NEXT: retq 1144; 1145; AVX512-LABEL: load_zext_16i8_to_8i32: 1146; AVX512: # %bb.0: # %entry 1147; AVX512-NEXT: vpmovzxbd {{.*#+}} ymm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero 1148; AVX512-NEXT: retq 1149entry: 1150 %X = load <16 x i8>, <16 x i8>* %ptr 1151 %Y = shufflevector <16 x i8> %X, <16 x i8> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> 1152 %Z = zext <8 x i8> %Y to <8 x i32> 1153 ret <8 x i32> %Z 1154} 1155 1156define <8 x i64> @load_zext_8i8_to_8i64(<8 x i8> *%ptr) { 1157; SSE2-LABEL: load_zext_8i8_to_8i64: 1158; SSE2: # %bb.0: # %entry 1159; SSE2-NEXT: movq {{.*#+}} xmm1 = mem[0],zero 1160; SSE2-NEXT: pxor %xmm4, %xmm4 1161; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,1,2,3] 1162; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3],xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7] 1163; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3] 1164; SSE2-NEXT: movdqa %xmm1, %xmm0 1165; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1] 1166; SSE2-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm4[2],xmm1[3],xmm4[3] 1167; SSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7] 1168; SSE2-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3] 1169; SSE2-NEXT: movdqa %xmm3, %xmm2 1170; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1] 1171; SSE2-NEXT: punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3] 1172; SSE2-NEXT: retq 1173; 1174; SSSE3-LABEL: load_zext_8i8_to_8i64: 1175; SSSE3: # %bb.0: # %entry 1176; SSSE3-NEXT: movq {{.*#+}} xmm1 = mem[0],zero 1177; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [0,128,128,128,128,128,128,128,1,128,128,128,128,128,128,128] 1178; SSSE3-NEXT: movdqa %xmm1, %xmm0 1179; SSSE3-NEXT: pshufb %xmm4, %xmm0 1180; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2,128,128,128,128,128,128,128,3,128,128,128,128,128,128,128] 1181; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,1,2,3] 1182; SSSE3-NEXT: pshufb %xmm5, %xmm1 1183; SSSE3-NEXT: movdqa %xmm3, %xmm2 1184; SSSE3-NEXT: pshufb %xmm4, %xmm2 1185; SSSE3-NEXT: pshufb %xmm5, %xmm3 1186; SSSE3-NEXT: retq 1187; 1188; SSE41-LABEL: load_zext_8i8_to_8i64: 1189; SSE41: # %bb.0: # %entry 1190; SSE41-NEXT: pmovzxbq {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero 1191; SSE41-NEXT: pmovzxbq {{.*#+}} xmm1 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero 1192; SSE41-NEXT: pmovzxbq {{.*#+}} xmm2 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero 1193; SSE41-NEXT: pmovzxbq {{.*#+}} xmm3 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero 1194; SSE41-NEXT: retq 1195; 1196; AVX1-LABEL: load_zext_8i8_to_8i64: 1197; AVX1: # %bb.0: # %entry 1198; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm1 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero 1199; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm2 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero 1200; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero 1201; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm3 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero 1202; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm3, %ymm0 1203; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1 1204; AVX1-NEXT: retq 1205; 1206; AVX2-LABEL: load_zext_8i8_to_8i64: 1207; AVX2: # %bb.0: # %entry 1208; AVX2-NEXT: vpmovzxbq {{.*#+}} ymm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero,mem[2],zero,zero,zero,zero,zero,zero,zero,mem[3],zero,zero,zero,zero,zero,zero,zero 1209; AVX2-NEXT: vpmovzxbq {{.*#+}} ymm1 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero,mem[2],zero,zero,zero,zero,zero,zero,zero,mem[3],zero,zero,zero,zero,zero,zero,zero 1210; AVX2-NEXT: retq 1211; 1212; AVX512-LABEL: load_zext_8i8_to_8i64: 1213; AVX512: # %bb.0: # %entry 1214; AVX512-NEXT: vpmovzxbq {{.*#+}} zmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero,mem[2],zero,zero,zero,zero,zero,zero,zero,mem[3],zero,zero,zero,zero,zero,zero,zero,mem[4],zero,zero,zero,zero,zero,zero,zero,mem[5],zero,zero,zero,zero,zero,zero,zero,mem[6],zero,zero,zero,zero,zero,zero,zero,mem[7],zero,zero,zero,zero,zero,zero,zero 1215; AVX512-NEXT: retq 1216entry: 1217 %X = load <8 x i8>, <8 x i8>* %ptr 1218 %Y = zext <8 x i8> %X to <8 x i64> 1219 ret <8 x i64> %Y 1220} 1221 1222define <16 x i16> @load_zext_16i8_to_16i16(<16 x i8> *%ptr) { 1223; SSE2-LABEL: load_zext_16i8_to_16i16: 1224; SSE2: # %bb.0: # %entry 1225; SSE2-NEXT: movdqa (%rdi), %xmm1 1226; SSE2-NEXT: pxor %xmm2, %xmm2 1227; SSE2-NEXT: movdqa %xmm1, %xmm0 1228; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7] 1229; SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15] 1230; SSE2-NEXT: retq 1231; 1232; SSSE3-LABEL: load_zext_16i8_to_16i16: 1233; SSSE3: # %bb.0: # %entry 1234; SSSE3-NEXT: movdqa (%rdi), %xmm1 1235; SSSE3-NEXT: pxor %xmm2, %xmm2 1236; SSSE3-NEXT: movdqa %xmm1, %xmm0 1237; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7] 1238; SSSE3-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15] 1239; SSSE3-NEXT: retq 1240; 1241; SSE41-LABEL: load_zext_16i8_to_16i16: 1242; SSE41: # %bb.0: # %entry 1243; SSE41-NEXT: pmovzxbw {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero 1244; SSE41-NEXT: pmovzxbw {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero 1245; SSE41-NEXT: retq 1246; 1247; AVX1-LABEL: load_zext_16i8_to_16i16: 1248; AVX1: # %bb.0: # %entry 1249; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero 1250; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero 1251; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1252; AVX1-NEXT: retq 1253; 1254; AVX2-LABEL: load_zext_16i8_to_16i16: 1255; AVX2: # %bb.0: # %entry 1256; AVX2-NEXT: vpmovzxbw {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero,mem[8],zero,mem[9],zero,mem[10],zero,mem[11],zero,mem[12],zero,mem[13],zero,mem[14],zero,mem[15],zero 1257; AVX2-NEXT: retq 1258; 1259; AVX512-LABEL: load_zext_16i8_to_16i16: 1260; AVX512: # %bb.0: # %entry 1261; AVX512-NEXT: vpmovzxbw {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero,mem[8],zero,mem[9],zero,mem[10],zero,mem[11],zero,mem[12],zero,mem[13],zero,mem[14],zero,mem[15],zero 1262; AVX512-NEXT: retq 1263entry: 1264 %X = load <16 x i8>, <16 x i8>* %ptr 1265 %Y = zext <16 x i8> %X to <16 x i16> 1266 ret <16 x i16> %Y 1267} 1268 1269define <2 x i64> @load_zext_2i16_to_2i64(<2 x i16> *%ptr) { 1270; SSE2-LABEL: load_zext_2i16_to_2i64: 1271; SSE2: # %bb.0: # %entry 1272; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 1273; SSE2-NEXT: pxor %xmm1, %xmm1 1274; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 1275; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 1276; SSE2-NEXT: retq 1277; 1278; SSSE3-LABEL: load_zext_2i16_to_2i64: 1279; SSSE3: # %bb.0: # %entry 1280; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 1281; SSSE3-NEXT: pxor %xmm1, %xmm1 1282; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 1283; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 1284; SSSE3-NEXT: retq 1285; 1286; SSE41-LABEL: load_zext_2i16_to_2i64: 1287; SSE41: # %bb.0: # %entry 1288; SSE41-NEXT: pmovzxwq {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero 1289; SSE41-NEXT: retq 1290; 1291; AVX-LABEL: load_zext_2i16_to_2i64: 1292; AVX: # %bb.0: # %entry 1293; AVX-NEXT: vpmovzxwq {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero 1294; AVX-NEXT: retq 1295entry: 1296 %X = load <2 x i16>, <2 x i16>* %ptr 1297 %Y = zext <2 x i16> %X to <2 x i64> 1298 ret <2 x i64> %Y 1299} 1300 1301define <4 x i32> @load_zext_4i16_to_4i32(<4 x i16> *%ptr) { 1302; SSE2-LABEL: load_zext_4i16_to_4i32: 1303; SSE2: # %bb.0: # %entry 1304; SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero 1305; SSE2-NEXT: pxor %xmm1, %xmm1 1306; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 1307; SSE2-NEXT: retq 1308; 1309; SSSE3-LABEL: load_zext_4i16_to_4i32: 1310; SSSE3: # %bb.0: # %entry 1311; SSSE3-NEXT: movq {{.*#+}} xmm0 = mem[0],zero 1312; SSSE3-NEXT: pxor %xmm1, %xmm1 1313; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 1314; SSSE3-NEXT: retq 1315; 1316; SSE41-LABEL: load_zext_4i16_to_4i32: 1317; SSE41: # %bb.0: # %entry 1318; SSE41-NEXT: pmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero 1319; SSE41-NEXT: retq 1320; 1321; AVX-LABEL: load_zext_4i16_to_4i32: 1322; AVX: # %bb.0: # %entry 1323; AVX-NEXT: vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero 1324; AVX-NEXT: retq 1325entry: 1326 %X = load <4 x i16>, <4 x i16>* %ptr 1327 %Y = zext <4 x i16> %X to <4 x i32> 1328 ret <4 x i32> %Y 1329} 1330 1331define <4 x i64> @load_zext_4i16_to_4i64(<4 x i16> *%ptr) { 1332; SSE2-LABEL: load_zext_4i16_to_4i64: 1333; SSE2: # %bb.0: # %entry 1334; SSE2-NEXT: movq {{.*#+}} xmm1 = mem[0],zero 1335; SSE2-NEXT: pxor %xmm2, %xmm2 1336; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3] 1337; SSE2-NEXT: movdqa %xmm1, %xmm0 1338; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 1339; SSE2-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3] 1340; SSE2-NEXT: retq 1341; 1342; SSSE3-LABEL: load_zext_4i16_to_4i64: 1343; SSSE3: # %bb.0: # %entry 1344; SSSE3-NEXT: movq {{.*#+}} xmm1 = mem[0],zero 1345; SSSE3-NEXT: pxor %xmm2, %xmm2 1346; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3] 1347; SSSE3-NEXT: movdqa %xmm1, %xmm0 1348; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 1349; SSSE3-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3] 1350; SSSE3-NEXT: retq 1351; 1352; SSE41-LABEL: load_zext_4i16_to_4i64: 1353; SSE41: # %bb.0: # %entry 1354; SSE41-NEXT: pmovzxwq {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero 1355; SSE41-NEXT: pmovzxwq {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero 1356; SSE41-NEXT: retq 1357; 1358; AVX1-LABEL: load_zext_4i16_to_4i64: 1359; AVX1: # %bb.0: # %entry 1360; AVX1-NEXT: vpmovzxwq {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero 1361; AVX1-NEXT: vpmovzxwq {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero 1362; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1363; AVX1-NEXT: retq 1364; 1365; AVX2-LABEL: load_zext_4i16_to_4i64: 1366; AVX2: # %bb.0: # %entry 1367; AVX2-NEXT: vpmovzxwq {{.*#+}} ymm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero 1368; AVX2-NEXT: retq 1369; 1370; AVX512-LABEL: load_zext_4i16_to_4i64: 1371; AVX512: # %bb.0: # %entry 1372; AVX512-NEXT: vpmovzxwq {{.*#+}} ymm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero 1373; AVX512-NEXT: retq 1374entry: 1375 %X = load <4 x i16>, <4 x i16>* %ptr 1376 %Y = zext <4 x i16> %X to <4 x i64> 1377 ret <4 x i64> %Y 1378} 1379 1380define <8 x i32> @load_zext_8i16_to_8i32(<8 x i16> *%ptr) { 1381; SSE2-LABEL: load_zext_8i16_to_8i32: 1382; SSE2: # %bb.0: # %entry 1383; SSE2-NEXT: movdqa (%rdi), %xmm1 1384; SSE2-NEXT: pxor %xmm2, %xmm2 1385; SSE2-NEXT: movdqa %xmm1, %xmm0 1386; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 1387; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 1388; SSE2-NEXT: retq 1389; 1390; SSSE3-LABEL: load_zext_8i16_to_8i32: 1391; SSSE3: # %bb.0: # %entry 1392; SSSE3-NEXT: movdqa (%rdi), %xmm1 1393; SSSE3-NEXT: pxor %xmm2, %xmm2 1394; SSSE3-NEXT: movdqa %xmm1, %xmm0 1395; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 1396; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 1397; SSSE3-NEXT: retq 1398; 1399; SSE41-LABEL: load_zext_8i16_to_8i32: 1400; SSE41: # %bb.0: # %entry 1401; SSE41-NEXT: pmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero 1402; SSE41-NEXT: pmovzxwd {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero 1403; SSE41-NEXT: retq 1404; 1405; AVX1-LABEL: load_zext_8i16_to_8i32: 1406; AVX1: # %bb.0: # %entry 1407; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero 1408; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero 1409; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1410; AVX1-NEXT: retq 1411; 1412; AVX2-LABEL: load_zext_8i16_to_8i32: 1413; AVX2: # %bb.0: # %entry 1414; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero 1415; AVX2-NEXT: retq 1416; 1417; AVX512-LABEL: load_zext_8i16_to_8i32: 1418; AVX512: # %bb.0: # %entry 1419; AVX512-NEXT: vpmovzxwd {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero 1420; AVX512-NEXT: retq 1421entry: 1422 %X = load <8 x i16>, <8 x i16>* %ptr 1423 %Y = zext <8 x i16> %X to <8 x i32> 1424 ret <8 x i32> %Y 1425} 1426 1427define <2 x i64> @load_zext_2i32_to_2i64(<2 x i32> *%ptr) { 1428; SSE2-LABEL: load_zext_2i32_to_2i64: 1429; SSE2: # %bb.0: # %entry 1430; SSE2-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 1431; SSE2-NEXT: xorps %xmm1, %xmm1 1432; SSE2-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 1433; SSE2-NEXT: retq 1434; 1435; SSSE3-LABEL: load_zext_2i32_to_2i64: 1436; SSSE3: # %bb.0: # %entry 1437; SSSE3-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 1438; SSSE3-NEXT: xorps %xmm1, %xmm1 1439; SSSE3-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 1440; SSSE3-NEXT: retq 1441; 1442; SSE41-LABEL: load_zext_2i32_to_2i64: 1443; SSE41: # %bb.0: # %entry 1444; SSE41-NEXT: pmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero 1445; SSE41-NEXT: retq 1446; 1447; AVX-LABEL: load_zext_2i32_to_2i64: 1448; AVX: # %bb.0: # %entry 1449; AVX-NEXT: vpmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero 1450; AVX-NEXT: retq 1451entry: 1452 %X = load <2 x i32>, <2 x i32>* %ptr 1453 %Y = zext <2 x i32> %X to <2 x i64> 1454 ret <2 x i64> %Y 1455} 1456 1457define <4 x i64> @load_zext_4i32_to_4i64(<4 x i32> *%ptr) { 1458; SSE2-LABEL: load_zext_4i32_to_4i64: 1459; SSE2: # %bb.0: # %entry 1460; SSE2-NEXT: movaps (%rdi), %xmm1 1461; SSE2-NEXT: xorps %xmm2, %xmm2 1462; SSE2-NEXT: movaps %xmm1, %xmm0 1463; SSE2-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 1464; SSE2-NEXT: unpckhps {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3] 1465; SSE2-NEXT: retq 1466; 1467; SSSE3-LABEL: load_zext_4i32_to_4i64: 1468; SSSE3: # %bb.0: # %entry 1469; SSSE3-NEXT: movaps (%rdi), %xmm1 1470; SSSE3-NEXT: xorps %xmm2, %xmm2 1471; SSSE3-NEXT: movaps %xmm1, %xmm0 1472; SSSE3-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 1473; SSSE3-NEXT: unpckhps {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3] 1474; SSSE3-NEXT: retq 1475; 1476; SSE41-LABEL: load_zext_4i32_to_4i64: 1477; SSE41: # %bb.0: # %entry 1478; SSE41-NEXT: pmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero 1479; SSE41-NEXT: pmovzxdq {{.*#+}} xmm1 = mem[0],zero,mem[1],zero 1480; SSE41-NEXT: retq 1481; 1482; AVX1-LABEL: load_zext_4i32_to_4i64: 1483; AVX1: # %bb.0: # %entry 1484; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero 1485; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = mem[0],zero,mem[1],zero 1486; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1487; AVX1-NEXT: retq 1488; 1489; AVX2-LABEL: load_zext_4i32_to_4i64: 1490; AVX2: # %bb.0: # %entry 1491; AVX2-NEXT: vpmovzxdq {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero 1492; AVX2-NEXT: retq 1493; 1494; AVX512-LABEL: load_zext_4i32_to_4i64: 1495; AVX512: # %bb.0: # %entry 1496; AVX512-NEXT: vpmovzxdq {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero 1497; AVX512-NEXT: retq 1498entry: 1499 %X = load <4 x i32>, <4 x i32>* %ptr 1500 %Y = zext <4 x i32> %X to <4 x i64> 1501 ret <4 x i64> %Y 1502} 1503 1504define <8 x i32> @zext_8i8_to_8i32(<8 x i8> %z) { 1505; SSE2-LABEL: zext_8i8_to_8i32: 1506; SSE2: # %bb.0: # %entry 1507; SSE2-NEXT: movdqa %xmm0, %xmm1 1508; SSE2-NEXT: pand {{.*}}(%rip), %xmm1 1509; SSE2-NEXT: pxor %xmm2, %xmm2 1510; SSE2-NEXT: movdqa %xmm1, %xmm0 1511; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 1512; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 1513; SSE2-NEXT: retq 1514; 1515; SSSE3-LABEL: zext_8i8_to_8i32: 1516; SSSE3: # %bb.0: # %entry 1517; SSSE3-NEXT: movdqa %xmm0, %xmm1 1518; SSSE3-NEXT: pand {{.*}}(%rip), %xmm1 1519; SSSE3-NEXT: pxor %xmm2, %xmm2 1520; SSSE3-NEXT: movdqa %xmm1, %xmm0 1521; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 1522; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 1523; SSSE3-NEXT: retq 1524; 1525; SSE41-LABEL: zext_8i8_to_8i32: 1526; SSE41: # %bb.0: # %entry 1527; SSE41-NEXT: movdqa %xmm0, %xmm1 1528; SSE41-NEXT: pand {{.*}}(%rip), %xmm1 1529; SSE41-NEXT: pxor %xmm2, %xmm2 1530; SSE41-NEXT: pmovzxwd {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero 1531; SSE41-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 1532; SSE41-NEXT: retq 1533; 1534; AVX1-LABEL: zext_8i8_to_8i32: 1535; AVX1: # %bb.0: # %entry 1536; AVX1-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 1537; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 1538; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm1 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] 1539; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 1540; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1541; AVX1-NEXT: retq 1542; 1543; AVX2-LABEL: zext_8i8_to_8i32: 1544; AVX2: # %bb.0: # %entry 1545; AVX2-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 1546; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1547; AVX2-NEXT: retq 1548; 1549; AVX512-LABEL: zext_8i8_to_8i32: 1550; AVX512: # %bb.0: # %entry 1551; AVX512-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 1552; AVX512-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1553; AVX512-NEXT: retq 1554entry: 1555 %t = zext <8 x i8> %z to <8 x i32> 1556 ret <8 x i32> %t 1557} 1558 1559define <8 x i32> @shuf_zext_8i16_to_8i32(<8 x i16> %A) nounwind uwtable readnone ssp { 1560; SSE2-LABEL: shuf_zext_8i16_to_8i32: 1561; SSE2: # %bb.0: # %entry 1562; SSE2-NEXT: movdqa %xmm0, %xmm1 1563; SSE2-NEXT: pxor %xmm2, %xmm2 1564; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 1565; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 1566; SSE2-NEXT: retq 1567; 1568; SSSE3-LABEL: shuf_zext_8i16_to_8i32: 1569; SSSE3: # %bb.0: # %entry 1570; SSSE3-NEXT: movdqa %xmm0, %xmm1 1571; SSSE3-NEXT: pxor %xmm2, %xmm2 1572; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 1573; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 1574; SSSE3-NEXT: retq 1575; 1576; SSE41-LABEL: shuf_zext_8i16_to_8i32: 1577; SSE41: # %bb.0: # %entry 1578; SSE41-NEXT: movdqa %xmm0, %xmm1 1579; SSE41-NEXT: pxor %xmm2, %xmm2 1580; SSE41-NEXT: pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 1581; SSE41-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 1582; SSE41-NEXT: retq 1583; 1584; AVX1-LABEL: shuf_zext_8i16_to_8i32: 1585; AVX1: # %bb.0: # %entry 1586; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 1587; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm1 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] 1588; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 1589; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1590; AVX1-NEXT: retq 1591; 1592; AVX2-LABEL: shuf_zext_8i16_to_8i32: 1593; AVX2: # %bb.0: # %entry 1594; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1595; AVX2-NEXT: retq 1596; 1597; AVX512-LABEL: shuf_zext_8i16_to_8i32: 1598; AVX512: # %bb.0: # %entry 1599; AVX512-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1600; AVX512-NEXT: retq 1601entry: 1602 %B = shufflevector <8 x i16> %A, <8 x i16> zeroinitializer, <16 x i32> <i32 0, i32 8, i32 1, i32 8, i32 2, i32 8, i32 3, i32 8, i32 4, i32 8, i32 5, i32 8, i32 6, i32 8, i32 7, i32 8> 1603 %Z = bitcast <16 x i16> %B to <8 x i32> 1604 ret <8 x i32> %Z 1605} 1606 1607define <4 x i64> @shuf_zext_4i32_to_4i64(<4 x i32> %A) nounwind uwtable readnone ssp { 1608; SSE2-LABEL: shuf_zext_4i32_to_4i64: 1609; SSE2: # %bb.0: # %entry 1610; SSE2-NEXT: movaps %xmm0, %xmm1 1611; SSE2-NEXT: xorps %xmm2, %xmm2 1612; SSE2-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 1613; SSE2-NEXT: unpckhps {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3] 1614; SSE2-NEXT: retq 1615; 1616; SSSE3-LABEL: shuf_zext_4i32_to_4i64: 1617; SSSE3: # %bb.0: # %entry 1618; SSSE3-NEXT: movaps %xmm0, %xmm1 1619; SSSE3-NEXT: xorps %xmm2, %xmm2 1620; SSSE3-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 1621; SSSE3-NEXT: unpckhps {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3] 1622; SSSE3-NEXT: retq 1623; 1624; SSE41-LABEL: shuf_zext_4i32_to_4i64: 1625; SSE41: # %bb.0: # %entry 1626; SSE41-NEXT: movdqa %xmm0, %xmm1 1627; SSE41-NEXT: pxor %xmm2, %xmm2 1628; SSE41-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero 1629; SSE41-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3] 1630; SSE41-NEXT: retq 1631; 1632; AVX1-LABEL: shuf_zext_4i32_to_4i64: 1633; AVX1: # %bb.0: # %entry 1634; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 1635; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm1 = xmm0[2],xmm1[2],xmm0[3],xmm1[3] 1636; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero 1637; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1638; AVX1-NEXT: retq 1639; 1640; AVX2-LABEL: shuf_zext_4i32_to_4i64: 1641; AVX2: # %bb.0: # %entry 1642; AVX2-NEXT: vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 1643; AVX2-NEXT: retq 1644; 1645; AVX512-LABEL: shuf_zext_4i32_to_4i64: 1646; AVX512: # %bb.0: # %entry 1647; AVX512-NEXT: vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 1648; AVX512-NEXT: retq 1649entry: 1650 %B = shufflevector <4 x i32> %A, <4 x i32> zeroinitializer, <8 x i32> <i32 0, i32 4, i32 1, i32 4, i32 2, i32 4, i32 3, i32 4> 1651 %Z = bitcast <8 x i32> %B to <4 x i64> 1652 ret <4 x i64> %Z 1653} 1654 1655define <8 x i32> @shuf_zext_8i8_to_8i32(<8 x i8> %A) { 1656; SSE2-LABEL: shuf_zext_8i8_to_8i32: 1657; SSE2: # %bb.0: # %entry 1658; SSE2-NEXT: movdqa %xmm0, %xmm1 1659; SSE2-NEXT: pand {{.*}}(%rip), %xmm1 1660; SSE2-NEXT: packuswb %xmm1, %xmm1 1661; SSE2-NEXT: pxor %xmm2, %xmm2 1662; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 1663; SSE2-NEXT: movdqa %xmm1, %xmm0 1664; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 1665; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 1666; SSE2-NEXT: retq 1667; 1668; SSSE3-LABEL: shuf_zext_8i8_to_8i32: 1669; SSSE3: # %bb.0: # %entry 1670; SSSE3-NEXT: movdqa %xmm0, %xmm1 1671; SSSE3-NEXT: pand {{.*}}(%rip), %xmm1 1672; SSSE3-NEXT: pxor %xmm2, %xmm2 1673; SSSE3-NEXT: movdqa %xmm1, %xmm0 1674; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 1675; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 1676; SSSE3-NEXT: retq 1677; 1678; SSE41-LABEL: shuf_zext_8i8_to_8i32: 1679; SSE41: # %bb.0: # %entry 1680; SSE41-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u] 1681; SSE41-NEXT: pmovzxbd {{.*#+}} xmm2 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 1682; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 1683; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 1684; SSE41-NEXT: movdqa %xmm2, %xmm0 1685; SSE41-NEXT: retq 1686; 1687; AVX1-LABEL: shuf_zext_8i8_to_8i32: 1688; AVX1: # %bb.0: # %entry 1689; AVX1-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u] 1690; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 1691; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 1692; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 1693; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1694; AVX1-NEXT: retq 1695; 1696; AVX2-LABEL: shuf_zext_8i8_to_8i32: 1697; AVX2: # %bb.0: # %entry 1698; AVX2-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u] 1699; 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,zero 1700; AVX2-NEXT: retq 1701; 1702; AVX512-LABEL: shuf_zext_8i8_to_8i32: 1703; AVX512: # %bb.0: # %entry 1704; AVX512-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u] 1705; 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,zero 1706; AVX512-NEXT: retq 1707entry: 1708 %B = shufflevector <8 x i8> %A, <8 x i8> zeroinitializer, <32 x i32> <i32 0, i32 8, i32 8, i32 8, i32 1, i32 8, i32 8, i32 8, i32 2, i32 8, i32 8, i32 8, i32 3, i32 8, i32 8, i32 8, i32 4, i32 8, i32 8, i32 8, i32 5, i32 8, i32 8, i32 8, i32 6, i32 8, i32 8, i32 8, i32 7, i32 8, i32 8, i32 8> 1709 %Z = bitcast <32 x i8> %B to <8 x i32> 1710 ret <8 x i32> %Z 1711} 1712 1713define <2 x i64> @shuf_zext_16i8_to_2i64_offset6(<16 x i8> %A) nounwind uwtable readnone ssp { 1714; SSE2-LABEL: shuf_zext_16i8_to_2i64_offset6: 1715; SSE2: # %bb.0: # %entry 1716; SSE2-NEXT: pxor %xmm1, %xmm1 1717; 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] 1718; SSE2-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] 1719; SSE2-NEXT: punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3] 1720; SSE2-NEXT: retq 1721; 1722; SSSE3-LABEL: shuf_zext_16i8_to_2i64_offset6: 1723; SSSE3: # %bb.0: # %entry 1724; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[6],zero,zero,zero,zero,zero,zero,zero,xmm0[7],zero,zero,zero,zero,zero,zero,zero 1725; SSSE3-NEXT: retq 1726; 1727; SSE41-LABEL: shuf_zext_16i8_to_2i64_offset6: 1728; SSE41: # %bb.0: # %entry 1729; SSE41-NEXT: psrlq $48, %xmm0 1730; SSE41-NEXT: pmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 1731; SSE41-NEXT: retq 1732; 1733; AVX1-LABEL: shuf_zext_16i8_to_2i64_offset6: 1734; AVX1: # %bb.0: # %entry 1735; AVX1-NEXT: vpsrlq $48, %xmm0, %xmm0 1736; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 1737; AVX1-NEXT: retq 1738; 1739; AVX2-SLOW-LABEL: shuf_zext_16i8_to_2i64_offset6: 1740; AVX2-SLOW: # %bb.0: # %entry 1741; AVX2-SLOW-NEXT: vpsrlq $48, %xmm0, %xmm0 1742; AVX2-SLOW-NEXT: vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 1743; AVX2-SLOW-NEXT: retq 1744; 1745; AVX2-FAST-LABEL: shuf_zext_16i8_to_2i64_offset6: 1746; AVX2-FAST: # %bb.0: # %entry 1747; AVX2-FAST-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[6],zero,zero,zero,zero,zero,zero,zero,xmm0[7],zero,zero,zero,zero,zero,zero,zero 1748; AVX2-FAST-NEXT: retq 1749; 1750; AVX512F-LABEL: shuf_zext_16i8_to_2i64_offset6: 1751; AVX512F: # %bb.0: # %entry 1752; AVX512F-NEXT: vpsrlq $48, %xmm0, %xmm0 1753; AVX512F-NEXT: vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 1754; AVX512F-NEXT: retq 1755; 1756; AVX512BW-LABEL: shuf_zext_16i8_to_2i64_offset6: 1757; AVX512BW: # %bb.0: # %entry 1758; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[6],zero,zero,zero,zero,zero,zero,zero,xmm0[7],zero,zero,zero,zero,zero,zero,zero 1759; AVX512BW-NEXT: retq 1760entry: 1761 %B = shufflevector <16 x i8> %A, <16 x i8> zeroinitializer, <16 x i32> <i32 6, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 7, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16> 1762 %Z = bitcast <16 x i8> %B to <2 x i64> 1763 ret <2 x i64> %Z 1764} 1765 1766define <4 x i64> @shuf_zext_16i8_to_4i64_offset11(<16 x i8> %A) nounwind uwtable readnone ssp { 1767; SSE2-LABEL: shuf_zext_16i8_to_4i64_offset11: 1768; SSE2: # %bb.0: # %entry 1769; SSE2-NEXT: movdqa %xmm0, %xmm1 1770; SSE2-NEXT: psrldq {{.*#+}} xmm1 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero 1771; SSE2-NEXT: pxor %xmm2, %xmm2 1772; SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15] 1773; SSE2-NEXT: movdqa %xmm1, %xmm0 1774; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 1775; SSE2-NEXT: punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm2[2],xmm0[3],xmm2[3] 1776; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 1777; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1] 1778; SSE2-NEXT: retq 1779; 1780; SSSE3-LABEL: shuf_zext_16i8_to_4i64_offset11: 1781; SSSE3: # %bb.0: # %entry 1782; SSSE3-NEXT: movdqa %xmm0, %xmm1 1783; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[11],zero,zero,zero,zero,zero,zero,zero,xmm0[12],zero,zero,zero,zero,zero,zero,zero 1784; SSSE3-NEXT: pshufb {{.*#+}} xmm1 = xmm1[13],zero,zero,zero,zero,zero,zero,zero,xmm1[14],zero,zero,zero,zero,zero,zero,zero 1785; SSSE3-NEXT: retq 1786; 1787; SSE41-LABEL: shuf_zext_16i8_to_4i64_offset11: 1788; SSE41: # %bb.0: # %entry 1789; SSE41-NEXT: movdqa %xmm0, %xmm1 1790; SSE41-NEXT: psrldq {{.*#+}} xmm1 = xmm1[11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 1791; SSE41-NEXT: pmovzxbq {{.*#+}} xmm2 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero 1792; SSE41-NEXT: psrldq {{.*#+}} xmm0 = xmm0[13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 1793; SSE41-NEXT: pmovzxbq {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 1794; SSE41-NEXT: movdqa %xmm2, %xmm0 1795; SSE41-NEXT: retq 1796; 1797; AVX1-LABEL: shuf_zext_16i8_to_4i64_offset11: 1798; AVX1: # %bb.0: # %entry 1799; AVX1-NEXT: vpsrldq {{.*#+}} xmm1 = xmm0[11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 1800; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero 1801; AVX1-NEXT: vpsrldq {{.*#+}} xmm0 = xmm0[13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 1802; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 1803; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1804; AVX1-NEXT: retq 1805; 1806; AVX2-LABEL: shuf_zext_16i8_to_4i64_offset11: 1807; AVX2: # %bb.0: # %entry 1808; AVX2-NEXT: vpsrldq {{.*#+}} xmm0 = xmm0[11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 1809; AVX2-NEXT: vpmovzxbq {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero,xmm0[2],zero,zero,zero,zero,zero,zero,zero,xmm0[3],zero,zero,zero,zero,zero,zero,zero 1810; AVX2-NEXT: retq 1811; 1812; AVX512-LABEL: shuf_zext_16i8_to_4i64_offset11: 1813; AVX512: # %bb.0: # %entry 1814; AVX512-NEXT: vpsrldq {{.*#+}} xmm0 = xmm0[11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 1815; AVX512-NEXT: vpmovzxbq {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero,xmm0[2],zero,zero,zero,zero,zero,zero,zero,xmm0[3],zero,zero,zero,zero,zero,zero,zero 1816; AVX512-NEXT: retq 1817entry: 1818 %B = shufflevector <16 x i8> %A, <16 x i8> zeroinitializer, <32 x i32> <i32 11, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 12, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 13, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 14, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16> 1819 %Z = bitcast <32 x i8> %B to <4 x i64> 1820 ret <4 x i64> %Z 1821} 1822 1823define <2 x i64> @shuf_zext_8i16_to_2i64_offset6(<8 x i16> %A) nounwind uwtable readnone ssp { 1824; SSE2-LABEL: shuf_zext_8i16_to_2i64_offset6: 1825; SSE2: # %bb.0: # %entry 1826; SSE2-NEXT: psrldq {{.*#+}} xmm0 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero 1827; SSE2-NEXT: pxor %xmm1, %xmm1 1828; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 1829; SSE2-NEXT: punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3] 1830; SSE2-NEXT: retq 1831; 1832; SSSE3-LABEL: shuf_zext_8i16_to_2i64_offset6: 1833; SSSE3: # %bb.0: # %entry 1834; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[6,7],zero,zero,zero,zero,zero,zero,xmm0[8,9],zero,zero,zero,zero,zero,zero 1835; SSSE3-NEXT: retq 1836; 1837; SSE41-LABEL: shuf_zext_8i16_to_2i64_offset6: 1838; SSE41: # %bb.0: # %entry 1839; SSE41-NEXT: psrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero 1840; SSE41-NEXT: pmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero 1841; SSE41-NEXT: retq 1842; 1843; AVX1-LABEL: shuf_zext_8i16_to_2i64_offset6: 1844; AVX1: # %bb.0: # %entry 1845; AVX1-NEXT: vpsrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero 1846; AVX1-NEXT: vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero 1847; AVX1-NEXT: retq 1848; 1849; AVX2-SLOW-LABEL: shuf_zext_8i16_to_2i64_offset6: 1850; AVX2-SLOW: # %bb.0: # %entry 1851; AVX2-SLOW-NEXT: vpsrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero 1852; AVX2-SLOW-NEXT: vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero 1853; AVX2-SLOW-NEXT: retq 1854; 1855; AVX2-FAST-LABEL: shuf_zext_8i16_to_2i64_offset6: 1856; AVX2-FAST: # %bb.0: # %entry 1857; AVX2-FAST-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[6,7],zero,zero,zero,zero,zero,zero,xmm0[8,9],zero,zero,zero,zero,zero,zero 1858; AVX2-FAST-NEXT: retq 1859; 1860; AVX512F-LABEL: shuf_zext_8i16_to_2i64_offset6: 1861; AVX512F: # %bb.0: # %entry 1862; AVX512F-NEXT: vpsrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero 1863; AVX512F-NEXT: vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero 1864; AVX512F-NEXT: retq 1865; 1866; AVX512BW-LABEL: shuf_zext_8i16_to_2i64_offset6: 1867; AVX512BW: # %bb.0: # %entry 1868; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[6,7],zero,zero,zero,zero,zero,zero,xmm0[8,9],zero,zero,zero,zero,zero,zero 1869; AVX512BW-NEXT: retq 1870entry: 1871 %B = shufflevector <8 x i16> %A, <8 x i16> zeroinitializer, <8 x i32> <i32 3, i32 8, i32 8, i32 8, i32 4, i32 8, i32 8, i32 8> 1872 %Z = bitcast <8 x i16> %B to <2 x i64> 1873 ret <2 x i64> %Z 1874} 1875 1876define <4 x i64> @shuf_zext_8i16_to_4i64_offset2(<8 x i16> %A) nounwind uwtable readnone ssp { 1877; SSE2-LABEL: shuf_zext_8i16_to_4i64_offset2: 1878; SSE2: # %bb.0: # %entry 1879; SSE2-NEXT: movdqa %xmm0, %xmm1 1880; SSE2-NEXT: pxor %xmm2, %xmm2 1881; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 1882; SSE2-NEXT: punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm2[2],xmm0[3],xmm2[3] 1883; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 1884; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1] 1885; SSE2-NEXT: retq 1886; 1887; SSSE3-LABEL: shuf_zext_8i16_to_4i64_offset2: 1888; SSSE3: # %bb.0: # %entry 1889; SSSE3-NEXT: movdqa %xmm0, %xmm1 1890; SSSE3-NEXT: pxor %xmm2, %xmm2 1891; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 1892; SSSE3-NEXT: punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm2[2],xmm0[3],xmm2[3] 1893; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 1894; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1] 1895; SSSE3-NEXT: retq 1896; 1897; SSE41-LABEL: shuf_zext_8i16_to_4i64_offset2: 1898; SSE41: # %bb.0: # %entry 1899; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1900; SSE41-NEXT: pmovzxwq {{.*#+}} xmm2 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero 1901; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 1902; SSE41-NEXT: pmovzxwq {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero 1903; SSE41-NEXT: movdqa %xmm2, %xmm0 1904; SSE41-NEXT: retq 1905; 1906; AVX1-LABEL: shuf_zext_8i16_to_4i64_offset2: 1907; AVX1: # %bb.0: # %entry 1908; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1909; AVX1-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero 1910; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 1911; AVX1-NEXT: vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero 1912; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1913; AVX1-NEXT: retq 1914; 1915; AVX2-LABEL: shuf_zext_8i16_to_4i64_offset2: 1916; AVX2: # %bb.0: # %entry 1917; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,2,2,3] 1918; AVX2-NEXT: vpmovzxwq {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 1919; AVX2-NEXT: retq 1920; 1921; AVX512-LABEL: shuf_zext_8i16_to_4i64_offset2: 1922; AVX512: # %bb.0: # %entry 1923; AVX512-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,2,2,3] 1924; AVX512-NEXT: vpmovzxwq {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 1925; AVX512-NEXT: retq 1926entry: 1927 %B = shufflevector <8 x i16> %A, <8 x i16> zeroinitializer, <16 x i32> <i32 2, i32 8, i32 8, i32 8, i32 3, i32 8, i32 8, i32 8, i32 4, i32 8, i32 8, i32 8, i32 5, i32 8, i32 8, i32 8> 1928 %Z = bitcast <16 x i16> %B to <4 x i64> 1929 ret <4 x i64> %Z 1930} 1931 1932define <4 x i32> @shuf_zext_8i16_to_4i32_offset1(<8 x i16> %A) nounwind uwtable readnone ssp { 1933; SSE2-LABEL: shuf_zext_8i16_to_4i32_offset1: 1934; SSE2: # %bb.0: # %entry 1935; SSE2-NEXT: psrldq {{.*#+}} xmm0 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero 1936; SSE2-NEXT: pxor %xmm1, %xmm1 1937; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 1938; SSE2-NEXT: retq 1939; 1940; SSSE3-LABEL: shuf_zext_8i16_to_4i32_offset1: 1941; SSSE3: # %bb.0: # %entry 1942; SSSE3-NEXT: psrldq {{.*#+}} xmm0 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero 1943; SSSE3-NEXT: pxor %xmm1, %xmm1 1944; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 1945; SSSE3-NEXT: retq 1946; 1947; SSE41-LABEL: shuf_zext_8i16_to_4i32_offset1: 1948; SSE41: # %bb.0: # %entry 1949; SSE41-NEXT: psrldq {{.*#+}} xmm0 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero 1950; SSE41-NEXT: pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 1951; SSE41-NEXT: retq 1952; 1953; AVX1-LABEL: shuf_zext_8i16_to_4i32_offset1: 1954; AVX1: # %bb.0: # %entry 1955; AVX1-NEXT: vpsrldq {{.*#+}} xmm0 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero 1956; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 1957; AVX1-NEXT: retq 1958; 1959; AVX2-SLOW-LABEL: shuf_zext_8i16_to_4i32_offset1: 1960; AVX2-SLOW: # %bb.0: # %entry 1961; AVX2-SLOW-NEXT: vpsrldq {{.*#+}} xmm0 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero 1962; AVX2-SLOW-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 1963; AVX2-SLOW-NEXT: retq 1964; 1965; AVX2-FAST-LABEL: shuf_zext_8i16_to_4i32_offset1: 1966; AVX2-FAST: # %bb.0: # %entry 1967; AVX2-FAST-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[2,3],zero,zero,xmm0[4,5],zero,zero,xmm0[6,7],zero,zero,xmm0[8,9],zero,zero 1968; AVX2-FAST-NEXT: retq 1969; 1970; AVX512F-LABEL: shuf_zext_8i16_to_4i32_offset1: 1971; AVX512F: # %bb.0: # %entry 1972; AVX512F-NEXT: vpsrldq {{.*#+}} xmm0 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero 1973; AVX512F-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 1974; AVX512F-NEXT: retq 1975; 1976; AVX512BW-LABEL: shuf_zext_8i16_to_4i32_offset1: 1977; AVX512BW: # %bb.0: # %entry 1978; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[2,3],zero,zero,xmm0[4,5],zero,zero,xmm0[6,7],zero,zero,xmm0[8,9],zero,zero 1979; AVX512BW-NEXT: retq 1980entry: 1981 %B = shufflevector <8 x i16> %A, <8 x i16> zeroinitializer, <8 x i32> <i32 1, i32 8, i32 2, i32 8, i32 3, i32 8, i32 4, i32 8> 1982 %Z = bitcast <8 x i16> %B to <4 x i32> 1983 ret <4 x i32> %Z 1984} 1985 1986define <8 x i32> @shuf_zext_8i16_to_8i32_offset3(<8 x i16> %A) nounwind uwtable readnone ssp { 1987; SSE2-LABEL: shuf_zext_8i16_to_8i32_offset3: 1988; SSE2: # %bb.0: # %entry 1989; SSE2-NEXT: movdqa %xmm0, %xmm1 1990; SSE2-NEXT: psrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero 1991; SSE2-NEXT: pxor %xmm2, %xmm2 1992; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 1993; SSE2-NEXT: psrldq {{.*#+}} xmm1 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 1994; SSE2-NEXT: retq 1995; 1996; SSSE3-LABEL: shuf_zext_8i16_to_8i32_offset3: 1997; SSSE3: # %bb.0: # %entry 1998; SSSE3-NEXT: movdqa %xmm0, %xmm1 1999; SSSE3-NEXT: psrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero 2000; SSSE3-NEXT: pxor %xmm2, %xmm2 2001; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 2002; SSSE3-NEXT: psrldq {{.*#+}} xmm1 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 2003; SSSE3-NEXT: retq 2004; 2005; SSE41-LABEL: shuf_zext_8i16_to_8i32_offset3: 2006; SSE41: # %bb.0: # %entry 2007; SSE41-NEXT: movdqa %xmm0, %xmm1 2008; SSE41-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13] 2009; SSE41-NEXT: pxor %xmm2, %xmm2 2010; SSE41-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7] 2011; SSE41-NEXT: psrldq {{.*#+}} xmm1 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 2012; SSE41-NEXT: retq 2013; 2014; AVX1-LABEL: shuf_zext_8i16_to_8i32_offset3: 2015; AVX1: # %bb.0: # %entry 2016; AVX1-NEXT: vpslldq {{.*#+}} xmm1 = zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13] 2017; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 2018; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 2019; AVX1-NEXT: vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 2020; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 2021; AVX1-NEXT: retq 2022; 2023; AVX2-LABEL: shuf_zext_8i16_to_8i32_offset3: 2024; AVX2: # %bb.0: # %entry 2025; AVX2-NEXT: vpsrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero 2026; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 2027; AVX2-NEXT: retq 2028; 2029; AVX512-LABEL: shuf_zext_8i16_to_8i32_offset3: 2030; AVX512: # %bb.0: # %entry 2031; AVX512-NEXT: vpsrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero 2032; AVX512-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 2033; AVX512-NEXT: retq 2034entry: 2035 %B = shufflevector <8 x i16> %A, <8 x i16> zeroinitializer, <16 x i32> <i32 3, i32 8, i32 4, i32 8, i32 5, i32 8, i32 6, i32 8, i32 7, i32 8, i32 undef, i32 8, i32 undef, i32 8, i32 undef, i32 8> 2036 %Z = bitcast <16 x i16> %B to <8 x i32> 2037 ret <8 x i32> %Z 2038} 2039 2040define <8 x i32> @shuf_zext_16i16_to_8i32_offset8(<16 x i16> %A) nounwind uwtable readnone ssp { 2041; SSE2-LABEL: shuf_zext_16i16_to_8i32_offset8: 2042; SSE2: # %bb.0: # %entry 2043; SSE2-NEXT: pxor %xmm2, %xmm2 2044; SSE2-NEXT: movdqa %xmm1, %xmm0 2045; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 2046; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 2047; SSE2-NEXT: retq 2048; 2049; SSSE3-LABEL: shuf_zext_16i16_to_8i32_offset8: 2050; SSSE3: # %bb.0: # %entry 2051; SSSE3-NEXT: pxor %xmm2, %xmm2 2052; SSSE3-NEXT: movdqa %xmm1, %xmm0 2053; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 2054; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 2055; SSSE3-NEXT: retq 2056; 2057; SSE41-LABEL: shuf_zext_16i16_to_8i32_offset8: 2058; SSE41: # %bb.0: # %entry 2059; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,2,3,3] 2060; SSE41-NEXT: pxor %xmm2, %xmm2 2061; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3],xmm0[4],xmm2[5,6,7] 2062; SSE41-NEXT: pmovzxwd {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero 2063; SSE41-NEXT: movdqa %xmm2, %xmm1 2064; SSE41-NEXT: retq 2065; 2066; AVX1-LABEL: shuf_zext_16i16_to_8i32_offset8: 2067; AVX1: # %bb.0: # %entry 2068; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 2069; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,2,3,3] 2070; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 2071; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3],xmm1[4],xmm2[5,6,7] 2072; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 2073; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 2074; AVX1-NEXT: retq 2075; 2076; AVX2-LABEL: shuf_zext_16i16_to_8i32_offset8: 2077; AVX2: # %bb.0: # %entry 2078; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 2079; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 2080; AVX2-NEXT: retq 2081; 2082; AVX512-LABEL: shuf_zext_16i16_to_8i32_offset8: 2083; AVX512: # %bb.0: # %entry 2084; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm0 2085; AVX512-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 2086; AVX512-NEXT: retq 2087entry: 2088 %B = shufflevector <16 x i16> %A, <16 x i16> zeroinitializer, <16 x i32> <i32 8, i32 16, i32 9, i32 16, i32 10, i32 16, i32 11, i32 16, i32 12, i32 16, i32 undef, i32 16, i32 14, i32 16, i32 undef, i32 16> 2089 %Z = bitcast <16 x i16> %B to <8 x i32> 2090 ret <8 x i32> %Z 2091} 2092 2093define <2 x i64> @shuf_zext_4i32_to_2i64_offset2(<4 x i32> %A) nounwind uwtable readnone ssp { 2094; SSE-LABEL: shuf_zext_4i32_to_2i64_offset2: 2095; SSE: # %bb.0: # %entry 2096; SSE-NEXT: xorps %xmm1, %xmm1 2097; SSE-NEXT: unpckhps {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3] 2098; SSE-NEXT: retq 2099; 2100; AVX-LABEL: shuf_zext_4i32_to_2i64_offset2: 2101; AVX: # %bb.0: # %entry 2102; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 2103; AVX-NEXT: vunpckhps {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3] 2104; AVX-NEXT: retq 2105entry: 2106 %B = shufflevector <4 x i32> %A, <4 x i32> zeroinitializer, <4 x i32> <i32 2, i32 4, i32 3, i32 4> 2107 %Z = bitcast <4 x i32> %B to <2 x i64> 2108 ret <2 x i64> %Z 2109} 2110 2111define <4 x i64> @shuf_zext_4i32_to_4i64_offset1(<4 x i32> %A) nounwind uwtable readnone ssp { 2112; SSE2-LABEL: shuf_zext_4i32_to_4i64_offset1: 2113; SSE2: # %bb.0: # %entry 2114; SSE2-NEXT: movdqa %xmm0, %xmm1 2115; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [0,0,4294967295,0] 2116; SSE2-NEXT: pand %xmm1, %xmm0 2117; SSE2-NEXT: psrldq {{.*#+}} xmm1 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 2118; SSE2-NEXT: retq 2119; 2120; SSSE3-LABEL: shuf_zext_4i32_to_4i64_offset1: 2121; SSSE3: # %bb.0: # %entry 2122; SSSE3-NEXT: movdqa %xmm0, %xmm1 2123; SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [0,0,4294967295,0] 2124; SSSE3-NEXT: pand %xmm1, %xmm0 2125; SSSE3-NEXT: psrldq {{.*#+}} xmm1 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 2126; SSSE3-NEXT: retq 2127; 2128; SSE41-LABEL: shuf_zext_4i32_to_4i64_offset1: 2129; SSE41: # %bb.0: # %entry 2130; SSE41-NEXT: movdqa %xmm0, %xmm1 2131; SSE41-NEXT: pxor %xmm0, %xmm0 2132; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5],xmm0[6,7] 2133; SSE41-NEXT: psrldq {{.*#+}} xmm1 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 2134; SSE41-NEXT: retq 2135; 2136; AVX1-LABEL: shuf_zext_4i32_to_4i64_offset1: 2137; AVX1: # %bb.0: # %entry 2138; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 2139; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm0[4,5],xmm1[6,7] 2140; AVX1-NEXT: vpsrldq {{.*#+}} xmm0 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 2141; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 2142; AVX1-NEXT: retq 2143; 2144; AVX2-LABEL: shuf_zext_4i32_to_4i64_offset1: 2145; AVX2: # %bb.0: # %entry 2146; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,2,3,3] 2147; AVX2-NEXT: vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 2148; AVX2-NEXT: retq 2149; 2150; AVX512-LABEL: shuf_zext_4i32_to_4i64_offset1: 2151; AVX512: # %bb.0: # %entry 2152; AVX512-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,2,3,3] 2153; AVX512-NEXT: vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 2154; AVX512-NEXT: retq 2155entry: 2156 %B = shufflevector <4 x i32> %A, <4 x i32> zeroinitializer, <8 x i32> <i32 undef, i32 4, i32 2, i32 4, i32 3, i32 4, i32 undef, i32 4> 2157 %Z = bitcast <8 x i32> %B to <4 x i64> 2158 ret <4 x i64> %Z 2159} 2160 2161define <32 x i32> @zext_32i8_to_32i32(<32 x i8> %x) { 2162; SSE2-LABEL: zext_32i8_to_32i32: 2163; SSE2: # %bb.0: 2164; SSE2-NEXT: movq %rdi, %rax 2165; SSE2-NEXT: pxor %xmm2, %xmm2 2166; SSE2-NEXT: movdqa %xmm0, %xmm3 2167; SSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7] 2168; SSE2-NEXT: movdqa %xmm3, %xmm8 2169; SSE2-NEXT: punpcklwd {{.*#+}} xmm8 = xmm8[0],xmm2[0],xmm8[1],xmm2[1],xmm8[2],xmm2[2],xmm8[3],xmm2[3] 2170; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7] 2171; SSE2-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm2[8],xmm0[9],xmm2[9],xmm0[10],xmm2[10],xmm0[11],xmm2[11],xmm0[12],xmm2[12],xmm0[13],xmm2[13],xmm0[14],xmm2[14],xmm0[15],xmm2[15] 2172; SSE2-NEXT: movdqa %xmm0, %xmm5 2173; SSE2-NEXT: punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm2[0],xmm5[1],xmm2[1],xmm5[2],xmm2[2],xmm5[3],xmm2[3] 2174; SSE2-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7] 2175; SSE2-NEXT: movdqa %xmm1, %xmm6 2176; SSE2-NEXT: punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm2[0],xmm6[1],xmm2[1],xmm6[2],xmm2[2],xmm6[3],xmm2[3],xmm6[4],xmm2[4],xmm6[5],xmm2[5],xmm6[6],xmm2[6],xmm6[7],xmm2[7] 2177; SSE2-NEXT: movdqa %xmm6, %xmm7 2178; SSE2-NEXT: punpcklwd {{.*#+}} xmm7 = xmm7[0],xmm2[0],xmm7[1],xmm2[1],xmm7[2],xmm2[2],xmm7[3],xmm2[3] 2179; SSE2-NEXT: punpckhwd {{.*#+}} xmm6 = xmm6[4],xmm2[4],xmm6[5],xmm2[5],xmm6[6],xmm2[6],xmm6[7],xmm2[7] 2180; SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15] 2181; SSE2-NEXT: movdqa %xmm1, %xmm4 2182; SSE2-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3] 2183; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 2184; SSE2-NEXT: movdqa %xmm1, 112(%rdi) 2185; SSE2-NEXT: movdqa %xmm4, 96(%rdi) 2186; SSE2-NEXT: movdqa %xmm6, 80(%rdi) 2187; SSE2-NEXT: movdqa %xmm7, 64(%rdi) 2188; SSE2-NEXT: movdqa %xmm0, 48(%rdi) 2189; SSE2-NEXT: movdqa %xmm5, 32(%rdi) 2190; SSE2-NEXT: movdqa %xmm3, 16(%rdi) 2191; SSE2-NEXT: movdqa %xmm8, (%rdi) 2192; SSE2-NEXT: retq 2193; 2194; SSSE3-LABEL: zext_32i8_to_32i32: 2195; SSSE3: # %bb.0: 2196; SSSE3-NEXT: movq %rdi, %rax 2197; SSSE3-NEXT: pxor %xmm2, %xmm2 2198; SSSE3-NEXT: movdqa %xmm0, %xmm3 2199; SSSE3-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7] 2200; SSSE3-NEXT: movdqa %xmm3, %xmm8 2201; SSSE3-NEXT: punpcklwd {{.*#+}} xmm8 = xmm8[0],xmm2[0],xmm8[1],xmm2[1],xmm8[2],xmm2[2],xmm8[3],xmm2[3] 2202; SSSE3-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7] 2203; SSSE3-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm2[8],xmm0[9],xmm2[9],xmm0[10],xmm2[10],xmm0[11],xmm2[11],xmm0[12],xmm2[12],xmm0[13],xmm2[13],xmm0[14],xmm2[14],xmm0[15],xmm2[15] 2204; SSSE3-NEXT: movdqa %xmm0, %xmm5 2205; SSSE3-NEXT: punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm2[0],xmm5[1],xmm2[1],xmm5[2],xmm2[2],xmm5[3],xmm2[3] 2206; SSSE3-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7] 2207; SSSE3-NEXT: movdqa %xmm1, %xmm6 2208; SSSE3-NEXT: punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm2[0],xmm6[1],xmm2[1],xmm6[2],xmm2[2],xmm6[3],xmm2[3],xmm6[4],xmm2[4],xmm6[5],xmm2[5],xmm6[6],xmm2[6],xmm6[7],xmm2[7] 2209; SSSE3-NEXT: movdqa %xmm6, %xmm7 2210; SSSE3-NEXT: punpcklwd {{.*#+}} xmm7 = xmm7[0],xmm2[0],xmm7[1],xmm2[1],xmm7[2],xmm2[2],xmm7[3],xmm2[3] 2211; SSSE3-NEXT: punpckhwd {{.*#+}} xmm6 = xmm6[4],xmm2[4],xmm6[5],xmm2[5],xmm6[6],xmm2[6],xmm6[7],xmm2[7] 2212; SSSE3-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15] 2213; SSSE3-NEXT: movdqa %xmm1, %xmm4 2214; SSSE3-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3] 2215; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 2216; SSSE3-NEXT: movdqa %xmm1, 112(%rdi) 2217; SSSE3-NEXT: movdqa %xmm4, 96(%rdi) 2218; SSSE3-NEXT: movdqa %xmm6, 80(%rdi) 2219; SSSE3-NEXT: movdqa %xmm7, 64(%rdi) 2220; SSSE3-NEXT: movdqa %xmm0, 48(%rdi) 2221; SSSE3-NEXT: movdqa %xmm5, 32(%rdi) 2222; SSSE3-NEXT: movdqa %xmm3, 16(%rdi) 2223; SSSE3-NEXT: movdqa %xmm8, (%rdi) 2224; SSSE3-NEXT: retq 2225; 2226; SSE41-LABEL: zext_32i8_to_32i32: 2227; SSE41: # %bb.0: 2228; SSE41-NEXT: movq %rdi, %rax 2229; SSE41-NEXT: pmovzxbd {{.*#+}} xmm2 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 2230; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,2,3] 2231; SSE41-NEXT: pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero 2232; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm0[2,3,0,1] 2233; SSE41-NEXT: pmovzxbd {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero,xmm4[2],zero,zero,zero,xmm4[3],zero,zero,zero 2234; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3] 2235; SSE41-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 2236; SSE41-NEXT: pmovzxbd {{.*#+}} xmm5 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero 2237; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm1[1,1,2,3] 2238; SSE41-NEXT: pmovzxbd {{.*#+}} xmm6 = xmm6[0],zero,zero,zero,xmm6[1],zero,zero,zero,xmm6[2],zero,zero,zero,xmm6[3],zero,zero,zero 2239; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm1[2,3,0,1] 2240; SSE41-NEXT: pmovzxbd {{.*#+}} xmm7 = xmm7[0],zero,zero,zero,xmm7[1],zero,zero,zero,xmm7[2],zero,zero,zero,xmm7[3],zero,zero,zero 2241; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[3,1,2,3] 2242; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero 2243; SSE41-NEXT: movdqa %xmm1, 112(%rdi) 2244; SSE41-NEXT: movdqa %xmm7, 96(%rdi) 2245; SSE41-NEXT: movdqa %xmm6, 80(%rdi) 2246; SSE41-NEXT: movdqa %xmm5, 64(%rdi) 2247; SSE41-NEXT: movdqa %xmm0, 48(%rdi) 2248; SSE41-NEXT: movdqa %xmm4, 32(%rdi) 2249; SSE41-NEXT: movdqa %xmm3, 16(%rdi) 2250; SSE41-NEXT: movdqa %xmm2, (%rdi) 2251; SSE41-NEXT: retq 2252; 2253; AVX1-LABEL: zext_32i8_to_32i32: 2254; AVX1: # %bb.0: 2255; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 2256; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[1,1,2,3] 2257; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero 2258; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm4 2259; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 2260; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm1 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero 2261; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm3[1,1,2,3] 2262; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero 2263; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm2 2264; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 2265; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero 2266; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,3,0,1] 2267; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 2268; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm1 2269; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm3[2,3,0,1] 2270; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 2271; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[3,3,0,1] 2272; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero 2273; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm3 2274; AVX1-NEXT: vmovaps %ymm4, %ymm0 2275; AVX1-NEXT: retq 2276; 2277; AVX2-LABEL: zext_32i8_to_32i32: 2278; AVX2: # %bb.0: 2279; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm4 = 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,zero 2280; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 2281; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm2 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero 2282; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 2283; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero 2284; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[3,1,2,3] 2285; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm3 = 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,zero 2286; AVX2-NEXT: vmovdqa %ymm4, %ymm0 2287; AVX2-NEXT: retq 2288; 2289; AVX512-LABEL: zext_32i8_to_32i32: 2290; AVX512: # %bb.0: 2291; AVX512-NEXT: vpmovzxbd {{.*#+}} zmm2 = 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,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero 2292; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm0 2293; AVX512-NEXT: vpmovzxbd {{.*#+}} zmm1 = 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,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero 2294; AVX512-NEXT: vmovdqa64 %zmm2, %zmm0 2295; AVX512-NEXT: retq 2296 %res = zext <32 x i8>%x to <32 x i32> 2297 ret <32 x i32> %res 2298} 2299 2300define <2 x i32> @zext_2i8_to_2i32(<2 x i8>* %addr) { 2301; SSE2-LABEL: zext_2i8_to_2i32: 2302; SSE2: # %bb.0: 2303; SSE2-NEXT: movzwl (%rdi), %eax 2304; SSE2-NEXT: movd %eax, %xmm0 2305; SSE2-NEXT: pxor %xmm1, %xmm1 2306; 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] 2307; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 2308; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3] 2309; SSE2-NEXT: paddq %xmm0, %xmm0 2310; SSE2-NEXT: retq 2311; 2312; SSSE3-LABEL: zext_2i8_to_2i32: 2313; SSSE3: # %bb.0: 2314; SSSE3-NEXT: movzwl (%rdi), %eax 2315; SSSE3-NEXT: movd %eax, %xmm0 2316; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[3],zero,zero,zero 2317; SSSE3-NEXT: paddq %xmm0, %xmm0 2318; SSSE3-NEXT: retq 2319; 2320; SSE41-LABEL: zext_2i8_to_2i32: 2321; SSE41: # %bb.0: 2322; SSE41-NEXT: pmovzxbq {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero 2323; SSE41-NEXT: paddq %xmm0, %xmm0 2324; SSE41-NEXT: retq 2325; 2326; AVX-LABEL: zext_2i8_to_2i32: 2327; AVX: # %bb.0: 2328; AVX-NEXT: vpmovzxbq {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero 2329; AVX-NEXT: vpaddq %xmm0, %xmm0, %xmm0 2330; AVX-NEXT: retq 2331 %x = load <2 x i8>, <2 x i8>* %addr, align 1 2332 %y = zext <2 x i8> %x to <2 x i32> 2333 %z = add <2 x i32>%y, %y 2334 ret <2 x i32>%z 2335} 2336 2337define <4 x i32> @zext_4i17_to_4i32(<4 x i17>* %ptr) { 2338; SSE2-LABEL: zext_4i17_to_4i32: 2339; SSE2: # %bb.0: 2340; SSE2-NEXT: movq (%rdi), %rax 2341; SSE2-NEXT: movd %eax, %xmm0 2342; SSE2-NEXT: movq %rax, %rcx 2343; SSE2-NEXT: shrq $17, %rcx 2344; SSE2-NEXT: movd %ecx, %xmm1 2345; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 2346; SSE2-NEXT: movl 8(%rdi), %ecx 2347; SSE2-NEXT: shll $13, %ecx 2348; SSE2-NEXT: movq %rax, %rdx 2349; SSE2-NEXT: shrq $51, %rdx 2350; SSE2-NEXT: orl %ecx, %edx 2351; SSE2-NEXT: movd %edx, %xmm1 2352; SSE2-NEXT: shrq $34, %rax 2353; SSE2-NEXT: movd %eax, %xmm2 2354; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1] 2355; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0] 2356; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 2357; SSE2-NEXT: retq 2358; 2359; SSSE3-LABEL: zext_4i17_to_4i32: 2360; SSSE3: # %bb.0: 2361; SSSE3-NEXT: movq (%rdi), %rax 2362; SSSE3-NEXT: movd %eax, %xmm0 2363; SSSE3-NEXT: movq %rax, %rcx 2364; SSSE3-NEXT: shrq $17, %rcx 2365; SSSE3-NEXT: movd %ecx, %xmm1 2366; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 2367; SSSE3-NEXT: movl 8(%rdi), %ecx 2368; SSSE3-NEXT: shll $13, %ecx 2369; SSSE3-NEXT: movq %rax, %rdx 2370; SSSE3-NEXT: shrq $51, %rdx 2371; SSSE3-NEXT: orl %ecx, %edx 2372; SSSE3-NEXT: movd %edx, %xmm1 2373; SSSE3-NEXT: shrq $34, %rax 2374; SSSE3-NEXT: movd %eax, %xmm2 2375; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1] 2376; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0] 2377; SSSE3-NEXT: pand {{.*}}(%rip), %xmm0 2378; SSSE3-NEXT: retq 2379; 2380; SSE41-LABEL: zext_4i17_to_4i32: 2381; SSE41: # %bb.0: 2382; SSE41-NEXT: movl 8(%rdi), %eax 2383; SSE41-NEXT: shll $13, %eax 2384; SSE41-NEXT: movq (%rdi), %rcx 2385; SSE41-NEXT: movq %rcx, %rdx 2386; SSE41-NEXT: shrq $51, %rdx 2387; SSE41-NEXT: orl %eax, %edx 2388; SSE41-NEXT: movq %rcx, %rax 2389; SSE41-NEXT: shrq $17, %rax 2390; SSE41-NEXT: movd %ecx, %xmm0 2391; SSE41-NEXT: pinsrd $1, %eax, %xmm0 2392; SSE41-NEXT: shrq $34, %rcx 2393; SSE41-NEXT: pinsrd $2, %ecx, %xmm0 2394; SSE41-NEXT: pinsrd $3, %edx, %xmm0 2395; SSE41-NEXT: pand {{.*}}(%rip), %xmm0 2396; SSE41-NEXT: retq 2397; 2398; AVX1-LABEL: zext_4i17_to_4i32: 2399; AVX1: # %bb.0: 2400; AVX1-NEXT: movl 8(%rdi), %eax 2401; AVX1-NEXT: shll $13, %eax 2402; AVX1-NEXT: movq (%rdi), %rcx 2403; AVX1-NEXT: movq %rcx, %rdx 2404; AVX1-NEXT: shrq $51, %rdx 2405; AVX1-NEXT: orl %eax, %edx 2406; AVX1-NEXT: movq %rcx, %rax 2407; AVX1-NEXT: shrq $17, %rax 2408; AVX1-NEXT: vmovd %ecx, %xmm0 2409; AVX1-NEXT: vpinsrd $1, %eax, %xmm0, %xmm0 2410; AVX1-NEXT: shrq $34, %rcx 2411; AVX1-NEXT: vpinsrd $2, %ecx, %xmm0, %xmm0 2412; AVX1-NEXT: vpinsrd $3, %edx, %xmm0, %xmm0 2413; AVX1-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 2414; AVX1-NEXT: retq 2415; 2416; AVX2-LABEL: zext_4i17_to_4i32: 2417; AVX2: # %bb.0: 2418; AVX2-NEXT: movl 8(%rdi), %eax 2419; AVX2-NEXT: shll $13, %eax 2420; AVX2-NEXT: movq (%rdi), %rcx 2421; AVX2-NEXT: movq %rcx, %rdx 2422; AVX2-NEXT: shrq $51, %rdx 2423; AVX2-NEXT: orl %eax, %edx 2424; AVX2-NEXT: movq %rcx, %rax 2425; AVX2-NEXT: shrq $17, %rax 2426; AVX2-NEXT: vmovd %ecx, %xmm0 2427; AVX2-NEXT: vpinsrd $1, %eax, %xmm0, %xmm0 2428; AVX2-NEXT: shrq $34, %rcx 2429; AVX2-NEXT: vpinsrd $2, %ecx, %xmm0, %xmm0 2430; AVX2-NEXT: vpinsrd $3, %edx, %xmm0, %xmm0 2431; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [131071,131071,131071,131071] 2432; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0 2433; AVX2-NEXT: retq 2434; 2435; AVX512-LABEL: zext_4i17_to_4i32: 2436; AVX512: # %bb.0: 2437; AVX512-NEXT: movl 8(%rdi), %eax 2438; AVX512-NEXT: shll $13, %eax 2439; AVX512-NEXT: movq (%rdi), %rcx 2440; AVX512-NEXT: movq %rcx, %rdx 2441; AVX512-NEXT: shrq $51, %rdx 2442; AVX512-NEXT: orl %eax, %edx 2443; AVX512-NEXT: movq %rcx, %rax 2444; AVX512-NEXT: shrq $17, %rax 2445; AVX512-NEXT: vmovd %ecx, %xmm0 2446; AVX512-NEXT: vpinsrd $1, %eax, %xmm0, %xmm0 2447; AVX512-NEXT: shrq $34, %rcx 2448; AVX512-NEXT: vpinsrd $2, %ecx, %xmm0, %xmm0 2449; AVX512-NEXT: vpinsrd $3, %edx, %xmm0, %xmm0 2450; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm1 = [131071,131071,131071,131071] 2451; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm0 2452; AVX512-NEXT: retq 2453 %a = load <4 x i17>, <4 x i17>* %ptr 2454 %b = zext <4 x i17> %a to <4 x i32> 2455 ret <4 x i32> %b 2456} 2457 2458define <8 x i64> @zext_8i6_to_8i64(i32 %x) nounwind uwtable readnone ssp { 2459; SSE2-LABEL: zext_8i6_to_8i64: 2460; SSE2: # %bb.0: # %entry 2461; SSE2-NEXT: movd %edi, %xmm0 2462; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7] 2463; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,0,0,0] 2464; SSE2-NEXT: paddw {{.*}}(%rip), %xmm3 2465; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,1,0,3] 2466; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,5,6,7] 2467; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [63,63] 2468; SSE2-NEXT: pand %xmm4, %xmm0 2469; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,1,3] 2470; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,5,5,6,7] 2471; SSE2-NEXT: pand %xmm4, %xmm1 2472; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[2,1,2,3] 2473; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,5,6,7] 2474; SSE2-NEXT: pand %xmm4, %xmm2 2475; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[3,1,3,3] 2476; SSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,5,5,6,7] 2477; SSE2-NEXT: pand %xmm4, %xmm3 2478; SSE2-NEXT: retq 2479; 2480; SSSE3-LABEL: zext_8i6_to_8i64: 2481; SSSE3: # %bb.0: # %entry 2482; SSSE3-NEXT: movd %edi, %xmm0 2483; SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7] 2484; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,0,0,0] 2485; SSSE3-NEXT: paddw {{.*}}(%rip), %xmm3 2486; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,1,0,3] 2487; SSSE3-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,5,6,7] 2488; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [63,63] 2489; SSSE3-NEXT: pand %xmm4, %xmm0 2490; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,1,3] 2491; SSSE3-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,5,5,6,7] 2492; SSSE3-NEXT: pand %xmm4, %xmm1 2493; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[2,1,2,3] 2494; SSSE3-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,5,6,7] 2495; SSSE3-NEXT: pand %xmm4, %xmm2 2496; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[3,1,3,3] 2497; SSSE3-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,5,5,6,7] 2498; SSSE3-NEXT: pand %xmm4, %xmm3 2499; SSSE3-NEXT: retq 2500; 2501; SSE41-LABEL: zext_8i6_to_8i64: 2502; SSE41: # %bb.0: # %entry 2503; SSE41-NEXT: movd %edi, %xmm0 2504; SSE41-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7] 2505; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,0,0,0] 2506; SSE41-NEXT: paddw {{.*}}(%rip), %xmm3 2507; SSE41-NEXT: pmovzxwq {{.*#+}} xmm0 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero 2508; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [63,63] 2509; SSE41-NEXT: pand %xmm4, %xmm0 2510; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,2,3] 2511; SSE41-NEXT: pmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero 2512; SSE41-NEXT: pand %xmm4, %xmm1 2513; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm3[2,3,0,1] 2514; SSE41-NEXT: pmovzxwq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero 2515; SSE41-NEXT: pand %xmm4, %xmm2 2516; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[3,1,2,3] 2517; SSE41-NEXT: pmovzxwq {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero 2518; SSE41-NEXT: pand %xmm4, %xmm3 2519; SSE41-NEXT: retq 2520; 2521; AVX1-LABEL: zext_8i6_to_8i64: 2522; AVX1: # %bb.0: # %entry 2523; AVX1-NEXT: vmovd %edi, %xmm0 2524; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7] 2525; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0] 2526; AVX1-NEXT: vpaddw {{.*}}(%rip), %xmm0, %xmm0 2527; AVX1-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm1 2528; AVX1-NEXT: vpmovzxwq {{.*#+}} xmm0 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero 2529; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,2,3] 2530; AVX1-NEXT: vpmovzxwq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero 2531; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 2532; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[2,3,0,1] 2533; AVX1-NEXT: vpmovzxwq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero 2534; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[3,3,0,1] 2535; AVX1-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero 2536; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1 2537; AVX1-NEXT: retq 2538; 2539; AVX2-LABEL: zext_8i6_to_8i64: 2540; AVX2: # %bb.0: # %entry 2541; AVX2-NEXT: vmovd %edi, %xmm0 2542; AVX2-NEXT: vpbroadcastw %xmm0, %xmm0 2543; AVX2-NEXT: vpaddw {{.*}}(%rip), %xmm0, %xmm0 2544; AVX2-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm1 2545; AVX2-NEXT: vpmovzxwq {{.*#+}} ymm0 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero 2546; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1] 2547; AVX2-NEXT: vpmovzxwq {{.*#+}} ymm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero 2548; AVX2-NEXT: retq 2549; 2550; AVX512-LABEL: zext_8i6_to_8i64: 2551; AVX512: # %bb.0: # %entry 2552; AVX512-NEXT: vmovd %edi, %xmm0 2553; AVX512-NEXT: vpbroadcastw %xmm0, %xmm0 2554; AVX512-NEXT: vpaddw {{.*}}(%rip), %xmm0, %xmm0 2555; 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,zero 2556; AVX512-NEXT: vpandq {{.*}}(%rip){1to8}, %zmm0, %zmm0 2557; AVX512-NEXT: retq 2558entry: 2559 %a = trunc i32 %x to i6 2560 %b = insertelement <8 x i6> undef, i6 %a, i32 0 2561 %c = shufflevector <8 x i6> %b, <8 x i6> undef, <8 x i32> zeroinitializer 2562 %d = add <8 x i6> %c, <i6 0, i6 1, i6 2, i6 3, i6 4, i6 5, i6 6, i6 7> 2563 %e = zext <8 x i6> %d to <8 x i64> 2564 ret <8 x i64> %e 2565} 2566