brintos

brintos / llvm-project-archived public Read only

0
0
Text · 19.4 KiB · f8feceb Raw
539 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx  | FileCheck %s --check-prefix=ALL --check-prefix=AVX3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX24 5; 0'th element insertion into an AVX register.6 7define <8 x float> @insert_f32_firstelt_of_low_subvector(<8 x float> %x, float %s) {8; ALL-LABEL: insert_f32_firstelt_of_low_subvector:9; ALL:       # %bb.0:10; ALL-NEXT:    # kill: def $xmm1 killed $xmm1 def $ymm111; ALL-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0],ymm0[1,2,3,4,5,6,7]12; ALL-NEXT:    retq13  %i0 = insertelement <8 x float> %x, float %s, i32 014  ret <8 x float> %i015}16 17define <4 x double> @insert_f64_firstelt_of_low_subvector(<4 x double> %x, double %s) {18; ALL-LABEL: insert_f64_firstelt_of_low_subvector:19; ALL:       # %bb.0:20; ALL-NEXT:    # kill: def $xmm1 killed $xmm1 def $ymm121; ALL-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1],ymm0[2,3,4,5,6,7]22; ALL-NEXT:    retq23  %i0 = insertelement <4 x double> %x, double %s, i32 024  ret <4 x double> %i025}26 27define <32 x i8> @insert_i8_firstelt_of_low_subvector(<32 x i8> %x, i8 %s) {28; AVX-LABEL: insert_i8_firstelt_of_low_subvector:29; AVX:       # %bb.0:30; AVX-NEXT:    vpinsrb $0, %edi, %xmm0, %xmm131; AVX-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]32; AVX-NEXT:    retq33;34; AVX2-LABEL: insert_i8_firstelt_of_low_subvector:35; AVX2:       # %bb.0:36; AVX2-NEXT:    vpinsrb $0, %edi, %xmm0, %xmm137; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]38; AVX2-NEXT:    retq39  %i0 = insertelement <32 x i8> %x, i8 %s, i32 040  ret <32 x i8> %i041}42 43define <16 x i16> @insert_i16_firstelt_of_low_subvector(<16 x i16> %x, i16 %s) {44; AVX-LABEL: insert_i16_firstelt_of_low_subvector:45; AVX:       # %bb.0:46; AVX-NEXT:    vpinsrw $0, %edi, %xmm0, %xmm147; AVX-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]48; AVX-NEXT:    retq49;50; AVX2-LABEL: insert_i16_firstelt_of_low_subvector:51; AVX2:       # %bb.0:52; AVX2-NEXT:    vpinsrw $0, %edi, %xmm0, %xmm153; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]54; AVX2-NEXT:    retq55  %i0 = insertelement <16 x i16> %x, i16 %s, i32 056  ret <16 x i16> %i057}58 59define <8 x i32> @insert_i32_firstelt_of_low_subvector(<8 x i32> %x, i32 %s) {60; AVX-LABEL: insert_i32_firstelt_of_low_subvector:61; AVX:       # %bb.0:62; AVX-NEXT:    vpinsrd $0, %edi, %xmm0, %xmm163; AVX-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]64; AVX-NEXT:    retq65;66; AVX2-LABEL: insert_i32_firstelt_of_low_subvector:67; AVX2:       # %bb.0:68; AVX2-NEXT:    vmovd %edi, %xmm169; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0],ymm0[1,2,3,4,5,6,7]70; AVX2-NEXT:    retq71  %i0 = insertelement <8 x i32> %x, i32 %s, i32 072  ret <8 x i32> %i073}74 75define <4 x i64> @insert_i64_firstelt_of_low_subvector(<4 x i64> %x, i64 %s) {76; AVX-LABEL: insert_i64_firstelt_of_low_subvector:77; AVX:       # %bb.0:78; AVX-NEXT:    vpinsrq $0, %rdi, %xmm0, %xmm179; AVX-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]80; AVX-NEXT:    retq81;82; AVX2-LABEL: insert_i64_firstelt_of_low_subvector:83; AVX2:       # %bb.0:84; AVX2-NEXT:    vmovq %rdi, %xmm185; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1],ymm0[2,3,4,5,6,7]86; AVX2-NEXT:    retq87  %i0 = insertelement <4 x i64> %x, i64 %s, i32 088  ret <4 x i64> %i089}90 91; 0'th element of high subvector insertion into an AVX register.92 93define <8 x float> @insert_f32_firstelt_of_high_subvector(<8 x float> %x, float %s) {94; AVX-LABEL: insert_f32_firstelt_of_high_subvector:95; AVX:       # %bb.0:96; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm297; AVX-NEXT:    vmovss {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3]98; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm099; AVX-NEXT:    retq100;101; AVX2-LABEL: insert_f32_firstelt_of_high_subvector:102; AVX2:       # %bb.0:103; AVX2-NEXT:    vbroadcastss %xmm1, %ymm1104; AVX2-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4],ymm0[5,6,7]105; AVX2-NEXT:    retq106  %i0 = insertelement <8 x float> %x, float %s, i32 4107  ret <8 x float> %i0108}109 110define <4 x double> @insert_f64_firstelt_of_high_subvector(<4 x double> %x, double %s) {111; AVX-LABEL: insert_f64_firstelt_of_high_subvector:112; AVX:       # %bb.0:113; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm2114; AVX-NEXT:    vmovsd {{.*#+}} xmm1 = xmm1[0],xmm2[1]115; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0116; AVX-NEXT:    retq117;118; AVX2-LABEL: insert_f64_firstelt_of_high_subvector:119; AVX2:       # %bb.0:120; AVX2-NEXT:    vbroadcastsd %xmm1, %ymm1121; AVX2-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5],ymm0[6,7]122; AVX2-NEXT:    retq123  %i0 = insertelement <4 x double> %x, double %s, i32 2124  ret <4 x double> %i0125}126 127define <32 x i8> @insert_i8_firstelt_of_high_subvector(<32 x i8> %x, i8 %s) {128; AVX-LABEL: insert_i8_firstelt_of_high_subvector:129; AVX:       # %bb.0:130; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1131; AVX-NEXT:    vpinsrb $0, %edi, %xmm1, %xmm1132; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0133; AVX-NEXT:    retq134;135; AVX2-LABEL: insert_i8_firstelt_of_high_subvector:136; AVX2:       # %bb.0:137; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1138; AVX2-NEXT:    vpinsrb $0, %edi, %xmm1, %xmm1139; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0140; AVX2-NEXT:    retq141  %i0 = insertelement <32 x i8> %x, i8 %s, i32 16142  ret <32 x i8> %i0143}144 145define <16 x i16> @insert_i16_firstelt_of_high_subvector(<16 x i16> %x, i16 %s) {146; AVX-LABEL: insert_i16_firstelt_of_high_subvector:147; AVX:       # %bb.0:148; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1149; AVX-NEXT:    vpinsrw $0, %edi, %xmm1, %xmm1150; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0151; AVX-NEXT:    retq152;153; AVX2-LABEL: insert_i16_firstelt_of_high_subvector:154; AVX2:       # %bb.0:155; AVX2-NEXT:    vmovd %edi, %xmm1156; AVX2-NEXT:    vpbroadcastw %xmm1, %ymm1157; AVX2-NEXT:    vpblendw {{.*#+}} ymm1 = ymm1[0],ymm0[1,2,3,4,5,6,7],ymm1[8],ymm0[9,10,11,12,13,14,15]158; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]159; AVX2-NEXT:    retq160  %i0 = insertelement <16 x i16> %x, i16 %s, i32 8161  ret <16 x i16> %i0162}163 164define <8 x i32> @insert_i32_firstelt_of_high_subvector(<8 x i32> %x, i32 %s) {165; AVX-LABEL: insert_i32_firstelt_of_high_subvector:166; AVX:       # %bb.0:167; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1168; AVX-NEXT:    vpinsrd $0, %edi, %xmm1, %xmm1169; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0170; AVX-NEXT:    retq171;172; AVX2-LABEL: insert_i32_firstelt_of_high_subvector:173; AVX2:       # %bb.0:174; AVX2-NEXT:    vmovd %edi, %xmm1175; AVX2-NEXT:    vpbroadcastd %xmm1, %ymm1176; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4],ymm0[5,6,7]177; AVX2-NEXT:    retq178  %i0 = insertelement <8 x i32> %x, i32 %s, i32 4179  ret <8 x i32> %i0180}181 182define <4 x i64> @insert_i64_firstelt_of_high_subvector(<4 x i64> %x, i64 %s) {183; AVX-LABEL: insert_i64_firstelt_of_high_subvector:184; AVX:       # %bb.0:185; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1186; AVX-NEXT:    vpinsrq $0, %rdi, %xmm1, %xmm1187; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0188; AVX-NEXT:    retq189;190; AVX2-LABEL: insert_i64_firstelt_of_high_subvector:191; AVX2:       # %bb.0:192; AVX2-NEXT:    vmovq %rdi, %xmm1193; AVX2-NEXT:    vpbroadcastq %xmm1, %ymm1194; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5],ymm0[6,7]195; AVX2-NEXT:    retq196  %i0 = insertelement <4 x i64> %x, i64 %s, i32 2197  ret <4 x i64> %i0198}199 200; element insertion into 0'th element of both subvectors201 202define <8 x float> @insert_f32_firstelts(<8 x float> %x, float %s) {203; AVX-LABEL: insert_f32_firstelts:204; AVX:       # %bb.0:205; AVX-NEXT:    vmovss {{.*#+}} xmm2 = xmm1[0],xmm0[1,2,3]206; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm0207; AVX-NEXT:    vmovss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]208; AVX-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0209; AVX-NEXT:    retq210;211; AVX2-LABEL: insert_f32_firstelts:212; AVX2:       # %bb.0:213; AVX2-NEXT:    vbroadcastss %xmm1, %ymm1214; AVX2-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0],ymm0[1,2,3],ymm1[4],ymm0[5,6,7]215; AVX2-NEXT:    retq216  %i0 = insertelement <8 x float> %x, float %s, i32 0217  %i1 = insertelement <8 x float> %i0, float %s, i32 4218  ret <8 x float> %i1219}220 221define <4 x double> @insert_f64_firstelts(<4 x double> %x, double %s) {222; AVX-LABEL: insert_f64_firstelts:223; AVX:       # %bb.0:224; AVX-NEXT:    # kill: def $xmm1 killed $xmm1 def $ymm1225; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm1, %ymm1226; AVX-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1],ymm0[2,3],ymm1[4,5],ymm0[6,7]227; AVX-NEXT:    retq228;229; AVX2-LABEL: insert_f64_firstelts:230; AVX2:       # %bb.0:231; AVX2-NEXT:    vbroadcastsd %xmm1, %ymm1232; AVX2-NEXT:    vunpckhpd {{.*#+}} ymm0 = ymm1[1],ymm0[1],ymm1[3],ymm0[3]233; AVX2-NEXT:    retq234  %i0 = insertelement <4 x double> %x, double %s, i32 0235  %i1 = insertelement <4 x double> %i0, double %s, i32 2236  ret <4 x double> %i1237}238 239define <32 x i8> @insert_i8_firstelts(<32 x i8> %x, i8 %s) {240; AVX-LABEL: insert_i8_firstelts:241; AVX:       # %bb.0:242; AVX-NEXT:    vpinsrb $0, %edi, %xmm0, %xmm1243; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm0244; AVX-NEXT:    vpinsrb $0, %edi, %xmm0, %xmm0245; AVX-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0246; AVX-NEXT:    retq247;248; AVX2-LABEL: insert_i8_firstelts:249; AVX2:       # %bb.0:250; AVX2-NEXT:    vpinsrb $0, %edi, %xmm0, %xmm1251; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0252; AVX2-NEXT:    vpinsrb $0, %edi, %xmm0, %xmm0253; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0254; AVX2-NEXT:    retq255  %i0 = insertelement <32 x i8> %x, i8 %s, i32 0256  %i1 = insertelement <32 x i8> %i0, i8 %s, i32 16257  ret <32 x i8> %i1258}259 260define <16 x i16> @insert_i16_firstelts(<16 x i16> %x, i16 %s) {261; AVX-LABEL: insert_i16_firstelts:262; AVX:       # %bb.0:263; AVX-NEXT:    vpinsrw $0, %edi, %xmm0, %xmm1264; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm0265; AVX-NEXT:    vpinsrw $0, %edi, %xmm0, %xmm0266; AVX-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0267; AVX-NEXT:    retq268;269; AVX2-LABEL: insert_i16_firstelts:270; AVX2:       # %bb.0:271; AVX2-NEXT:    vpinsrw $0, %edi, %xmm0, %xmm1272; AVX2-NEXT:    vmovd %edi, %xmm2273; AVX2-NEXT:    vpbroadcastw %xmm2, %ymm2274; AVX2-NEXT:    vpblendw {{.*#+}} ymm0 = ymm2[0],ymm0[1,2,3,4,5,6,7],ymm2[8],ymm0[9,10,11,12,13,14,15]275; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]276; AVX2-NEXT:    retq277  %i0 = insertelement <16 x i16> %x, i16 %s, i32 0278  %i1 = insertelement <16 x i16> %i0, i16 %s, i32 8279  ret <16 x i16> %i1280}281 282define <8 x i32> @insert_i32_firstelts(<8 x i32> %x, i32 %s) {283; AVX-LABEL: insert_i32_firstelts:284; AVX:       # %bb.0:285; AVX-NEXT:    vpinsrd $0, %edi, %xmm0, %xmm1286; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm0287; AVX-NEXT:    vpinsrd $0, %edi, %xmm0, %xmm0288; AVX-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0289; AVX-NEXT:    retq290;291; AVX2-LABEL: insert_i32_firstelts:292; AVX2:       # %bb.0:293; AVX2-NEXT:    vmovd %edi, %xmm1294; AVX2-NEXT:    vpbroadcastd %xmm1, %ymm1295; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0],ymm0[1,2,3],ymm1[4],ymm0[5,6,7]296; AVX2-NEXT:    retq297  %i0 = insertelement <8 x i32> %x, i32 %s, i32 0298  %i1 = insertelement <8 x i32> %i0, i32 %s, i32 4299  ret <8 x i32> %i1300}301 302define <4 x i64> @insert_i64_firstelts(<4 x i64> %x, i64 %s) {303; AVX-LABEL: insert_i64_firstelts:304; AVX:       # %bb.0:305; AVX-NEXT:    vpinsrq $0, %rdi, %xmm0, %xmm1306; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm0307; AVX-NEXT:    vpinsrq $0, %rdi, %xmm0, %xmm0308; AVX-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0309; AVX-NEXT:    retq310;311; AVX2-LABEL: insert_i64_firstelts:312; AVX2:       # %bb.0:313; AVX2-NEXT:    vmovq %rdi, %xmm1314; AVX2-NEXT:    vpbroadcastq %xmm1, %ymm1315; AVX2-NEXT:    vpunpckhqdq {{.*#+}} ymm0 = ymm1[1],ymm0[1],ymm1[3],ymm0[3]316; AVX2-NEXT:    retq317  %i0 = insertelement <4 x i64> %x, i64 %s, i32 0318  %i1 = insertelement <4 x i64> %i0, i64 %s, i32 2319  ret <4 x i64> %i1320}321 322; element insertion into two elements of high subvector323 324define <8 x float> @insert_f32_two_elts_of_high_subvector(<8 x float> %x, float %s) {325; AVX-LABEL: insert_f32_two_elts_of_high_subvector:326; AVX:       # %bb.0:327; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm2328; AVX-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[0,0],xmm2[2,3]329; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0330; AVX-NEXT:    retq331;332; AVX2-LABEL: insert_f32_two_elts_of_high_subvector:333; AVX2:       # %bb.0:334; AVX2-NEXT:    vbroadcastss %xmm1, %ymm1335; AVX2-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5],ymm0[6,7]336; AVX2-NEXT:    retq337  %i0 = insertelement <8 x float> %x, float %s, i32 4338  %i1 = insertelement <8 x float> %i0, float %s, i32 5339  ret <8 x float> %i1340}341 342define <4 x double> @insert_f64_two_elts_of_high_subvector(<4 x double> %x, double %s) {343; AVX-LABEL: insert_f64_two_elts_of_high_subvector:344; AVX:       # %bb.0:345; AVX-NEXT:    vmovddup {{.*#+}} xmm1 = xmm1[0,0]346; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0347; AVX-NEXT:    retq348;349; AVX2-LABEL: insert_f64_two_elts_of_high_subvector:350; AVX2:       # %bb.0:351; AVX2-NEXT:    vbroadcastsd %xmm1, %ymm1352; AVX2-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]353; AVX2-NEXT:    retq354  %i0 = insertelement <4 x double> %x, double %s, i32 2355  %i1 = insertelement <4 x double> %i0, double %s, i32 3356  ret <4 x double> %i1357}358 359define <32 x i8> @insert_i8_two_elts_of_high_subvector(<32 x i8> %x, i8 %s) {360; AVX-LABEL: insert_i8_two_elts_of_high_subvector:361; AVX:       # %bb.0:362; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1363; AVX-NEXT:    vpinsrb $0, %edi, %xmm1, %xmm1364; AVX-NEXT:    vpinsrb $1, %edi, %xmm1, %xmm1365; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0366; AVX-NEXT:    retq367;368; AVX2-LABEL: insert_i8_two_elts_of_high_subvector:369; AVX2:       # %bb.0:370; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1371; AVX2-NEXT:    vpinsrb $0, %edi, %xmm1, %xmm1372; AVX2-NEXT:    vpinsrb $1, %edi, %xmm1, %xmm1373; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0374; AVX2-NEXT:    retq375  %i0 = insertelement <32 x i8> %x, i8 %s, i32 16376  %i1 = insertelement <32 x i8> %i0, i8 %s, i32 17377  ret <32 x i8> %i1378}379 380define <16 x i16> @insert_i16_two_elts_of_high_subvector(<16 x i16> %x, i16 %s) {381; AVX-LABEL: insert_i16_two_elts_of_high_subvector:382; AVX:       # %bb.0:383; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1384; AVX-NEXT:    vpinsrw $0, %edi, %xmm1, %xmm1385; AVX-NEXT:    vpinsrw $1, %edi, %xmm1, %xmm1386; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0387; AVX-NEXT:    retq388;389; AVX2-LABEL: insert_i16_two_elts_of_high_subvector:390; AVX2:       # %bb.0:391; AVX2-NEXT:    vmovd %edi, %xmm1392; AVX2-NEXT:    vpbroadcastw %xmm1, %ymm1393; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4],ymm0[5,6,7]394; AVX2-NEXT:    retq395  %i0 = insertelement <16 x i16> %x, i16 %s, i32 8396  %i1 = insertelement <16 x i16> %i0, i16 %s, i32 9397  ret <16 x i16> %i1398}399 400define <8 x i32> @insert_i32_two_elts_of_high_subvector(<8 x i32> %x, i32 %s) {401; AVX-LABEL: insert_i32_two_elts_of_high_subvector:402; AVX:       # %bb.0:403; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1404; AVX-NEXT:    vpinsrd $0, %edi, %xmm1, %xmm1405; AVX-NEXT:    vpinsrd $1, %edi, %xmm1, %xmm1406; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0407; AVX-NEXT:    retq408;409; AVX2-LABEL: insert_i32_two_elts_of_high_subvector:410; AVX2:       # %bb.0:411; AVX2-NEXT:    vmovd %edi, %xmm1412; AVX2-NEXT:    vpbroadcastd %xmm1, %ymm1413; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5],ymm0[6,7]414; AVX2-NEXT:    retq415  %i0 = insertelement <8 x i32> %x, i32 %s, i32 4416  %i1 = insertelement <8 x i32> %i0, i32 %s, i32 5417  ret <8 x i32> %i1418}419 420define <4 x i64> @insert_i64_two_elts_of_high_subvector(<4 x i64> %x, i64 %s) {421; AVX-LABEL: insert_i64_two_elts_of_high_subvector:422; AVX:       # %bb.0:423; AVX-NEXT:    vmovq %rdi, %xmm1424; AVX-NEXT:    vpinsrq $1, %rdi, %xmm1, %xmm1425; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0426; AVX-NEXT:    retq427;428; AVX2-LABEL: insert_i64_two_elts_of_high_subvector:429; AVX2:       # %bb.0:430; AVX2-NEXT:    vmovq %rdi, %xmm1431; AVX2-NEXT:    vpbroadcastq %xmm1, %ymm1432; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]433; AVX2-NEXT:    retq434  %i0 = insertelement <4 x i64> %x, i64 %s, i32 2435  %i1 = insertelement <4 x i64> %i0, i64 %s, i32 3436  ret <4 x i64> %i1437}438 439; element insertion into two elements of low subvector440 441define <8 x float> @insert_f32_two_elts_of_low_subvector(<8 x float> %x, float %s) {442; ALL-LABEL: insert_f32_two_elts_of_low_subvector:443; ALL:       # %bb.0:444; ALL-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,3]445; ALL-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]446; ALL-NEXT:    retq447  %i0 = insertelement <8 x float> %x, float %s, i32 0448  %i1 = insertelement <8 x float> %i0, float %s, i32 1449  ret <8 x float> %i1450}451 452define <4 x double> @insert_f64_two_elts_of_low_subvector(<4 x double> %x, double %s) {453; ALL-LABEL: insert_f64_two_elts_of_low_subvector:454; ALL:       # %bb.0:455; ALL-NEXT:    vmovddup {{.*#+}} xmm1 = xmm1[0,0]456; ALL-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]457; ALL-NEXT:    retq458  %i0 = insertelement <4 x double> %x, double %s, i32 0459  %i1 = insertelement <4 x double> %i0, double %s, i32 1460  ret <4 x double> %i1461}462 463define <32 x i8> @insert_i8_two_elts_of_low_subvector(<32 x i8> %x, i8 %s) {464; AVX-LABEL: insert_i8_two_elts_of_low_subvector:465; AVX:       # %bb.0:466; AVX-NEXT:    vpinsrb $0, %edi, %xmm0, %xmm1467; AVX-NEXT:    vpinsrb $1, %edi, %xmm1, %xmm1468; AVX-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]469; AVX-NEXT:    retq470;471; AVX2-LABEL: insert_i8_two_elts_of_low_subvector:472; AVX2:       # %bb.0:473; AVX2-NEXT:    vpinsrb $0, %edi, %xmm0, %xmm1474; AVX2-NEXT:    vpinsrb $1, %edi, %xmm1, %xmm1475; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]476; AVX2-NEXT:    retq477  %i0 = insertelement <32 x i8> %x, i8 %s, i32 0478  %i1 = insertelement <32 x i8> %i0, i8 %s, i32 1479  ret <32 x i8> %i1480}481 482define <16 x i16> @insert_i16_two_elts_of_low_subvector(<16 x i16> %x, i16 %s) {483; AVX-LABEL: insert_i16_two_elts_of_low_subvector:484; AVX:       # %bb.0:485; AVX-NEXT:    vpinsrw $0, %edi, %xmm0, %xmm1486; AVX-NEXT:    vpinsrw $1, %edi, %xmm1, %xmm1487; AVX-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]488; AVX-NEXT:    retq489;490; AVX2-LABEL: insert_i16_two_elts_of_low_subvector:491; AVX2:       # %bb.0:492; AVX2-NEXT:    vpinsrw $0, %edi, %xmm0, %xmm1493; AVX2-NEXT:    vpinsrw $1, %edi, %xmm1, %xmm1494; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]495; AVX2-NEXT:    retq496  %i0 = insertelement <16 x i16> %x, i16 %s, i32 0497  %i1 = insertelement <16 x i16> %i0, i16 %s, i32 1498  ret <16 x i16> %i1499}500 501define <8 x i32> @insert_i32_two_elts_of_low_subvector(<8 x i32> %x, i32 %s) {502; AVX-LABEL: insert_i32_two_elts_of_low_subvector:503; AVX:       # %bb.0:504; AVX-NEXT:    vpinsrd $0, %edi, %xmm0, %xmm1505; AVX-NEXT:    vpinsrd $1, %edi, %xmm1, %xmm1506; AVX-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]507; AVX-NEXT:    retq508;509; AVX2-LABEL: insert_i32_two_elts_of_low_subvector:510; AVX2:       # %bb.0:511; AVX2-NEXT:    vmovd %edi, %xmm1512; AVX2-NEXT:    vpblendd {{.*#+}} xmm1 = xmm1[0],xmm0[1,2,3]513; AVX2-NEXT:    vpinsrd $1, %edi, %xmm1, %xmm1514; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]515; AVX2-NEXT:    retq516  %i0 = insertelement <8 x i32> %x, i32 %s, i32 0517  %i1 = insertelement <8 x i32> %i0, i32 %s, i32 1518  ret <8 x i32> %i1519}520 521define <4 x i64> @insert_i64_two_elts_of_low_subvector(<4 x i64> %x, i64 %s) {522; AVX-LABEL: insert_i64_two_elts_of_low_subvector:523; AVX:       # %bb.0:524; AVX-NEXT:    vmovq %rdi, %xmm1525; AVX-NEXT:    vpinsrq $1, %rdi, %xmm1, %xmm1526; AVX-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]527; AVX-NEXT:    retq528;529; AVX2-LABEL: insert_i64_two_elts_of_low_subvector:530; AVX2:       # %bb.0:531; AVX2-NEXT:    vmovq %rdi, %xmm1532; AVX2-NEXT:    vpinsrq $1, %rdi, %xmm1, %xmm1533; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]534; AVX2-NEXT:    retq535  %i0 = insertelement <4 x i64> %x, i64 %s, i32 0536  %i1 = insertelement <4 x i64> %i0, i64 %s, i32 1537  ret <4 x i64> %i1538}539