169 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-prefix=X643; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=sse2 | FileCheck %s --check-prefix=X864; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=avx2 | FileCheck %s --check-prefix=X86AVX5 6; Use movq or movsd to load / store i64 values if sse2 is available.7; rdar://66598588 9define void @foo(ptr %x, ptr %y) nounwind {10; X64-LABEL: foo:11; X64: # %bb.0:12; X64-NEXT: movq (%rsi), %rax13; X64-NEXT: movq %rax, (%rdi)14; X64-NEXT: retq15;16; X86-LABEL: foo:17; X86: # %bb.0:18; X86-NEXT: movl {{[0-9]+}}(%esp), %eax19; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx20; X86-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero21; X86-NEXT: movsd %xmm0, (%eax)22; X86-NEXT: retl23;24; X86AVX-LABEL: foo:25; X86AVX: # %bb.0:26; X86AVX-NEXT: movl {{[0-9]+}}(%esp), %eax27; X86AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx28; X86AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero29; X86AVX-NEXT: vmovsd %xmm0, (%eax)30; X86AVX-NEXT: retl31 %tmp1 = load i64, ptr %y, align 832 store i64 %tmp1, ptr %x, align 833 ret void34}35 36; Verify that a 64-bit chunk extracted from a vector is stored with a movq37; regardless of whether the system is 64-bit.38 39define void @store_i64_from_vector(<8 x i16> %x, <8 x i16> %y, ptr %i) nounwind {40; X64-LABEL: store_i64_from_vector:41; X64: # %bb.0:42; X64-NEXT: paddw %xmm1, %xmm043; X64-NEXT: movq %xmm0, (%rdi)44; X64-NEXT: retq45;46; X86-LABEL: store_i64_from_vector:47; X86: # %bb.0:48; X86-NEXT: movl {{[0-9]+}}(%esp), %eax49; X86-NEXT: paddw %xmm1, %xmm050; X86-NEXT: movq %xmm0, (%eax)51; X86-NEXT: retl52;53; X86AVX-LABEL: store_i64_from_vector:54; X86AVX: # %bb.0:55; X86AVX-NEXT: movl {{[0-9]+}}(%esp), %eax56; X86AVX-NEXT: vpaddw %xmm1, %xmm0, %xmm057; X86AVX-NEXT: vmovq %xmm0, (%eax)58; X86AVX-NEXT: retl59 %z = add <8 x i16> %x, %y ; force execution domain60 %bc = bitcast <8 x i16> %z to <2 x i64>61 %vecext = extractelement <2 x i64> %bc, i32 062 store i64 %vecext, ptr %i, align 863 ret void64}65 66define void @store_i64_from_vector256(<16 x i16> %x, <16 x i16> %y, ptr %i) nounwind {67; X64-LABEL: store_i64_from_vector256:68; X64: # %bb.0:69; X64-NEXT: paddw %xmm3, %xmm170; X64-NEXT: movq %xmm1, (%rdi)71; X64-NEXT: retq72;73; X86-LABEL: store_i64_from_vector256:74; X86: # %bb.0:75; X86-NEXT: pushl %ebp76; X86-NEXT: movl %esp, %ebp77; X86-NEXT: andl $-16, %esp78; X86-NEXT: subl $16, %esp79; X86-NEXT: movl 24(%ebp), %eax80; X86-NEXT: paddw 8(%ebp), %xmm181; X86-NEXT: movq %xmm1, (%eax)82; X86-NEXT: movl %ebp, %esp83; X86-NEXT: popl %ebp84; X86-NEXT: retl85;86; X86AVX-LABEL: store_i64_from_vector256:87; X86AVX: # %bb.0:88; X86AVX-NEXT: movl {{[0-9]+}}(%esp), %eax89; X86AVX-NEXT: vextracti128 $1, %ymm1, %xmm190; X86AVX-NEXT: vextracti128 $1, %ymm0, %xmm091; X86AVX-NEXT: vpaddw %xmm1, %xmm0, %xmm092; X86AVX-NEXT: vmovq %xmm0, (%eax)93; X86AVX-NEXT: vzeroupper94; X86AVX-NEXT: retl95 %z = add <16 x i16> %x, %y ; force execution domain96 %bc = bitcast <16 x i16> %z to <4 x i64>97 %vecext = extractelement <4 x i64> %bc, i32 298 store i64 %vecext, ptr %i, align 899 ret void100}101 102; PR23476103; Handle extraction from a non-simple / pre-legalization type.104 105define void @PR23476(<5 x i64> %in, ptr %out, i32 %index) nounwind {106; X64-LABEL: PR23476:107; X64: # %bb.0:108; X64-NEXT: movq %rsi, %xmm0109; X64-NEXT: movq %rdi, %xmm1110; X64-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]111; X64-NEXT: movq %rcx, %xmm0112; X64-NEXT: movq %rdx, %xmm2113; X64-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0]114; X64-NEXT: movl {{[0-9]+}}(%rsp), %eax115; X64-NEXT: andl $7, %eax116; X64-NEXT: movq %r8, %xmm0117; X64-NEXT: movdqa %xmm0, -{{[0-9]+}}(%rsp)118; X64-NEXT: movdqa %xmm2, -{{[0-9]+}}(%rsp)119; X64-NEXT: movdqa %xmm1, -{{[0-9]+}}(%rsp)120; X64-NEXT: movq -72(%rsp,%rax,8), %rax121; X64-NEXT: movq %rax, (%r9)122; X64-NEXT: retq123;124; X86-LABEL: PR23476:125; X86: # %bb.0:126; X86-NEXT: pushl %ebp127; X86-NEXT: movl %esp, %ebp128; X86-NEXT: andl $-16, %esp129; X86-NEXT: subl $80, %esp130; X86-NEXT: movl 52(%ebp), %eax131; X86-NEXT: andl $7, %eax132; X86-NEXT: movl 48(%ebp), %ecx133; X86-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero134; X86-NEXT: movups 8(%ebp), %xmm1135; X86-NEXT: movups 24(%ebp), %xmm2136; X86-NEXT: movaps %xmm2, {{[0-9]+}}(%esp)137; X86-NEXT: movaps %xmm1, (%esp)138; X86-NEXT: movaps %xmm0, {{[0-9]+}}(%esp)139; X86-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero140; X86-NEXT: movsd %xmm0, (%ecx)141; X86-NEXT: movl %ebp, %esp142; X86-NEXT: popl %ebp143; X86-NEXT: retl144;145; X86AVX-LABEL: PR23476:146; X86AVX: # %bb.0:147; X86AVX-NEXT: pushl %ebp148; X86AVX-NEXT: movl %esp, %ebp149; X86AVX-NEXT: andl $-32, %esp150; X86AVX-NEXT: subl $96, %esp151; X86AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero152; X86AVX-NEXT: movl 52(%ebp), %eax153; X86AVX-NEXT: andl $7, %eax154; X86AVX-NEXT: movl 48(%ebp), %ecx155; X86AVX-NEXT: vmovups 8(%ebp), %ymm1156; X86AVX-NEXT: vmovaps %ymm1, (%esp)157; X86AVX-NEXT: vmovaps %ymm0, {{[0-9]+}}(%esp)158; X86AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero159; X86AVX-NEXT: vmovsd %xmm0, (%ecx)160; X86AVX-NEXT: movl %ebp, %esp161; X86AVX-NEXT: popl %ebp162; X86AVX-NEXT: vzeroupper163; X86AVX-NEXT: retl164 %ext = extractelement <5 x i64> %in, i32 %index165 store i64 %ext, ptr %out, align 8166 ret void167}168 169