brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.0 KiB · 8030d5f Raw
144 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown-unknown   -mattr=avx | FileCheck %s --check-prefix=X323; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx | FileCheck %s --check-prefix=X644 5define void @big_nonzero_16_bytes(ptr nocapture %a) {6; X32-LABEL: big_nonzero_16_bytes:7; X32:       # %bb.0:8; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax9; X32-NEXT:    vmovaps {{.*#+}} xmm0 = [1,2,3,4]10; X32-NEXT:    vmovups %xmm0, (%eax)11; X32-NEXT:    retl12;13; X64-LABEL: big_nonzero_16_bytes:14; X64:       # %bb.0:15; X64-NEXT:    vmovaps {{.*#+}} xmm0 = [1,2,3,4]16; X64-NEXT:    vmovups %xmm0, (%rdi)17; X64-NEXT:    retq18  %arrayidx1 = getelementptr inbounds i32, ptr %a, i64 119  %arrayidx2 = getelementptr inbounds i32, ptr %a, i64 220  %arrayidx3 = getelementptr inbounds i32, ptr %a, i64 321 22  store i32 1, ptr %a, align 423  store i32 2, ptr %arrayidx1, align 424  store i32 3, ptr %arrayidx2, align 425  store i32 4, ptr %arrayidx3, align 426  ret void27}28 29; TODO: We assumed that two 64-bit stores were better than 1 vector load and 1 vector store.30; But if the 64-bit constants can't be represented as sign-extended 32-bit constants, then31; it takes extra instructions to do this in scalar.32 33define void @big_nonzero_16_bytes_big64bit_constants(ptr nocapture %a) {34; X32-LABEL: big_nonzero_16_bytes_big64bit_constants:35; X32:       # %bb.0:36; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax37; X32-NEXT:    vmovaps {{.*#+}} xmm0 = [1,1,1,3]38; X32-NEXT:    vmovups %xmm0, (%eax)39; X32-NEXT:    retl40;41; X64-LABEL: big_nonzero_16_bytes_big64bit_constants:42; X64:       # %bb.0:43; X64-NEXT:    movabsq $4294967297, %rax # imm = 0x10000000144; X64-NEXT:    movq %rax, (%rdi)45; X64-NEXT:    movabsq $12884901889, %rax # imm = 0x30000000146; X64-NEXT:    movq %rax, 8(%rdi)47; X64-NEXT:    retq48  %arrayidx1 = getelementptr inbounds i64, ptr %a, i64 149 50  store i64 4294967297, ptr %a51  store i64 12884901889, ptr %arrayidx152  ret void53}54 55; Splats may be an opportunity to use a broadcast op.56 57define void @big_nonzero_32_bytes_splat(ptr nocapture %a) {58; X32-LABEL: big_nonzero_32_bytes_splat:59; X32:       # %bb.0:60; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax61; X32-NEXT:    vbroadcastss {{.*#+}} ymm0 = [42,42,42,42,42,42,42,42]62; X32-NEXT:    vmovups %ymm0, (%eax)63; X32-NEXT:    vzeroupper64; X32-NEXT:    retl65;66; X64-LABEL: big_nonzero_32_bytes_splat:67; X64:       # %bb.0:68; X64-NEXT:    vbroadcastss {{.*#+}} ymm0 = [42,42,42,42,42,42,42,42]69; X64-NEXT:    vmovups %ymm0, (%rdi)70; X64-NEXT:    vzeroupper71; X64-NEXT:    retq72  %arrayidx1 = getelementptr inbounds i32, ptr %a, i64 173  %arrayidx2 = getelementptr inbounds i32, ptr %a, i64 274  %arrayidx3 = getelementptr inbounds i32, ptr %a, i64 375  %arrayidx4 = getelementptr inbounds i32, ptr %a, i64 476  %arrayidx5 = getelementptr inbounds i32, ptr %a, i64 577  %arrayidx6 = getelementptr inbounds i32, ptr %a, i64 678  %arrayidx7 = getelementptr inbounds i32, ptr %a, i64 779 80  store i32 42, ptr %a, align 481  store i32 42, ptr %arrayidx1, align 482  store i32 42, ptr %arrayidx2, align 483  store i32 42, ptr %arrayidx3, align 484  store i32 42, ptr %arrayidx4, align 485  store i32 42, ptr %arrayidx5, align 486  store i32 42, ptr %arrayidx6, align 487  store i32 42, ptr %arrayidx7, align 488  ret void89}90 91; Verify that we choose the best-sized store(s) for each chunk.92 93define void @big_nonzero_63_bytes(ptr nocapture %a) {94; X32-LABEL: big_nonzero_63_bytes:95; X32:       # %bb.0:96; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax97; X32-NEXT:    vmovaps {{.*#+}} ymm0 = [1,0,2,0,3,0,4,0]98; X32-NEXT:    vmovups %ymm0, (%eax)99; X32-NEXT:    vmovaps {{.*#+}} xmm0 = [5,0,6,0]100; X32-NEXT:    vmovups %xmm0, 32(%eax)101; X32-NEXT:    movl $0, 52(%eax)102; X32-NEXT:    movl $7, 48(%eax)103; X32-NEXT:    movl $8, 56(%eax)104; X32-NEXT:    movw $9, 60(%eax)105; X32-NEXT:    movb $10, 62(%eax)106; X32-NEXT:    vzeroupper107; X32-NEXT:    retl108;109; X64-LABEL: big_nonzero_63_bytes:110; X64:       # %bb.0:111; X64-NEXT:    vmovaps {{.*#+}} ymm0 = [1,2,3,4]112; X64-NEXT:    vmovups %ymm0, (%rdi)113; X64-NEXT:    movq $5, 32(%rdi)114; X64-NEXT:    movq $6, 40(%rdi)115; X64-NEXT:    movq $7, 48(%rdi)116; X64-NEXT:    movl $8, 56(%rdi)117; X64-NEXT:    movw $9, 60(%rdi)118; X64-NEXT:    movb $10, 62(%rdi)119; X64-NEXT:    vzeroupper120; X64-NEXT:    retq121  %arrayidx8 = getelementptr inbounds i64, ptr %a, i64 1122  %arrayidx16 = getelementptr inbounds i64, ptr %a, i64 2123  %arrayidx24 = getelementptr inbounds i64, ptr %a, i64 3124  %arrayidx32 = getelementptr inbounds i64, ptr %a, i64 4125  %arrayidx40 = getelementptr inbounds i64, ptr %a, i64 5126  %arrayidx48 = getelementptr inbounds i64, ptr %a, i64 6127  %arrayidx56 = getelementptr inbounds i32, ptr %a, i64 14128  %arrayidx60 = getelementptr inbounds i16, ptr %a, i64 30129  %arrayidx62 = getelementptr inbounds i8, ptr %a, i64 62130 131  store i64 1, ptr %a132  store i64 2, ptr %arrayidx8133  store i64 3, ptr %arrayidx16134  store i64 4, ptr %arrayidx24135  store i64 5, ptr %arrayidx32136  store i64 6, ptr %arrayidx40137  store i64 7, ptr %arrayidx48138  store i32 8, ptr %arrayidx56139  store i16 9, ptr %arrayidx60140  store i8 10, ptr %arrayidx62141  ret void142}143 144