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