856 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE2-SSSE3,SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSE2-SSSE3,SSSE34; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX15; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX26; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefix=AVX27; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-perlane-shuffle | FileCheck %s --check-prefix=AVX28; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX512F9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl,+avx512bw,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefix=AVX512VLBW10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl,+avx512bw,+fast-variable-perlane-shuffle | FileCheck %s --check-prefix=AVX512VLBW11 12;13; 128-bit vectors14;15 16define <2 x i64> @ext_i2_2i64(i2 %a0) {17; SSE2-SSSE3-LABEL: ext_i2_2i64:18; SSE2-SSSE3: # %bb.0:19; SSE2-SSSE3-NEXT: movd %edi, %xmm020; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]21; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [1,2]22; SSE2-SSSE3-NEXT: pand %xmm0, %xmm123; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm124; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2]25; SSE2-SSSE3-NEXT: pand %xmm1, %xmm026; SSE2-SSSE3-NEXT: psrlq $63, %xmm027; SSE2-SSSE3-NEXT: retq28;29; AVX1-LABEL: ext_i2_2i64:30; AVX1: # %bb.0:31; AVX1-NEXT: vmovd %edi, %xmm032; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]33; AVX1-NEXT: vpmovsxbq {{.*#+}} xmm1 = [1,2]34; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm035; AVX1-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm036; AVX1-NEXT: vpsrlq $63, %xmm0, %xmm037; AVX1-NEXT: retq38;39; AVX2-LABEL: ext_i2_2i64:40; AVX2: # %bb.0:41; AVX2-NEXT: vmovd %edi, %xmm042; AVX2-NEXT: vpbroadcastd %xmm0, %xmm043; AVX2-NEXT: vpmovsxbq {{.*#+}} xmm1 = [1,2]44; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm045; AVX2-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm046; AVX2-NEXT: vpsrlq $63, %xmm0, %xmm047; AVX2-NEXT: retq48;49; AVX512F-LABEL: ext_i2_2i64:50; AVX512F: # %bb.0:51; AVX512F-NEXT: kmovw %edi, %k152; AVX512F-NEXT: vpternlogq {{.*#+}} zmm0 {%k1} {z} = -153; AVX512F-NEXT: vpsrlq $63, %xmm0, %xmm054; AVX512F-NEXT: vzeroupper55; AVX512F-NEXT: retq56;57; AVX512VLBW-LABEL: ext_i2_2i64:58; AVX512VLBW: # %bb.0:59; AVX512VLBW-NEXT: kmovd %edi, %k160; AVX512VLBW-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm061; AVX512VLBW-NEXT: vmovdqa64 %xmm0, %xmm0 {%k1} {z}62; AVX512VLBW-NEXT: vpsrlq $63, %xmm0, %xmm063; AVX512VLBW-NEXT: retq64 %1 = bitcast i2 %a0 to <2 x i1>65 %2 = zext <2 x i1> %1 to <2 x i64>66 ret <2 x i64> %267}68 69define <4 x i32> @ext_i4_4i32(i4 %a0) {70; SSE2-SSSE3-LABEL: ext_i4_4i32:71; SSE2-SSSE3: # %bb.0:72; SSE2-SSSE3-NEXT: movd %edi, %xmm073; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]74; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8]75; SSE2-SSSE3-NEXT: pand %xmm1, %xmm076; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm077; SSE2-SSSE3-NEXT: psrld $31, %xmm078; SSE2-SSSE3-NEXT: retq79;80; AVX1-LABEL: ext_i4_4i32:81; AVX1: # %bb.0:82; AVX1-NEXT: vmovd %edi, %xmm083; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]84; AVX1-NEXT: vpmovsxbd {{.*#+}} xmm1 = [1,2,4,8]85; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm086; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm087; AVX1-NEXT: vpsrld $31, %xmm0, %xmm088; AVX1-NEXT: retq89;90; AVX2-LABEL: ext_i4_4i32:91; AVX2: # %bb.0:92; AVX2-NEXT: vmovd %edi, %xmm093; AVX2-NEXT: vpbroadcastd %xmm0, %xmm094; AVX2-NEXT: vpmovsxbd {{.*#+}} xmm1 = [1,2,4,8]95; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm096; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm097; AVX2-NEXT: vpsrld $31, %xmm0, %xmm098; AVX2-NEXT: retq99;100; AVX512F-LABEL: ext_i4_4i32:101; AVX512F: # %bb.0:102; AVX512F-NEXT: kmovw %edi, %k1103; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1104; AVX512F-NEXT: vpsrld $31, %xmm0, %xmm0105; AVX512F-NEXT: vzeroupper106; AVX512F-NEXT: retq107;108; AVX512VLBW-LABEL: ext_i4_4i32:109; AVX512VLBW: # %bb.0:110; AVX512VLBW-NEXT: kmovd %edi, %k1111; AVX512VLBW-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0112; AVX512VLBW-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}113; AVX512VLBW-NEXT: vpsrld $31, %xmm0, %xmm0114; AVX512VLBW-NEXT: retq115 %1 = bitcast i4 %a0 to <4 x i1>116 %2 = zext <4 x i1> %1 to <4 x i32>117 ret <4 x i32> %2118}119 120define <8 x i16> @ext_i8_8i16(i8 %a0) {121; SSE2-SSSE3-LABEL: ext_i8_8i16:122; SSE2-SSSE3: # %bb.0:123; SSE2-SSSE3-NEXT: movd %edi, %xmm0124; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]125; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]126; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]127; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0128; SSE2-SSSE3-NEXT: pcmpeqw %xmm1, %xmm0129; SSE2-SSSE3-NEXT: psrlw $15, %xmm0130; SSE2-SSSE3-NEXT: retq131;132; AVX1-LABEL: ext_i8_8i16:133; AVX1: # %bb.0:134; AVX1-NEXT: vmovd %edi, %xmm0135; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]136; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]137; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]138; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0139; AVX1-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0140; AVX1-NEXT: vpsrlw $15, %xmm0, %xmm0141; AVX1-NEXT: retq142;143; AVX2-LABEL: ext_i8_8i16:144; AVX2: # %bb.0:145; AVX2-NEXT: vmovd %edi, %xmm0146; AVX2-NEXT: vpbroadcastb %xmm0, %xmm0147; AVX2-NEXT: vpmovzxbw {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]148; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0149; AVX2-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0150; AVX2-NEXT: vpsrlw $15, %xmm0, %xmm0151; AVX2-NEXT: retq152;153; AVX512F-LABEL: ext_i8_8i16:154; AVX512F: # %bb.0:155; AVX512F-NEXT: kmovw %edi, %k1156; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1157; AVX512F-NEXT: vpmovdw %zmm0, %ymm0158; AVX512F-NEXT: vpsrlw $15, %xmm0, %xmm0159; AVX512F-NEXT: vzeroupper160; AVX512F-NEXT: retq161;162; AVX512VLBW-LABEL: ext_i8_8i16:163; AVX512VLBW: # %bb.0:164; AVX512VLBW-NEXT: kmovd %edi, %k0165; AVX512VLBW-NEXT: vpmovm2w %k0, %xmm0166; AVX512VLBW-NEXT: vpsrlw $15, %xmm0, %xmm0167; AVX512VLBW-NEXT: retq168 %1 = bitcast i8 %a0 to <8 x i1>169 %2 = zext <8 x i1> %1 to <8 x i16>170 ret <8 x i16> %2171}172 173define <16 x i8> @ext_i16_16i8(i16 %a0) {174; SSE2-LABEL: ext_i16_16i8:175; SSE2: # %bb.0:176; SSE2-NEXT: movd %edi, %xmm0177; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]178; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,1,1,4,5,6,7]179; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]180; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]181; SSE2-NEXT: pand %xmm1, %xmm0182; SSE2-NEXT: pcmpeqb %xmm1, %xmm0183; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0184; SSE2-NEXT: retq185;186; SSSE3-LABEL: ext_i16_16i8:187; SSSE3: # %bb.0:188; SSSE3-NEXT: movd %edi, %xmm0189; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]190; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]191; SSSE3-NEXT: pand %xmm1, %xmm0192; SSSE3-NEXT: pcmpeqb %xmm1, %xmm0193; SSSE3-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0194; SSSE3-NEXT: retq195;196; AVX1-LABEL: ext_i16_16i8:197; AVX1: # %bb.0:198; AVX1-NEXT: vmovd %edi, %xmm0199; AVX1-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]200; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]201; AVX1-NEXT: # xmm1 = mem[0,0]202; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0203; AVX1-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0204; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0205; AVX1-NEXT: retq206;207; AVX2-LABEL: ext_i16_16i8:208; AVX2: # %bb.0:209; AVX2-NEXT: vmovd %edi, %xmm0210; AVX2-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]211; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]212; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0213; AVX2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0214; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0215; AVX2-NEXT: retq216;217; AVX512F-LABEL: ext_i16_16i8:218; AVX512F: # %bb.0:219; AVX512F-NEXT: kmovw %edi, %k1220; AVX512F-NEXT: vpbroadcastd {{.*#+}} zmm0 {%k1} {z} = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]221; AVX512F-NEXT: vpmovdb %zmm0, %xmm0222; AVX512F-NEXT: vzeroupper223; AVX512F-NEXT: retq224;225; AVX512VLBW-LABEL: ext_i16_16i8:226; AVX512VLBW: # %bb.0:227; AVX512VLBW-NEXT: kmovd %edi, %k1228; AVX512VLBW-NEXT: vmovdqu8 {{.*#+}} xmm0 {%k1} {z} = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]229; AVX512VLBW-NEXT: retq230 %1 = bitcast i16 %a0 to <16 x i1>231 %2 = zext <16 x i1> %1 to <16 x i8>232 ret <16 x i8> %2233}234 235;236; 256-bit vectors237;238 239define <4 x i64> @ext_i4_4i64(i4 %a0) {240; SSE2-SSSE3-LABEL: ext_i4_4i64:241; SSE2-SSSE3: # %bb.0:242; SSE2-SSSE3-NEXT: movd %edi, %xmm0243; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,1,0,1]244; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [1,2]245; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm1246; SSE2-SSSE3-NEXT: pand %xmm0, %xmm1247; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm1248; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2]249; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0250; SSE2-SSSE3-NEXT: psrlq $63, %xmm0251; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [4,8]252; SSE2-SSSE3-NEXT: pand %xmm1, %xmm2253; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm2254; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2]255; SSE2-SSSE3-NEXT: pand %xmm2, %xmm1256; SSE2-SSSE3-NEXT: psrlq $63, %xmm1257; SSE2-SSSE3-NEXT: retq258;259; AVX1-LABEL: ext_i4_4i64:260; AVX1: # %bb.0:261; AVX1-NEXT: vmovd %edi, %xmm0262; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]263; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0264; AVX1-NEXT: vmovaps {{.*#+}} ymm1 = [1,2,4,8]265; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0266; AVX1-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm1267; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0268; AVX1-NEXT: vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0269; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0270; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0271; AVX1-NEXT: retq272;273; AVX2-LABEL: ext_i4_4i64:274; AVX2: # %bb.0:275; AVX2-NEXT: vmovd %edi, %xmm0276; AVX2-NEXT: vpbroadcastd %xmm0, %ymm0277; AVX2-NEXT: vpmovsxbq {{.*#+}} ymm1 = [1,2,4,8]278; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0279; AVX2-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0280; AVX2-NEXT: vpsrlq $63, %ymm0, %ymm0281; AVX2-NEXT: retq282;283; AVX512F-LABEL: ext_i4_4i64:284; AVX512F: # %bb.0:285; AVX512F-NEXT: kmovw %edi, %k1286; AVX512F-NEXT: vpternlogq {{.*#+}} zmm0 {%k1} {z} = -1287; AVX512F-NEXT: vpsrlq $63, %ymm0, %ymm0288; AVX512F-NEXT: retq289;290; AVX512VLBW-LABEL: ext_i4_4i64:291; AVX512VLBW: # %bb.0:292; AVX512VLBW-NEXT: kmovd %edi, %k1293; AVX512VLBW-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0294; AVX512VLBW-NEXT: vmovdqa64 %ymm0, %ymm0 {%k1} {z}295; AVX512VLBW-NEXT: vpsrlq $63, %ymm0, %ymm0296; AVX512VLBW-NEXT: retq297 %1 = bitcast i4 %a0 to <4 x i1>298 %2 = zext <4 x i1> %1 to <4 x i64>299 ret <4 x i64> %2300}301 302define <8 x i32> @ext_i8_8i32(i8 %a0) {303; SSE2-SSSE3-LABEL: ext_i8_8i32:304; SSE2-SSSE3: # %bb.0:305; SSE2-SSSE3-NEXT: movd %edi, %xmm0306; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,0,0]307; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [1,2,4,8]308; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm0309; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0310; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm0311; SSE2-SSSE3-NEXT: psrld $31, %xmm0312; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [16,32,64,128]313; SSE2-SSSE3-NEXT: pand %xmm2, %xmm1314; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm1315; SSE2-SSSE3-NEXT: psrld $31, %xmm1316; SSE2-SSSE3-NEXT: retq317;318; AVX1-LABEL: ext_i8_8i32:319; AVX1: # %bb.0:320; AVX1-NEXT: vmovd %edi, %xmm0321; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]322; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0323; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0324; AVX1-NEXT: vcvtdq2ps %ymm0, %ymm0325; AVX1-NEXT: vcmpeqps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0326; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0327; AVX1-NEXT: retq328;329; AVX2-LABEL: ext_i8_8i32:330; AVX2: # %bb.0:331; AVX2-NEXT: vmovd %edi, %xmm0332; AVX2-NEXT: vpbroadcastb %xmm0, %ymm0333; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128]334; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0335; AVX2-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0336; AVX2-NEXT: vpsrld $31, %ymm0, %ymm0337; AVX2-NEXT: retq338;339; AVX512F-LABEL: ext_i8_8i32:340; AVX512F: # %bb.0:341; AVX512F-NEXT: kmovw %edi, %k1342; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1343; AVX512F-NEXT: vpsrld $31, %ymm0, %ymm0344; AVX512F-NEXT: retq345;346; AVX512VLBW-LABEL: ext_i8_8i32:347; AVX512VLBW: # %bb.0:348; AVX512VLBW-NEXT: kmovd %edi, %k1349; AVX512VLBW-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0350; AVX512VLBW-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}351; AVX512VLBW-NEXT: vpsrld $31, %ymm0, %ymm0352; AVX512VLBW-NEXT: retq353 %1 = bitcast i8 %a0 to <8 x i1>354 %2 = zext <8 x i1> %1 to <8 x i32>355 ret <8 x i32> %2356}357 358define <16 x i16> @ext_i16_16i16(i16 %a0) {359; SSE2-SSSE3-LABEL: ext_i16_16i16:360; SSE2-SSSE3: # %bb.0:361; SSE2-SSSE3-NEXT: movd %edi, %xmm0362; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]363; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]364; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128]365; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm0366; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0367; SSE2-SSSE3-NEXT: pcmpeqw %xmm2, %xmm0368; SSE2-SSSE3-NEXT: psrlw $15, %xmm0369; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [256,512,1024,2048,4096,8192,16384,32768]370; SSE2-SSSE3-NEXT: pand %xmm2, %xmm1371; SSE2-SSSE3-NEXT: pcmpeqw %xmm2, %xmm1372; SSE2-SSSE3-NEXT: psrlw $15, %xmm1373; SSE2-SSSE3-NEXT: retq374;375; AVX1-LABEL: ext_i16_16i16:376; AVX1: # %bb.0:377; AVX1-NEXT: vmovd %edi, %xmm0378; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]379; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]380; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0381; AVX1-NEXT: vmovaps {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]382; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0383; AVX1-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm1384; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0385; AVX1-NEXT: vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0386; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0387; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0388; AVX1-NEXT: retq389;390; AVX2-LABEL: ext_i16_16i16:391; AVX2: # %bb.0:392; AVX2-NEXT: vmovd %edi, %xmm0393; AVX2-NEXT: vpbroadcastw %xmm0, %ymm0394; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]395; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0396; AVX2-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0397; AVX2-NEXT: vpsrlw $15, %ymm0, %ymm0398; AVX2-NEXT: retq399;400; AVX512F-LABEL: ext_i16_16i16:401; AVX512F: # %bb.0:402; AVX512F-NEXT: kmovw %edi, %k1403; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1404; AVX512F-NEXT: vpmovdw %zmm0, %ymm0405; AVX512F-NEXT: vpsrlw $15, %ymm0, %ymm0406; AVX512F-NEXT: retq407;408; AVX512VLBW-LABEL: ext_i16_16i16:409; AVX512VLBW: # %bb.0:410; AVX512VLBW-NEXT: kmovd %edi, %k0411; AVX512VLBW-NEXT: vpmovm2w %k0, %ymm0412; AVX512VLBW-NEXT: vpsrlw $15, %ymm0, %ymm0413; AVX512VLBW-NEXT: retq414 %1 = bitcast i16 %a0 to <16 x i1>415 %2 = zext <16 x i1> %1 to <16 x i16>416 ret <16 x i16> %2417}418 419define <32 x i8> @ext_i32_32i8(i32 %a0) {420; SSE2-SSSE3-LABEL: ext_i32_32i8:421; SSE2-SSSE3: # %bb.0:422; SSE2-SSSE3-NEXT: movd %edi, %xmm1423; SSE2-SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]424; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm1[0,0,1,1,4,5,6,7]425; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]426; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]427; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0428; SSE2-SSSE3-NEXT: pcmpeqb %xmm2, %xmm0429; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]430; SSE2-SSSE3-NEXT: pand %xmm3, %xmm0431; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[2,2,3,3,4,5,6,7]432; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]433; SSE2-SSSE3-NEXT: pand %xmm2, %xmm1434; SSE2-SSSE3-NEXT: pcmpeqb %xmm2, %xmm1435; SSE2-SSSE3-NEXT: pand %xmm3, %xmm1436; SSE2-SSSE3-NEXT: retq437;438; AVX1-LABEL: ext_i32_32i8:439; AVX1: # %bb.0:440; AVX1-NEXT: vmovd %edi, %xmm0441; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]442; AVX1-NEXT: vpshuflw {{.*#+}} xmm1 = xmm0[0,0,1,1,4,5,6,7]443; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[2,2,3,3,4,5,6,7]444; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0445; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,0,1,1,4,4,5,5]446; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0447; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1448; AVX1-NEXT: vmovddup {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]449; AVX1-NEXT: # xmm2 = mem[0,0]450; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1451; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm0452; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0453; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0454; AVX1-NEXT: retq455;456; AVX2-LABEL: ext_i32_32i8:457; AVX2: # %bb.0:458; AVX2-NEXT: vmovd %edi, %xmm0459; AVX2-NEXT: vpbroadcastd %xmm0, %ymm0460; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,0,0,0,0,0,0,0,9,9,9,9,9,9,9,9,18,18,18,18,18,18,18,18,27,27,27,27,27,27,27,27]461; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]462; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0463; AVX2-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0464; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0465; AVX2-NEXT: retq466;467; AVX512F-LABEL: ext_i32_32i8:468; AVX512F: # %bb.0:469; AVX512F-NEXT: kmovw %edi, %k1470; AVX512F-NEXT: shrl $16, %edi471; AVX512F-NEXT: kmovw %edi, %k2472; AVX512F-NEXT: vpbroadcastd {{.*#+}} zmm0 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]473; AVX512F-NEXT: vmovdqa32 %zmm0, %zmm1 {%k1} {z}474; AVX512F-NEXT: vpmovdb %zmm1, %xmm1475; AVX512F-NEXT: vmovdqa32 %zmm0, %zmm0 {%k2} {z}476; AVX512F-NEXT: vpmovdb %zmm0, %xmm0477; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0478; AVX512F-NEXT: retq479;480; AVX512VLBW-LABEL: ext_i32_32i8:481; AVX512VLBW: # %bb.0:482; AVX512VLBW-NEXT: kmovd %edi, %k1483; AVX512VLBW-NEXT: vmovdqu8 {{.*#+}} ymm0 {%k1} {z} = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]484; AVX512VLBW-NEXT: retq485 %1 = bitcast i32 %a0 to <32 x i1>486 %2 = zext <32 x i1> %1 to <32 x i8>487 ret <32 x i8> %2488}489 490;491; 512-bit vectors492;493 494define <8 x i64> @ext_i8_8i64(i8 %a0) {495; SSE2-SSSE3-LABEL: ext_i8_8i64:496; SSE2-SSSE3: # %bb.0:497; SSE2-SSSE3-NEXT: movd %edi, %xmm0498; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,1,0,1]499; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [1,2]500; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm1501; SSE2-SSSE3-NEXT: pand %xmm0, %xmm1502; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm1503; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2]504; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0505; SSE2-SSSE3-NEXT: psrlq $63, %xmm0506; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [4,8]507; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm2508; SSE2-SSSE3-NEXT: pand %xmm1, %xmm2509; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm2510; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2]511; SSE2-SSSE3-NEXT: pand %xmm2, %xmm1512; SSE2-SSSE3-NEXT: psrlq $63, %xmm1513; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [16,32]514; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm3515; SSE2-SSSE3-NEXT: pand %xmm2, %xmm3516; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm3517; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,0,3,2]518; SSE2-SSSE3-NEXT: pand %xmm3, %xmm2519; SSE2-SSSE3-NEXT: psrlq $63, %xmm2520; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [64,128]521; SSE2-SSSE3-NEXT: pand %xmm3, %xmm4522; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm4523; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,0,3,2]524; SSE2-SSSE3-NEXT: pand %xmm4, %xmm3525; SSE2-SSSE3-NEXT: psrlq $63, %xmm3526; SSE2-SSSE3-NEXT: retq527;528; AVX1-LABEL: ext_i8_8i64:529; AVX1: # %bb.0:530; AVX1-NEXT: vmovd %edi, %xmm0531; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]532; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm1533; AVX1-NEXT: vmovaps {{.*#+}} ymm0 = [1,2,4,8]534; AVX1-NEXT: vandps %ymm0, %ymm1, %ymm2535; AVX1-NEXT: vpcmpeqq %xmm0, %xmm2, %xmm0536; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2537; AVX1-NEXT: vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2538; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0539; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm2 = [1,1,1,1]540; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0541; AVX1-NEXT: vmovaps {{.*#+}} ymm3 = [16,32,64,128]542; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1543; AVX1-NEXT: vpcmpeqq %xmm3, %xmm1, %xmm3544; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1545; AVX1-NEXT: vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1546; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm1547; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1548; AVX1-NEXT: retq549;550; AVX2-LABEL: ext_i8_8i64:551; AVX2: # %bb.0:552; AVX2-NEXT: vmovd %edi, %xmm0553; AVX2-NEXT: vpbroadcastb %xmm0, %ymm1554; AVX2-NEXT: vpmovsxbq {{.*#+}} ymm0 = [1,2,4,8]555; AVX2-NEXT: vpand %ymm0, %ymm1, %ymm2556; AVX2-NEXT: vpcmpeqq %ymm0, %ymm2, %ymm0557; AVX2-NEXT: vpsrlq $63, %ymm0, %ymm0558; AVX2-NEXT: vpmovzxbq {{.*#+}} ymm2 = [16,32,64,128]559; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1560; AVX2-NEXT: vpcmpeqq %ymm2, %ymm1, %ymm1561; AVX2-NEXT: vpsrlq $63, %ymm1, %ymm1562; AVX2-NEXT: retq563;564; AVX512F-LABEL: ext_i8_8i64:565; AVX512F: # %bb.0:566; AVX512F-NEXT: kmovw %edi, %k1567; AVX512F-NEXT: vpternlogq {{.*#+}} zmm0 {%k1} {z} = -1568; AVX512F-NEXT: vpsrlq $63, %zmm0, %zmm0569; AVX512F-NEXT: retq570;571; AVX512VLBW-LABEL: ext_i8_8i64:572; AVX512VLBW: # %bb.0:573; AVX512VLBW-NEXT: kmovd %edi, %k1574; AVX512VLBW-NEXT: vpternlogq {{.*#+}} zmm0 {%k1} {z} = -1575; AVX512VLBW-NEXT: vpsrlq $63, %zmm0, %zmm0576; AVX512VLBW-NEXT: retq577 %1 = bitcast i8 %a0 to <8 x i1>578 %2 = zext <8 x i1> %1 to <8 x i64>579 ret <8 x i64> %2580}581 582define <16 x i32> @ext_i16_16i32(i16 %a0) {583; SSE2-SSSE3-LABEL: ext_i16_16i32:584; SSE2-SSSE3: # %bb.0:585; SSE2-SSSE3-NEXT: movd %edi, %xmm0586; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,0,0,0]587; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8]588; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm0589; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0590; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm0591; SSE2-SSSE3-NEXT: psrld $31, %xmm0592; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [16,32,64,128]593; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm1594; SSE2-SSSE3-NEXT: pand %xmm2, %xmm1595; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm1596; SSE2-SSSE3-NEXT: psrld $31, %xmm1597; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [256,512,1024,2048]598; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm2599; SSE2-SSSE3-NEXT: pand %xmm4, %xmm2600; SSE2-SSSE3-NEXT: pcmpeqd %xmm4, %xmm2601; SSE2-SSSE3-NEXT: psrld $31, %xmm2602; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [4096,8192,16384,32768]603; SSE2-SSSE3-NEXT: pand %xmm4, %xmm3604; SSE2-SSSE3-NEXT: pcmpeqd %xmm4, %xmm3605; SSE2-SSSE3-NEXT: psrld $31, %xmm3606; SSE2-SSSE3-NEXT: retq607;608; AVX1-LABEL: ext_i16_16i32:609; AVX1: # %bb.0:610; AVX1-NEXT: vmovd %edi, %xmm0611; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]612; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm1613; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm0614; AVX1-NEXT: vcvtdq2ps %ymm0, %ymm0615; AVX1-NEXT: vcmpeqps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0616; AVX1-NEXT: vbroadcastss {{.*#+}} ymm2 = [1,1,1,1,1,1,1,1]617; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0618; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1619; AVX1-NEXT: vcvtdq2ps %ymm1, %ymm1620; AVX1-NEXT: vcmpeqps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1621; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1622; AVX1-NEXT: retq623;624; AVX2-LABEL: ext_i16_16i32:625; AVX2: # %bb.0:626; AVX2-NEXT: vmovd %edi, %xmm0627; AVX2-NEXT: vpbroadcastw %xmm0, %ymm1628; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm0 = [1,2,4,8,16,32,64,128]629; AVX2-NEXT: vpand %ymm0, %ymm1, %ymm2630; AVX2-NEXT: vpcmpeqd %ymm0, %ymm2, %ymm0631; AVX2-NEXT: vpsrld $31, %ymm0, %ymm0632; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm2 = [256,512,1024,2048,4096,8192,16384,32768]633; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1634; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm1635; AVX2-NEXT: vpsrld $31, %ymm1, %ymm1636; AVX2-NEXT: retq637;638; AVX512F-LABEL: ext_i16_16i32:639; AVX512F: # %bb.0:640; AVX512F-NEXT: kmovw %edi, %k1641; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1642; AVX512F-NEXT: vpsrld $31, %zmm0, %zmm0643; AVX512F-NEXT: retq644;645; AVX512VLBW-LABEL: ext_i16_16i32:646; AVX512VLBW: # %bb.0:647; AVX512VLBW-NEXT: kmovd %edi, %k1648; AVX512VLBW-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1649; AVX512VLBW-NEXT: vpsrld $31, %zmm0, %zmm0650; AVX512VLBW-NEXT: retq651 %1 = bitcast i16 %a0 to <16 x i1>652 %2 = zext <16 x i1> %1 to <16 x i32>653 ret <16 x i32> %2654}655 656define <32 x i16> @ext_i32_32i16(i32 %a0) {657; SSE2-SSSE3-LABEL: ext_i32_32i16:658; SSE2-SSSE3: # %bb.0:659; SSE2-SSSE3-NEXT: movd %edi, %xmm2660; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm2[0,0,0,0,4,5,6,7]661; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]662; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [1,2,4,8,16,32,64,128]663; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm0664; SSE2-SSSE3-NEXT: pand %xmm4, %xmm0665; SSE2-SSSE3-NEXT: pcmpeqw %xmm4, %xmm0666; SSE2-SSSE3-NEXT: psrlw $15, %xmm0667; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [256,512,1024,2048,4096,8192,16384,32768]668; SSE2-SSSE3-NEXT: pand %xmm5, %xmm1669; SSE2-SSSE3-NEXT: pcmpeqw %xmm5, %xmm1670; SSE2-SSSE3-NEXT: psrlw $15, %xmm1671; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[1,1,1,1,4,5,6,7]672; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,1,0,1]673; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm2674; SSE2-SSSE3-NEXT: pand %xmm4, %xmm2675; SSE2-SSSE3-NEXT: pcmpeqw %xmm4, %xmm2676; SSE2-SSSE3-NEXT: psrlw $15, %xmm2677; SSE2-SSSE3-NEXT: pand %xmm5, %xmm3678; SSE2-SSSE3-NEXT: pcmpeqw %xmm5, %xmm3679; SSE2-SSSE3-NEXT: psrlw $15, %xmm3680; SSE2-SSSE3-NEXT: retq681;682; AVX1-LABEL: ext_i32_32i16:683; AVX1: # %bb.0:684; AVX1-NEXT: vmovd %edi, %xmm1685; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm1[0,0,0,0,4,5,6,7]686; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]687; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0688; AVX1-NEXT: vmovaps {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]689; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0690; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3691; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [256,512,1024,2048,4096,8192,16384,32768]692; AVX1-NEXT: vpcmpeqw %xmm4, %xmm3, %xmm3693; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm0694; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0695; AVX1-NEXT: vbroadcastss {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]696; AVX1-NEXT: vandps %ymm3, %ymm0, %ymm0697; AVX1-NEXT: vpshuflw {{.*#+}} xmm1 = xmm1[1,1,1,1,4,5,6,7]698; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]699; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm1, %ymm1700; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1701; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5702; AVX1-NEXT: vpcmpeqw %xmm4, %xmm5, %xmm4703; AVX1-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm1704; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm1, %ymm1705; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1706; AVX1-NEXT: retq707;708; AVX2-LABEL: ext_i32_32i16:709; AVX2: # %bb.0:710; AVX2-NEXT: vmovd %edi, %xmm0711; AVX2-NEXT: vpbroadcastw %xmm0, %ymm0712; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]713; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0714; AVX2-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0715; AVX2-NEXT: vpsrlw $15, %ymm0, %ymm0716; AVX2-NEXT: shrl $16, %edi717; AVX2-NEXT: vmovd %edi, %xmm2718; AVX2-NEXT: vpbroadcastw %xmm2, %ymm2719; AVX2-NEXT: vpand %ymm1, %ymm2, %ymm2720; AVX2-NEXT: vpcmpeqw %ymm1, %ymm2, %ymm1721; AVX2-NEXT: vpsrlw $15, %ymm1, %ymm1722; AVX2-NEXT: retq723;724; AVX512F-LABEL: ext_i32_32i16:725; AVX512F: # %bb.0:726; AVX512F-NEXT: kmovw %edi, %k1727; AVX512F-NEXT: shrl $16, %edi728; AVX512F-NEXT: kmovw %edi, %k2729; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1730; AVX512F-NEXT: vpmovdw %zmm0, %ymm0731; AVX512F-NEXT: vpsrlw $15, %ymm0, %ymm0732; AVX512F-NEXT: vpternlogd {{.*#+}} zmm1 {%k2} {z} = -1733; AVX512F-NEXT: vpmovdw %zmm1, %ymm1734; AVX512F-NEXT: vpsrlw $15, %ymm1, %ymm1735; AVX512F-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0736; AVX512F-NEXT: retq737;738; AVX512VLBW-LABEL: ext_i32_32i16:739; AVX512VLBW: # %bb.0:740; AVX512VLBW-NEXT: kmovd %edi, %k0741; AVX512VLBW-NEXT: vpmovm2w %k0, %zmm0742; AVX512VLBW-NEXT: vpsrlw $15, %zmm0, %zmm0743; AVX512VLBW-NEXT: retq744 %1 = bitcast i32 %a0 to <32 x i1>745 %2 = zext <32 x i1> %1 to <32 x i16>746 ret <32 x i16> %2747}748 749define <64 x i8> @ext_i64_64i8(i64 %a0) {750; SSE2-SSSE3-LABEL: ext_i64_64i8:751; SSE2-SSSE3: # %bb.0:752; SSE2-SSSE3-NEXT: movq %rdi, %xmm3753; SSE2-SSSE3-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]754; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm3[0,0,1,1,4,5,6,7]755; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]756; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]757; SSE2-SSSE3-NEXT: pand %xmm4, %xmm0758; SSE2-SSSE3-NEXT: pcmpeqb %xmm4, %xmm0759; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]760; SSE2-SSSE3-NEXT: pand %xmm5, %xmm0761; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm1 = xmm3[2,2,3,3,4,5,6,7]762; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]763; SSE2-SSSE3-NEXT: pand %xmm4, %xmm1764; SSE2-SSSE3-NEXT: pcmpeqb %xmm4, %xmm1765; SSE2-SSSE3-NEXT: pand %xmm5, %xmm1766; SSE2-SSSE3-NEXT: pshufhw {{.*#+}} xmm2 = xmm3[0,1,2,3,4,4,5,5]767; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,2,3,3]768; SSE2-SSSE3-NEXT: pand %xmm4, %xmm2769; SSE2-SSSE3-NEXT: pcmpeqb %xmm4, %xmm2770; SSE2-SSSE3-NEXT: pand %xmm5, %xmm2771; SSE2-SSSE3-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,6,6,7,7]772; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[2,2,3,3]773; SSE2-SSSE3-NEXT: pand %xmm4, %xmm3774; SSE2-SSSE3-NEXT: pcmpeqb %xmm4, %xmm3775; SSE2-SSSE3-NEXT: pand %xmm5, %xmm3776; SSE2-SSSE3-NEXT: retq777;778; AVX1-LABEL: ext_i64_64i8:779; AVX1: # %bb.0:780; AVX1-NEXT: vmovq %rdi, %xmm0781; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm1 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]782; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm1[0,0,1,1,4,5,6,7]783; AVX1-NEXT: vpshuflw {{.*#+}} xmm2 = xmm1[2,2,3,3,4,5,6,7]784; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0785; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,0,1,1,4,4,5,5]786; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]787; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0788; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3789; AVX1-NEXT: vpcmpeqb %xmm2, %xmm3, %xmm3790; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm0791; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0792; AVX1-NEXT: vbroadcastss {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]793; AVX1-NEXT: vandps %ymm3, %ymm0, %ymm0794; AVX1-NEXT: vpshufhw {{.*#+}} xmm4 = xmm1[0,1,2,3,4,4,5,5]795; AVX1-NEXT: vpshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,6,6,7,7]796; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm4, %ymm1797; AVX1-NEXT: vshufps {{.*#+}} ymm1 = ymm1[2,2,3,3,6,6,7,7]798; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1799; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4800; AVX1-NEXT: vpcmpeqb %xmm2, %xmm4, %xmm4801; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1802; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm1, %ymm1803; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1804; AVX1-NEXT: retq805;806; AVX2-LABEL: ext_i64_64i8:807; AVX2: # %bb.0:808; AVX2-NEXT: vmovq %rdi, %xmm0809; AVX2-NEXT: vpbroadcastq %xmm0, %ymm1810; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm1[0,0,0,0,0,0,0,0,9,9,9,9,9,9,9,9,18,18,18,18,18,18,18,18,27,27,27,27,27,27,27,27]811; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]812; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0813; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm0814; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]815; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm0816; AVX2-NEXT: vpshufb {{.*#+}} ymm1 = ymm1[4,4,4,4,4,4,4,4,13,13,13,13,13,13,13,13,22,22,22,22,22,22,22,22,31,31,31,31,31,31,31,31]817; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1818; AVX2-NEXT: vpcmpeqb %ymm2, %ymm1, %ymm1819; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1820; AVX2-NEXT: retq821;822; AVX512F-LABEL: ext_i64_64i8:823; AVX512F: # %bb.0:824; AVX512F-NEXT: movq %rdi, %rax825; AVX512F-NEXT: movl %edi, %ecx826; AVX512F-NEXT: kmovw %edi, %k1827; AVX512F-NEXT: shrq $32, %rdi828; AVX512F-NEXT: shrq $48, %rax829; AVX512F-NEXT: shrl $16, %ecx830; AVX512F-NEXT: kmovw %ecx, %k2831; AVX512F-NEXT: kmovw %eax, %k3832; AVX512F-NEXT: kmovw %edi, %k4833; AVX512F-NEXT: vpbroadcastd {{.*#+}} zmm0 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]834; AVX512F-NEXT: vmovdqa32 %zmm0, %zmm1 {%k4} {z}835; AVX512F-NEXT: vpmovdb %zmm1, %xmm1836; AVX512F-NEXT: vmovdqa32 %zmm0, %zmm2 {%k3} {z}837; AVX512F-NEXT: vpmovdb %zmm2, %xmm2838; AVX512F-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1839; AVX512F-NEXT: vmovdqa32 %zmm0, %zmm2 {%k1} {z}840; AVX512F-NEXT: vpmovdb %zmm2, %xmm2841; AVX512F-NEXT: vmovdqa32 %zmm0, %zmm0 {%k2} {z}842; AVX512F-NEXT: vpmovdb %zmm0, %xmm0843; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm2, %ymm0844; AVX512F-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0845; AVX512F-NEXT: retq846;847; AVX512VLBW-LABEL: ext_i64_64i8:848; AVX512VLBW: # %bb.0:849; AVX512VLBW-NEXT: kmovq %rdi, %k1850; AVX512VLBW-NEXT: vmovdqu8 {{.*#+}} zmm0 {%k1} {z} = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]851; AVX512VLBW-NEXT: retq852 %1 = bitcast i64 %a0 to <64 x i1>853 %2 = zext <64 x i1> %1 to <64 x i8>854 ret <64 x i8> %2855}856