1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=x86-64 -mattr=+avx512vpopcntdq | FileCheck %s --check-prefix=GENERIC 3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=icelake-client | FileCheck %s --check-prefix=ICELAKE 4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=icelake-server | FileCheck %s --check-prefix=ICELAKE 5 6 define void @test_vpopcntd(<16 x i32> %a0, <16 x i32> %a1, <16 x i32> *%a2, i16 %a3) { 7 ; GENERIC-LABEL: test_vpopcntd: 8 ; GENERIC: # %bb.0: 9 ; GENERIC-NEXT: kmovw %esi, %k1 # sched: [1:0.33] 10 ; GENERIC-NEXT: #APP 11 ; GENERIC-NEXT: vpopcntd %zmm1, %zmm0 # sched: [1:0.50] 12 ; GENERIC-NEXT: vpopcntd %zmm1, %zmm0 {%k1} # sched: [1:0.50] 13 ; GENERIC-NEXT: vpopcntd %zmm1, %zmm0 {%k1} {z} # sched: [1:0.50] 14 ; GENERIC-NEXT: vpopcntd (%rdi), %zmm0 # sched: [8:0.50] 15 ; GENERIC-NEXT: vpopcntd (%rdi), %zmm0 {%k1} # sched: [8:0.50] 16 ; GENERIC-NEXT: vpopcntd (%rdi), %zmm0 {%k1} {z} # sched: [8:0.50] 17 ; GENERIC-NEXT: vpopcntd (%rdi){1to16}, %zmm0 # sched: [8:0.50] 18 ; GENERIC-NEXT: vpopcntd (%rdi){1to16}, %zmm0 {%k1} # sched: [8:0.50] 19 ; GENERIC-NEXT: vpopcntd (%rdi){1to16}, %zmm0 {%k1} {z} # sched: [8:0.50] 20 ; GENERIC-NEXT: #NO_APP 21 ; GENERIC-NEXT: vzeroupper # sched: [100:0.33] 22 ; GENERIC-NEXT: retq # sched: [1:1.00] 23 ; 24 ; ICELAKE-LABEL: test_vpopcntd: 25 ; ICELAKE: # %bb.0: 26 ; ICELAKE-NEXT: kmovd %esi, %k1 # sched: [1:1.00] 27 ; ICELAKE-NEXT: #APP 28 ; ICELAKE-NEXT: vpopcntd %zmm1, %zmm0 # sched: [1:1.00] 29 ; ICELAKE-NEXT: vpopcntd %zmm1, %zmm0 {%k1} # sched: [1:1.00] 30 ; ICELAKE-NEXT: vpopcntd %zmm1, %zmm0 {%k1} {z} # sched: [1:1.00] 31 ; ICELAKE-NEXT: vpopcntd (%rdi), %zmm0 # sched: [8:1.00] 32 ; ICELAKE-NEXT: vpopcntd (%rdi), %zmm0 {%k1} # sched: [8:1.00] 33 ; ICELAKE-NEXT: vpopcntd (%rdi), %zmm0 {%k1} {z} # sched: [8:1.00] 34 ; ICELAKE-NEXT: vpopcntd (%rdi){1to16}, %zmm0 # sched: [8:1.00] 35 ; ICELAKE-NEXT: vpopcntd (%rdi){1to16}, %zmm0 {%k1} # sched: [8:1.00] 36 ; ICELAKE-NEXT: vpopcntd (%rdi){1to16}, %zmm0 {%k1} {z} # sched: [8:1.00] 37 ; ICELAKE-NEXT: #NO_APP 38 ; ICELAKE-NEXT: vzeroupper # sched: [4:1.00] 39 ; ICELAKE-NEXT: retq # sched: [7:1.00] 40 tail call void asm "vpopcntd $1, $0 \0A\09 vpopcntd $1, $0 {$3} \0A\09 vpopcntd $1, $0 {$3} {z} \0A\09 vpopcntd $2, $0 \0A\09 vpopcntd $2, $0 {$3} \0A\09 vpopcntd $2, $0 {$3} {z} \0A\09 vpopcntd $2{1to16}, $0 \0A\09 vpopcntd $2{1to16}, $0 {$3} \0A\09 vpopcntd $2{1to16}, $0 {$3} {z}", "v,v,*m,^Yk"(<16 x i32> %a0, <16 x i32> %a1, <16 x i32> *%a2, i16 %a3) nounwind 41 ret void 42 } 43 44 define void @test_vpopcntq(<8 x i64> %a0, <8 x i64> %a1, <8 x i64> *%a2, i8 %a3) { 45 ; GENERIC-LABEL: test_vpopcntq: 46 ; GENERIC: # %bb.0: 47 ; GENERIC-NEXT: kmovw %esi, %k1 # sched: [1:0.33] 48 ; GENERIC-NEXT: #APP 49 ; GENERIC-NEXT: vpopcntq %zmm1, %zmm0 # sched: [1:0.50] 50 ; GENERIC-NEXT: vpopcntq %zmm1, %zmm0 {%k1} # sched: [1:0.50] 51 ; GENERIC-NEXT: vpopcntq %zmm1, %zmm0 {%k1} {z} # sched: [1:0.50] 52 ; GENERIC-NEXT: vpopcntq (%rdi), %zmm0 # sched: [8:0.50] 53 ; GENERIC-NEXT: vpopcntq (%rdi), %zmm0 {%k1} # sched: [8:0.50] 54 ; GENERIC-NEXT: vpopcntq (%rdi), %zmm0 {%k1} {z} # sched: [8:0.50] 55 ; GENERIC-NEXT: vpopcntq (%rdi){1to8}, %zmm0 # sched: [8:0.50] 56 ; GENERIC-NEXT: vpopcntq (%rdi){1to8}, %zmm0 {%k1} # sched: [8:0.50] 57 ; GENERIC-NEXT: vpopcntq (%rdi){1to8}, %zmm0 {%k1} {z} # sched: [8:0.50] 58 ; GENERIC-NEXT: #NO_APP 59 ; GENERIC-NEXT: vzeroupper # sched: [100:0.33] 60 ; GENERIC-NEXT: retq # sched: [1:1.00] 61 ; 62 ; ICELAKE-LABEL: test_vpopcntq: 63 ; ICELAKE: # %bb.0: 64 ; ICELAKE-NEXT: kmovd %esi, %k1 # sched: [1:1.00] 65 ; ICELAKE-NEXT: #APP 66 ; ICELAKE-NEXT: vpopcntq %zmm1, %zmm0 # sched: [1:1.00] 67 ; ICELAKE-NEXT: vpopcntq %zmm1, %zmm0 {%k1} # sched: [1:1.00] 68 ; ICELAKE-NEXT: vpopcntq %zmm1, %zmm0 {%k1} {z} # sched: [1:1.00] 69 ; ICELAKE-NEXT: vpopcntq (%rdi), %zmm0 # sched: [8:1.00] 70 ; ICELAKE-NEXT: vpopcntq (%rdi), %zmm0 {%k1} # sched: [8:1.00] 71 ; ICELAKE-NEXT: vpopcntq (%rdi), %zmm0 {%k1} {z} # sched: [8:1.00] 72 ; ICELAKE-NEXT: vpopcntq (%rdi){1to8}, %zmm0 # sched: [8:1.00] 73 ; ICELAKE-NEXT: vpopcntq (%rdi){1to8}, %zmm0 {%k1} # sched: [8:1.00] 74 ; ICELAKE-NEXT: vpopcntq (%rdi){1to8}, %zmm0 {%k1} {z} # sched: [8:1.00] 75 ; ICELAKE-NEXT: #NO_APP 76 ; ICELAKE-NEXT: vzeroupper # sched: [4:1.00] 77 ; ICELAKE-NEXT: retq # sched: [7:1.00] 78 tail call void asm "vpopcntq $1, $0 \0A\09 vpopcntq $1, $0 {$3} \0A\09 vpopcntq $1, $0 {$3} {z} \0A\09 vpopcntq $2, $0 \0A\09 vpopcntq $2, $0 {$3} \0A\09 vpopcntq $2, $0 {$3} {z} \0A\09 vpopcntq $2{1to8}, $0 \0A\09 vpopcntq $2{1to8}, $0 {$3} \0A\09 vpopcntq $2{1to8}, $0 {$3} {z}", "v,v,*m,^Yk"(<8 x i64> %a0, <8 x i64> %a1, <8 x i64> *%a2, i8 %a3) nounwind 79 ret void 80 } 81