brintos

brintos / llvm-project-archived public Read only

0
0
Text · 61.3 KiB · b6aae48 Raw
1640 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE414; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX7;8; 32-bit SSE tests to make sure we do reasonable things.9; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse | FileCheck %s --check-prefixes=X86-SSE,X86-SSE110; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=X86-SSE,X86-SSE4111 12define <2 x double> @merge_2f64_f64_23(ptr %ptr) nounwind uwtable noinline ssp {13; SSE-LABEL: merge_2f64_f64_23:14; SSE:       # %bb.0:15; SSE-NEXT:    movups 16(%rdi), %xmm016; SSE-NEXT:    retq17;18; AVX-LABEL: merge_2f64_f64_23:19; AVX:       # %bb.0:20; AVX-NEXT:    vmovups 16(%rdi), %xmm021; AVX-NEXT:    retq22;23; X86-SSE1-LABEL: merge_2f64_f64_23:24; X86-SSE1:       # %bb.0:25; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax26; X86-SSE1-NEXT:    fldl 16(%eax)27; X86-SSE1-NEXT:    fldl 24(%eax)28; X86-SSE1-NEXT:    fxch %st(1)29; X86-SSE1-NEXT:    retl30;31; X86-SSE41-LABEL: merge_2f64_f64_23:32; X86-SSE41:       # %bb.0:33; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax34; X86-SSE41-NEXT:    movups 16(%eax), %xmm035; X86-SSE41-NEXT:    retl36  %ptr0 = getelementptr inbounds double, ptr %ptr, i64 237  %ptr1 = getelementptr inbounds double, ptr %ptr, i64 338  %val0 = load double, ptr %ptr039  %val1 = load double, ptr %ptr140  %res0 = insertelement <2 x double> undef, double %val0, i32 041  %res1 = insertelement <2 x double> %res0, double %val1, i32 142  ret <2 x double> %res143}44 45define <2 x i64> @merge_2i64_i64_12(ptr %ptr) nounwind uwtable noinline ssp {46; SSE-LABEL: merge_2i64_i64_12:47; SSE:       # %bb.0:48; SSE-NEXT:    movups 8(%rdi), %xmm049; SSE-NEXT:    retq50;51; AVX-LABEL: merge_2i64_i64_12:52; AVX:       # %bb.0:53; AVX-NEXT:    vmovups 8(%rdi), %xmm054; AVX-NEXT:    retq55;56; X86-SSE1-LABEL: merge_2i64_i64_12:57; X86-SSE1:       # %bb.0:58; X86-SSE1-NEXT:    pushl %edi59; X86-SSE1-NEXT:    .cfi_def_cfa_offset 860; X86-SSE1-NEXT:    pushl %esi61; X86-SSE1-NEXT:    .cfi_def_cfa_offset 1262; X86-SSE1-NEXT:    .cfi_offset %esi, -1263; X86-SSE1-NEXT:    .cfi_offset %edi, -864; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax65; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %ecx66; X86-SSE1-NEXT:    movl 8(%ecx), %edx67; X86-SSE1-NEXT:    movl 12(%ecx), %esi68; X86-SSE1-NEXT:    movl 16(%ecx), %edi69; X86-SSE1-NEXT:    movl 20(%ecx), %ecx70; X86-SSE1-NEXT:    movl %ecx, 12(%eax)71; X86-SSE1-NEXT:    movl %edi, 8(%eax)72; X86-SSE1-NEXT:    movl %esi, 4(%eax)73; X86-SSE1-NEXT:    movl %edx, (%eax)74; X86-SSE1-NEXT:    popl %esi75; X86-SSE1-NEXT:    .cfi_def_cfa_offset 876; X86-SSE1-NEXT:    popl %edi77; X86-SSE1-NEXT:    .cfi_def_cfa_offset 478; X86-SSE1-NEXT:    retl $479;80; X86-SSE41-LABEL: merge_2i64_i64_12:81; X86-SSE41:       # %bb.0:82; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax83; X86-SSE41-NEXT:    movups 8(%eax), %xmm084; X86-SSE41-NEXT:    retl85  %ptr0 = getelementptr inbounds i64, ptr %ptr, i64 186  %ptr1 = getelementptr inbounds i64, ptr %ptr, i64 287  %val0 = load i64, ptr %ptr088  %val1 = load i64, ptr %ptr189  %res0 = insertelement <2 x i64> undef, i64 %val0, i32 090  %res1 = insertelement <2 x i64> %res0, i64 %val1, i32 191  ret <2 x i64> %res192}93 94define <4 x float> @merge_4f32_f32_2345(ptr %ptr) nounwind uwtable noinline ssp {95; SSE-LABEL: merge_4f32_f32_2345:96; SSE:       # %bb.0:97; SSE-NEXT:    movups 8(%rdi), %xmm098; SSE-NEXT:    retq99;100; AVX-LABEL: merge_4f32_f32_2345:101; AVX:       # %bb.0:102; AVX-NEXT:    vmovups 8(%rdi), %xmm0103; AVX-NEXT:    retq104;105; X86-SSE-LABEL: merge_4f32_f32_2345:106; X86-SSE:       # %bb.0:107; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax108; X86-SSE-NEXT:    movups 8(%eax), %xmm0109; X86-SSE-NEXT:    retl110  %ptr0 = getelementptr inbounds float, ptr %ptr, i64 2111  %ptr1 = getelementptr inbounds float, ptr %ptr, i64 3112  %ptr2 = getelementptr inbounds float, ptr %ptr, i64 4113  %ptr3 = getelementptr inbounds float, ptr %ptr, i64 5114  %val0 = load float, ptr %ptr0115  %val1 = load float, ptr %ptr1116  %val2 = load float, ptr %ptr2117  %val3 = load float, ptr %ptr3118  %res0 = insertelement <4 x float> undef, float %val0, i32 0119  %res1 = insertelement <4 x float> %res0, float %val1, i32 1120  %res2 = insertelement <4 x float> %res1, float %val2, i32 2121  %res3 = insertelement <4 x float> %res2, float %val3, i32 3122  ret <4 x float> %res3123}124 125define <4 x float> @merge_4f32_f32_3zuu(ptr %ptr) nounwind uwtable noinline ssp {126; SSE-LABEL: merge_4f32_f32_3zuu:127; SSE:       # %bb.0:128; SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero129; SSE-NEXT:    retq130;131; AVX-LABEL: merge_4f32_f32_3zuu:132; AVX:       # %bb.0:133; AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero134; AVX-NEXT:    retq135;136; X86-SSE-LABEL: merge_4f32_f32_3zuu:137; X86-SSE:       # %bb.0:138; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax139; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero140; X86-SSE-NEXT:    retl141  %ptr0 = getelementptr inbounds float, ptr %ptr, i64 3142  %val0 = load float, ptr %ptr0143  %res0 = insertelement <4 x float> undef, float %val0, i32 0144  %res1 = insertelement <4 x float> %res0, float 0.0, i32 1145  ret <4 x float> %res1146}147 148define <4 x float> @merge_4f32_f32_34uu(ptr %ptr) nounwind uwtable noinline ssp {149; SSE-LABEL: merge_4f32_f32_34uu:150; SSE:       # %bb.0:151; SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero152; SSE-NEXT:    retq153;154; AVX-LABEL: merge_4f32_f32_34uu:155; AVX:       # %bb.0:156; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero157; AVX-NEXT:    retq158;159; X86-SSE1-LABEL: merge_4f32_f32_34uu:160; X86-SSE1:       # %bb.0:161; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax162; X86-SSE1-NEXT:    xorps %xmm0, %xmm0163; X86-SSE1-NEXT:    movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]164; X86-SSE1-NEXT:    retl165;166; X86-SSE41-LABEL: merge_4f32_f32_34uu:167; X86-SSE41:       # %bb.0:168; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax169; X86-SSE41-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero170; X86-SSE41-NEXT:    retl171  %ptr0 = getelementptr inbounds float, ptr %ptr, i64 3172  %ptr1 = getelementptr inbounds float, ptr %ptr, i64 4173  %val0 = load float, ptr %ptr0174  %val1 = load float, ptr %ptr1175  %res0 = insertelement <4 x float> undef, float %val0, i32 0176  %res1 = insertelement <4 x float> %res0, float %val1, i32 1177  ret <4 x float> %res1178}179 180define <4 x float> @merge_4f32_f32_34z6(ptr %ptr) nounwind uwtable noinline ssp {181; SSE2-LABEL: merge_4f32_f32_34z6:182; SSE2:       # %bb.0:183; SSE2-NEXT:    movups 12(%rdi), %xmm0184; SSE2-NEXT:    xorps %xmm1, %xmm1185; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[3,0]186; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]187; SSE2-NEXT:    retq188;189; SSE41-LABEL: merge_4f32_f32_34z6:190; SSE41:       # %bb.0:191; SSE41-NEXT:    movups 12(%rdi), %xmm1192; SSE41-NEXT:    xorps %xmm0, %xmm0193; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm1[0,1],xmm0[2],xmm1[3]194; SSE41-NEXT:    retq195;196; AVX-LABEL: merge_4f32_f32_34z6:197; AVX:       # %bb.0:198; AVX-NEXT:    vxorps %xmm0, %xmm0, %xmm0199; AVX-NEXT:    vblendps {{.*#+}} xmm0 = mem[0,1],xmm0[2],mem[3]200; AVX-NEXT:    retq201;202; X86-SSE1-LABEL: merge_4f32_f32_34z6:203; X86-SSE1:       # %bb.0:204; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax205; X86-SSE1-NEXT:    movups 12(%eax), %xmm0206; X86-SSE1-NEXT:    xorps %xmm1, %xmm1207; X86-SSE1-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[3,0]208; X86-SSE1-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]209; X86-SSE1-NEXT:    retl210;211; X86-SSE41-LABEL: merge_4f32_f32_34z6:212; X86-SSE41:       # %bb.0:213; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax214; X86-SSE41-NEXT:    movups 12(%eax), %xmm1215; X86-SSE41-NEXT:    xorps %xmm0, %xmm0216; X86-SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm1[0,1],xmm0[2],xmm1[3]217; X86-SSE41-NEXT:    retl218  %ptr0 = getelementptr inbounds float, ptr %ptr, i64 3219  %ptr1 = getelementptr inbounds float, ptr %ptr, i64 4220  %ptr3 = getelementptr inbounds float, ptr %ptr, i64 6221  %val0 = load float, ptr %ptr0222  %val1 = load float, ptr %ptr1223  %val3 = load float, ptr %ptr3224  %res0 = insertelement <4 x float> zeroinitializer, float %val0, i32 0225  %res1 = insertelement <4 x float> %res0, float %val1, i32 1226  %res3 = insertelement <4 x float> %res1, float %val3, i32 3227  ret <4 x float> %res3228}229 230define <4 x float> @merge_4f32_f32_45zz(ptr %ptr) nounwind uwtable noinline ssp {231; SSE-LABEL: merge_4f32_f32_45zz:232; SSE:       # %bb.0:233; SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero234; SSE-NEXT:    retq235;236; AVX-LABEL: merge_4f32_f32_45zz:237; AVX:       # %bb.0:238; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero239; AVX-NEXT:    retq240;241; X86-SSE1-LABEL: merge_4f32_f32_45zz:242; X86-SSE1:       # %bb.0:243; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax244; X86-SSE1-NEXT:    xorps %xmm0, %xmm0245; X86-SSE1-NEXT:    movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]246; X86-SSE1-NEXT:    retl247;248; X86-SSE41-LABEL: merge_4f32_f32_45zz:249; X86-SSE41:       # %bb.0:250; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax251; X86-SSE41-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero252; X86-SSE41-NEXT:    retl253  %ptr0 = getelementptr inbounds float, ptr %ptr, i64 4254  %ptr1 = getelementptr inbounds float, ptr %ptr, i64 5255  %val0 = load float, ptr %ptr0256  %val1 = load float, ptr %ptr1257  %res0 = insertelement <4 x float> zeroinitializer, float %val0, i32 0258  %res1 = insertelement <4 x float> %res0, float %val1, i32 1259  ret <4 x float> %res1260}261 262define <4 x float> @merge_4f32_f32_012u(ptr %ptr) nounwind uwtable noinline ssp {263; SSE2-LABEL: merge_4f32_f32_012u:264; SSE2:       # %bb.0:265; SSE2-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero266; SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero267; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]268; SSE2-NEXT:    retq269;270; SSE41-LABEL: merge_4f32_f32_012u:271; SSE41:       # %bb.0:272; SSE41-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero273; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1],mem[0],xmm0[3]274; SSE41-NEXT:    retq275;276; AVX-LABEL: merge_4f32_f32_012u:277; AVX:       # %bb.0:278; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero279; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],mem[0],xmm0[3]280; AVX-NEXT:    retq281;282; X86-SSE1-LABEL: merge_4f32_f32_012u:283; X86-SSE1:       # %bb.0:284; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax285; X86-SSE1-NEXT:    xorps %xmm0, %xmm0286; X86-SSE1-NEXT:    movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]287; X86-SSE1-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero288; X86-SSE1-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]289; X86-SSE1-NEXT:    retl290;291; X86-SSE41-LABEL: merge_4f32_f32_012u:292; X86-SSE41:       # %bb.0:293; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax294; X86-SSE41-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero295; X86-SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1],mem[0],xmm0[3]296; X86-SSE41-NEXT:    retl297  %ptr1 = getelementptr inbounds float, ptr %ptr, i64 1298  %ptr2 = getelementptr inbounds float, ptr %ptr, i64 2299  %val0 = load float, ptr %ptr300  %val1 = load float, ptr %ptr1301  %val2 = load float, ptr %ptr2302  %res0 = insertelement <4 x float> undef, float %val0, i32 0303  %res1 = insertelement <4 x float> %res0, float %val1, i32 1304  %res2 = insertelement <4 x float> %res1, float %val2, i32 2305  %res3 = insertelement <4 x float> %res2, float undef, i32 3306  ret <4 x float> %res3307}308 309define <4 x float> @merge_4f32_f32_019u(ptr %ptr) nounwind uwtable noinline ssp {310; SSE2-LABEL: merge_4f32_f32_019u:311; SSE2:       # %bb.0:312; SSE2-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero313; SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero314; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]315; SSE2-NEXT:    retq316;317; SSE41-LABEL: merge_4f32_f32_019u:318; SSE41:       # %bb.0:319; SSE41-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero320; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1],mem[0],xmm0[3]321; SSE41-NEXT:    retq322;323; AVX-LABEL: merge_4f32_f32_019u:324; AVX:       # %bb.0:325; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero326; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],mem[0],xmm0[3]327; AVX-NEXT:    retq328;329; X86-SSE1-LABEL: merge_4f32_f32_019u:330; X86-SSE1:       # %bb.0:331; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax332; X86-SSE1-NEXT:    xorps %xmm0, %xmm0333; X86-SSE1-NEXT:    movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]334; X86-SSE1-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero335; X86-SSE1-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]336; X86-SSE1-NEXT:    retl337;338; X86-SSE41-LABEL: merge_4f32_f32_019u:339; X86-SSE41:       # %bb.0:340; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax341; X86-SSE41-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero342; X86-SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1],mem[0],xmm0[3]343; X86-SSE41-NEXT:    retl344  %ptr1 = getelementptr inbounds float, ptr %ptr, i64 1345  %ptr2 = getelementptr inbounds float, ptr %ptr, i64 9346  %val0 = load float, ptr %ptr347  %val1 = load float, ptr %ptr1348  %val2 = load float, ptr %ptr2349  %res0 = insertelement <4 x float> undef, float %val0, i32 0350  %res1 = insertelement <4 x float> %res0, float %val1, i32 1351  %res2 = insertelement <4 x float> %res1, float %val2, i32 2352  %res3 = insertelement <4 x float> %res2, float undef, i32 3353  ret <4 x float> %res3354}355 356define <4 x float> @merge_v4f32_f32_3210(ptr %ptr) nounwind uwtable noinline ssp {357; SSE-LABEL: merge_v4f32_f32_3210:358; SSE:       # %bb.0:359; SSE-NEXT:    movups (%rdi), %xmm0360; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,2,1,0]361; SSE-NEXT:    retq362;363; AVX-LABEL: merge_v4f32_f32_3210:364; AVX:       # %bb.0:365; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = mem[3,2,1,0]366; AVX-NEXT:    retq367;368; X86-SSE-LABEL: merge_v4f32_f32_3210:369; X86-SSE:       # %bb.0:370; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax371; X86-SSE-NEXT:    movups (%eax), %xmm0372; X86-SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,2,1,0]373; X86-SSE-NEXT:    retl374  %ptr0 = getelementptr inbounds float, ptr %ptr, i64 3375  %ptr1 = getelementptr inbounds float, ptr %ptr, i64 2376  %ptr2 = getelementptr inbounds float, ptr %ptr, i64 1377  %ptr3 = getelementptr inbounds float, ptr %ptr, i64 0378  %val0 = load float, ptr %ptr0, align 4379  %val1 = load float, ptr %ptr1, align 4380  %val2 = load float, ptr %ptr2, align 4381  %val3 = load float, ptr %ptr3, align 4382  %res0 = insertelement <4 x float> poison, float %val0, i64 0383  %res1 = insertelement <4 x float> %res0, float %val1, i64 1384  %res2 = insertelement <4 x float> %res1, float %val2, i64 2385  %res3 = insertelement <4 x float> %res2, float %val3, i64 3386  ret <4 x float> %res3387}388 389define <4 x i32> @merge_4i32_i32_23u5(ptr %ptr) nounwind uwtable noinline ssp {390; SSE-LABEL: merge_4i32_i32_23u5:391; SSE:       # %bb.0:392; SSE-NEXT:    movups 8(%rdi), %xmm0393; SSE-NEXT:    retq394;395; AVX-LABEL: merge_4i32_i32_23u5:396; AVX:       # %bb.0:397; AVX-NEXT:    vmovups 8(%rdi), %xmm0398; AVX-NEXT:    retq399;400; X86-SSE1-LABEL: merge_4i32_i32_23u5:401; X86-SSE1:       # %bb.0:402; X86-SSE1-NEXT:    pushl %esi403; X86-SSE1-NEXT:    .cfi_def_cfa_offset 8404; X86-SSE1-NEXT:    .cfi_offset %esi, -8405; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax406; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %ecx407; X86-SSE1-NEXT:    movl 8(%ecx), %edx408; X86-SSE1-NEXT:    movl 12(%ecx), %esi409; X86-SSE1-NEXT:    movl 20(%ecx), %ecx410; X86-SSE1-NEXT:    movl %esi, 4(%eax)411; X86-SSE1-NEXT:    movl %edx, (%eax)412; X86-SSE1-NEXT:    movl %ecx, 12(%eax)413; X86-SSE1-NEXT:    popl %esi414; X86-SSE1-NEXT:    .cfi_def_cfa_offset 4415; X86-SSE1-NEXT:    retl $4416;417; X86-SSE41-LABEL: merge_4i32_i32_23u5:418; X86-SSE41:       # %bb.0:419; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax420; X86-SSE41-NEXT:    movups 8(%eax), %xmm0421; X86-SSE41-NEXT:    retl422  %ptr0 = getelementptr inbounds i32, ptr %ptr, i64 2423  %ptr1 = getelementptr inbounds i32, ptr %ptr, i64 3424  %ptr3 = getelementptr inbounds i32, ptr %ptr, i64 5425  %val0 = load i32, ptr %ptr0426  %val1 = load i32, ptr %ptr1427  %val3 = load i32, ptr %ptr3428  %res0 = insertelement <4 x i32> undef, i32 %val0, i32 0429  %res1 = insertelement <4 x i32> %res0, i32 %val1, i32 1430  %res3 = insertelement <4 x i32> %res1, i32 %val3, i32 3431  ret <4 x i32> %res3432}433 434define <4 x i32> @merge_4i32_i32_23u5_inc2(ptr %ptr) nounwind uwtable noinline ssp {435; SSE-LABEL: merge_4i32_i32_23u5_inc2:436; SSE:       # %bb.0:437; SSE-NEXT:    movups 8(%rdi), %xmm0438; SSE-NEXT:    incl 8(%rdi)439; SSE-NEXT:    retq440;441; AVX-LABEL: merge_4i32_i32_23u5_inc2:442; AVX:       # %bb.0:443; AVX-NEXT:    vmovups 8(%rdi), %xmm0444; AVX-NEXT:    incl 8(%rdi)445; AVX-NEXT:    retq446;447; X86-SSE1-LABEL: merge_4i32_i32_23u5_inc2:448; X86-SSE1:       # %bb.0:449; X86-SSE1-NEXT:    pushl %edi450; X86-SSE1-NEXT:    .cfi_def_cfa_offset 8451; X86-SSE1-NEXT:    pushl %esi452; X86-SSE1-NEXT:    .cfi_def_cfa_offset 12453; X86-SSE1-NEXT:    .cfi_offset %esi, -12454; X86-SSE1-NEXT:    .cfi_offset %edi, -8455; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax456; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %ecx457; X86-SSE1-NEXT:    movl 8(%ecx), %edx458; X86-SSE1-NEXT:    movl 12(%ecx), %esi459; X86-SSE1-NEXT:    leal 1(%edx), %edi460; X86-SSE1-NEXT:    movl %edi, 8(%ecx)461; X86-SSE1-NEXT:    movl 20(%ecx), %ecx462; X86-SSE1-NEXT:    movl %esi, 4(%eax)463; X86-SSE1-NEXT:    movl %edx, (%eax)464; X86-SSE1-NEXT:    movl %ecx, 12(%eax)465; X86-SSE1-NEXT:    popl %esi466; X86-SSE1-NEXT:    .cfi_def_cfa_offset 8467; X86-SSE1-NEXT:    popl %edi468; X86-SSE1-NEXT:    .cfi_def_cfa_offset 4469; X86-SSE1-NEXT:    retl $4470;471; X86-SSE41-LABEL: merge_4i32_i32_23u5_inc2:472; X86-SSE41:       # %bb.0:473; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax474; X86-SSE41-NEXT:    movups 8(%eax), %xmm0475; X86-SSE41-NEXT:    incl 8(%eax)476; X86-SSE41-NEXT:    retl477  %ptr0 = getelementptr inbounds i32, ptr %ptr, i64 2478  %ptr1 = getelementptr inbounds i32, ptr %ptr, i64 3479  %ptr3 = getelementptr inbounds i32, ptr %ptr, i64 5480  %val0 = load i32, ptr %ptr0481  %inc = add i32 %val0, 1482  store i32 %inc, ptr %ptr0483  %val1 = load i32, ptr %ptr1484  %val3 = load i32, ptr %ptr3485  %res0 = insertelement <4 x i32> undef, i32 %val0, i32 0486  %res1 = insertelement <4 x i32> %res0, i32 %val1, i32 1487  %res3 = insertelement <4 x i32> %res1, i32 %val3, i32 3488  ret <4 x i32> %res3489}490 491define <4 x i32> @merge_4i32_i32_23u5_inc3(ptr %ptr) nounwind uwtable noinline ssp {492; SSE-LABEL: merge_4i32_i32_23u5_inc3:493; SSE:       # %bb.0:494; SSE-NEXT:    movups 8(%rdi), %xmm0495; SSE-NEXT:    incl 12(%rdi)496; SSE-NEXT:    retq497;498; AVX-LABEL: merge_4i32_i32_23u5_inc3:499; AVX:       # %bb.0:500; AVX-NEXT:    vmovups 8(%rdi), %xmm0501; AVX-NEXT:    incl 12(%rdi)502; AVX-NEXT:    retq503;504; X86-SSE1-LABEL: merge_4i32_i32_23u5_inc3:505; X86-SSE1:       # %bb.0:506; X86-SSE1-NEXT:    pushl %edi507; X86-SSE1-NEXT:    .cfi_def_cfa_offset 8508; X86-SSE1-NEXT:    pushl %esi509; X86-SSE1-NEXT:    .cfi_def_cfa_offset 12510; X86-SSE1-NEXT:    .cfi_offset %esi, -12511; X86-SSE1-NEXT:    .cfi_offset %edi, -8512; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax513; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %ecx514; X86-SSE1-NEXT:    movl 8(%ecx), %edx515; X86-SSE1-NEXT:    movl 12(%ecx), %esi516; X86-SSE1-NEXT:    leal 1(%esi), %edi517; X86-SSE1-NEXT:    movl %edi, 12(%ecx)518; X86-SSE1-NEXT:    movl 20(%ecx), %ecx519; X86-SSE1-NEXT:    movl %esi, 4(%eax)520; X86-SSE1-NEXT:    movl %edx, (%eax)521; X86-SSE1-NEXT:    movl %ecx, 12(%eax)522; X86-SSE1-NEXT:    popl %esi523; X86-SSE1-NEXT:    .cfi_def_cfa_offset 8524; X86-SSE1-NEXT:    popl %edi525; X86-SSE1-NEXT:    .cfi_def_cfa_offset 4526; X86-SSE1-NEXT:    retl $4527;528; X86-SSE41-LABEL: merge_4i32_i32_23u5_inc3:529; X86-SSE41:       # %bb.0:530; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax531; X86-SSE41-NEXT:    movups 8(%eax), %xmm0532; X86-SSE41-NEXT:    incl 12(%eax)533; X86-SSE41-NEXT:    retl534  %ptr0 = getelementptr inbounds i32, ptr %ptr, i64 2535  %ptr1 = getelementptr inbounds i32, ptr %ptr, i64 3536  %ptr3 = getelementptr inbounds i32, ptr %ptr, i64 5537  %val0 = load i32, ptr %ptr0538  %val1 = load i32, ptr %ptr1539  %inc = add i32 %val1, 1540  store i32 %inc, ptr %ptr1541  %val3 = load i32, ptr %ptr3542  %res0 = insertelement <4 x i32> undef, i32 %val0, i32 0543  %res1 = insertelement <4 x i32> %res0, i32 %val1, i32 1544  %res3 = insertelement <4 x i32> %res1, i32 %val3, i32 3545  ret <4 x i32> %res3546}547 548define <4 x i32> @merge_4i32_i32_3zuu(ptr %ptr) nounwind uwtable noinline ssp {549; SSE-LABEL: merge_4i32_i32_3zuu:550; SSE:       # %bb.0:551; SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero552; SSE-NEXT:    retq553;554; AVX-LABEL: merge_4i32_i32_3zuu:555; AVX:       # %bb.0:556; AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero557; AVX-NEXT:    retq558;559; X86-SSE1-LABEL: merge_4i32_i32_3zuu:560; X86-SSE1:       # %bb.0:561; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax562; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %ecx563; X86-SSE1-NEXT:    movl 12(%ecx), %ecx564; X86-SSE1-NEXT:    movl %ecx, (%eax)565; X86-SSE1-NEXT:    movl $0, 4(%eax)566; X86-SSE1-NEXT:    retl $4567;568; X86-SSE41-LABEL: merge_4i32_i32_3zuu:569; X86-SSE41:       # %bb.0:570; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax571; X86-SSE41-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero572; X86-SSE41-NEXT:    retl573  %ptr0 = getelementptr inbounds i32, ptr %ptr, i64 3574  %val0 = load i32, ptr %ptr0575  %res0 = insertelement <4 x i32> undef, i32 %val0, i32 0576  %res1 = insertelement <4 x i32> %res0, i32     0, i32 1577  ret <4 x i32> %res1578}579 580define <4 x i32> @merge_4i32_i32_34uu(ptr %ptr) nounwind uwtable noinline ssp {581; SSE-LABEL: merge_4i32_i32_34uu:582; SSE:       # %bb.0:583; SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero584; SSE-NEXT:    retq585;586; AVX-LABEL: merge_4i32_i32_34uu:587; AVX:       # %bb.0:588; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero589; AVX-NEXT:    retq590;591; X86-SSE1-LABEL: merge_4i32_i32_34uu:592; X86-SSE1:       # %bb.0:593; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax594; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %ecx595; X86-SSE1-NEXT:    movl 12(%ecx), %edx596; X86-SSE1-NEXT:    movl 16(%ecx), %ecx597; X86-SSE1-NEXT:    movl %ecx, 4(%eax)598; X86-SSE1-NEXT:    movl %edx, (%eax)599; X86-SSE1-NEXT:    retl $4600;601; X86-SSE41-LABEL: merge_4i32_i32_34uu:602; X86-SSE41:       # %bb.0:603; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax604; X86-SSE41-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero605; X86-SSE41-NEXT:    retl606  %ptr0 = getelementptr inbounds i32, ptr %ptr, i64 3607  %ptr1 = getelementptr inbounds i32, ptr %ptr, i64 4608  %val0 = load i32, ptr %ptr0609  %val1 = load i32, ptr %ptr1610  %res0 = insertelement <4 x i32> undef, i32 %val0, i32 0611  %res1 = insertelement <4 x i32> %res0, i32 %val1, i32 1612  ret <4 x i32> %res1613}614 615define <4 x i32> @merge_4i32_i32_45zz(ptr %ptr) nounwind uwtable noinline ssp {616; SSE-LABEL: merge_4i32_i32_45zz:617; SSE:       # %bb.0:618; SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero619; SSE-NEXT:    retq620;621; AVX-LABEL: merge_4i32_i32_45zz:622; AVX:       # %bb.0:623; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero624; AVX-NEXT:    retq625;626; X86-SSE1-LABEL: merge_4i32_i32_45zz:627; X86-SSE1:       # %bb.0:628; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax629; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %ecx630; X86-SSE1-NEXT:    movl 16(%ecx), %edx631; X86-SSE1-NEXT:    movl 20(%ecx), %ecx632; X86-SSE1-NEXT:    movl %ecx, 4(%eax)633; X86-SSE1-NEXT:    movl %edx, (%eax)634; X86-SSE1-NEXT:    movl $0, 12(%eax)635; X86-SSE1-NEXT:    movl $0, 8(%eax)636; X86-SSE1-NEXT:    retl $4637;638; X86-SSE41-LABEL: merge_4i32_i32_45zz:639; X86-SSE41:       # %bb.0:640; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax641; X86-SSE41-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero642; X86-SSE41-NEXT:    retl643  %ptr0 = getelementptr inbounds i32, ptr %ptr, i64 4644  %ptr1 = getelementptr inbounds i32, ptr %ptr, i64 5645  %val0 = load i32, ptr %ptr0646  %val1 = load i32, ptr %ptr1647  %res0 = insertelement <4 x i32> zeroinitializer, i32 %val0, i32 0648  %res1 = insertelement <4 x i32> %res0, i32 %val1, i32 1649  ret <4 x i32> %res1650}651 652define <4 x i32> @merge_4i32_i32_45zz_inc4(ptr %ptr) nounwind uwtable noinline ssp {653; SSE-LABEL: merge_4i32_i32_45zz_inc4:654; SSE:       # %bb.0:655; SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero656; SSE-NEXT:    incl 16(%rdi)657; SSE-NEXT:    retq658;659; AVX-LABEL: merge_4i32_i32_45zz_inc4:660; AVX:       # %bb.0:661; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero662; AVX-NEXT:    incl 16(%rdi)663; AVX-NEXT:    retq664;665; X86-SSE1-LABEL: merge_4i32_i32_45zz_inc4:666; X86-SSE1:       # %bb.0:667; X86-SSE1-NEXT:    pushl %edi668; X86-SSE1-NEXT:    .cfi_def_cfa_offset 8669; X86-SSE1-NEXT:    pushl %esi670; X86-SSE1-NEXT:    .cfi_def_cfa_offset 12671; X86-SSE1-NEXT:    .cfi_offset %esi, -12672; X86-SSE1-NEXT:    .cfi_offset %edi, -8673; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax674; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %ecx675; X86-SSE1-NEXT:    movl 16(%ecx), %edx676; X86-SSE1-NEXT:    movl 20(%ecx), %esi677; X86-SSE1-NEXT:    leal 1(%edx), %edi678; X86-SSE1-NEXT:    movl %edi, 16(%ecx)679; X86-SSE1-NEXT:    movl %esi, 4(%eax)680; X86-SSE1-NEXT:    movl %edx, (%eax)681; X86-SSE1-NEXT:    movl $0, 12(%eax)682; X86-SSE1-NEXT:    movl $0, 8(%eax)683; X86-SSE1-NEXT:    popl %esi684; X86-SSE1-NEXT:    .cfi_def_cfa_offset 8685; X86-SSE1-NEXT:    popl %edi686; X86-SSE1-NEXT:    .cfi_def_cfa_offset 4687; X86-SSE1-NEXT:    retl $4688;689; X86-SSE41-LABEL: merge_4i32_i32_45zz_inc4:690; X86-SSE41:       # %bb.0:691; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax692; X86-SSE41-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero693; X86-SSE41-NEXT:    incl 16(%eax)694; X86-SSE41-NEXT:    retl695  %ptr0 = getelementptr inbounds i32, ptr %ptr, i64 4696  %ptr1 = getelementptr inbounds i32, ptr %ptr, i64 5697  %val0 = load i32, ptr %ptr0698  %inc = add i32 %val0, 1699  store i32 %inc, ptr %ptr0700  %val1 = load i32, ptr %ptr1701  %res0 = insertelement <4 x i32> zeroinitializer, i32 %val0, i32 0702  %res1 = insertelement <4 x i32> %res0, i32 %val1, i32 1703  ret <4 x i32> %res1704}705 706define <4 x i32> @merge_4i32_i32_45zz_inc5(ptr %ptr) nounwind uwtable noinline ssp {707; SSE-LABEL: merge_4i32_i32_45zz_inc5:708; SSE:       # %bb.0:709; SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero710; SSE-NEXT:    incl 20(%rdi)711; SSE-NEXT:    retq712;713; AVX-LABEL: merge_4i32_i32_45zz_inc5:714; AVX:       # %bb.0:715; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero716; AVX-NEXT:    incl 20(%rdi)717; AVX-NEXT:    retq718;719; X86-SSE1-LABEL: merge_4i32_i32_45zz_inc5:720; X86-SSE1:       # %bb.0:721; X86-SSE1-NEXT:    pushl %edi722; X86-SSE1-NEXT:    .cfi_def_cfa_offset 8723; X86-SSE1-NEXT:    pushl %esi724; X86-SSE1-NEXT:    .cfi_def_cfa_offset 12725; X86-SSE1-NEXT:    .cfi_offset %esi, -12726; X86-SSE1-NEXT:    .cfi_offset %edi, -8727; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax728; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %ecx729; X86-SSE1-NEXT:    movl 16(%ecx), %edx730; X86-SSE1-NEXT:    movl 20(%ecx), %esi731; X86-SSE1-NEXT:    leal 1(%esi), %edi732; X86-SSE1-NEXT:    movl %edi, 20(%ecx)733; X86-SSE1-NEXT:    movl %esi, 4(%eax)734; X86-SSE1-NEXT:    movl %edx, (%eax)735; X86-SSE1-NEXT:    movl $0, 12(%eax)736; X86-SSE1-NEXT:    movl $0, 8(%eax)737; X86-SSE1-NEXT:    popl %esi738; X86-SSE1-NEXT:    .cfi_def_cfa_offset 8739; X86-SSE1-NEXT:    popl %edi740; X86-SSE1-NEXT:    .cfi_def_cfa_offset 4741; X86-SSE1-NEXT:    retl $4742;743; X86-SSE41-LABEL: merge_4i32_i32_45zz_inc5:744; X86-SSE41:       # %bb.0:745; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax746; X86-SSE41-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero747; X86-SSE41-NEXT:    incl 20(%eax)748; X86-SSE41-NEXT:    retl749  %ptr0 = getelementptr inbounds i32, ptr %ptr, i64 4750  %ptr1 = getelementptr inbounds i32, ptr %ptr, i64 5751  %val0 = load i32, ptr %ptr0752  %val1 = load i32, ptr %ptr1753  %inc = add i32 %val1, 1754  store i32 %inc, ptr %ptr1755  %res0 = insertelement <4 x i32> zeroinitializer, i32 %val0, i32 0756  %res1 = insertelement <4 x i32> %res0, i32 %val1, i32 1757  ret <4 x i32> %res1758}759 760define <4 x i32> @merge_v4i32_i32_3210(ptr %ptr) nounwind uwtable noinline ssp {761; SSE-LABEL: merge_v4i32_i32_3210:762; SSE:       # %bb.0:763; SSE-NEXT:    movdqu (%rdi), %xmm0764; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]765; SSE-NEXT:    retq766;767; AVX-LABEL: merge_v4i32_i32_3210:768; AVX:       # %bb.0:769; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = mem[3,2,1,0]770; AVX-NEXT:    retq771;772; X86-SSE1-LABEL: merge_v4i32_i32_3210:773; X86-SSE1:       # %bb.0:774; X86-SSE1-NEXT:    pushl %edi775; X86-SSE1-NEXT:    .cfi_def_cfa_offset 8776; X86-SSE1-NEXT:    pushl %esi777; X86-SSE1-NEXT:    .cfi_def_cfa_offset 12778; X86-SSE1-NEXT:    .cfi_offset %esi, -12779; X86-SSE1-NEXT:    .cfi_offset %edi, -8780; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax781; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %ecx782; X86-SSE1-NEXT:    movl 12(%ecx), %edx783; X86-SSE1-NEXT:    movl 8(%ecx), %esi784; X86-SSE1-NEXT:    movl (%ecx), %edi785; X86-SSE1-NEXT:    movl 4(%ecx), %ecx786; X86-SSE1-NEXT:    movl %edi, 12(%eax)787; X86-SSE1-NEXT:    movl %ecx, 8(%eax)788; X86-SSE1-NEXT:    movl %esi, 4(%eax)789; X86-SSE1-NEXT:    movl %edx, (%eax)790; X86-SSE1-NEXT:    popl %esi791; X86-SSE1-NEXT:    .cfi_def_cfa_offset 8792; X86-SSE1-NEXT:    popl %edi793; X86-SSE1-NEXT:    .cfi_def_cfa_offset 4794; X86-SSE1-NEXT:    retl $4795;796; X86-SSE41-LABEL: merge_v4i32_i32_3210:797; X86-SSE41:       # %bb.0:798; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax799; X86-SSE41-NEXT:    movdqu (%eax), %xmm0800; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]801; X86-SSE41-NEXT:    retl802  %ptr0 = getelementptr inbounds i32, ptr %ptr, i64 3803  %ptr1 = getelementptr inbounds i32, ptr %ptr, i64 2804  %ptr2 = getelementptr inbounds i32, ptr %ptr, i64 1805  %ptr3 = getelementptr inbounds i32, ptr %ptr, i64 0806  %val0 = load i32, ptr %ptr0, align 4807  %val1 = load i32, ptr %ptr1, align 4808  %val2 = load i32, ptr %ptr2, align 4809  %val3 = load i32, ptr %ptr3, align 4810  %res0 = insertelement <4 x i32> poison, i32 %val0, i64 0811  %res1 = insertelement <4 x i32> %res0, i32 %val1, i64 1812  %res2 = insertelement <4 x i32> %res1, i32 %val2, i64 2813  %res3 = insertelement <4 x i32> %res2, i32 %val3, i64 3814  ret <4 x i32> %res3815}816 817define <8 x i16> @merge_8i16_i16_23u567u9(ptr %ptr) nounwind uwtable noinline ssp {818; SSE-LABEL: merge_8i16_i16_23u567u9:819; SSE:       # %bb.0:820; SSE-NEXT:    movups 4(%rdi), %xmm0821; SSE-NEXT:    retq822;823; AVX-LABEL: merge_8i16_i16_23u567u9:824; AVX:       # %bb.0:825; AVX-NEXT:    vmovups 4(%rdi), %xmm0826; AVX-NEXT:    retq827;828; X86-SSE1-LABEL: merge_8i16_i16_23u567u9:829; X86-SSE1:       # %bb.0:830; X86-SSE1-NEXT:    pushl %edi831; X86-SSE1-NEXT:    .cfi_def_cfa_offset 8832; X86-SSE1-NEXT:    pushl %esi833; X86-SSE1-NEXT:    .cfi_def_cfa_offset 12834; X86-SSE1-NEXT:    .cfi_offset %esi, -12835; X86-SSE1-NEXT:    .cfi_offset %edi, -8836; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax837; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %ecx838; X86-SSE1-NEXT:    movl 4(%ecx), %edx839; X86-SSE1-NEXT:    movl 10(%ecx), %esi840; X86-SSE1-NEXT:    movzwl 14(%ecx), %edi841; X86-SSE1-NEXT:    movzwl 18(%ecx), %ecx842; X86-SSE1-NEXT:    movw %di, 10(%eax)843; X86-SSE1-NEXT:    movw %cx, 14(%eax)844; X86-SSE1-NEXT:    movl %esi, 6(%eax)845; X86-SSE1-NEXT:    movl %edx, (%eax)846; X86-SSE1-NEXT:    popl %esi847; X86-SSE1-NEXT:    .cfi_def_cfa_offset 8848; X86-SSE1-NEXT:    popl %edi849; X86-SSE1-NEXT:    .cfi_def_cfa_offset 4850; X86-SSE1-NEXT:    retl $4851;852; X86-SSE41-LABEL: merge_8i16_i16_23u567u9:853; X86-SSE41:       # %bb.0:854; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax855; X86-SSE41-NEXT:    movups 4(%eax), %xmm0856; X86-SSE41-NEXT:    retl857  %ptr0 = getelementptr inbounds i16, ptr %ptr, i64 2858  %ptr1 = getelementptr inbounds i16, ptr %ptr, i64 3859  %ptr3 = getelementptr inbounds i16, ptr %ptr, i64 5860  %ptr4 = getelementptr inbounds i16, ptr %ptr, i64 6861  %ptr5 = getelementptr inbounds i16, ptr %ptr, i64 7862  %ptr7 = getelementptr inbounds i16, ptr %ptr, i64 9863  %val0 = load i16, ptr %ptr0864  %val1 = load i16, ptr %ptr1865  %val3 = load i16, ptr %ptr3866  %val4 = load i16, ptr %ptr4867  %val5 = load i16, ptr %ptr5868  %val7 = load i16, ptr %ptr7869  %res0 = insertelement <8 x i16> undef, i16 %val0, i32 0870  %res1 = insertelement <8 x i16> %res0, i16 %val1, i32 1871  %res3 = insertelement <8 x i16> %res1, i16 %val3, i32 3872  %res4 = insertelement <8 x i16> %res3, i16 %val4, i32 4873  %res5 = insertelement <8 x i16> %res4, i16 %val5, i32 5874  %res7 = insertelement <8 x i16> %res5, i16 %val7, i32 7875  ret <8 x i16> %res7876}877 878define <8 x i16> @merge_8i16_i16_34uuuuuu(ptr %ptr) nounwind uwtable noinline ssp {879; SSE-LABEL: merge_8i16_i16_34uuuuuu:880; SSE:       # %bb.0:881; SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero882; SSE-NEXT:    retq883;884; AVX-LABEL: merge_8i16_i16_34uuuuuu:885; AVX:       # %bb.0:886; AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero887; AVX-NEXT:    retq888;889; X86-SSE1-LABEL: merge_8i16_i16_34uuuuuu:890; X86-SSE1:       # %bb.0:891; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax892; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %ecx893; X86-SSE1-NEXT:    movl 6(%ecx), %ecx894; X86-SSE1-NEXT:    movl %ecx, (%eax)895; X86-SSE1-NEXT:    retl $4896;897; X86-SSE41-LABEL: merge_8i16_i16_34uuuuuu:898; X86-SSE41:       # %bb.0:899; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax900; X86-SSE41-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero901; X86-SSE41-NEXT:    retl902  %ptr0 = getelementptr inbounds i16, ptr %ptr, i64 3903  %ptr1 = getelementptr inbounds i16, ptr %ptr, i64 4904  %val0 = load i16, ptr %ptr0905  %val1 = load i16, ptr %ptr1906  %res0 = insertelement <8 x i16> undef, i16 %val0, i32 0907  %res1 = insertelement <8 x i16> %res0, i16 %val1, i32 1908  ret <8 x i16> %res1909}910 911define <8 x i16> @merge_8i16_i16_45u7zzzz(ptr %ptr) nounwind uwtable noinline ssp {912; SSE-LABEL: merge_8i16_i16_45u7zzzz:913; SSE:       # %bb.0:914; SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero915; SSE-NEXT:    retq916;917; AVX-LABEL: merge_8i16_i16_45u7zzzz:918; AVX:       # %bb.0:919; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero920; AVX-NEXT:    retq921;922; X86-SSE1-LABEL: merge_8i16_i16_45u7zzzz:923; X86-SSE1:       # %bb.0:924; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax925; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %ecx926; X86-SSE1-NEXT:    movl 8(%ecx), %edx927; X86-SSE1-NEXT:    movzwl 14(%ecx), %ecx928; X86-SSE1-NEXT:    movw %cx, 6(%eax)929; X86-SSE1-NEXT:    movl %edx, (%eax)930; X86-SSE1-NEXT:    movl $0, 12(%eax)931; X86-SSE1-NEXT:    movl $0, 8(%eax)932; X86-SSE1-NEXT:    retl $4933;934; X86-SSE41-LABEL: merge_8i16_i16_45u7zzzz:935; X86-SSE41:       # %bb.0:936; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax937; X86-SSE41-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero938; X86-SSE41-NEXT:    retl939  %ptr0 = getelementptr inbounds i16, ptr %ptr, i64 4940  %ptr1 = getelementptr inbounds i16, ptr %ptr, i64 5941  %ptr3 = getelementptr inbounds i16, ptr %ptr, i64 7942  %val0 = load i16, ptr %ptr0943  %val1 = load i16, ptr %ptr1944  %val3 = load i16, ptr %ptr3945  %res0 = insertelement <8 x i16> undef, i16 %val0, i32 0946  %res1 = insertelement <8 x i16> %res0, i16 %val1, i32 1947  %res3 = insertelement <8 x i16> %res1, i16 %val3, i32 3948  %res4 = insertelement <8 x i16> %res3, i16     0, i32 4949  %res5 = insertelement <8 x i16> %res4, i16     0, i32 5950  %res6 = insertelement <8 x i16> %res5, i16     0, i32 6951  %res7 = insertelement <8 x i16> %res6, i16     0, i32 7952  ret <8 x i16> %res7953}954 955define <8 x i16> @merge_8i16_i16_76543210(ptr %ptr) nounwind uwtable noinline ssp {956; SSE2-LABEL: merge_8i16_i16_76543210:957; SSE2:       # %bb.0:958; SSE2-NEXT:    movdqu (%rdi), %xmm0959; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]960; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]961; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]962; SSE2-NEXT:    retq963;964; SSE41-LABEL: merge_8i16_i16_76543210:965; SSE41:       # %bb.0:966; SSE41-NEXT:    movdqu (%rdi), %xmm0967; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[14,15,12,13,10,11,8,9,6,7,4,5,2,3,0,1]968; SSE41-NEXT:    retq969;970; AVX-LABEL: merge_8i16_i16_76543210:971; AVX:       # %bb.0:972; AVX-NEXT:    vmovdqu (%rdi), %xmm0973; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[14,15,12,13,10,11,8,9,6,7,4,5,2,3,0,1]974; AVX-NEXT:    retq975;976; X86-SSE1-LABEL: merge_8i16_i16_76543210:977; X86-SSE1:       # %bb.0:978; X86-SSE1-NEXT:    pushl %ebp979; X86-SSE1-NEXT:    .cfi_def_cfa_offset 8980; X86-SSE1-NEXT:    pushl %ebx981; X86-SSE1-NEXT:    .cfi_def_cfa_offset 12982; X86-SSE1-NEXT:    pushl %edi983; X86-SSE1-NEXT:    .cfi_def_cfa_offset 16984; X86-SSE1-NEXT:    pushl %esi985; X86-SSE1-NEXT:    .cfi_def_cfa_offset 20986; X86-SSE1-NEXT:    pushl %eax987; X86-SSE1-NEXT:    .cfi_def_cfa_offset 24988; X86-SSE1-NEXT:    .cfi_offset %esi, -20989; X86-SSE1-NEXT:    .cfi_offset %edi, -16990; X86-SSE1-NEXT:    .cfi_offset %ebx, -12991; X86-SSE1-NEXT:    .cfi_offset %ebp, -8992; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax993; X86-SSE1-NEXT:    movzwl 14(%eax), %ecx994; X86-SSE1-NEXT:    movw %cx, {{[-0-9]+}}(%e{{[sb]}}p) # 2-byte Spill995; X86-SSE1-NEXT:    movzwl 12(%eax), %ecx996; X86-SSE1-NEXT:    movw %cx, (%esp) # 2-byte Spill997; X86-SSE1-NEXT:    movzwl 10(%eax), %esi998; X86-SSE1-NEXT:    movzwl 8(%eax), %edi999; X86-SSE1-NEXT:    movzwl 6(%eax), %ebx1000; X86-SSE1-NEXT:    movzwl 4(%eax), %ebp1001; X86-SSE1-NEXT:    movzwl (%eax), %ecx1002; X86-SSE1-NEXT:    movzwl 2(%eax), %edx1003; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax1004; X86-SSE1-NEXT:    movw %cx, 14(%eax)1005; X86-SSE1-NEXT:    movw %dx, 12(%eax)1006; X86-SSE1-NEXT:    movw %bp, 10(%eax)1007; X86-SSE1-NEXT:    movw %bx, 8(%eax)1008; X86-SSE1-NEXT:    movw %di, 6(%eax)1009; X86-SSE1-NEXT:    movw %si, 4(%eax)1010; X86-SSE1-NEXT:    movzwl (%esp), %ecx # 2-byte Folded Reload1011; X86-SSE1-NEXT:    movw %cx, 2(%eax)1012; X86-SSE1-NEXT:    movzwl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 2-byte Folded Reload1013; X86-SSE1-NEXT:    movw %cx, (%eax)1014; X86-SSE1-NEXT:    addl $4, %esp1015; X86-SSE1-NEXT:    .cfi_def_cfa_offset 201016; X86-SSE1-NEXT:    popl %esi1017; X86-SSE1-NEXT:    .cfi_def_cfa_offset 161018; X86-SSE1-NEXT:    popl %edi1019; X86-SSE1-NEXT:    .cfi_def_cfa_offset 121020; X86-SSE1-NEXT:    popl %ebx1021; X86-SSE1-NEXT:    .cfi_def_cfa_offset 81022; X86-SSE1-NEXT:    popl %ebp1023; X86-SSE1-NEXT:    .cfi_def_cfa_offset 41024; X86-SSE1-NEXT:    retl $41025;1026; X86-SSE41-LABEL: merge_8i16_i16_76543210:1027; X86-SSE41:       # %bb.0:1028; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax1029; X86-SSE41-NEXT:    movdqu (%eax), %xmm01030; X86-SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[14,15,12,13,10,11,8,9,6,7,4,5,2,3,0,1]1031; X86-SSE41-NEXT:    retl1032  %ptr0 = getelementptr inbounds i16, ptr %ptr, i64 71033  %ptr1 = getelementptr inbounds i16, ptr %ptr, i64 61034  %ptr2 = getelementptr inbounds i16, ptr %ptr, i64 51035  %ptr3 = getelementptr inbounds i16, ptr %ptr, i64 41036  %ptr4 = getelementptr inbounds i16, ptr %ptr, i64 31037  %ptr5 = getelementptr inbounds i16, ptr %ptr, i64 21038  %ptr6 = getelementptr inbounds i16, ptr %ptr, i64 11039  %ptr7 = getelementptr inbounds i16, ptr %ptr, i64 01040  %val0 = load i16, ptr %ptr01041  %val1 = load i16, ptr %ptr11042  %val2 = load i16, ptr %ptr21043  %val3 = load i16, ptr %ptr31044  %val4 = load i16, ptr %ptr41045  %val5 = load i16, ptr %ptr51046  %val6 = load i16, ptr %ptr61047  %val7 = load i16, ptr %ptr71048  %res0 = insertelement <8 x i16> poison, i16 %val0, i64 01049  %res1 = insertelement <8 x i16> %res0, i16 %val1, i64 11050  %res2 = insertelement <8 x i16> %res1, i16 %val2, i64 21051  %res3 = insertelement <8 x i16> %res2, i16 %val3, i64 31052  %res4 = insertelement <8 x i16> %res3, i16 %val4, i64 41053  %res5 = insertelement <8 x i16> %res4, i16 %val5, i64 51054  %res6 = insertelement <8 x i16> %res5, i16 %val6, i64 61055  %res7 = insertelement <8 x i16> %res6, i16 %val7, i64 71056  ret <8 x i16> %res71057}1058 1059define <16 x i8> @merge_16i8_i8_01u3456789ABCDuF(ptr %ptr) nounwind uwtable noinline ssp {1060; SSE-LABEL: merge_16i8_i8_01u3456789ABCDuF:1061; SSE:       # %bb.0:1062; SSE-NEXT:    movups (%rdi), %xmm01063; SSE-NEXT:    retq1064;1065; AVX-LABEL: merge_16i8_i8_01u3456789ABCDuF:1066; AVX:       # %bb.0:1067; AVX-NEXT:    vmovups (%rdi), %xmm01068; AVX-NEXT:    retq1069;1070; X86-SSE1-LABEL: merge_16i8_i8_01u3456789ABCDuF:1071; X86-SSE1:       # %bb.0:1072; X86-SSE1-NEXT:    pushl %ebp1073; X86-SSE1-NEXT:    .cfi_def_cfa_offset 81074; X86-SSE1-NEXT:    pushl %ebx1075; X86-SSE1-NEXT:    .cfi_def_cfa_offset 121076; X86-SSE1-NEXT:    pushl %edi1077; X86-SSE1-NEXT:    .cfi_def_cfa_offset 161078; X86-SSE1-NEXT:    pushl %esi1079; X86-SSE1-NEXT:    .cfi_def_cfa_offset 201080; X86-SSE1-NEXT:    .cfi_offset %esi, -201081; X86-SSE1-NEXT:    .cfi_offset %edi, -161082; X86-SSE1-NEXT:    .cfi_offset %ebx, -121083; X86-SSE1-NEXT:    .cfi_offset %ebp, -81084; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax1085; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %ecx1086; X86-SSE1-NEXT:    movzwl (%ecx), %ebp1087; X86-SSE1-NEXT:    movl 3(%ecx), %esi1088; X86-SSE1-NEXT:    movl 7(%ecx), %edi1089; X86-SSE1-NEXT:    movzwl 11(%ecx), %ebx1090; X86-SSE1-NEXT:    movzbl 13(%ecx), %edx1091; X86-SSE1-NEXT:    movzbl 15(%ecx), %ecx1092; X86-SSE1-NEXT:    movb %dl, 13(%eax)1093; X86-SSE1-NEXT:    movb %cl, 15(%eax)1094; X86-SSE1-NEXT:    movw %bx, 11(%eax)1095; X86-SSE1-NEXT:    movl %edi, 7(%eax)1096; X86-SSE1-NEXT:    movl %esi, 3(%eax)1097; X86-SSE1-NEXT:    movw %bp, (%eax)1098; X86-SSE1-NEXT:    popl %esi1099; X86-SSE1-NEXT:    .cfi_def_cfa_offset 161100; X86-SSE1-NEXT:    popl %edi1101; X86-SSE1-NEXT:    .cfi_def_cfa_offset 121102; X86-SSE1-NEXT:    popl %ebx1103; X86-SSE1-NEXT:    .cfi_def_cfa_offset 81104; X86-SSE1-NEXT:    popl %ebp1105; X86-SSE1-NEXT:    .cfi_def_cfa_offset 41106; X86-SSE1-NEXT:    retl $41107;1108; X86-SSE41-LABEL: merge_16i8_i8_01u3456789ABCDuF:1109; X86-SSE41:       # %bb.0:1110; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax1111; X86-SSE41-NEXT:    movups (%eax), %xmm01112; X86-SSE41-NEXT:    retl1113  %ptr1 = getelementptr inbounds i8, ptr %ptr, i64 11114  %ptr3 = getelementptr inbounds i8, ptr %ptr, i64 31115  %ptr4 = getelementptr inbounds i8, ptr %ptr, i64 41116  %ptr5 = getelementptr inbounds i8, ptr %ptr, i64 51117  %ptr6 = getelementptr inbounds i8, ptr %ptr, i64 61118  %ptr7 = getelementptr inbounds i8, ptr %ptr, i64 71119  %ptr8 = getelementptr inbounds i8, ptr %ptr, i64 81120  %ptr9 = getelementptr inbounds i8, ptr %ptr, i64 91121  %ptrA = getelementptr inbounds i8, ptr %ptr, i64 101122  %ptrB = getelementptr inbounds i8, ptr %ptr, i64 111123  %ptrC = getelementptr inbounds i8, ptr %ptr, i64 121124  %ptrD = getelementptr inbounds i8, ptr %ptr, i64 131125  %ptrF = getelementptr inbounds i8, ptr %ptr, i64 151126  %val0 = load i8, ptr %ptr1127  %val1 = load i8, ptr %ptr11128  %val3 = load i8, ptr %ptr31129  %val4 = load i8, ptr %ptr41130  %val5 = load i8, ptr %ptr51131  %val6 = load i8, ptr %ptr61132  %val7 = load i8, ptr %ptr71133  %val8 = load i8, ptr %ptr81134  %val9 = load i8, ptr %ptr91135  %valA = load i8, ptr %ptrA1136  %valB = load i8, ptr %ptrB1137  %valC = load i8, ptr %ptrC1138  %valD = load i8, ptr %ptrD1139  %valF = load i8, ptr %ptrF1140  %res0 = insertelement <16 x i8> undef, i8 %val0, i32 01141  %res1 = insertelement <16 x i8> %res0, i8 %val1, i32 11142  %res3 = insertelement <16 x i8> %res1, i8 %val3, i32 31143  %res4 = insertelement <16 x i8> %res3, i8 %val4, i32 41144  %res5 = insertelement <16 x i8> %res4, i8 %val5, i32 51145  %res6 = insertelement <16 x i8> %res5, i8 %val6, i32 61146  %res7 = insertelement <16 x i8> %res6, i8 %val7, i32 71147  %res8 = insertelement <16 x i8> %res7, i8 %val8, i32 81148  %res9 = insertelement <16 x i8> %res8, i8 %val9, i32 91149  %resA = insertelement <16 x i8> %res9, i8 %valA, i32 101150  %resB = insertelement <16 x i8> %resA, i8 %valB, i32 111151  %resC = insertelement <16 x i8> %resB, i8 %valC, i32 121152  %resD = insertelement <16 x i8> %resC, i8 %valD, i32 131153  %resF = insertelement <16 x i8> %resD, i8 %valF, i32 151154  ret <16 x i8> %resF1155}1156 1157define <16 x i8> @merge_16i8_i8_01u3uuzzuuuuuzzz(ptr %ptr) nounwind uwtable noinline ssp {1158; SSE-LABEL: merge_16i8_i8_01u3uuzzuuuuuzzz:1159; SSE:       # %bb.0:1160; SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero1161; SSE-NEXT:    retq1162;1163; AVX-LABEL: merge_16i8_i8_01u3uuzzuuuuuzzz:1164; AVX:       # %bb.0:1165; AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero1166; AVX-NEXT:    retq1167;1168; X86-SSE1-LABEL: merge_16i8_i8_01u3uuzzuuuuuzzz:1169; X86-SSE1:       # %bb.0:1170; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax1171; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %ecx1172; X86-SSE1-NEXT:    movzwl (%ecx), %edx1173; X86-SSE1-NEXT:    movzbl 3(%ecx), %ecx1174; X86-SSE1-NEXT:    movb %cl, 3(%eax)1175; X86-SSE1-NEXT:    movw %dx, (%eax)1176; X86-SSE1-NEXT:    movb $0, 15(%eax)1177; X86-SSE1-NEXT:    movw $0, 13(%eax)1178; X86-SSE1-NEXT:    movw $0, 6(%eax)1179; X86-SSE1-NEXT:    retl $41180;1181; X86-SSE41-LABEL: merge_16i8_i8_01u3uuzzuuuuuzzz:1182; X86-SSE41:       # %bb.0:1183; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax1184; X86-SSE41-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero1185; X86-SSE41-NEXT:    retl1186  %ptr1 = getelementptr inbounds i8, ptr %ptr, i64 11187  %ptr3 = getelementptr inbounds i8, ptr %ptr, i64 31188  %val0 = load i8, ptr %ptr1189  %val1 = load i8, ptr %ptr11190  %val3 = load i8, ptr %ptr31191  %res0 = insertelement <16 x i8> undef, i8 %val0, i32 01192  %res1 = insertelement <16 x i8> %res0, i8 %val1, i32 11193  %res3 = insertelement <16 x i8> %res1, i8 %val3, i32 31194  %res6 = insertelement <16 x i8> %res3, i8     0, i32 61195  %res7 = insertelement <16 x i8> %res6, i8     0, i32 71196  %resD = insertelement <16 x i8> %res7, i8     0, i32 131197  %resE = insertelement <16 x i8> %resD, i8     0, i32 141198  %resF = insertelement <16 x i8> %resE, i8     0, i32 151199  ret <16 x i8> %resF1200}1201 1202define <16 x i8> @merge_16i8_i8_0123uu67uuuuuzzz(ptr %ptr) nounwind uwtable noinline ssp {1203; SSE-LABEL: merge_16i8_i8_0123uu67uuuuuzzz:1204; SSE:       # %bb.0:1205; SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero1206; SSE-NEXT:    retq1207;1208; AVX-LABEL: merge_16i8_i8_0123uu67uuuuuzzz:1209; AVX:       # %bb.0:1210; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero1211; AVX-NEXT:    retq1212;1213; X86-SSE1-LABEL: merge_16i8_i8_0123uu67uuuuuzzz:1214; X86-SSE1:       # %bb.0:1215; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax1216; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %ecx1217; X86-SSE1-NEXT:    movl (%ecx), %edx1218; X86-SSE1-NEXT:    movzwl 6(%ecx), %ecx1219; X86-SSE1-NEXT:    movw %cx, 6(%eax)1220; X86-SSE1-NEXT:    movl %edx, (%eax)1221; X86-SSE1-NEXT:    movb $0, 15(%eax)1222; X86-SSE1-NEXT:    movw $0, 13(%eax)1223; X86-SSE1-NEXT:    retl $41224;1225; X86-SSE41-LABEL: merge_16i8_i8_0123uu67uuuuuzzz:1226; X86-SSE41:       # %bb.0:1227; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax1228; X86-SSE41-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero1229; X86-SSE41-NEXT:    retl1230  %ptr1 = getelementptr inbounds i8, ptr %ptr, i64 11231  %ptr2 = getelementptr inbounds i8, ptr %ptr, i64 21232  %ptr3 = getelementptr inbounds i8, ptr %ptr, i64 31233  %ptr6 = getelementptr inbounds i8, ptr %ptr, i64 61234  %ptr7 = getelementptr inbounds i8, ptr %ptr, i64 71235  %val0 = load i8, ptr %ptr1236  %val1 = load i8, ptr %ptr11237  %val2 = load i8, ptr %ptr21238  %val3 = load i8, ptr %ptr31239  %val6 = load i8, ptr %ptr61240  %val7 = load i8, ptr %ptr71241  %res0 = insertelement <16 x i8> undef, i8 %val0, i32 01242  %res1 = insertelement <16 x i8> %res0, i8 %val1, i32 11243  %res2 = insertelement <16 x i8> %res1, i8 %val2, i32 21244  %res3 = insertelement <16 x i8> %res2, i8 %val3, i32 31245  %res6 = insertelement <16 x i8> %res3, i8 %val6, i32 61246  %res7 = insertelement <16 x i8> %res6, i8 %val7, i32 71247  %resD = insertelement <16 x i8> %res7, i8     0, i32 131248  %resE = insertelement <16 x i8> %resD, i8     0, i32 141249  %resF = insertelement <16 x i8> %resE, i8     0, i32 151250  ret <16 x i8> %resF1251}1252 1253define <16 x i8> @merge_16i8_i8_FEDCBA9876543210(ptr %ptr) nounwind uwtable noinline ssp {1254; SSE2-LABEL: merge_16i8_i8_FEDCBA9876543210:1255; SSE2:       # %bb.0:1256; SSE2-NEXT:    movdqu (%rdi), %xmm01257; SSE2-NEXT:    pxor %xmm1, %xmm11258; SSE2-NEXT:    movdqa %xmm0, %xmm21259; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]1260; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]1261; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[3,2,1,0,4,5,6,7]1262; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,6,5,4]1263; SSE2-NEXT:    punpckhbw {{.*#+}} xmm0 = 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]1264; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]1265; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]1266; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]1267; SSE2-NEXT:    packuswb %xmm2, %xmm01268; SSE2-NEXT:    retq1269;1270; SSE41-LABEL: merge_16i8_i8_FEDCBA9876543210:1271; SSE41:       # %bb.0:1272; SSE41-NEXT:    movdqu (%rdi), %xmm01273; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]1274; SSE41-NEXT:    retq1275;1276; AVX-LABEL: merge_16i8_i8_FEDCBA9876543210:1277; AVX:       # %bb.0:1278; AVX-NEXT:    vmovdqu (%rdi), %xmm01279; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]1280; AVX-NEXT:    retq1281;1282; X86-SSE1-LABEL: merge_16i8_i8_FEDCBA9876543210:1283; X86-SSE1:       # %bb.0:1284; X86-SSE1-NEXT:    pushl %ebx1285; X86-SSE1-NEXT:    .cfi_def_cfa_offset 81286; X86-SSE1-NEXT:    pushl %esi1287; X86-SSE1-NEXT:    .cfi_def_cfa_offset 121288; X86-SSE1-NEXT:    subl $12, %esp1289; X86-SSE1-NEXT:    .cfi_def_cfa_offset 241290; X86-SSE1-NEXT:    .cfi_offset %esi, -121291; X86-SSE1-NEXT:    .cfi_offset %ebx, -81292; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax1293; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %esi1294; X86-SSE1-NEXT:    movzbl 15(%esi), %ecx1295; X86-SSE1-NEXT:    movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill1296; X86-SSE1-NEXT:    movzbl 14(%esi), %ecx1297; X86-SSE1-NEXT:    movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill1298; X86-SSE1-NEXT:    movzbl 13(%esi), %ecx1299; X86-SSE1-NEXT:    movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill1300; X86-SSE1-NEXT:    movzbl 12(%esi), %ecx1301; X86-SSE1-NEXT:    movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill1302; X86-SSE1-NEXT:    movzbl 11(%esi), %ecx1303; X86-SSE1-NEXT:    movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill1304; X86-SSE1-NEXT:    movzbl 10(%esi), %ecx1305; X86-SSE1-NEXT:    movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill1306; X86-SSE1-NEXT:    movzbl 9(%esi), %ecx1307; X86-SSE1-NEXT:    movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill1308; X86-SSE1-NEXT:    movzbl 8(%esi), %ecx1309; X86-SSE1-NEXT:    movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill1310; X86-SSE1-NEXT:    movzbl 7(%esi), %ecx1311; X86-SSE1-NEXT:    movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill1312; X86-SSE1-NEXT:    movzbl 6(%esi), %ecx1313; X86-SSE1-NEXT:    movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill1314; X86-SSE1-NEXT:    movb 5(%esi), %bh1315; X86-SSE1-NEXT:    movb 4(%esi), %bl1316; X86-SSE1-NEXT:    movb 3(%esi), %dh1317; X86-SSE1-NEXT:    movb 2(%esi), %ch1318; X86-SSE1-NEXT:    movb (%esi), %cl1319; X86-SSE1-NEXT:    movb 1(%esi), %dl1320; X86-SSE1-NEXT:    movb %cl, 15(%eax)1321; X86-SSE1-NEXT:    movb %dl, 14(%eax)1322; X86-SSE1-NEXT:    movb %ch, 13(%eax)1323; X86-SSE1-NEXT:    movb %dh, 12(%eax)1324; X86-SSE1-NEXT:    movb %bl, 11(%eax)1325; X86-SSE1-NEXT:    movb %bh, 10(%eax)1326; X86-SSE1-NEXT:    movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload1327; X86-SSE1-NEXT:    movb %cl, 9(%eax)1328; X86-SSE1-NEXT:    movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload1329; X86-SSE1-NEXT:    movb %cl, 8(%eax)1330; X86-SSE1-NEXT:    movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload1331; X86-SSE1-NEXT:    movb %cl, 7(%eax)1332; X86-SSE1-NEXT:    movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload1333; X86-SSE1-NEXT:    movb %cl, 6(%eax)1334; X86-SSE1-NEXT:    movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload1335; X86-SSE1-NEXT:    movb %cl, 5(%eax)1336; X86-SSE1-NEXT:    movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload1337; X86-SSE1-NEXT:    movb %cl, 4(%eax)1338; X86-SSE1-NEXT:    movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload1339; X86-SSE1-NEXT:    movb %cl, 3(%eax)1340; X86-SSE1-NEXT:    movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload1341; X86-SSE1-NEXT:    movb %cl, 2(%eax)1342; X86-SSE1-NEXT:    movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload1343; X86-SSE1-NEXT:    movb %cl, 1(%eax)1344; X86-SSE1-NEXT:    movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 1-byte Folded Reload1345; X86-SSE1-NEXT:    movb %cl, (%eax)1346; X86-SSE1-NEXT:    addl $12, %esp1347; X86-SSE1-NEXT:    .cfi_def_cfa_offset 121348; X86-SSE1-NEXT:    popl %esi1349; X86-SSE1-NEXT:    .cfi_def_cfa_offset 81350; X86-SSE1-NEXT:    popl %ebx1351; X86-SSE1-NEXT:    .cfi_def_cfa_offset 41352; X86-SSE1-NEXT:    retl $41353;1354; X86-SSE41-LABEL: merge_16i8_i8_FEDCBA9876543210:1355; X86-SSE41:       # %bb.0:1356; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax1357; X86-SSE41-NEXT:    movdqu (%eax), %xmm01358; X86-SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]1359; X86-SSE41-NEXT:    retl1360  %ptr0 = getelementptr inbounds i8, ptr %ptr, i64 151361  %ptr1 = getelementptr inbounds i8, ptr %ptr, i64 141362  %ptr2 = getelementptr inbounds i8, ptr %ptr, i64 131363  %ptr3 = getelementptr inbounds i8, ptr %ptr, i64 121364  %ptr4 = getelementptr inbounds i8, ptr %ptr, i64 111365  %ptr5 = getelementptr inbounds i8, ptr %ptr, i64 101366  %ptr6 = getelementptr inbounds i8, ptr %ptr, i64 91367  %ptr7 = getelementptr inbounds i8, ptr %ptr, i64 81368  %ptr8 = getelementptr inbounds i8, ptr %ptr, i64 71369  %ptr9 = getelementptr inbounds i8, ptr %ptr, i64 61370  %ptrA = getelementptr inbounds i8, ptr %ptr, i64 51371  %ptrB = getelementptr inbounds i8, ptr %ptr, i64 41372  %ptrC = getelementptr inbounds i8, ptr %ptr, i64 31373  %ptrD = getelementptr inbounds i8, ptr %ptr, i64 21374  %ptrE = getelementptr inbounds i8, ptr %ptr, i64 11375  %ptrF = getelementptr inbounds i8, ptr %ptr, i64 01376  %val0 = load i8, ptr %ptr01377  %val1 = load i8, ptr %ptr11378  %val2 = load i8, ptr %ptr21379  %val3 = load i8, ptr %ptr31380  %val4 = load i8, ptr %ptr41381  %val5 = load i8, ptr %ptr51382  %val6 = load i8, ptr %ptr61383  %val7 = load i8, ptr %ptr71384  %val8 = load i8, ptr %ptr81385  %val9 = load i8, ptr %ptr91386  %valA = load i8, ptr %ptrA1387  %valB = load i8, ptr %ptrB1388  %valC = load i8, ptr %ptrC1389  %valD = load i8, ptr %ptrD1390  %valE = load i8, ptr %ptrE1391  %valF = load i8, ptr %ptrF1392  %res0 = insertelement <16 x i8> poison, i8 %val0, i8 01393  %res1 = insertelement <16 x i8> %res0, i8 %val1, i64 11394  %res2 = insertelement <16 x i8> %res1, i8 %val2, i64 21395  %res3 = insertelement <16 x i8> %res2, i8 %val3, i64 31396  %res4 = insertelement <16 x i8> %res3, i8 %val4, i64 41397  %res5 = insertelement <16 x i8> %res4, i8 %val5, i64 51398  %res6 = insertelement <16 x i8> %res5, i8 %val6, i64 61399  %res7 = insertelement <16 x i8> %res6, i8 %val7, i64 71400  %res8 = insertelement <16 x i8> %res7, i8 %val8, i64 81401  %res9 = insertelement <16 x i8> %res8, i8 %val9, i64 91402  %resA = insertelement <16 x i8> %res9, i8 %valA, i64 101403  %resB = insertelement <16 x i8> %resA, i8 %valB, i64 111404  %resC = insertelement <16 x i8> %resB, i8 %valC, i64 121405  %resD = insertelement <16 x i8> %resC, i8 %valD, i64 131406  %resE = insertelement <16 x i8> %resD, i8 %valE, i64 141407  %resF = insertelement <16 x i8> %resE, i8 %valF, i64 151408  ret <16 x i8> %resF1409}1410 1411define void @merge_4i32_i32_combine(ptr %dst, ptr %src) {1412; SSE-LABEL: merge_4i32_i32_combine:1413; SSE:       # %bb.0:1414; SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero1415; SSE-NEXT:    movaps %xmm0, (%rdi)1416; SSE-NEXT:    retq1417;1418; AVX-LABEL: merge_4i32_i32_combine:1419; AVX:       # %bb.0:1420; AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero1421; AVX-NEXT:    vmovaps %xmm0, (%rdi)1422; AVX-NEXT:    retq1423;1424; X86-SSE1-LABEL: merge_4i32_i32_combine:1425; X86-SSE1:       # %bb.0:1426; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax1427; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %ecx1428; X86-SSE1-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero1429; X86-SSE1-NEXT:    movss {{.*#+}} xmm1 = [NaN,0.0E+0,0.0E+0,0.0E+0]1430; X86-SSE1-NEXT:    andps %xmm0, %xmm11431; X86-SSE1-NEXT:    movaps %xmm1, (%eax)1432; X86-SSE1-NEXT:    retl1433;1434; X86-SSE41-LABEL: merge_4i32_i32_combine:1435; X86-SSE41:       # %bb.0:1436; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax1437; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx1438; X86-SSE41-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero1439; X86-SSE41-NEXT:    movaps %xmm0, (%eax)1440; X86-SSE41-NEXT:    retl1441 %1 = load i32, ptr %src1442 %2 = insertelement <4 x i32> undef, i32 %1, i32 01443 %3 = shufflevector <4 x i32> %2, <4 x i32> undef, <4 x i32> zeroinitializer1444 %4 = lshr <4 x i32> %3, <i32 0, i32 undef, i32 undef, i32 undef>1445 %5 = and <4 x i32> %4, <i32 -1, i32 0, i32 0, i32 0>1446 store <4 x i32> %5, ptr %dst1447 ret void1448}1449 1450;1451; consecutive loads including any/all volatiles may not be combined1452;1453 1454define <2 x i64> @merge_2i64_i64_12_volatile(ptr %ptr) nounwind uwtable noinline ssp {1455; SSE-LABEL: merge_2i64_i64_12_volatile:1456; SSE:       # %bb.0:1457; SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero1458; SSE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero1459; SSE-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]1460; SSE-NEXT:    retq1461;1462; AVX-LABEL: merge_2i64_i64_12_volatile:1463; AVX:       # %bb.0:1464; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero1465; AVX-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero1466; AVX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]1467; AVX-NEXT:    retq1468;1469; X86-SSE1-LABEL: merge_2i64_i64_12_volatile:1470; X86-SSE1:       # %bb.0:1471; X86-SSE1-NEXT:    pushl %edi1472; X86-SSE1-NEXT:    .cfi_def_cfa_offset 81473; X86-SSE1-NEXT:    pushl %esi1474; X86-SSE1-NEXT:    .cfi_def_cfa_offset 121475; X86-SSE1-NEXT:    .cfi_offset %esi, -121476; X86-SSE1-NEXT:    .cfi_offset %edi, -81477; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax1478; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %ecx1479; X86-SSE1-NEXT:    movl 8(%ecx), %edx1480; X86-SSE1-NEXT:    movl 12(%ecx), %esi1481; X86-SSE1-NEXT:    movl 16(%ecx), %edi1482; X86-SSE1-NEXT:    movl 20(%ecx), %ecx1483; X86-SSE1-NEXT:    movl %ecx, 12(%eax)1484; X86-SSE1-NEXT:    movl %edi, 8(%eax)1485; X86-SSE1-NEXT:    movl %esi, 4(%eax)1486; X86-SSE1-NEXT:    movl %edx, (%eax)1487; X86-SSE1-NEXT:    popl %esi1488; X86-SSE1-NEXT:    .cfi_def_cfa_offset 81489; X86-SSE1-NEXT:    popl %edi1490; X86-SSE1-NEXT:    .cfi_def_cfa_offset 41491; X86-SSE1-NEXT:    retl $41492;1493; X86-SSE41-LABEL: merge_2i64_i64_12_volatile:1494; X86-SSE41:       # %bb.0:1495; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax1496; X86-SSE41-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero1497; X86-SSE41-NEXT:    pinsrd $1, 12(%eax), %xmm01498; X86-SSE41-NEXT:    pinsrd $2, 16(%eax), %xmm01499; X86-SSE41-NEXT:    pinsrd $3, 20(%eax), %xmm01500; X86-SSE41-NEXT:    retl1501  %ptr0 = getelementptr inbounds i64, ptr %ptr, i64 11502  %ptr1 = getelementptr inbounds i64, ptr %ptr, i64 21503  %val0 = load volatile i64, ptr %ptr01504  %val1 = load volatile i64, ptr %ptr11505  %res0 = insertelement <2 x i64> undef, i64 %val0, i32 01506  %res1 = insertelement <2 x i64> %res0, i64 %val1, i32 11507  ret <2 x i64> %res11508}1509 1510define <4 x float> @merge_4f32_f32_2345_volatile(ptr %ptr) nounwind uwtable noinline ssp {1511; SSE2-LABEL: merge_4f32_f32_2345_volatile:1512; SSE2:       # %bb.0:1513; SSE2-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero1514; SSE2-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero1515; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1516; SSE2-NEXT:    movhps {{.*#+}} xmm0 = xmm0[0,1],mem[0,1]1517; SSE2-NEXT:    retq1518;1519; SSE41-LABEL: merge_4f32_f32_2345_volatile:1520; SSE41:       # %bb.0:1521; SSE41-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero1522; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[2,3]1523; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1],mem[0],xmm0[3]1524; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1,2],mem[0]1525; SSE41-NEXT:    retq1526;1527; AVX-LABEL: merge_4f32_f32_2345_volatile:1528; AVX:       # %bb.0:1529; AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero1530; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[2,3]1531; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],mem[0],xmm0[3]1532; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],mem[0]1533; AVX-NEXT:    retq1534;1535; X86-SSE1-LABEL: merge_4f32_f32_2345_volatile:1536; X86-SSE1:       # %bb.0:1537; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax1538; X86-SSE1-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero1539; X86-SSE1-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero1540; X86-SSE1-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1541; X86-SSE1-NEXT:    movhps {{.*#+}} xmm0 = xmm0[0,1],mem[0,1]1542; X86-SSE1-NEXT:    retl1543;1544; X86-SSE41-LABEL: merge_4f32_f32_2345_volatile:1545; X86-SSE41:       # %bb.0:1546; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax1547; X86-SSE41-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero1548; X86-SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[2,3]1549; X86-SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1],mem[0],xmm0[3]1550; X86-SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1,2],mem[0]1551; X86-SSE41-NEXT:    retl1552  %ptr0 = getelementptr inbounds float, ptr %ptr, i64 21553  %ptr1 = getelementptr inbounds float, ptr %ptr, i64 31554  %ptr2 = getelementptr inbounds float, ptr %ptr, i64 41555  %ptr3 = getelementptr inbounds float, ptr %ptr, i64 51556  %val0 = load volatile float, ptr %ptr01557  %val1 = load float, ptr %ptr11558  %val2 = load float, ptr %ptr21559  %val3 = load float, ptr %ptr31560  %res0 = insertelement <4 x float> undef, float %val0, i32 01561  %res1 = insertelement <4 x float> %res0, float %val1, i32 11562  %res2 = insertelement <4 x float> %res1, float %val2, i32 21563  %res3 = insertelement <4 x float> %res2, float %val3, i32 31564  ret <4 x float> %res31565}1566 1567;1568; Non-consecutive test.1569;1570 1571define <4 x float> @merge_4f32_f32_X0YY(ptr %ptr0, ptr %ptr1) nounwind uwtable noinline ssp {1572; SSE-LABEL: merge_4f32_f32_X0YY:1573; SSE:       # %bb.0:1574; SSE-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero1575; SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero1576; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]1577; SSE-NEXT:    retq1578;1579; AVX-LABEL: merge_4f32_f32_X0YY:1580; AVX:       # %bb.0:1581; AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero1582; AVX-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero1583; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0,0]1584; AVX-NEXT:    retq1585;1586; X86-SSE-LABEL: merge_4f32_f32_X0YY:1587; X86-SSE:       # %bb.0:1588; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax1589; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx1590; X86-SSE-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero1591; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero1592; X86-SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,0]1593; X86-SSE-NEXT:    retl1594  %val0 = load float, ptr %ptr0, align 41595  %val1 = load float, ptr %ptr1, align 41596  %res0 = insertelement <4 x float> undef, float %val0, i32 01597  %res1 = insertelement <4 x float> %res0, float 0.000000e+00, i32 11598  %res2 = insertelement <4 x float> %res1, float %val1, i32 21599  %res3 = insertelement <4 x float> %res2, float %val1, i32 31600  ret <4 x float> %res31601}1602 1603;1604; Extension tests.1605;1606 1607; PR313091608define <4 x i32> @load_i32_zext_i128_v4i32(ptr %ptr) {1609; SSE-LABEL: load_i32_zext_i128_v4i32:1610; SSE:       # %bb.0:1611; SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero1612; SSE-NEXT:    retq1613;1614; AVX-LABEL: load_i32_zext_i128_v4i32:1615; AVX:       # %bb.0:1616; AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero1617; AVX-NEXT:    retq1618;1619; X86-SSE1-LABEL: load_i32_zext_i128_v4i32:1620; X86-SSE1:       # %bb.0:1621; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax1622; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %ecx1623; X86-SSE1-NEXT:    movl (%ecx), %ecx1624; X86-SSE1-NEXT:    movl %ecx, (%eax)1625; X86-SSE1-NEXT:    movl $0, 12(%eax)1626; X86-SSE1-NEXT:    movl $0, 8(%eax)1627; X86-SSE1-NEXT:    movl $0, 4(%eax)1628; X86-SSE1-NEXT:    retl $41629;1630; X86-SSE41-LABEL: load_i32_zext_i128_v4i32:1631; X86-SSE41:       # %bb.0:1632; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax1633; X86-SSE41-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero1634; X86-SSE41-NEXT:    retl1635  %1 = load i32, ptr %ptr1636  %2 = zext i32 %1 to i1281637  %3 = bitcast i128 %2 to <4 x i32>1638  ret <4 x i32> %31639}1640