823 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+mmx | FileCheck %s --check-prefixes=X86,X86-MMX3; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+mmx,+sse2 | FileCheck %s --check-prefixes=X86,X86-SSE4; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+mmx,+ssse3 | FileCheck %s --check-prefixes=X86,X86-SSE5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+mmx,+sse2 | FileCheck %s --check-prefix=X646; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+mmx,+ssse3 | FileCheck %s --check-prefix=X647; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+mmx,+avx | FileCheck %s --check-prefix=X648; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+mmx,+avx2 | FileCheck %s --check-prefix=X649; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+mmx,+avx512f | FileCheck %s --check-prefix=X6410 11declare <1 x i64> @llvm.x86.mmx.padd.d(<1 x i64>, <1 x i64>)12 13;14; v2i3215;16 17define void @build_v2i32_01(ptr%p0, i32 %a0, i32 %a1) nounwind {18; X86-LABEL: build_v2i32_01:19; X86: # %bb.0:20; X86-NEXT: movl {{[0-9]+}}(%esp), %eax21; X86-NEXT: movd {{[0-9]+}}(%esp), %mm022; X86-NEXT: movd {{[0-9]+}}(%esp), %mm123; X86-NEXT: punpckldq %mm0, %mm1 # mm1 = mm1[0],mm0[0]24; X86-NEXT: paddd %mm1, %mm125; X86-NEXT: movq %mm1, (%eax)26; X86-NEXT: retl27;28; X64-LABEL: build_v2i32_01:29; X64: # %bb.0:30; X64-NEXT: movd %edx, %mm031; X64-NEXT: movd %esi, %mm132; X64-NEXT: punpckldq %mm0, %mm1 # mm1 = mm1[0],mm0[0]33; X64-NEXT: paddd %mm1, %mm134; X64-NEXT: movq %mm1, (%rdi)35; X64-NEXT: retq36 %1 = insertelement <2 x i32> undef, i32 %a0, i32 037 %2 = insertelement <2 x i32> %1, i32 %a1, i32 138 %3 = bitcast <2 x i32> %2 to <1 x i64>39 %4 = tail call <1 x i64> @llvm.x86.mmx.padd.d(<1 x i64> %3, <1 x i64> %3)40 store <1 x i64> %4, ptr%p041 ret void42}43 44define void @build_v2i32_0z(ptr%p0, i32 %a0, i32 %a1) nounwind {45; X86-LABEL: build_v2i32_0z:46; X86: # %bb.0:47; X86-NEXT: movl {{[0-9]+}}(%esp), %eax48; X86-NEXT: movd {{[0-9]+}}(%esp), %mm049; X86-NEXT: paddd %mm0, %mm050; X86-NEXT: movq %mm0, (%eax)51; X86-NEXT: retl52;53; X64-LABEL: build_v2i32_0z:54; X64: # %bb.0:55; X64-NEXT: movd %esi, %mm056; X64-NEXT: paddd %mm0, %mm057; X64-NEXT: movq %mm0, (%rdi)58; X64-NEXT: retq59 %1 = insertelement <2 x i32> undef, i32 %a0, i32 060 %2 = insertelement <2 x i32> %1, i32 0, i32 161 %3 = bitcast <2 x i32> %2 to <1 x i64>62 %4 = tail call <1 x i64> @llvm.x86.mmx.padd.d(<1 x i64> %3, <1 x i64> %3)63 store <1 x i64> %4, ptr%p064 ret void65}66 67define void @build_v2i32_u1(ptr%p0, i32 %a0, i32 %a1) nounwind {68; X86-MMX-LABEL: build_v2i32_u1:69; X86-MMX: # %bb.0:70; X86-MMX-NEXT: movl {{[0-9]+}}(%esp), %eax71; X86-MMX-NEXT: movd {{[0-9]+}}(%esp), %mm072; X86-MMX-NEXT: punpckldq %mm0, %mm0 # mm0 = mm0[0,0]73; X86-MMX-NEXT: paddd %mm0, %mm074; X86-MMX-NEXT: movq %mm0, (%eax)75; X86-MMX-NEXT: retl76;77; X86-SSE-LABEL: build_v2i32_u1:78; X86-SSE: # %bb.0:79; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax80; X86-SSE-NEXT: movd {{[0-9]+}}(%esp), %mm081; X86-SSE-NEXT: pshufw $68, %mm0, %mm0 # mm0 = mm0[0,1,0,1]82; X86-SSE-NEXT: paddd %mm0, %mm083; X86-SSE-NEXT: movq %mm0, (%eax)84; X86-SSE-NEXT: retl85;86; X64-LABEL: build_v2i32_u1:87; X64: # %bb.0:88; X64-NEXT: movd %edx, %mm089; X64-NEXT: pshufw $68, %mm0, %mm0 # mm0 = mm0[0,1,0,1]90; X64-NEXT: paddd %mm0, %mm091; X64-NEXT: movq %mm0, (%rdi)92; X64-NEXT: retq93 %1 = insertelement <2 x i32> undef, i32 undef, i32 094 %2 = insertelement <2 x i32> %1, i32 %a1, i32 195 %3 = bitcast <2 x i32> %2 to <1 x i64>96 %4 = tail call <1 x i64> @llvm.x86.mmx.padd.d(<1 x i64> %3, <1 x i64> %3)97 store <1 x i64> %4, ptr%p098 ret void99}100 101define void @build_v2i32_z1(ptr%p0, i32 %a0, i32 %a1) nounwind {102; X86-LABEL: build_v2i32_z1:103; X86: # %bb.0:104; X86-NEXT: movl {{[0-9]+}}(%esp), %eax105; X86-NEXT: movd {{[0-9]+}}(%esp), %mm0106; X86-NEXT: pxor %mm1, %mm1107; X86-NEXT: punpckldq %mm0, %mm1 # mm1 = mm1[0],mm0[0]108; X86-NEXT: paddd %mm1, %mm1109; X86-NEXT: movq %mm1, (%eax)110; X86-NEXT: retl111;112; X64-LABEL: build_v2i32_z1:113; X64: # %bb.0:114; X64-NEXT: movd %edx, %mm0115; X64-NEXT: pxor %mm1, %mm1116; X64-NEXT: punpckldq %mm0, %mm1 # mm1 = mm1[0],mm0[0]117; X64-NEXT: paddd %mm1, %mm1118; X64-NEXT: movq %mm1, (%rdi)119; X64-NEXT: retq120 %1 = insertelement <2 x i32> undef, i32 0, i32 0121 %2 = insertelement <2 x i32> %1, i32 %a1, i32 1122 %3 = bitcast <2 x i32> %2 to <1 x i64>123 %4 = tail call <1 x i64> @llvm.x86.mmx.padd.d(<1 x i64> %3, <1 x i64> %3)124 store <1 x i64> %4, ptr%p0125 ret void126}127 128define void @build_v2i32_00(ptr%p0, i32 %a0, i32 %a1) nounwind {129; X86-MMX-LABEL: build_v2i32_00:130; X86-MMX: # %bb.0:131; X86-MMX-NEXT: movl {{[0-9]+}}(%esp), %eax132; X86-MMX-NEXT: movd {{[0-9]+}}(%esp), %mm0133; X86-MMX-NEXT: punpckldq %mm0, %mm0 # mm0 = mm0[0,0]134; X86-MMX-NEXT: paddd %mm0, %mm0135; X86-MMX-NEXT: movq %mm0, (%eax)136; X86-MMX-NEXT: retl137;138; X86-SSE-LABEL: build_v2i32_00:139; X86-SSE: # %bb.0:140; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax141; X86-SSE-NEXT: movd {{[0-9]+}}(%esp), %mm0142; X86-SSE-NEXT: pshufw $68, %mm0, %mm0 # mm0 = mm0[0,1,0,1]143; X86-SSE-NEXT: paddd %mm0, %mm0144; X86-SSE-NEXT: movq %mm0, (%eax)145; X86-SSE-NEXT: retl146;147; X64-LABEL: build_v2i32_00:148; X64: # %bb.0:149; X64-NEXT: movd %esi, %mm0150; X64-NEXT: pshufw $68, %mm0, %mm0 # mm0 = mm0[0,1,0,1]151; X64-NEXT: paddd %mm0, %mm0152; X64-NEXT: movq %mm0, (%rdi)153; X64-NEXT: retq154 %1 = insertelement <2 x i32> undef, i32 %a0, i32 0155 %2 = insertelement <2 x i32> %1, i32 %a0, i32 1156 %3 = bitcast <2 x i32> %2 to <1 x i64>157 %4 = tail call <1 x i64> @llvm.x86.mmx.padd.d(<1 x i64> %3, <1 x i64> %3)158 store <1 x i64> %4, ptr%p0159 ret void160}161 162;163; v4i16164;165 166define void @build_v4i16_0123(ptr%p0, i16 %a0, i16 %a1, i16 %a2, i16 %a3) nounwind {167; X86-LABEL: build_v4i16_0123:168; X86: # %bb.0:169; X86-NEXT: movl {{[0-9]+}}(%esp), %eax170; X86-NEXT: movd {{[0-9]+}}(%esp), %mm0171; X86-NEXT: movd {{[0-9]+}}(%esp), %mm1172; X86-NEXT: punpcklwd %mm0, %mm1 # mm1 = mm1[0],mm0[0],mm1[1],mm0[1]173; X86-NEXT: movd {{[0-9]+}}(%esp), %mm0174; X86-NEXT: movd {{[0-9]+}}(%esp), %mm2175; X86-NEXT: punpcklwd %mm0, %mm2 # mm2 = mm2[0],mm0[0],mm2[1],mm0[1]176; X86-NEXT: punpckldq %mm1, %mm2 # mm2 = mm2[0],mm1[0]177; X86-NEXT: paddd %mm2, %mm2178; X86-NEXT: movq %mm2, (%eax)179; X86-NEXT: retl180;181; X64-LABEL: build_v4i16_0123:182; X64: # %bb.0:183; X64-NEXT: movd %r8d, %mm0184; X64-NEXT: movd %ecx, %mm1185; X64-NEXT: punpcklwd %mm0, %mm1 # mm1 = mm1[0],mm0[0],mm1[1],mm0[1]186; X64-NEXT: movd %edx, %mm0187; X64-NEXT: movd %esi, %mm2188; X64-NEXT: punpcklwd %mm0, %mm2 # mm2 = mm2[0],mm0[0],mm2[1],mm0[1]189; X64-NEXT: punpckldq %mm1, %mm2 # mm2 = mm2[0],mm1[0]190; X64-NEXT: paddd %mm2, %mm2191; X64-NEXT: movq %mm2, (%rdi)192; X64-NEXT: retq193 %1 = insertelement <4 x i16> undef, i16 %a0, i32 0194 %2 = insertelement <4 x i16> %1, i16 %a1, i32 1195 %3 = insertelement <4 x i16> %2, i16 %a2, i32 2196 %4 = insertelement <4 x i16> %3, i16 %a3, i32 3197 %5 = bitcast <4 x i16> %4 to <1 x i64>198 %6 = tail call <1 x i64> @llvm.x86.mmx.padd.d(<1 x i64> %5, <1 x i64> %5)199 store <1 x i64> %6, ptr%p0200 ret void201}202 203define void @build_v4i16_01zz(ptr%p0, i16 %a0, i16 %a1, i16 %a2, i16 %a3) nounwind {204; X86-LABEL: build_v4i16_01zz:205; X86: # %bb.0:206; X86-NEXT: movl {{[0-9]+}}(%esp), %eax207; X86-NEXT: movd {{[0-9]+}}(%esp), %mm0208; X86-NEXT: movd {{[0-9]+}}(%esp), %mm1209; X86-NEXT: punpcklwd %mm0, %mm1 # mm1 = mm1[0],mm0[0],mm1[1],mm0[1]210; X86-NEXT: pxor %mm0, %mm0211; X86-NEXT: punpcklwd %mm0, %mm0 # mm0 = mm0[0,0,1,1]212; X86-NEXT: punpckldq %mm0, %mm1 # mm1 = mm1[0],mm0[0]213; X86-NEXT: paddd %mm1, %mm1214; X86-NEXT: movq %mm1, (%eax)215; X86-NEXT: retl216;217; X64-LABEL: build_v4i16_01zz:218; X64: # %bb.0:219; X64-NEXT: movd %edx, %mm0220; X64-NEXT: movd %esi, %mm1221; X64-NEXT: punpcklwd %mm0, %mm1 # mm1 = mm1[0],mm0[0],mm1[1],mm0[1]222; X64-NEXT: pxor %mm0, %mm0223; X64-NEXT: punpcklwd %mm0, %mm0 # mm0 = mm0[0,0,1,1]224; X64-NEXT: punpckldq %mm0, %mm1 # mm1 = mm1[0],mm0[0]225; X64-NEXT: paddd %mm1, %mm1226; X64-NEXT: movq %mm1, (%rdi)227; X64-NEXT: retq228 %1 = insertelement <4 x i16> undef, i16 %a0, i32 0229 %2 = insertelement <4 x i16> %1, i16 %a1, i32 1230 %3 = insertelement <4 x i16> %2, i16 0, i32 2231 %4 = insertelement <4 x i16> %3, i16 0, i32 3232 %5 = bitcast <4 x i16> %4 to <1 x i64>233 %6 = tail call <1 x i64> @llvm.x86.mmx.padd.d(<1 x i64> %5, <1 x i64> %5)234 store <1 x i64> %6, ptr%p0235 ret void236}237 238define void @build_v4i16_0uuz(ptr%p0, i16 %a0, i16 %a1, i16 %a2, i16 %a3) nounwind {239; X86-LABEL: build_v4i16_0uuz:240; X86: # %bb.0:241; X86-NEXT: movl {{[0-9]+}}(%esp), %eax242; X86-NEXT: movd {{[0-9]+}}(%esp), %mm0243; X86-NEXT: paddd %mm0, %mm0244; X86-NEXT: movq %mm0, (%eax)245; X86-NEXT: retl246;247; X64-LABEL: build_v4i16_0uuz:248; X64: # %bb.0:249; X64-NEXT: movd %esi, %mm0250; X64-NEXT: paddd %mm0, %mm0251; X64-NEXT: movq %mm0, (%rdi)252; X64-NEXT: retq253 %1 = insertelement <4 x i16> undef, i16 %a0, i32 0254 %2 = insertelement <4 x i16> %1, i16 undef, i32 1255 %3 = insertelement <4 x i16> %2, i16 undef, i32 2256 %4 = insertelement <4 x i16> %3, i16 0, i32 3257 %5 = bitcast <4 x i16> %4 to <1 x i64>258 %6 = tail call <1 x i64> @llvm.x86.mmx.padd.d(<1 x i64> %5, <1 x i64> %5)259 store <1 x i64> %6, ptr%p0260 ret void261}262 263define void @build_v4i16_0zuz(ptr%p0, i16 %a0, i16 %a1, i16 %a2, i16 %a3) nounwind {264; X86-LABEL: build_v4i16_0zuz:265; X86: # %bb.0:266; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax267; X86-NEXT: movd %eax, %mm0268; X86-NEXT: movl {{[0-9]+}}(%esp), %eax269; X86-NEXT: paddd %mm0, %mm0270; X86-NEXT: movq %mm0, (%eax)271; X86-NEXT: retl272;273; X64-LABEL: build_v4i16_0zuz:274; X64: # %bb.0:275; X64-NEXT: movzwl %si, %eax276; X64-NEXT: movd %eax, %mm0277; X64-NEXT: paddd %mm0, %mm0278; X64-NEXT: movq %mm0, (%rdi)279; X64-NEXT: retq280 %1 = insertelement <4 x i16> undef, i16 %a0, i32 0281 %2 = insertelement <4 x i16> %1, i16 0, i32 1282 %3 = insertelement <4 x i16> %2, i16 undef, i32 2283 %4 = insertelement <4 x i16> %3, i16 0, i32 3284 %5 = bitcast <4 x i16> %4 to <1 x i64>285 %6 = tail call <1 x i64> @llvm.x86.mmx.padd.d(<1 x i64> %5, <1 x i64> %5)286 store <1 x i64> %6, ptr%p0287 ret void288}289 290define void @build_v4i16_012u(ptr%p0, i16 %a0, i16 %a1, i16 %a2, i16 %a3) nounwind {291; X86-LABEL: build_v4i16_012u:292; X86: # %bb.0:293; X86-NEXT: movl {{[0-9]+}}(%esp), %eax294; X86-NEXT: movd {{[0-9]+}}(%esp), %mm0295; X86-NEXT: punpcklwd %mm0, %mm0 # mm0 = mm0[0,0,1,1]296; X86-NEXT: movd {{[0-9]+}}(%esp), %mm1297; X86-NEXT: movd {{[0-9]+}}(%esp), %mm2298; X86-NEXT: punpcklwd %mm1, %mm2 # mm2 = mm2[0],mm1[0],mm2[1],mm1[1]299; X86-NEXT: punpckldq %mm0, %mm2 # mm2 = mm2[0],mm0[0]300; X86-NEXT: paddd %mm2, %mm2301; X86-NEXT: movq %mm2, (%eax)302; X86-NEXT: retl303;304; X64-LABEL: build_v4i16_012u:305; X64: # %bb.0:306; X64-NEXT: movd %ecx, %mm0307; X64-NEXT: punpcklwd %mm0, %mm0 # mm0 = mm0[0,0,1,1]308; X64-NEXT: movd %edx, %mm1309; X64-NEXT: movd %esi, %mm2310; X64-NEXT: punpcklwd %mm1, %mm2 # mm2 = mm2[0],mm1[0],mm2[1],mm1[1]311; X64-NEXT: punpckldq %mm0, %mm2 # mm2 = mm2[0],mm0[0]312; X64-NEXT: paddd %mm2, %mm2313; X64-NEXT: movq %mm2, (%rdi)314; X64-NEXT: retq315 %1 = insertelement <4 x i16> undef, i16 %a0, i32 0316 %2 = insertelement <4 x i16> %1, i16 %a1, i32 1317 %3 = insertelement <4 x i16> %2, i16 %a2, i32 2318 %4 = insertelement <4 x i16> %3, i16 undef, i32 3319 %5 = bitcast <4 x i16> %4 to <1 x i64>320 %6 = tail call <1 x i64> @llvm.x86.mmx.padd.d(<1 x i64> %5, <1 x i64> %5)321 store <1 x i64> %6, ptr%p0322 ret void323}324 325define void @build_v4i16_0u00(ptr%p0, i16 %a0, i16 %a1, i16 %a2, i16 %a3) nounwind {326; X86-MMX-LABEL: build_v4i16_0u00:327; X86-MMX: # %bb.0:328; X86-MMX-NEXT: movl {{[0-9]+}}(%esp), %eax329; X86-MMX-NEXT: movd {{[0-9]+}}(%esp), %mm0330; X86-MMX-NEXT: punpcklwd %mm0, %mm0 # mm0 = mm0[0,0,1,1]331; X86-MMX-NEXT: punpckldq %mm0, %mm0 # mm0 = mm0[0,0]332; X86-MMX-NEXT: paddd %mm0, %mm0333; X86-MMX-NEXT: movq %mm0, (%eax)334; X86-MMX-NEXT: retl335;336; X86-SSE-LABEL: build_v4i16_0u00:337; X86-SSE: # %bb.0:338; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax339; X86-SSE-NEXT: movd {{[0-9]+}}(%esp), %mm0340; X86-SSE-NEXT: pshufw $0, %mm0, %mm0 # mm0 = mm0[0,0,0,0]341; X86-SSE-NEXT: paddd %mm0, %mm0342; X86-SSE-NEXT: movq %mm0, (%eax)343; X86-SSE-NEXT: retl344;345; X64-LABEL: build_v4i16_0u00:346; X64: # %bb.0:347; X64-NEXT: movd %esi, %mm0348; X64-NEXT: pshufw $0, %mm0, %mm0 # mm0 = mm0[0,0,0,0]349; X64-NEXT: paddd %mm0, %mm0350; X64-NEXT: movq %mm0, (%rdi)351; X64-NEXT: retq352 %1 = insertelement <4 x i16> undef, i16 %a0, i32 0353 %2 = insertelement <4 x i16> %1, i16 undef, i32 1354 %3 = insertelement <4 x i16> %2, i16 %a0, i32 2355 %4 = insertelement <4 x i16> %3, i16 %a0, i32 3356 %5 = bitcast <4 x i16> %4 to <1 x i64>357 %6 = tail call <1 x i64> @llvm.x86.mmx.padd.d(<1 x i64> %5, <1 x i64> %5)358 store <1 x i64> %6, ptr%p0359 ret void360}361 362;363; v8i8364;365 366define void @build_v8i8_01234567(ptr%p0, i8 %a0, i8 %a1, i8 %a2, i8 %a3, i8 %a4, i8 %a5, i8 %a6, i8 %a7) nounwind {367; X86-LABEL: build_v8i8_01234567:368; X86: # %bb.0:369; X86-NEXT: movl {{[0-9]+}}(%esp), %eax370; X86-NEXT: movd {{[0-9]+}}(%esp), %mm0371; X86-NEXT: movd {{[0-9]+}}(%esp), %mm1372; X86-NEXT: punpcklbw %mm0, %mm1 # mm1 = mm1[0],mm0[0],mm1[1],mm0[1],mm1[2],mm0[2],mm1[3],mm0[3]373; X86-NEXT: movd {{[0-9]+}}(%esp), %mm0374; X86-NEXT: movd {{[0-9]+}}(%esp), %mm2375; X86-NEXT: punpcklbw %mm0, %mm2 # mm2 = mm2[0],mm0[0],mm2[1],mm0[1],mm2[2],mm0[2],mm2[3],mm0[3]376; X86-NEXT: punpcklwd %mm1, %mm2 # mm2 = mm2[0],mm1[0],mm2[1],mm1[1]377; X86-NEXT: movd {{[0-9]+}}(%esp), %mm0378; X86-NEXT: movd {{[0-9]+}}(%esp), %mm1379; X86-NEXT: punpcklbw %mm0, %mm1 # mm1 = mm1[0],mm0[0],mm1[1],mm0[1],mm1[2],mm0[2],mm1[3],mm0[3]380; X86-NEXT: movd {{[0-9]+}}(%esp), %mm0381; X86-NEXT: movd {{[0-9]+}}(%esp), %mm3382; X86-NEXT: punpcklbw %mm0, %mm3 # mm3 = mm3[0],mm0[0],mm3[1],mm0[1],mm3[2],mm0[2],mm3[3],mm0[3]383; X86-NEXT: punpcklwd %mm1, %mm3 # mm3 = mm3[0],mm1[0],mm3[1],mm1[1]384; X86-NEXT: punpckldq %mm2, %mm3 # mm3 = mm3[0],mm2[0]385; X86-NEXT: paddd %mm3, %mm3386; X86-NEXT: movq %mm3, (%eax)387; X86-NEXT: retl388;389; X64-LABEL: build_v8i8_01234567:390; X64: # %bb.0:391; X64-NEXT: movd {{[0-9]+}}(%rsp), %mm0392; X64-NEXT: movd {{[0-9]+}}(%rsp), %mm1393; X64-NEXT: punpcklbw %mm0, %mm1 # mm1 = mm1[0],mm0[0],mm1[1],mm0[1],mm1[2],mm0[2],mm1[3],mm0[3]394; X64-NEXT: movd %r9d, %mm0395; X64-NEXT: movd {{[0-9]+}}(%rsp), %mm2396; X64-NEXT: punpcklbw %mm2, %mm0 # mm0 = mm0[0],mm2[0],mm0[1],mm2[1],mm0[2],mm2[2],mm0[3],mm2[3]397; X64-NEXT: punpcklwd %mm1, %mm0 # mm0 = mm0[0],mm1[0],mm0[1],mm1[1]398; X64-NEXT: movd %r8d, %mm1399; X64-NEXT: movd %ecx, %mm2400; X64-NEXT: punpcklbw %mm1, %mm2 # mm2 = mm2[0],mm1[0],mm2[1],mm1[1],mm2[2],mm1[2],mm2[3],mm1[3]401; X64-NEXT: movd %edx, %mm1402; X64-NEXT: movd %esi, %mm3403; X64-NEXT: punpcklbw %mm1, %mm3 # mm3 = mm3[0],mm1[0],mm3[1],mm1[1],mm3[2],mm1[2],mm3[3],mm1[3]404; X64-NEXT: punpcklwd %mm2, %mm3 # mm3 = mm3[0],mm2[0],mm3[1],mm2[1]405; X64-NEXT: punpckldq %mm0, %mm3 # mm3 = mm3[0],mm0[0]406; X64-NEXT: paddd %mm3, %mm3407; X64-NEXT: movq %mm3, (%rdi)408; X64-NEXT: retq409 %1 = insertelement <8 x i8> undef, i8 %a0, i32 0410 %2 = insertelement <8 x i8> %1, i8 %a1, i32 1411 %3 = insertelement <8 x i8> %2, i8 %a2, i32 2412 %4 = insertelement <8 x i8> %3, i8 %a3, i32 3413 %5 = insertelement <8 x i8> %4, i8 %a4, i32 4414 %6 = insertelement <8 x i8> %5, i8 %a5, i32 5415 %7 = insertelement <8 x i8> %6, i8 %a6, i32 6416 %8 = insertelement <8 x i8> %7, i8 %a7, i32 7417 %9 = bitcast <8 x i8> %8 to <1 x i64>418 %10 = tail call <1 x i64> @llvm.x86.mmx.padd.d(<1 x i64> %9, <1 x i64> %9)419 store <1 x i64> %10, ptr%p0420 ret void421}422 423define void @build_v8i8_0u2345z7(ptr%p0, i8 %a0, i8 %a1, i8 %a2, i8 %a3, i8 %a4, i8 %a5, i8 %a6, i8 %a7) nounwind {424; X86-LABEL: build_v8i8_0u2345z7:425; X86: # %bb.0:426; X86-NEXT: movl {{[0-9]+}}(%esp), %eax427; X86-NEXT: movd {{[0-9]+}}(%esp), %mm0428; X86-NEXT: pxor %mm1, %mm1429; X86-NEXT: punpcklbw %mm0, %mm1 # mm1 = mm1[0],mm0[0],mm1[1],mm0[1],mm1[2],mm0[2],mm1[3],mm0[3]430; X86-NEXT: movd {{[0-9]+}}(%esp), %mm0431; X86-NEXT: movd {{[0-9]+}}(%esp), %mm2432; X86-NEXT: punpcklbw %mm0, %mm2 # mm2 = mm2[0],mm0[0],mm2[1],mm0[1],mm2[2],mm0[2],mm2[3],mm0[3]433; X86-NEXT: punpcklwd %mm1, %mm2 # mm2 = mm2[0],mm1[0],mm2[1],mm1[1]434; X86-NEXT: movd {{[0-9]+}}(%esp), %mm0435; X86-NEXT: movd {{[0-9]+}}(%esp), %mm1436; X86-NEXT: punpcklbw %mm0, %mm1 # mm1 = mm1[0],mm0[0],mm1[1],mm0[1],mm1[2],mm0[2],mm1[3],mm0[3]437; X86-NEXT: movd {{[0-9]+}}(%esp), %mm0438; X86-NEXT: punpcklbw %mm0, %mm0 # mm0 = mm0[0,0,1,1,2,2,3,3]439; X86-NEXT: punpcklwd %mm1, %mm0 # mm0 = mm0[0],mm1[0],mm0[1],mm1[1]440; X86-NEXT: punpckldq %mm2, %mm0 # mm0 = mm0[0],mm2[0]441; X86-NEXT: paddd %mm0, %mm0442; X86-NEXT: movq %mm0, (%eax)443; X86-NEXT: retl444;445; X64-LABEL: build_v8i8_0u2345z7:446; X64: # %bb.0:447; X64-NEXT: movd {{[0-9]+}}(%rsp), %mm0448; X64-NEXT: pxor %mm1, %mm1449; X64-NEXT: punpcklbw %mm0, %mm1 # mm1 = mm1[0],mm0[0],mm1[1],mm0[1],mm1[2],mm0[2],mm1[3],mm0[3]450; X64-NEXT: movd %r9d, %mm0451; X64-NEXT: movd {{[0-9]+}}(%rsp), %mm2452; X64-NEXT: punpcklbw %mm2, %mm0 # mm0 = mm0[0],mm2[0],mm0[1],mm2[1],mm0[2],mm2[2],mm0[3],mm2[3]453; X64-NEXT: punpcklwd %mm1, %mm0 # mm0 = mm0[0],mm1[0],mm0[1],mm1[1]454; X64-NEXT: movd %r8d, %mm1455; X64-NEXT: movd %ecx, %mm2456; X64-NEXT: punpcklbw %mm1, %mm2 # mm2 = mm2[0],mm1[0],mm2[1],mm1[1],mm2[2],mm1[2],mm2[3],mm1[3]457; X64-NEXT: movd %esi, %mm1458; X64-NEXT: punpcklbw %mm1, %mm1 # mm1 = mm1[0,0,1,1,2,2,3,3]459; X64-NEXT: punpcklwd %mm2, %mm1 # mm1 = mm1[0],mm2[0],mm1[1],mm2[1]460; X64-NEXT: punpckldq %mm0, %mm1 # mm1 = mm1[0],mm0[0]461; X64-NEXT: paddd %mm1, %mm1462; X64-NEXT: movq %mm1, (%rdi)463; X64-NEXT: retq464 %1 = insertelement <8 x i8> undef, i8 %a0, i32 0465 %2 = insertelement <8 x i8> %1, i8 undef, i32 1466 %3 = insertelement <8 x i8> %2, i8 %a2, i32 2467 %4 = insertelement <8 x i8> %3, i8 %a3, i32 3468 %5 = insertelement <8 x i8> %4, i8 %a4, i32 4469 %6 = insertelement <8 x i8> %5, i8 %a5, i32 5470 %7 = insertelement <8 x i8> %6, i8 0, i32 6471 %8 = insertelement <8 x i8> %7, i8 %a7, i32 7472 %9 = bitcast <8 x i8> %8 to <1 x i64>473 %10 = tail call <1 x i64> @llvm.x86.mmx.padd.d(<1 x i64> %9, <1 x i64> %9)474 store <1 x i64> %10, ptr%p0475 ret void476}477 478define void @build_v8i8_0123zzzu(ptr%p0, i8 %a0, i8 %a1, i8 %a2, i8 %a3, i8 %a4, i8 %a5, i8 %a6, i8 %a7) nounwind {479; X86-LABEL: build_v8i8_0123zzzu:480; X86: # %bb.0:481; X86-NEXT: movl {{[0-9]+}}(%esp), %eax482; X86-NEXT: movd {{[0-9]+}}(%esp), %mm0483; X86-NEXT: movd {{[0-9]+}}(%esp), %mm1484; X86-NEXT: punpcklbw %mm0, %mm1 # mm1 = mm1[0],mm0[0],mm1[1],mm0[1],mm1[2],mm0[2],mm1[3],mm0[3]485; X86-NEXT: movd {{[0-9]+}}(%esp), %mm0486; X86-NEXT: movd {{[0-9]+}}(%esp), %mm2487; X86-NEXT: punpcklbw %mm0, %mm2 # mm2 = mm2[0],mm0[0],mm2[1],mm0[1],mm2[2],mm0[2],mm2[3],mm0[3]488; X86-NEXT: punpcklwd %mm1, %mm2 # mm2 = mm2[0],mm1[0],mm2[1],mm1[1]489; X86-NEXT: pxor %mm0, %mm0490; X86-NEXT: pxor %mm1, %mm1491; X86-NEXT: punpcklbw %mm1, %mm1 # mm1 = mm1[0,0,1,1,2,2,3,3]492; X86-NEXT: punpcklbw %mm0, %mm0 # mm0 = mm0[0,0,1,1,2,2,3,3]493; X86-NEXT: punpcklwd %mm1, %mm0 # mm0 = mm0[0],mm1[0],mm0[1],mm1[1]494; X86-NEXT: punpckldq %mm0, %mm2 # mm2 = mm2[0],mm0[0]495; X86-NEXT: paddd %mm2, %mm2496; X86-NEXT: movq %mm2, (%eax)497; X86-NEXT: retl498;499; X64-LABEL: build_v8i8_0123zzzu:500; X64: # %bb.0:501; X64-NEXT: movd %r8d, %mm0502; X64-NEXT: movd %ecx, %mm1503; X64-NEXT: punpcklbw %mm0, %mm1 # mm1 = mm1[0],mm0[0],mm1[1],mm0[1],mm1[2],mm0[2],mm1[3],mm0[3]504; X64-NEXT: movd %edx, %mm0505; X64-NEXT: movd %esi, %mm2506; X64-NEXT: punpcklbw %mm0, %mm2 # mm2 = mm2[0],mm0[0],mm2[1],mm0[1],mm2[2],mm0[2],mm2[3],mm0[3]507; X64-NEXT: punpcklwd %mm1, %mm2 # mm2 = mm2[0],mm1[0],mm2[1],mm1[1]508; X64-NEXT: pxor %mm0, %mm0509; X64-NEXT: pxor %mm1, %mm1510; X64-NEXT: punpcklbw %mm1, %mm1 # mm1 = mm1[0,0,1,1,2,2,3,3]511; X64-NEXT: punpcklbw %mm0, %mm0 # mm0 = mm0[0,0,1,1,2,2,3,3]512; X64-NEXT: punpcklwd %mm1, %mm0 # mm0 = mm0[0],mm1[0],mm0[1],mm1[1]513; X64-NEXT: punpckldq %mm0, %mm2 # mm2 = mm2[0],mm0[0]514; X64-NEXT: paddd %mm2, %mm2515; X64-NEXT: movq %mm2, (%rdi)516; X64-NEXT: retq517 %1 = insertelement <8 x i8> undef, i8 %a0, i32 0518 %2 = insertelement <8 x i8> %1, i8 %a1, i32 1519 %3 = insertelement <8 x i8> %2, i8 %a2, i32 2520 %4 = insertelement <8 x i8> %3, i8 %a3, i32 3521 %5 = insertelement <8 x i8> %4, i8 0, i32 4522 %6 = insertelement <8 x i8> %5, i8 0, i32 5523 %7 = insertelement <8 x i8> %6, i8 0, i32 6524 %8 = insertelement <8 x i8> %7, i8 undef, i32 7525 %9 = bitcast <8 x i8> %8 to <1 x i64>526 %10 = tail call <1 x i64> @llvm.x86.mmx.padd.d(<1 x i64> %9, <1 x i64> %9)527 store <1 x i64> %10, ptr%p0528 ret void529}530 531define void @build_v8i8_0uuuuzzz(ptr%p0, i8 %a0, i8 %a1, i8 %a2, i8 %a3, i8 %a4, i8 %a5, i8 %a6, i8 %a7) nounwind {532; X86-LABEL: build_v8i8_0uuuuzzz:533; X86: # %bb.0:534; X86-NEXT: movl {{[0-9]+}}(%esp), %eax535; X86-NEXT: movd {{[0-9]+}}(%esp), %mm0536; X86-NEXT: paddd %mm0, %mm0537; X86-NEXT: movq %mm0, (%eax)538; X86-NEXT: retl539;540; X64-LABEL: build_v8i8_0uuuuzzz:541; X64: # %bb.0:542; X64-NEXT: movd %esi, %mm0543; X64-NEXT: paddd %mm0, %mm0544; X64-NEXT: movq %mm0, (%rdi)545; X64-NEXT: retq546 %1 = insertelement <8 x i8> undef, i8 %a0, i32 0547 %2 = insertelement <8 x i8> %1, i8 undef, i32 1548 %3 = insertelement <8 x i8> %2, i8 undef, i32 2549 %4 = insertelement <8 x i8> %3, i8 undef, i32 3550 %5 = insertelement <8 x i8> %4, i8 undef, i32 4551 %6 = insertelement <8 x i8> %5, i8 0, i32 5552 %7 = insertelement <8 x i8> %6, i8 0, i32 6553 %8 = insertelement <8 x i8> %7, i8 0, i32 7554 %9 = bitcast <8 x i8> %8 to <1 x i64>555 %10 = tail call <1 x i64> @llvm.x86.mmx.padd.d(<1 x i64> %9, <1 x i64> %9)556 store <1 x i64> %10, ptr%p0557 ret void558}559 560define void @build_v8i8_0zzzzzzu(ptr%p0, i8 %a0, i8 %a1, i8 %a2, i8 %a3, i8 %a4, i8 %a5, i8 %a6, i8 %a7) nounwind {561; X86-LABEL: build_v8i8_0zzzzzzu:562; X86: # %bb.0:563; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax564; X86-NEXT: movd %eax, %mm0565; X86-NEXT: movl {{[0-9]+}}(%esp), %eax566; X86-NEXT: paddd %mm0, %mm0567; X86-NEXT: movq %mm0, (%eax)568; X86-NEXT: retl569;570; X64-LABEL: build_v8i8_0zzzzzzu:571; X64: # %bb.0:572; X64-NEXT: movzbl %sil, %eax573; X64-NEXT: movd %eax, %mm0574; X64-NEXT: paddd %mm0, %mm0575; X64-NEXT: movq %mm0, (%rdi)576; X64-NEXT: retq577 %1 = insertelement <8 x i8> undef, i8 %a0, i32 0578 %2 = insertelement <8 x i8> %1, i8 0, i32 1579 %3 = insertelement <8 x i8> %2, i8 0, i32 2580 %4 = insertelement <8 x i8> %3, i8 0, i32 3581 %5 = insertelement <8 x i8> %4, i8 0, i32 4582 %6 = insertelement <8 x i8> %5, i8 0, i32 5583 %7 = insertelement <8 x i8> %6, i8 0, i32 6584 %8 = insertelement <8 x i8> %7, i8 undef, i32 7585 %9 = bitcast <8 x i8> %8 to <1 x i64>586 %10 = tail call <1 x i64> @llvm.x86.mmx.padd.d(<1 x i64> %9, <1 x i64> %9)587 store <1 x i64> %10, ptr%p0588 ret void589}590 591define void @build_v8i8_00000000(ptr%p0, i8 %a0, i8 %a1, i8 %a2, i8 %a3, i8 %a4, i8 %a5, i8 %a6, i8 %a7) nounwind {592; X86-MMX-LABEL: build_v8i8_00000000:593; X86-MMX: # %bb.0:594; X86-MMX-NEXT: movl {{[0-9]+}}(%esp), %eax595; X86-MMX-NEXT: movd {{[0-9]+}}(%esp), %mm0596; X86-MMX-NEXT: punpcklbw %mm0, %mm0 # mm0 = mm0[0,0,1,1,2,2,3,3]597; X86-MMX-NEXT: punpcklwd %mm0, %mm0 # mm0 = mm0[0,0,1,1]598; X86-MMX-NEXT: punpckldq %mm0, %mm0 # mm0 = mm0[0,0]599; X86-MMX-NEXT: paddd %mm0, %mm0600; X86-MMX-NEXT: movq %mm0, (%eax)601; X86-MMX-NEXT: retl602;603; X86-SSE-LABEL: build_v8i8_00000000:604; X86-SSE: # %bb.0:605; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax606; X86-SSE-NEXT: movd {{[0-9]+}}(%esp), %mm0607; X86-SSE-NEXT: punpcklbw %mm0, %mm0 # mm0 = mm0[0,0,1,1,2,2,3,3]608; X86-SSE-NEXT: pshufw $0, %mm0, %mm0 # mm0 = mm0[0,0,0,0]609; X86-SSE-NEXT: paddd %mm0, %mm0610; X86-SSE-NEXT: movq %mm0, (%eax)611; X86-SSE-NEXT: retl612;613; X64-LABEL: build_v8i8_00000000:614; X64: # %bb.0:615; X64-NEXT: movd %esi, %mm0616; X64-NEXT: punpcklbw %mm0, %mm0 # mm0 = mm0[0,0,1,1,2,2,3,3]617; X64-NEXT: pshufw $0, %mm0, %mm0 # mm0 = mm0[0,0,0,0]618; X64-NEXT: paddd %mm0, %mm0619; X64-NEXT: movq %mm0, (%rdi)620; X64-NEXT: retq621 %1 = insertelement <8 x i8> undef, i8 %a0, i32 0622 %2 = insertelement <8 x i8> %1, i8 %a0, i32 1623 %3 = insertelement <8 x i8> %2, i8 %a0, i32 2624 %4 = insertelement <8 x i8> %3, i8 %a0, i32 3625 %5 = insertelement <8 x i8> %4, i8 %a0, i32 4626 %6 = insertelement <8 x i8> %5, i8 %a0, i32 5627 %7 = insertelement <8 x i8> %6, i8 %a0, i32 6628 %8 = insertelement <8 x i8> %7, i8 %a0, i32 7629 %9 = bitcast <8 x i8> %8 to <1 x i64>630 %10 = tail call <1 x i64> @llvm.x86.mmx.padd.d(<1 x i64> %9, <1 x i64> %9)631 store <1 x i64> %10, ptr%p0632 ret void633}634 635;636; v2f32637;638 639define void @build_v2f32_01(ptr%p0, float %a0, float %a1) nounwind {640; X86-MMX-LABEL: build_v2f32_01:641; X86-MMX: # %bb.0:642; X86-MMX-NEXT: movl {{[0-9]+}}(%esp), %eax643; X86-MMX-NEXT: movd {{[0-9]+}}(%esp), %mm0644; X86-MMX-NEXT: movd {{[0-9]+}}(%esp), %mm1645; X86-MMX-NEXT: punpckldq %mm0, %mm1 # mm1 = mm1[0],mm0[0]646; X86-MMX-NEXT: paddd %mm1, %mm1647; X86-MMX-NEXT: movq %mm1, (%eax)648; X86-MMX-NEXT: retl649;650; X86-SSE-LABEL: build_v2f32_01:651; X86-SSE: # %bb.0:652; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax653; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero654; X86-SSE-NEXT: movdq2q %xmm0, %mm0655; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero656; X86-SSE-NEXT: movdq2q %xmm0, %mm1657; X86-SSE-NEXT: punpckldq %mm0, %mm1 # mm1 = mm1[0],mm0[0]658; X86-SSE-NEXT: paddd %mm1, %mm1659; X86-SSE-NEXT: movq %mm1, (%eax)660; X86-SSE-NEXT: retl661;662; X64-LABEL: build_v2f32_01:663; X64: # %bb.0:664; X64-NEXT: movdq2q %xmm1, %mm0665; X64-NEXT: movdq2q %xmm0, %mm1666; X64-NEXT: punpckldq %mm0, %mm1 # mm1 = mm1[0],mm0[0]667; X64-NEXT: paddd %mm1, %mm1668; X64-NEXT: movq %mm1, (%rdi)669; X64-NEXT: retq670 %1 = insertelement <2 x float> undef, float %a0, i32 0671 %2 = insertelement <2 x float> %1, float %a1, i32 1672 %3 = bitcast <2 x float> %2 to <1 x i64>673 %4 = tail call <1 x i64> @llvm.x86.mmx.padd.d(<1 x i64> %3, <1 x i64> %3)674 store <1 x i64> %4, ptr%p0675 ret void676}677 678define void @build_v2f32_0z(ptr%p0, float %a0, float %a1) nounwind {679; X86-MMX-LABEL: build_v2f32_0z:680; X86-MMX: # %bb.0:681; X86-MMX-NEXT: movl {{[0-9]+}}(%esp), %eax682; X86-MMX-NEXT: pxor %mm0, %mm0683; X86-MMX-NEXT: movd {{[0-9]+}}(%esp), %mm1684; X86-MMX-NEXT: punpckldq %mm0, %mm1 # mm1 = mm1[0],mm0[0]685; X86-MMX-NEXT: paddd %mm1, %mm1686; X86-MMX-NEXT: movq %mm1, (%eax)687; X86-MMX-NEXT: retl688;689; X86-SSE-LABEL: build_v2f32_0z:690; X86-SSE: # %bb.0:691; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax692; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero693; X86-SSE-NEXT: movdq2q %xmm0, %mm0694; X86-SSE-NEXT: pxor %mm1, %mm1695; X86-SSE-NEXT: punpckldq %mm1, %mm0 # mm0 = mm0[0],mm1[0]696; X86-SSE-NEXT: paddd %mm0, %mm0697; X86-SSE-NEXT: movq %mm0, (%eax)698; X86-SSE-NEXT: retl699;700; X64-LABEL: build_v2f32_0z:701; X64: # %bb.0:702; X64-NEXT: movdq2q %xmm0, %mm0703; X64-NEXT: pxor %mm1, %mm1704; X64-NEXT: punpckldq %mm1, %mm0 # mm0 = mm0[0],mm1[0]705; X64-NEXT: paddd %mm0, %mm0706; X64-NEXT: movq %mm0, (%rdi)707; X64-NEXT: retq708 %1 = insertelement <2 x float> undef, float %a0, i32 0709 %2 = insertelement <2 x float> %1, float 0.0, i32 1710 %3 = bitcast <2 x float> %2 to <1 x i64>711 %4 = tail call <1 x i64> @llvm.x86.mmx.padd.d(<1 x i64> %3, <1 x i64> %3)712 store <1 x i64> %4, ptr%p0713 ret void714}715 716define void @build_v2f32_u1(ptr%p0, float %a0, float %a1) nounwind {717; X86-MMX-LABEL: build_v2f32_u1:718; X86-MMX: # %bb.0:719; X86-MMX-NEXT: movl {{[0-9]+}}(%esp), %eax720; X86-MMX-NEXT: movd {{[0-9]+}}(%esp), %mm0721; X86-MMX-NEXT: punpckldq %mm0, %mm0 # mm0 = mm0[0,0]722; X86-MMX-NEXT: paddd %mm0, %mm0723; X86-MMX-NEXT: movq %mm0, (%eax)724; X86-MMX-NEXT: retl725;726; X86-SSE-LABEL: build_v2f32_u1:727; X86-SSE: # %bb.0:728; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax729; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero730; X86-SSE-NEXT: movdq2q %xmm0, %mm0731; X86-SSE-NEXT: pshufw $68, %mm0, %mm0 # mm0 = mm0[0,1,0,1]732; X86-SSE-NEXT: paddd %mm0, %mm0733; X86-SSE-NEXT: movq %mm0, (%eax)734; X86-SSE-NEXT: retl735;736; X64-LABEL: build_v2f32_u1:737; X64: # %bb.0:738; X64-NEXT: movdq2q %xmm1, %mm0739; X64-NEXT: pshufw $68, %mm0, %mm0 # mm0 = mm0[0,1,0,1]740; X64-NEXT: paddd %mm0, %mm0741; X64-NEXT: movq %mm0, (%rdi)742; X64-NEXT: retq743 %1 = insertelement <2 x float> undef, float undef, i32 0744 %2 = insertelement <2 x float> %1, float %a1, i32 1745 %3 = bitcast <2 x float> %2 to <1 x i64>746 %4 = tail call <1 x i64> @llvm.x86.mmx.padd.d(<1 x i64> %3, <1 x i64> %3)747 store <1 x i64> %4, ptr%p0748 ret void749}750 751define void @build_v2f32_z1(ptr%p0, float %a0, float %a1) nounwind {752; X86-MMX-LABEL: build_v2f32_z1:753; X86-MMX: # %bb.0:754; X86-MMX-NEXT: movl {{[0-9]+}}(%esp), %eax755; X86-MMX-NEXT: movd {{[0-9]+}}(%esp), %mm0756; X86-MMX-NEXT: pxor %mm1, %mm1757; X86-MMX-NEXT: punpckldq %mm0, %mm1 # mm1 = mm1[0],mm0[0]758; X86-MMX-NEXT: paddd %mm1, %mm1759; X86-MMX-NEXT: movq %mm1, (%eax)760; X86-MMX-NEXT: retl761;762; X86-SSE-LABEL: build_v2f32_z1:763; X86-SSE: # %bb.0:764; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax765; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero766; X86-SSE-NEXT: movdq2q %xmm0, %mm0767; X86-SSE-NEXT: pxor %mm1, %mm1768; X86-SSE-NEXT: punpckldq %mm0, %mm1 # mm1 = mm1[0],mm0[0]769; X86-SSE-NEXT: paddd %mm1, %mm1770; X86-SSE-NEXT: movq %mm1, (%eax)771; X86-SSE-NEXT: retl772;773; X64-LABEL: build_v2f32_z1:774; X64: # %bb.0:775; X64-NEXT: movdq2q %xmm1, %mm0776; X64-NEXT: pxor %mm1, %mm1777; X64-NEXT: punpckldq %mm0, %mm1 # mm1 = mm1[0],mm0[0]778; X64-NEXT: paddd %mm1, %mm1779; X64-NEXT: movq %mm1, (%rdi)780; X64-NEXT: retq781 %1 = insertelement <2 x float> undef, float 0.0, i32 0782 %2 = insertelement <2 x float> %1, float %a1, i32 1783 %3 = bitcast <2 x float> %2 to <1 x i64>784 %4 = tail call <1 x i64> @llvm.x86.mmx.padd.d(<1 x i64> %3, <1 x i64> %3)785 store <1 x i64> %4, ptr%p0786 ret void787}788 789define void @build_v2f32_00(ptr%p0, float %a0, float %a1) nounwind {790; X86-MMX-LABEL: build_v2f32_00:791; X86-MMX: # %bb.0:792; X86-MMX-NEXT: movl {{[0-9]+}}(%esp), %eax793; X86-MMX-NEXT: movd {{[0-9]+}}(%esp), %mm0794; X86-MMX-NEXT: punpckldq %mm0, %mm0 # mm0 = mm0[0,0]795; X86-MMX-NEXT: paddd %mm0, %mm0796; X86-MMX-NEXT: movq %mm0, (%eax)797; X86-MMX-NEXT: retl798;799; X86-SSE-LABEL: build_v2f32_00:800; X86-SSE: # %bb.0:801; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax802; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero803; X86-SSE-NEXT: movdq2q %xmm0, %mm0804; X86-SSE-NEXT: pshufw $68, %mm0, %mm0 # mm0 = mm0[0,1,0,1]805; X86-SSE-NEXT: paddd %mm0, %mm0806; X86-SSE-NEXT: movq %mm0, (%eax)807; X86-SSE-NEXT: retl808;809; X64-LABEL: build_v2f32_00:810; X64: # %bb.0:811; X64-NEXT: movdq2q %xmm0, %mm0812; X64-NEXT: pshufw $68, %mm0, %mm0 # mm0 = mm0[0,1,0,1]813; X64-NEXT: paddd %mm0, %mm0814; X64-NEXT: movq %mm0, (%rdi)815; X64-NEXT: retq816 %1 = insertelement <2 x float> undef, float %a0, i32 0817 %2 = insertelement <2 x float> %1, float %a0, i32 1818 %3 = bitcast <2 x float> %2 to <1 x i64>819 %4 = tail call <1 x i64> @llvm.x86.mmx.padd.d(<1 x i64> %3, <1 x i64> %3)820 store <1 x i64> %4, ptr%p0821 ret void822}823