238 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-linux -mattr=+sse4.2 | FileCheck %s --check-prefix=X86-SSE3; RUN: llc < %s -mtriple=i686-linux -mattr=+avx | FileCheck %s --check-prefix=X86-AVX4; RUN: llc < %s -mtriple=i686-linux -mattr=+avx2 | FileCheck %s --check-prefix=X86-AVX5; RUN: llc < %s -mtriple=x86_64-linux -mattr=+sse4.2 | FileCheck %s --check-prefix=X64-SSE6; RUN: llc < %s -mtriple=x86_64-linux -mattr=+avx | FileCheck %s --check-prefix=X64-AVX7; RUN: llc < %s -mtriple=x86_64-linux -mattr=+avx2 | FileCheck %s --check-prefix=X64-AVX8 9; PR2770810 11define <7 x i64> @load7_aligned(ptr %x) nounwind {12; X86-SSE-LABEL: load7_aligned:13; X86-SSE: # %bb.0:14; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax15; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx16; X86-SSE-NEXT: movaps (%ecx), %xmm017; X86-SSE-NEXT: movaps 16(%ecx), %xmm118; X86-SSE-NEXT: movaps 32(%ecx), %xmm219; X86-SSE-NEXT: movl 48(%ecx), %edx20; X86-SSE-NEXT: movl 52(%ecx), %ecx21; X86-SSE-NEXT: movl %ecx, 52(%eax)22; X86-SSE-NEXT: movl %edx, 48(%eax)23; X86-SSE-NEXT: movaps %xmm2, 32(%eax)24; X86-SSE-NEXT: movaps %xmm1, 16(%eax)25; X86-SSE-NEXT: movaps %xmm0, (%eax)26; X86-SSE-NEXT: retl $427;28; X86-AVX-LABEL: load7_aligned:29; X86-AVX: # %bb.0:30; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax31; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx32; X86-AVX-NEXT: vmovaps (%ecx), %ymm033; X86-AVX-NEXT: vmovaps 48(%ecx), %xmm134; X86-AVX-NEXT: vextractps $1, %xmm1, 52(%eax)35; X86-AVX-NEXT: vmovss %xmm1, 48(%eax)36; X86-AVX-NEXT: vmovaps 32(%ecx), %xmm137; X86-AVX-NEXT: vmovaps %xmm1, 32(%eax)38; X86-AVX-NEXT: vmovaps %ymm0, (%eax)39; X86-AVX-NEXT: vzeroupper40; X86-AVX-NEXT: retl $441;42; X64-SSE-LABEL: load7_aligned:43; X64-SSE: # %bb.0:44; X64-SSE-NEXT: movq %rdi, %rax45; X64-SSE-NEXT: movaps (%rsi), %xmm046; X64-SSE-NEXT: movaps 16(%rsi), %xmm147; X64-SSE-NEXT: movaps 32(%rsi), %xmm248; X64-SSE-NEXT: movq 48(%rsi), %rcx49; X64-SSE-NEXT: movq %rcx, 48(%rdi)50; X64-SSE-NEXT: movaps %xmm2, 32(%rdi)51; X64-SSE-NEXT: movaps %xmm1, 16(%rdi)52; X64-SSE-NEXT: movaps %xmm0, (%rdi)53; X64-SSE-NEXT: retq54;55; X64-AVX-LABEL: load7_aligned:56; X64-AVX: # %bb.0:57; X64-AVX-NEXT: movq %rdi, %rax58; X64-AVX-NEXT: vmovaps (%rsi), %ymm059; X64-AVX-NEXT: movq 48(%rsi), %rcx60; X64-AVX-NEXT: movq %rcx, 48(%rdi)61; X64-AVX-NEXT: vmovaps 32(%rsi), %xmm162; X64-AVX-NEXT: vmovaps %xmm1, 32(%rdi)63; X64-AVX-NEXT: vmovaps %ymm0, (%rdi)64; X64-AVX-NEXT: vzeroupper65; X64-AVX-NEXT: retq66 %x1 = load <7 x i64>, ptr %x67 ret <7 x i64> %x168}69 70define <7 x i64> @load7_unaligned(ptr %x) nounwind {71; X86-SSE-LABEL: load7_unaligned:72; X86-SSE: # %bb.0:73; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax74; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx75; X86-SSE-NEXT: movups (%ecx), %xmm076; X86-SSE-NEXT: movups 16(%ecx), %xmm177; X86-SSE-NEXT: movups 32(%ecx), %xmm278; X86-SSE-NEXT: movl 48(%ecx), %edx79; X86-SSE-NEXT: movl 52(%ecx), %ecx80; X86-SSE-NEXT: movl %ecx, 52(%eax)81; X86-SSE-NEXT: movl %edx, 48(%eax)82; X86-SSE-NEXT: movaps %xmm2, 32(%eax)83; X86-SSE-NEXT: movaps %xmm1, 16(%eax)84; X86-SSE-NEXT: movaps %xmm0, (%eax)85; X86-SSE-NEXT: retl $486;87; X86-AVX-LABEL: load7_unaligned:88; X86-AVX: # %bb.0:89; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax90; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx91; X86-AVX-NEXT: vmovups (%ecx), %ymm092; X86-AVX-NEXT: vmovups 32(%ecx), %xmm193; X86-AVX-NEXT: movl 48(%ecx), %edx94; X86-AVX-NEXT: movl 52(%ecx), %ecx95; X86-AVX-NEXT: movl %ecx, 52(%eax)96; X86-AVX-NEXT: movl %edx, 48(%eax)97; X86-AVX-NEXT: vmovaps %xmm1, 32(%eax)98; X86-AVX-NEXT: vmovaps %ymm0, (%eax)99; X86-AVX-NEXT: vzeroupper100; X86-AVX-NEXT: retl $4101;102; X64-SSE-LABEL: load7_unaligned:103; X64-SSE: # %bb.0:104; X64-SSE-NEXT: movq %rdi, %rax105; X64-SSE-NEXT: movups (%rsi), %xmm0106; X64-SSE-NEXT: movups 16(%rsi), %xmm1107; X64-SSE-NEXT: movups 32(%rsi), %xmm2108; X64-SSE-NEXT: movq 48(%rsi), %rcx109; X64-SSE-NEXT: movq %rcx, 48(%rdi)110; X64-SSE-NEXT: movaps %xmm2, 32(%rdi)111; X64-SSE-NEXT: movaps %xmm1, 16(%rdi)112; X64-SSE-NEXT: movaps %xmm0, (%rdi)113; X64-SSE-NEXT: retq114;115; X64-AVX-LABEL: load7_unaligned:116; X64-AVX: # %bb.0:117; X64-AVX-NEXT: movq %rdi, %rax118; X64-AVX-NEXT: vmovups (%rsi), %ymm0119; X64-AVX-NEXT: vmovups 32(%rsi), %xmm1120; X64-AVX-NEXT: movq 48(%rsi), %rcx121; X64-AVX-NEXT: movq %rcx, 48(%rdi)122; X64-AVX-NEXT: vmovaps %xmm1, 32(%rdi)123; X64-AVX-NEXT: vmovaps %ymm0, (%rdi)124; X64-AVX-NEXT: vzeroupper125; X64-AVX-NEXT: retq126 %x1 = load <7 x i64>, ptr %x, align 1127 ret <7 x i64> %x1128}129 130; PR42305 - https://bugs.llvm.org/show_bug.cgi?id=42305131 132define void @load_split(ptr %ld, ptr %st1, ptr %st2) nounwind {133; X86-SSE-LABEL: load_split:134; X86-SSE: # %bb.0:135; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax136; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx137; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edx138; X86-SSE-NEXT: movups (%edx), %xmm0139; X86-SSE-NEXT: movups 16(%edx), %xmm1140; X86-SSE-NEXT: movups %xmm0, (%ecx)141; X86-SSE-NEXT: movups %xmm1, (%eax)142; X86-SSE-NEXT: retl143;144; X86-AVX-LABEL: load_split:145; X86-AVX: # %bb.0:146; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax147; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx148; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %edx149; X86-AVX-NEXT: vmovups (%edx), %ymm0150; X86-AVX-NEXT: vmovups %xmm0, (%ecx)151; X86-AVX-NEXT: vextractf128 $1, %ymm0, (%eax)152; X86-AVX-NEXT: vzeroupper153; X86-AVX-NEXT: retl154;155; X64-SSE-LABEL: load_split:156; X64-SSE: # %bb.0:157; X64-SSE-NEXT: movups (%rdi), %xmm0158; X64-SSE-NEXT: movups 16(%rdi), %xmm1159; X64-SSE-NEXT: movups %xmm0, (%rsi)160; X64-SSE-NEXT: movups %xmm1, (%rdx)161; X64-SSE-NEXT: retq162;163; X64-AVX-LABEL: load_split:164; X64-AVX: # %bb.0:165; X64-AVX-NEXT: vmovups (%rdi), %ymm0166; X64-AVX-NEXT: vmovups %xmm0, (%rsi)167; X64-AVX-NEXT: vextractf128 $1, %ymm0, (%rdx)168; X64-AVX-NEXT: vzeroupper169; X64-AVX-NEXT: retq170 %t256 = load <8 x float>, ptr %ld, align 1171 %b128 = shufflevector <8 x float> %t256, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>172 store <4 x float> %b128, ptr %st1, align 1173 %t128 = shufflevector <8 x float> %t256, <8 x float> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>174 store <4 x float> %t128, ptr %st2, align 1175 ret void176}177 178define void @load_split_more(ptr %src, ptr %idx, ptr %dst) nounwind {179; X86-SSE-LABEL: load_split_more:180; X86-SSE: # %bb.0:181; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax182; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx183; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edx184; X86-SSE-NEXT: movups (%edx), %xmm0185; X86-SSE-NEXT: movups 16(%edx), %xmm1186; X86-SSE-NEXT: movl (%ecx), %edx187; X86-SSE-NEXT: movups %xmm0, (%eax,%edx,4)188; X86-SSE-NEXT: movl 4(%ecx), %ecx189; X86-SSE-NEXT: movups %xmm1, (%eax,%ecx,4)190; X86-SSE-NEXT: retl191;192; X86-AVX-LABEL: load_split_more:193; X86-AVX: # %bb.0:194; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax195; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx196; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %edx197; X86-AVX-NEXT: vmovups (%edx), %ymm0198; X86-AVX-NEXT: movl (%ecx), %edx199; X86-AVX-NEXT: vmovups %xmm0, (%eax,%edx,4)200; X86-AVX-NEXT: movl 4(%ecx), %ecx201; X86-AVX-NEXT: vextractf128 $1, %ymm0, (%eax,%ecx,4)202; X86-AVX-NEXT: vzeroupper203; X86-AVX-NEXT: retl204;205; X64-SSE-LABEL: load_split_more:206; X64-SSE: # %bb.0:207; X64-SSE-NEXT: movups (%rdi), %xmm0208; X64-SSE-NEXT: movups 16(%rdi), %xmm1209; X64-SSE-NEXT: movslq (%rsi), %rax210; X64-SSE-NEXT: movups %xmm0, (%rdx,%rax,4)211; X64-SSE-NEXT: movslq 4(%rsi), %rax212; X64-SSE-NEXT: movups %xmm1, (%rdx,%rax,4)213; X64-SSE-NEXT: retq214;215; X64-AVX-LABEL: load_split_more:216; X64-AVX: # %bb.0:217; X64-AVX-NEXT: vmovups (%rdi), %ymm0218; X64-AVX-NEXT: movslq (%rsi), %rax219; X64-AVX-NEXT: vmovups %xmm0, (%rdx,%rax,4)220; X64-AVX-NEXT: movslq 4(%rsi), %rax221; X64-AVX-NEXT: vextractf128 $1, %ymm0, (%rdx,%rax,4)222; X64-AVX-NEXT: vzeroupper223; X64-AVX-NEXT: retq224 %tmp = load <8 x float>, ptr %src, align 1225 %tmp1 = load i32, ptr %idx, align 4226 %idx.ext = sext i32 %tmp1 to i64227 %add.ptr1 = getelementptr inbounds float, ptr %dst, i64 %idx.ext228 %extract = shufflevector <8 x float> %tmp, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>229 store <4 x float> %extract, ptr %add.ptr1, align 1230 %arrayidx2 = getelementptr inbounds i32, ptr %idx, i64 1231 %tmp2 = load i32, ptr %arrayidx2, align 4232 %idx.ext3 = sext i32 %tmp2 to i64233 %add.ptr4 = getelementptr inbounds float, ptr %dst, i64 %idx.ext3234 %extract5 = shufflevector <8 x float> %tmp, <8 x float> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>235 store <4 x float> %extract5, ptr %add.ptr4, align 1236 ret void237}238