2 * This file is part of FFmpeg.
4 * FFmpeg is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with FFmpeg; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 #include "libavutil/cpu.h"
24 #include "libavutil/avstring.h"
27 #include "libavutil/aarch64/cpu.h"
29 #include "libavutil/riscv/cpu.h"
36 #include "compat/getopt.c"
44 { AV_CPU_FLAG_ARMV8
, "armv8" },
45 { AV_CPU_FLAG_NEON
, "neon" },
46 { AV_CPU_FLAG_VFP
, "vfp" },
47 { AV_CPU_FLAG_DOTPROD
, "dotprod" },
48 { AV_CPU_FLAG_I8MM
, "i8mm" },
49 { AV_CPU_FLAG_SVE
, "sve" },
50 { AV_CPU_FLAG_SVE2
, "sve2" },
52 { AV_CPU_FLAG_ARMV5TE
, "armv5te" },
53 { AV_CPU_FLAG_ARMV6
, "armv6" },
54 { AV_CPU_FLAG_ARMV6T2
, "armv6t2" },
55 { AV_CPU_FLAG_VFP
, "vfp" },
56 { AV_CPU_FLAG_VFP_VM
, "vfp_vm" },
57 { AV_CPU_FLAG_VFPV3
, "vfpv3" },
58 { AV_CPU_FLAG_NEON
, "neon" },
59 { AV_CPU_FLAG_SETEND
, "setend" },
61 { AV_CPU_FLAG_ALTIVEC
, "altivec" },
62 { AV_CPU_FLAG_VSX
, "vsx" },
63 { AV_CPU_FLAG_POWER8
, "power8" },
65 { AV_CPU_FLAG_MMI
, "mmi" },
66 { AV_CPU_FLAG_MSA
, "msa" },
68 { AV_CPU_FLAG_MMX
, "mmx" },
69 { AV_CPU_FLAG_MMXEXT
, "mmxext" },
70 { AV_CPU_FLAG_SSE
, "sse" },
71 { AV_CPU_FLAG_SSE2
, "sse2" },
72 { AV_CPU_FLAG_SSE2SLOW
, "sse2slow" },
73 { AV_CPU_FLAG_SSE3
, "sse3" },
74 { AV_CPU_FLAG_SSE3SLOW
, "sse3slow" },
75 { AV_CPU_FLAG_SSSE3
, "ssse3" },
76 { AV_CPU_FLAG_ATOM
, "atom" },
77 { AV_CPU_FLAG_SSE4
, "sse4.1" },
78 { AV_CPU_FLAG_SSE42
, "sse4.2" },
79 { AV_CPU_FLAG_AVX
, "avx" },
80 { AV_CPU_FLAG_AVXSLOW
, "avxslow" },
81 { AV_CPU_FLAG_XOP
, "xop" },
82 { AV_CPU_FLAG_FMA3
, "fma3" },
83 { AV_CPU_FLAG_FMA4
, "fma4" },
84 { AV_CPU_FLAG_3DNOW
, "3dnow" },
85 { AV_CPU_FLAG_3DNOWEXT
, "3dnowext" },
86 { AV_CPU_FLAG_CMOV
, "cmov" },
87 { AV_CPU_FLAG_AVX2
, "avx2" },
88 { AV_CPU_FLAG_BMI1
, "bmi1" },
89 { AV_CPU_FLAG_BMI2
, "bmi2" },
90 { AV_CPU_FLAG_AESNI
, "aesni" },
91 { AV_CPU_FLAG_AVX512
, "avx512" },
92 { AV_CPU_FLAG_AVX512ICL
, "avx512icl" },
93 { AV_CPU_FLAG_SLOW_GATHER
, "slowgather" },
95 { AV_CPU_FLAG_LSX
, "lsx" },
96 { AV_CPU_FLAG_LASX
, "lasx" },
98 { AV_CPU_FLAG_RVI
, "rvi" },
99 { AV_CPU_FLAG_RVB_BASIC
, "zbb" },
100 { AV_CPU_FLAG_RVB
, "rvb" },
101 { AV_CPU_FLAG_RVV_I32
, "zve32x" },
102 { AV_CPU_FLAG_RVV_F32
, "zve32f" },
103 { AV_CPU_FLAG_RVV_I64
, "zve64x" },
104 { AV_CPU_FLAG_RVV_F64
, "zve64d" },
105 { AV_CPU_FLAG_RV_ZVBB
, "zvbb" },
106 { AV_CPU_FLAG_RV_MISALIGNED
, "misaligned" },
108 { AV_CPU_FLAG_SIMD128
, "simd128" },
113 static void print_cpu_flags(int cpu_flags
, const char *type
)
117 printf("cpu_flags(%s) = 0x%08X\n", type
, cpu_flags
);
118 printf("cpu_flags_str(%s) =", type
);
119 for (i
= 0; cpu_flag_tab
[i
].flag
; i
++)
120 if (cpu_flags
& cpu_flag_tab
[i
].flag
)
121 printf(" %s", cpu_flag_tab
[i
].name
);
126 int main(int argc
, char **argv
)
128 int cpu_flags_raw
= av_get_cpu_flags();
130 int cpu_count
= av_cpu_count();
131 const char *threads
= "auto";
134 for(i
= 0; cpu_flag_tab
[i
].flag
; i
++) {
136 if (av_parse_cpu_caps(&tmp
, cpu_flag_tab
[i
].name
) < 0) {
137 fprintf(stderr
, "Table missing %s\n", cpu_flag_tab
[i
].name
);
142 if (cpu_flags_raw
< 0)
146 int c
= getopt(argc
, argv
, "c:t:");
152 unsigned flags
= av_get_cpu_flags();
153 if (av_parse_cpu_caps(&flags
, optarg
) < 0)
156 av_force_cpu_flags(flags
);
166 cpu_flags_eff
= av_get_cpu_flags();
168 if (cpu_flags_eff
< 0)
171 print_cpu_flags(cpu_flags_raw
, "raw");
172 print_cpu_flags(cpu_flags_eff
, "effective");
173 printf("threads = %s (cpu_count = %d)\n", threads
, cpu_count
);
174 #if ARCH_AARCH64 && HAVE_SVE
175 if (cpu_flags_raw
& AV_CPU_FLAG_SVE
)
176 printf("sve_vector_length = %d\n", 8 * ff_aarch64_sve_length());
177 #elif ARCH_RISCV && HAVE_RVV
178 if (cpu_flags_raw
& AV_CPU_FLAG_RVV_I32
) {
179 size_t bytes
= ff_get_rv_vlenb();
181 printf("rv_vlenb = %zu (%zu bits)\n", bytes
, 8 * bytes
);