749 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=i686-none-linux -fast-isel -fast-isel-abort=1 -mattr=+sse2 < %s | FileCheck %s --check-prefixes=X86,X86-SSE3; RUN: llc -mtriple=x86_64-none-linux -fast-isel -fast-isel-abort=1 -mattr=+sse2 < %s | FileCheck %s --check-prefixes=X64,X64-SSE4; RUN: llc -mtriple=i686-none-linux -fast-isel -fast-isel-abort=1 -mattr=+avx < %s | FileCheck %s --check-prefixes=X86,X86-AVX,X86-AVX15; RUN: llc -mtriple=x86_64-none-linux -fast-isel -fast-isel-abort=1 -mattr=+avx < %s | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX16; RUN: llc -mtriple=i686-none-linux -fast-isel -fast-isel-abort=1 -mattr=+avx512f < %s | FileCheck %s --check-prefixes=X86,X86-AVX,X86-AVX5127; RUN: llc -mtriple=x86_64-none-linux -fast-isel -fast-isel-abort=1 -mattr=+avx512f < %s | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX5128; RUN: llc -mtriple=i686-none-linux -fast-isel -fast-isel-abort=1 -mattr=+avx512f,+avx512dq,+avx512bw < %s | FileCheck %s --check-prefixes=X86,X86-AVX,X86-AVX5129; RUN: llc -mtriple=x86_64-none-linux -fast-isel -fast-isel-abort=1 -mattr=+avx512vl,+avx512dq,+avx512bw < %s | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX51210 11define i32 @test_store_32(ptr nocapture %addr, i32 %value) nounwind {12; X86-LABEL: test_store_32:13; X86: # %bb.0: # %entry14; X86-NEXT: movl {{[0-9]+}}(%esp), %eax15; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx16; X86-NEXT: movl %eax, (%ecx)17; X86-NEXT: retl18;19; X64-LABEL: test_store_32:20; X64: # %bb.0: # %entry21; X64-NEXT: movl %esi, %eax22; X64-NEXT: movl %esi, (%rdi)23; X64-NEXT: retq24entry:25 store i32 %value, ptr %addr, align 126 ret i32 %value27}28 29define i16 @test_store_16(ptr nocapture %addr, i16 %value) nounwind {30; X86-LABEL: test_store_16:31; X86: # %bb.0: # %entry32; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax33; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx34; X86-NEXT: movw %ax, (%ecx)35; X86-NEXT: retl36;37; X64-LABEL: test_store_16:38; X64: # %bb.0: # %entry39; X64-NEXT: movl %esi, %eax40; X64-NEXT: movw %ax, (%rdi)41; X64-NEXT: # kill: def $ax killed $ax killed $eax42; X64-NEXT: retq43entry:44 store i16 %value, ptr %addr, align 145 ret i16 %value46}47 48define <4 x i32> @test_store_4xi32(ptr nocapture %addr, <4 x i32> %value, <4 x i32> %value2) nounwind {49; X86-SSE-LABEL: test_store_4xi32:50; X86-SSE: # %bb.0:51; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax52; X86-SSE-NEXT: paddd %xmm1, %xmm053; X86-SSE-NEXT: movdqu %xmm0, (%eax)54; X86-SSE-NEXT: retl55;56; X64-SSE-LABEL: test_store_4xi32:57; X64-SSE: # %bb.0:58; X64-SSE-NEXT: paddd %xmm1, %xmm059; X64-SSE-NEXT: movdqu %xmm0, (%rdi)60; X64-SSE-NEXT: retq61;62; X86-AVX-LABEL: test_store_4xi32:63; X86-AVX: # %bb.0:64; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax65; X86-AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm066; X86-AVX-NEXT: vmovdqu %xmm0, (%eax)67; X86-AVX-NEXT: retl68;69; X64-AVX-LABEL: test_store_4xi32:70; X64-AVX: # %bb.0:71; X64-AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm072; X64-AVX-NEXT: vmovdqu %xmm0, (%rdi)73; X64-AVX-NEXT: retq74 %foo = add <4 x i32> %value, %value2 ; to force integer type on store75 store <4 x i32> %foo, ptr %addr, align 176 ret <4 x i32> %foo77}78 79define <4 x i32> @test_store_4xi32_aligned(ptr nocapture %addr, <4 x i32> %value, <4 x i32> %value2) nounwind {80; X86-SSE-LABEL: test_store_4xi32_aligned:81; X86-SSE: # %bb.0:82; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax83; X86-SSE-NEXT: paddd %xmm1, %xmm084; X86-SSE-NEXT: movdqa %xmm0, (%eax)85; X86-SSE-NEXT: retl86;87; X64-SSE-LABEL: test_store_4xi32_aligned:88; X64-SSE: # %bb.0:89; X64-SSE-NEXT: paddd %xmm1, %xmm090; X64-SSE-NEXT: movdqa %xmm0, (%rdi)91; X64-SSE-NEXT: retq92;93; X86-AVX-LABEL: test_store_4xi32_aligned:94; X86-AVX: # %bb.0:95; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax96; X86-AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm097; X86-AVX-NEXT: vmovdqa %xmm0, (%eax)98; X86-AVX-NEXT: retl99;100; X64-AVX-LABEL: test_store_4xi32_aligned:101; X64-AVX: # %bb.0:102; X64-AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm0103; X64-AVX-NEXT: vmovdqa %xmm0, (%rdi)104; X64-AVX-NEXT: retq105 %foo = add <4 x i32> %value, %value2 ; to force integer type on store106 store <4 x i32> %foo, ptr %addr, align 16107 ret <4 x i32> %foo108}109 110define <4 x float> @test_store_4xf32(ptr nocapture %addr, <4 x float> %value) nounwind {111; X86-SSE-LABEL: test_store_4xf32:112; X86-SSE: # %bb.0:113; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax114; X86-SSE-NEXT: movups %xmm0, (%eax)115; X86-SSE-NEXT: retl116;117; X64-SSE-LABEL: test_store_4xf32:118; X64-SSE: # %bb.0:119; X64-SSE-NEXT: movups %xmm0, (%rdi)120; X64-SSE-NEXT: retq121;122; X86-AVX-LABEL: test_store_4xf32:123; X86-AVX: # %bb.0:124; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax125; X86-AVX-NEXT: vmovups %xmm0, (%eax)126; X86-AVX-NEXT: retl127;128; X64-AVX-LABEL: test_store_4xf32:129; X64-AVX: # %bb.0:130; X64-AVX-NEXT: vmovups %xmm0, (%rdi)131; X64-AVX-NEXT: retq132 store <4 x float> %value, ptr %addr, align 1133 ret <4 x float> %value134}135 136define <4 x float> @test_store_4xf32_aligned(ptr nocapture %addr, <4 x float> %value) nounwind {137; X86-SSE-LABEL: test_store_4xf32_aligned:138; X86-SSE: # %bb.0:139; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax140; X86-SSE-NEXT: movaps %xmm0, (%eax)141; X86-SSE-NEXT: retl142;143; X64-SSE-LABEL: test_store_4xf32_aligned:144; X64-SSE: # %bb.0:145; X64-SSE-NEXT: movaps %xmm0, (%rdi)146; X64-SSE-NEXT: retq147;148; X86-AVX-LABEL: test_store_4xf32_aligned:149; X86-AVX: # %bb.0:150; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax151; X86-AVX-NEXT: vmovaps %xmm0, (%eax)152; X86-AVX-NEXT: retl153;154; X64-AVX-LABEL: test_store_4xf32_aligned:155; X64-AVX: # %bb.0:156; X64-AVX-NEXT: vmovaps %xmm0, (%rdi)157; X64-AVX-NEXT: retq158 store <4 x float> %value, ptr %addr, align 16159 ret <4 x float> %value160}161 162define <2 x double> @test_store_2xf64(ptr nocapture %addr, <2 x double> %value, <2 x double> %value2) nounwind {163; X86-SSE-LABEL: test_store_2xf64:164; X86-SSE: # %bb.0:165; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax166; X86-SSE-NEXT: addpd %xmm1, %xmm0167; X86-SSE-NEXT: movupd %xmm0, (%eax)168; X86-SSE-NEXT: retl169;170; X64-SSE-LABEL: test_store_2xf64:171; X64-SSE: # %bb.0:172; X64-SSE-NEXT: addpd %xmm1, %xmm0173; X64-SSE-NEXT: movupd %xmm0, (%rdi)174; X64-SSE-NEXT: retq175;176; X86-AVX-LABEL: test_store_2xf64:177; X86-AVX: # %bb.0:178; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax179; X86-AVX-NEXT: vaddpd %xmm1, %xmm0, %xmm0180; X86-AVX-NEXT: vmovupd %xmm0, (%eax)181; X86-AVX-NEXT: retl182;183; X64-AVX-LABEL: test_store_2xf64:184; X64-AVX: # %bb.0:185; X64-AVX-NEXT: vaddpd %xmm1, %xmm0, %xmm0186; X64-AVX-NEXT: vmovupd %xmm0, (%rdi)187; X64-AVX-NEXT: retq188 %foo = fadd <2 x double> %value, %value2 ; to force dobule type on store189 store <2 x double> %foo, ptr %addr, align 1190 ret <2 x double> %foo191}192 193define <2 x double> @test_store_2xf64_aligned(ptr nocapture %addr, <2 x double> %value, <2 x double> %value2) nounwind {194; X86-SSE-LABEL: test_store_2xf64_aligned:195; X86-SSE: # %bb.0:196; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax197; X86-SSE-NEXT: addpd %xmm1, %xmm0198; X86-SSE-NEXT: movapd %xmm0, (%eax)199; X86-SSE-NEXT: retl200;201; X64-SSE-LABEL: test_store_2xf64_aligned:202; X64-SSE: # %bb.0:203; X64-SSE-NEXT: addpd %xmm1, %xmm0204; X64-SSE-NEXT: movapd %xmm0, (%rdi)205; X64-SSE-NEXT: retq206;207; X86-AVX-LABEL: test_store_2xf64_aligned:208; X86-AVX: # %bb.0:209; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax210; X86-AVX-NEXT: vaddpd %xmm1, %xmm0, %xmm0211; X86-AVX-NEXT: vmovapd %xmm0, (%eax)212; X86-AVX-NEXT: retl213;214; X64-AVX-LABEL: test_store_2xf64_aligned:215; X64-AVX: # %bb.0:216; X64-AVX-NEXT: vaddpd %xmm1, %xmm0, %xmm0217; X64-AVX-NEXT: vmovapd %xmm0, (%rdi)218; X64-AVX-NEXT: retq219 %foo = fadd <2 x double> %value, %value2 ; to force dobule type on store220 store <2 x double> %foo, ptr %addr, align 16221 ret <2 x double> %foo222}223 224define <8 x i32> @test_store_8xi32(ptr nocapture %addr, <8 x i32> %value) nounwind {225; X86-SSE-LABEL: test_store_8xi32:226; X86-SSE: # %bb.0:227; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax228; X86-SSE-NEXT: movups %xmm0, (%eax)229; X86-SSE-NEXT: movups %xmm1, 16(%eax)230; X86-SSE-NEXT: retl231;232; X64-SSE-LABEL: test_store_8xi32:233; X64-SSE: # %bb.0:234; X64-SSE-NEXT: movups %xmm0, (%rdi)235; X64-SSE-NEXT: movups %xmm1, 16(%rdi)236; X64-SSE-NEXT: retq237;238; X86-AVX-LABEL: test_store_8xi32:239; X86-AVX: # %bb.0:240; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax241; X86-AVX-NEXT: vmovups %ymm0, (%eax)242; X86-AVX-NEXT: retl243;244; X64-AVX-LABEL: test_store_8xi32:245; X64-AVX: # %bb.0:246; X64-AVX-NEXT: vmovups %ymm0, (%rdi)247; X64-AVX-NEXT: retq248 store <8 x i32> %value, ptr %addr, align 1249 ret <8 x i32> %value250}251 252define <8 x i32> @test_store_8xi32_aligned(ptr nocapture %addr, <8 x i32> %value) nounwind {253; X86-SSE-LABEL: test_store_8xi32_aligned:254; X86-SSE: # %bb.0:255; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax256; X86-SSE-NEXT: movaps %xmm0, (%eax)257; X86-SSE-NEXT: movaps %xmm1, 16(%eax)258; X86-SSE-NEXT: retl259;260; X64-SSE-LABEL: test_store_8xi32_aligned:261; X64-SSE: # %bb.0:262; X64-SSE-NEXT: movaps %xmm0, (%rdi)263; X64-SSE-NEXT: movaps %xmm1, 16(%rdi)264; X64-SSE-NEXT: retq265;266; X86-AVX-LABEL: test_store_8xi32_aligned:267; X86-AVX: # %bb.0:268; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax269; X86-AVX-NEXT: vmovaps %ymm0, (%eax)270; X86-AVX-NEXT: retl271;272; X64-AVX-LABEL: test_store_8xi32_aligned:273; X64-AVX: # %bb.0:274; X64-AVX-NEXT: vmovaps %ymm0, (%rdi)275; X64-AVX-NEXT: retq276 store <8 x i32> %value, ptr %addr, align 32277 ret <8 x i32> %value278}279 280define <8 x float> @test_store_8xf32(ptr nocapture %addr, <8 x float> %value) nounwind {281; X86-SSE-LABEL: test_store_8xf32:282; X86-SSE: # %bb.0:283; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax284; X86-SSE-NEXT: movups %xmm0, (%eax)285; X86-SSE-NEXT: movups %xmm1, 16(%eax)286; X86-SSE-NEXT: retl287;288; X64-SSE-LABEL: test_store_8xf32:289; X64-SSE: # %bb.0:290; X64-SSE-NEXT: movups %xmm0, (%rdi)291; X64-SSE-NEXT: movups %xmm1, 16(%rdi)292; X64-SSE-NEXT: retq293;294; X86-AVX-LABEL: test_store_8xf32:295; X86-AVX: # %bb.0:296; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax297; X86-AVX-NEXT: vmovups %ymm0, (%eax)298; X86-AVX-NEXT: retl299;300; X64-AVX-LABEL: test_store_8xf32:301; X64-AVX: # %bb.0:302; X64-AVX-NEXT: vmovups %ymm0, (%rdi)303; X64-AVX-NEXT: retq304 store <8 x float> %value, ptr %addr, align 1305 ret <8 x float> %value306}307 308define <8 x float> @test_store_8xf32_aligned(ptr nocapture %addr, <8 x float> %value) nounwind {309; X86-SSE-LABEL: test_store_8xf32_aligned:310; X86-SSE: # %bb.0:311; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax312; X86-SSE-NEXT: movaps %xmm0, (%eax)313; X86-SSE-NEXT: movaps %xmm1, 16(%eax)314; X86-SSE-NEXT: retl315;316; X64-SSE-LABEL: test_store_8xf32_aligned:317; X64-SSE: # %bb.0:318; X64-SSE-NEXT: movaps %xmm0, (%rdi)319; X64-SSE-NEXT: movaps %xmm1, 16(%rdi)320; X64-SSE-NEXT: retq321;322; X86-AVX-LABEL: test_store_8xf32_aligned:323; X86-AVX: # %bb.0:324; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax325; X86-AVX-NEXT: vmovaps %ymm0, (%eax)326; X86-AVX-NEXT: retl327;328; X64-AVX-LABEL: test_store_8xf32_aligned:329; X64-AVX: # %bb.0:330; X64-AVX-NEXT: vmovaps %ymm0, (%rdi)331; X64-AVX-NEXT: retq332 store <8 x float> %value, ptr %addr, align 32333 ret <8 x float> %value334}335 336define <4 x double> @test_store_4xf64(ptr nocapture %addr, <4 x double> %value, <4 x double> %value2) nounwind {337; X86-SSE-LABEL: test_store_4xf64:338; X86-SSE: # %bb.0:339; X86-SSE-NEXT: subl $12, %esp340; X86-SSE-NEXT: movapd {{[0-9]+}}(%esp), %xmm3341; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax342; X86-SSE-NEXT: addpd %xmm2, %xmm0343; X86-SSE-NEXT: movupd %xmm0, (%eax)344; X86-SSE-NEXT: addpd %xmm3, %xmm1345; X86-SSE-NEXT: movupd %xmm1, 16(%eax)346; X86-SSE-NEXT: addl $12, %esp347; X86-SSE-NEXT: retl348;349; X64-SSE-LABEL: test_store_4xf64:350; X64-SSE: # %bb.0:351; X64-SSE-NEXT: addpd %xmm2, %xmm0352; X64-SSE-NEXT: movupd %xmm0, (%rdi)353; X64-SSE-NEXT: addpd %xmm3, %xmm1354; X64-SSE-NEXT: movupd %xmm1, 16(%rdi)355; X64-SSE-NEXT: retq356;357; X86-AVX-LABEL: test_store_4xf64:358; X86-AVX: # %bb.0:359; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax360; X86-AVX-NEXT: vaddpd %ymm1, %ymm0, %ymm0361; X86-AVX-NEXT: vmovupd %ymm0, (%eax)362; X86-AVX-NEXT: retl363;364; X64-AVX-LABEL: test_store_4xf64:365; X64-AVX: # %bb.0:366; X64-AVX-NEXT: vaddpd %ymm1, %ymm0, %ymm0367; X64-AVX-NEXT: vmovupd %ymm0, (%rdi)368; X64-AVX-NEXT: retq369 %foo = fadd <4 x double> %value, %value2 ; to force dobule type on store370 store <4 x double> %foo, ptr %addr, align 1371 ret <4 x double> %foo372}373 374define <4 x double> @test_store_4xf64_aligned(ptr nocapture %addr, <4 x double> %value, <4 x double> %value2) nounwind {375; X86-SSE-LABEL: test_store_4xf64_aligned:376; X86-SSE: # %bb.0:377; X86-SSE-NEXT: subl $12, %esp378; X86-SSE-NEXT: movapd {{[0-9]+}}(%esp), %xmm3379; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax380; X86-SSE-NEXT: addpd %xmm2, %xmm0381; X86-SSE-NEXT: movapd %xmm0, (%eax)382; X86-SSE-NEXT: addpd %xmm3, %xmm1383; X86-SSE-NEXT: movapd %xmm1, 16(%eax)384; X86-SSE-NEXT: addl $12, %esp385; X86-SSE-NEXT: retl386;387; X64-SSE-LABEL: test_store_4xf64_aligned:388; X64-SSE: # %bb.0:389; X64-SSE-NEXT: addpd %xmm2, %xmm0390; X64-SSE-NEXT: movapd %xmm0, (%rdi)391; X64-SSE-NEXT: addpd %xmm3, %xmm1392; X64-SSE-NEXT: movapd %xmm1, 16(%rdi)393; X64-SSE-NEXT: retq394;395; X86-AVX-LABEL: test_store_4xf64_aligned:396; X86-AVX: # %bb.0:397; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax398; X86-AVX-NEXT: vaddpd %ymm1, %ymm0, %ymm0399; X86-AVX-NEXT: vmovapd %ymm0, (%eax)400; X86-AVX-NEXT: retl401;402; X64-AVX-LABEL: test_store_4xf64_aligned:403; X64-AVX: # %bb.0:404; X64-AVX-NEXT: vaddpd %ymm1, %ymm0, %ymm0405; X64-AVX-NEXT: vmovapd %ymm0, (%rdi)406; X64-AVX-NEXT: retq407 %foo = fadd <4 x double> %value, %value2 ; to force dobule type on store408 store <4 x double> %foo, ptr %addr, align 32409 ret <4 x double> %foo410}411 412define <16 x i32> @test_store_16xi32(ptr nocapture %addr, <16 x i32> %value) nounwind {413; X86-SSE-LABEL: test_store_16xi32:414; X86-SSE: # %bb.0:415; X86-SSE-NEXT: subl $12, %esp416; X86-SSE-NEXT: movaps {{[0-9]+}}(%esp), %xmm3417; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax418; X86-SSE-NEXT: movups %xmm0, (%eax)419; X86-SSE-NEXT: movups %xmm1, 16(%eax)420; X86-SSE-NEXT: movups %xmm2, 32(%eax)421; X86-SSE-NEXT: movups %xmm3, 48(%eax)422; X86-SSE-NEXT: addl $12, %esp423; X86-SSE-NEXT: retl424;425; X64-SSE-LABEL: test_store_16xi32:426; X64-SSE: # %bb.0:427; X64-SSE-NEXT: movups %xmm0, (%rdi)428; X64-SSE-NEXT: movups %xmm1, 16(%rdi)429; X64-SSE-NEXT: movups %xmm2, 32(%rdi)430; X64-SSE-NEXT: movups %xmm3, 48(%rdi)431; X64-SSE-NEXT: retq432;433; X86-AVX1-LABEL: test_store_16xi32:434; X86-AVX1: # %bb.0:435; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax436; X86-AVX1-NEXT: vmovups %ymm0, (%eax)437; X86-AVX1-NEXT: vmovups %ymm1, 32(%eax)438; X86-AVX1-NEXT: retl439;440; X64-AVX1-LABEL: test_store_16xi32:441; X64-AVX1: # %bb.0:442; X64-AVX1-NEXT: vmovups %ymm0, (%rdi)443; X64-AVX1-NEXT: vmovups %ymm1, 32(%rdi)444; X64-AVX1-NEXT: retq445;446; X86-AVX512-LABEL: test_store_16xi32:447; X86-AVX512: # %bb.0:448; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax449; X86-AVX512-NEXT: vmovups %zmm0, (%eax)450; X86-AVX512-NEXT: retl451;452; X64-AVX512-LABEL: test_store_16xi32:453; X64-AVX512: # %bb.0:454; X64-AVX512-NEXT: vmovups %zmm0, (%rdi)455; X64-AVX512-NEXT: retq456 store <16 x i32> %value, ptr %addr, align 1457 ret <16 x i32> %value458}459 460define <16 x i32> @test_store_16xi32_aligned(ptr nocapture %addr, <16 x i32> %value) nounwind {461; X86-SSE-LABEL: test_store_16xi32_aligned:462; X86-SSE: # %bb.0:463; X86-SSE-NEXT: subl $12, %esp464; X86-SSE-NEXT: movaps {{[0-9]+}}(%esp), %xmm3465; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax466; X86-SSE-NEXT: movaps %xmm0, (%eax)467; X86-SSE-NEXT: movaps %xmm1, 16(%eax)468; X86-SSE-NEXT: movaps %xmm2, 32(%eax)469; X86-SSE-NEXT: movaps %xmm3, 48(%eax)470; X86-SSE-NEXT: addl $12, %esp471; X86-SSE-NEXT: retl472;473; X64-SSE-LABEL: test_store_16xi32_aligned:474; X64-SSE: # %bb.0:475; X64-SSE-NEXT: movaps %xmm0, (%rdi)476; X64-SSE-NEXT: movaps %xmm1, 16(%rdi)477; X64-SSE-NEXT: movaps %xmm2, 32(%rdi)478; X64-SSE-NEXT: movaps %xmm3, 48(%rdi)479; X64-SSE-NEXT: retq480;481; X86-AVX1-LABEL: test_store_16xi32_aligned:482; X86-AVX1: # %bb.0:483; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax484; X86-AVX1-NEXT: vmovaps %ymm0, (%eax)485; X86-AVX1-NEXT: vmovaps %ymm1, 32(%eax)486; X86-AVX1-NEXT: retl487;488; X64-AVX1-LABEL: test_store_16xi32_aligned:489; X64-AVX1: # %bb.0:490; X64-AVX1-NEXT: vmovaps %ymm0, (%rdi)491; X64-AVX1-NEXT: vmovaps %ymm1, 32(%rdi)492; X64-AVX1-NEXT: retq493;494; X86-AVX512-LABEL: test_store_16xi32_aligned:495; X86-AVX512: # %bb.0:496; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax497; X86-AVX512-NEXT: vmovaps %zmm0, (%eax)498; X86-AVX512-NEXT: retl499;500; X64-AVX512-LABEL: test_store_16xi32_aligned:501; X64-AVX512: # %bb.0:502; X64-AVX512-NEXT: vmovaps %zmm0, (%rdi)503; X64-AVX512-NEXT: retq504 store <16 x i32> %value, ptr %addr, align 64505 ret <16 x i32> %value506}507 508define <16 x float> @test_store_16xf32(ptr nocapture %addr, <16 x float> %value) nounwind {509; X86-SSE-LABEL: test_store_16xf32:510; X86-SSE: # %bb.0:511; X86-SSE-NEXT: subl $12, %esp512; X86-SSE-NEXT: movaps {{[0-9]+}}(%esp), %xmm3513; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax514; X86-SSE-NEXT: movups %xmm0, (%eax)515; X86-SSE-NEXT: movups %xmm1, 16(%eax)516; X86-SSE-NEXT: movups %xmm2, 32(%eax)517; X86-SSE-NEXT: movups %xmm3, 48(%eax)518; X86-SSE-NEXT: addl $12, %esp519; X86-SSE-NEXT: retl520;521; X64-SSE-LABEL: test_store_16xf32:522; X64-SSE: # %bb.0:523; X64-SSE-NEXT: movups %xmm0, (%rdi)524; X64-SSE-NEXT: movups %xmm1, 16(%rdi)525; X64-SSE-NEXT: movups %xmm2, 32(%rdi)526; X64-SSE-NEXT: movups %xmm3, 48(%rdi)527; X64-SSE-NEXT: retq528;529; X86-AVX1-LABEL: test_store_16xf32:530; X86-AVX1: # %bb.0:531; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax532; X86-AVX1-NEXT: vmovups %ymm0, (%eax)533; X86-AVX1-NEXT: vmovups %ymm1, 32(%eax)534; X86-AVX1-NEXT: retl535;536; X64-AVX1-LABEL: test_store_16xf32:537; X64-AVX1: # %bb.0:538; X64-AVX1-NEXT: vmovups %ymm0, (%rdi)539; X64-AVX1-NEXT: vmovups %ymm1, 32(%rdi)540; X64-AVX1-NEXT: retq541;542; X86-AVX512-LABEL: test_store_16xf32:543; X86-AVX512: # %bb.0:544; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax545; X86-AVX512-NEXT: vmovups %zmm0, (%eax)546; X86-AVX512-NEXT: retl547;548; X64-AVX512-LABEL: test_store_16xf32:549; X64-AVX512: # %bb.0:550; X64-AVX512-NEXT: vmovups %zmm0, (%rdi)551; X64-AVX512-NEXT: retq552 store <16 x float> %value, ptr %addr, align 1553 ret <16 x float> %value554}555 556define <16 x float> @test_store_16xf32_aligned(ptr nocapture %addr, <16 x float> %value) nounwind {557; X86-SSE-LABEL: test_store_16xf32_aligned:558; X86-SSE: # %bb.0:559; X86-SSE-NEXT: subl $12, %esp560; X86-SSE-NEXT: movaps {{[0-9]+}}(%esp), %xmm3561; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax562; X86-SSE-NEXT: movaps %xmm0, (%eax)563; X86-SSE-NEXT: movaps %xmm1, 16(%eax)564; X86-SSE-NEXT: movaps %xmm2, 32(%eax)565; X86-SSE-NEXT: movaps %xmm3, 48(%eax)566; X86-SSE-NEXT: addl $12, %esp567; X86-SSE-NEXT: retl568;569; X64-SSE-LABEL: test_store_16xf32_aligned:570; X64-SSE: # %bb.0:571; X64-SSE-NEXT: movaps %xmm0, (%rdi)572; X64-SSE-NEXT: movaps %xmm1, 16(%rdi)573; X64-SSE-NEXT: movaps %xmm2, 32(%rdi)574; X64-SSE-NEXT: movaps %xmm3, 48(%rdi)575; X64-SSE-NEXT: retq576;577; X86-AVX1-LABEL: test_store_16xf32_aligned:578; X86-AVX1: # %bb.0:579; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax580; X86-AVX1-NEXT: vmovaps %ymm0, (%eax)581; X86-AVX1-NEXT: vmovaps %ymm1, 32(%eax)582; X86-AVX1-NEXT: retl583;584; X64-AVX1-LABEL: test_store_16xf32_aligned:585; X64-AVX1: # %bb.0:586; X64-AVX1-NEXT: vmovaps %ymm0, (%rdi)587; X64-AVX1-NEXT: vmovaps %ymm1, 32(%rdi)588; X64-AVX1-NEXT: retq589;590; X86-AVX512-LABEL: test_store_16xf32_aligned:591; X86-AVX512: # %bb.0:592; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax593; X86-AVX512-NEXT: vmovaps %zmm0, (%eax)594; X86-AVX512-NEXT: retl595;596; X64-AVX512-LABEL: test_store_16xf32_aligned:597; X64-AVX512: # %bb.0:598; X64-AVX512-NEXT: vmovaps %zmm0, (%rdi)599; X64-AVX512-NEXT: retq600 store <16 x float> %value, ptr %addr, align 64601 ret <16 x float> %value602}603 604define <8 x double> @test_store_8xf64(ptr nocapture %addr, <8 x double> %value, <8 x double> %value2) nounwind {605; X86-SSE-LABEL: test_store_8xf64:606; X86-SSE: # %bb.0:607; X86-SSE-NEXT: subl $12, %esp608; X86-SSE-NEXT: movapd {{[0-9]+}}(%esp), %xmm4609; X86-SSE-NEXT: movapd {{[0-9]+}}(%esp), %xmm5610; X86-SSE-NEXT: movapd {{[0-9]+}}(%esp), %xmm6611; X86-SSE-NEXT: movapd {{[0-9]+}}(%esp), %xmm3612; X86-SSE-NEXT: addpd %xmm4, %xmm3613; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax614; X86-SSE-NEXT: addpd {{[0-9]+}}(%esp), %xmm0615; X86-SSE-NEXT: movupd %xmm0, (%eax)616; X86-SSE-NEXT: addpd %xmm6, %xmm1617; X86-SSE-NEXT: movupd %xmm1, 16(%eax)618; X86-SSE-NEXT: addpd %xmm5, %xmm2619; X86-SSE-NEXT: movupd %xmm2, 32(%eax)620; X86-SSE-NEXT: movupd %xmm3, 48(%eax)621; X86-SSE-NEXT: addl $12, %esp622; X86-SSE-NEXT: retl623;624; X64-SSE-LABEL: test_store_8xf64:625; X64-SSE: # %bb.0:626; X64-SSE-NEXT: addpd %xmm4, %xmm0627; X64-SSE-NEXT: movupd %xmm0, (%rdi)628; X64-SSE-NEXT: addpd %xmm5, %xmm1629; X64-SSE-NEXT: movupd %xmm1, 16(%rdi)630; X64-SSE-NEXT: addpd %xmm6, %xmm2631; X64-SSE-NEXT: movupd %xmm2, 32(%rdi)632; X64-SSE-NEXT: addpd %xmm7, %xmm3633; X64-SSE-NEXT: movupd %xmm3, 48(%rdi)634; X64-SSE-NEXT: retq635;636; X86-AVX1-LABEL: test_store_8xf64:637; X86-AVX1: # %bb.0:638; X86-AVX1-NEXT: pushl %ebp639; X86-AVX1-NEXT: movl %esp, %ebp640; X86-AVX1-NEXT: andl $-32, %esp641; X86-AVX1-NEXT: subl $32, %esp642; X86-AVX1-NEXT: vmovapd 40(%ebp), %ymm3643; X86-AVX1-NEXT: movl 8(%ebp), %eax644; X86-AVX1-NEXT: vaddpd %ymm2, %ymm0, %ymm0645; X86-AVX1-NEXT: vmovupd %ymm0, (%eax)646; X86-AVX1-NEXT: vaddpd %ymm3, %ymm1, %ymm1647; X86-AVX1-NEXT: vmovupd %ymm1, 32(%eax)648; X86-AVX1-NEXT: movl %ebp, %esp649; X86-AVX1-NEXT: popl %ebp650; X86-AVX1-NEXT: retl651;652; X64-AVX1-LABEL: test_store_8xf64:653; X64-AVX1: # %bb.0:654; X64-AVX1-NEXT: vaddpd %ymm2, %ymm0, %ymm0655; X64-AVX1-NEXT: vmovupd %ymm0, (%rdi)656; X64-AVX1-NEXT: vaddpd %ymm3, %ymm1, %ymm1657; X64-AVX1-NEXT: vmovupd %ymm1, 32(%rdi)658; X64-AVX1-NEXT: retq659;660; X86-AVX512-LABEL: test_store_8xf64:661; X86-AVX512: # %bb.0:662; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax663; X86-AVX512-NEXT: vaddpd %zmm1, %zmm0, %zmm0664; X86-AVX512-NEXT: vmovupd %zmm0, (%eax)665; X86-AVX512-NEXT: retl666;667; X64-AVX512-LABEL: test_store_8xf64:668; X64-AVX512: # %bb.0:669; X64-AVX512-NEXT: vaddpd %zmm1, %zmm0, %zmm0670; X64-AVX512-NEXT: vmovupd %zmm0, (%rdi)671; X64-AVX512-NEXT: retq672 %foo = fadd <8 x double> %value, %value2 ; to force dobule type on store673 store <8 x double> %foo, ptr %addr, align 1674 ret <8 x double> %foo675}676 677define <8 x double> @test_store_8xf64_aligned(ptr nocapture %addr, <8 x double> %value, <8 x double> %value2) nounwind {678; X86-SSE-LABEL: test_store_8xf64_aligned:679; X86-SSE: # %bb.0:680; X86-SSE-NEXT: subl $12, %esp681; X86-SSE-NEXT: movapd {{[0-9]+}}(%esp), %xmm4682; X86-SSE-NEXT: movapd {{[0-9]+}}(%esp), %xmm5683; X86-SSE-NEXT: movapd {{[0-9]+}}(%esp), %xmm6684; X86-SSE-NEXT: movapd {{[0-9]+}}(%esp), %xmm3685; X86-SSE-NEXT: addpd %xmm4, %xmm3686; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax687; X86-SSE-NEXT: addpd {{[0-9]+}}(%esp), %xmm0688; X86-SSE-NEXT: movapd %xmm0, (%eax)689; X86-SSE-NEXT: addpd %xmm6, %xmm1690; X86-SSE-NEXT: movapd %xmm1, 16(%eax)691; X86-SSE-NEXT: addpd %xmm5, %xmm2692; X86-SSE-NEXT: movapd %xmm2, 32(%eax)693; X86-SSE-NEXT: movapd %xmm3, 48(%eax)694; X86-SSE-NEXT: addl $12, %esp695; X86-SSE-NEXT: retl696;697; X64-SSE-LABEL: test_store_8xf64_aligned:698; X64-SSE: # %bb.0:699; X64-SSE-NEXT: addpd %xmm4, %xmm0700; X64-SSE-NEXT: movapd %xmm0, (%rdi)701; X64-SSE-NEXT: addpd %xmm5, %xmm1702; X64-SSE-NEXT: movapd %xmm1, 16(%rdi)703; X64-SSE-NEXT: addpd %xmm6, %xmm2704; X64-SSE-NEXT: movapd %xmm2, 32(%rdi)705; X64-SSE-NEXT: addpd %xmm7, %xmm3706; X64-SSE-NEXT: movapd %xmm3, 48(%rdi)707; X64-SSE-NEXT: retq708;709; X86-AVX1-LABEL: test_store_8xf64_aligned:710; X86-AVX1: # %bb.0:711; X86-AVX1-NEXT: pushl %ebp712; X86-AVX1-NEXT: movl %esp, %ebp713; X86-AVX1-NEXT: andl $-32, %esp714; X86-AVX1-NEXT: subl $32, %esp715; X86-AVX1-NEXT: vmovapd 40(%ebp), %ymm3716; X86-AVX1-NEXT: movl 8(%ebp), %eax717; X86-AVX1-NEXT: vaddpd %ymm2, %ymm0, %ymm0718; X86-AVX1-NEXT: vmovapd %ymm0, (%eax)719; X86-AVX1-NEXT: vaddpd %ymm3, %ymm1, %ymm1720; X86-AVX1-NEXT: vmovapd %ymm1, 32(%eax)721; X86-AVX1-NEXT: movl %ebp, %esp722; X86-AVX1-NEXT: popl %ebp723; X86-AVX1-NEXT: retl724;725; X64-AVX1-LABEL: test_store_8xf64_aligned:726; X64-AVX1: # %bb.0:727; X64-AVX1-NEXT: vaddpd %ymm2, %ymm0, %ymm0728; X64-AVX1-NEXT: vmovapd %ymm0, (%rdi)729; X64-AVX1-NEXT: vaddpd %ymm3, %ymm1, %ymm1730; X64-AVX1-NEXT: vmovapd %ymm1, 32(%rdi)731; X64-AVX1-NEXT: retq732;733; X86-AVX512-LABEL: test_store_8xf64_aligned:734; X86-AVX512: # %bb.0:735; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax736; X86-AVX512-NEXT: vaddpd %zmm1, %zmm0, %zmm0737; X86-AVX512-NEXT: vmovapd %zmm0, (%eax)738; X86-AVX512-NEXT: retl739;740; X64-AVX512-LABEL: test_store_8xf64_aligned:741; X64-AVX512: # %bb.0:742; X64-AVX512-NEXT: vaddpd %zmm1, %zmm0, %zmm0743; X64-AVX512-NEXT: vmovapd %zmm0, (%rdi)744; X64-AVX512-NEXT: retq745 %foo = fadd <8 x double> %value, %value2 ; to force dobule type on store746 store <8 x double> %foo, ptr %addr, align 64747 ret <8 x double> %foo748}749