brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.4 KiB · 52e0eb8 Raw
128 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s3 4; widen a v3i1 to v4i1 to do a vector load/store. We would previously5; reconstruct the said v3i1 from the first element of the vector by filling all6; the lanes of the vector with that first element, which was obviously wrong.7; This was done in the type-legalizing of the DAG, when legalizing the load.8 9; Function Attrs: argmemonly nounwind readonly10declare <3 x i32> @llvm.masked.load.v3i32.p1(ptr addrspace(1), i32, <3 x i1>, <3 x i32>)11 12; Function Attrs: argmemonly nounwind13declare void @llvm.masked.store.v3i32.p1(<3 x i32>, ptr addrspace(1), i32, <3 x i1>)14 15define  <3 x i32> @masked_load_v3(ptr addrspace(1), <3 x i1>) {16; CHECK-LABEL: masked_load_v3:17; CHECK:       # %bb.0: # %entry18; CHECK-NEXT:    andb $1, %sil19; CHECK-NEXT:    andb $1, %dl20; CHECK-NEXT:    addb %dl, %dl21; CHECK-NEXT:    orb %sil, %dl22; CHECK-NEXT:    andb $1, %cl23; CHECK-NEXT:    shlb $2, %cl24; CHECK-NEXT:    orb %dl, %cl25; CHECK-NEXT:    testb $1, %cl26; CHECK-NEXT:    # implicit-def: $xmm027; CHECK-NEXT:    jne .LBB0_128; CHECK-NEXT:  # %bb.2: # %else29; CHECK-NEXT:    testb $2, %cl30; CHECK-NEXT:    jne .LBB0_331; CHECK-NEXT:  .LBB0_4: # %else232; CHECK-NEXT:    testb $4, %cl33; CHECK-NEXT:    jne .LBB0_534; CHECK-NEXT:  .LBB0_6: # %else535; CHECK-NEXT:    retq36; CHECK-NEXT:  .LBB0_1: # %cond.load37; CHECK-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero38; CHECK-NEXT:    testb $2, %cl39; CHECK-NEXT:    je .LBB0_440; CHECK-NEXT:  .LBB0_3: # %cond.load141; CHECK-NEXT:    pinsrd $1, 4(%rdi), %xmm042; CHECK-NEXT:    testb $4, %cl43; CHECK-NEXT:    je .LBB0_644; CHECK-NEXT:  .LBB0_5: # %cond.load445; CHECK-NEXT:    pinsrd $2, 8(%rdi), %xmm046; CHECK-NEXT:    retq47entry:48  %2 = call <3 x i32> @llvm.masked.load.v3i32.p1(ptr addrspace(1) %0, i32 4, <3 x i1> %1, <3 x i32> undef)49  ret <3 x i32> %250}51 52define void @masked_store4_v3(<3 x i32>, ptr addrspace(1), <3 x i1>) {53; CHECK-LABEL: masked_store4_v3:54; CHECK:       # %bb.0: # %entry55; CHECK-NEXT:    andb $1, %sil56; CHECK-NEXT:    andb $1, %dl57; CHECK-NEXT:    addb %dl, %dl58; CHECK-NEXT:    orb %sil, %dl59; CHECK-NEXT:    andb $1, %cl60; CHECK-NEXT:    shlb $2, %cl61; CHECK-NEXT:    orb %dl, %cl62; CHECK-NEXT:    testb $1, %cl63; CHECK-NEXT:    jne .LBB1_164; CHECK-NEXT:  # %bb.2: # %else65; CHECK-NEXT:    testb $2, %cl66; CHECK-NEXT:    jne .LBB1_367; CHECK-NEXT:  .LBB1_4: # %else268; CHECK-NEXT:    testb $4, %cl69; CHECK-NEXT:    jne .LBB1_570; CHECK-NEXT:  .LBB1_6: # %else471; CHECK-NEXT:    retq72; CHECK-NEXT:  .LBB1_1: # %cond.store73; CHECK-NEXT:    movss %xmm0, (%rdi)74; CHECK-NEXT:    testb $2, %cl75; CHECK-NEXT:    je .LBB1_476; CHECK-NEXT:  .LBB1_3: # %cond.store177; CHECK-NEXT:    extractps $1, %xmm0, 4(%rdi)78; CHECK-NEXT:    testb $4, %cl79; CHECK-NEXT:    je .LBB1_680; CHECK-NEXT:  .LBB1_5: # %cond.store381; CHECK-NEXT:    extractps $2, %xmm0, 8(%rdi)82; CHECK-NEXT:    retq83entry:84  call void @llvm.masked.store.v3i32.p1(<3 x i32> %0, ptr addrspace(1) %1, i32 4, <3 x i1> %2)85  ret void86}87 88define void @local_load_v3i1(ptr addrspace(1) %out, ptr addrspace(1) %in, ptr %predicate_ptr) nounwind {89; CHECK-LABEL: local_load_v3i1:90; CHECK:       # %bb.0:91; CHECK-NEXT:    pushq %rbp92; CHECK-NEXT:    pushq %r1593; CHECK-NEXT:    pushq %r1494; CHECK-NEXT:    pushq %rbx95; CHECK-NEXT:    pushq %rax96; CHECK-NEXT:    movq %rdi, %rbx97; CHECK-NEXT:    movzbl (%rdx), %eax98; CHECK-NEXT:    movl %eax, %ecx99; CHECK-NEXT:    shrb %cl100; CHECK-NEXT:    andb $1, %cl101; CHECK-NEXT:    movl %eax, %edx102; CHECK-NEXT:    shrb $2, %dl103; CHECK-NEXT:    andb $1, %al104; CHECK-NEXT:    movzbl %al, %ebp105; CHECK-NEXT:    movzbl %dl, %r14d106; CHECK-NEXT:    movzbl %cl, %r15d107; CHECK-NEXT:    movq %rsi, %rdi108; CHECK-NEXT:    movl %ebp, %esi109; CHECK-NEXT:    movl %r15d, %edx110; CHECK-NEXT:    movl %r14d, %ecx111; CHECK-NEXT:    callq masked_load_v3@PLT112; CHECK-NEXT:    movq %rbx, %rdi113; CHECK-NEXT:    movl %ebp, %esi114; CHECK-NEXT:    movl %r15d, %edx115; CHECK-NEXT:    movl %r14d, %ecx116; CHECK-NEXT:    callq masked_store4_v3@PLT117; CHECK-NEXT:    addq $8, %rsp118; CHECK-NEXT:    popq %rbx119; CHECK-NEXT:    popq %r14120; CHECK-NEXT:    popq %r15121; CHECK-NEXT:    popq %rbp122; CHECK-NEXT:    retq123  %predicate = load <3 x i1>, ptr %predicate_ptr124  %load1 = call <3 x i32> @masked_load_v3(ptr addrspace(1) %in, <3 x i1> %predicate)125  call void @masked_store4_v3(<3 x i32> %load1, ptr addrspace(1) %out, <3 x i1> %predicate)126  ret void127}128