brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.4 KiB · 4cdb079 Raw
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