On 2014-02-22 02:54:02 -0300, James Almer wrote: > Based on x264 code > > Signed-off-by: James Almer <[email protected]> > --- > libavutil/cpu.c | 6 ++++++ > libavutil/cpu.h | 2 ++ > libavutil/x86/cpu.c | 16 +++++++++++----- > 3 files changed, 19 insertions(+), 5 deletions(-) > > diff --git a/libavutil/cpu.c b/libavutil/cpu.c > index 972e4eb..d651eb2 100644 > --- a/libavutil/cpu.c > +++ b/libavutil/cpu.c > @@ -90,6 +90,8 @@ int av_parse_cpu_flags(const char *s) > #define CPUFLAG_FMA3 (AV_CPU_FLAG_FMA3 | CPUFLAG_AVX) > #define CPUFLAG_FMA4 (AV_CPU_FLAG_FMA4 | CPUFLAG_AVX) > #define CPUFLAG_AVX2 (AV_CPU_FLAG_AVX2 | CPUFLAG_AVX) > +#define CPUFLAG_BMI1 (AV_CPU_FLAG_BMI1) > +#define CPUFLAG_BMI2 (AV_CPU_FLAG_BMI2 | CPUFLAG_BMI1) > static const AVOption cpuflags_opts[] = { > { "flags" , NULL, 0, AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT64_MIN, > INT64_MAX, .unit = "flags" }, > #if ARCH_PPC > @@ -111,6 +113,8 @@ int av_parse_cpu_flags(const char *s) > { "fma3" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CPUFLAG_FMA3 > }, .unit = "flags" }, > { "fma4" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CPUFLAG_FMA4 > }, .unit = "flags" }, > { "avx2" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CPUFLAG_AVX2 > }, .unit = "flags" }, > + { "bmi1" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CPUFLAG_BMI1 > }, .unit = "flags" }, > + { "bmi2" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CPUFLAG_BMI2 > }, .unit = "flags" }, > { "3dnow" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CPUFLAG_3DNOW > }, .unit = "flags" }, > { "3dnowext", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = CPUFLAG_3DNOWEXT > }, .unit = "flags" }, > { "cmov", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_CMOV > }, .unit = "flags" }, > @@ -212,6 +216,8 @@ static const struct { > { AV_CPU_FLAG_3DNOWEXT, "3dnowext" }, > { AV_CPU_FLAG_CMOV, "cmov" }, > { AV_CPU_FLAG_AVX2, "avx2" }, > + { AV_CPU_FLAG_BMI1, "bmi1" }, > + { AV_CPU_FLAG_BMI2, "bmi2" }, > #endif > { 0 } > }; > diff --git a/libavutil/cpu.h b/libavutil/cpu.h > index 934b3be..517c520 100644 > --- a/libavutil/cpu.h > +++ b/libavutil/cpu.h > @@ -50,6 +50,8 @@ > #define AV_CPU_FLAG_CMOV 0x1000 ///< i686 cmov > #define AV_CPU_FLAG_AVX2 0x8000 ///< AVX2 functions: requires OS > support even if YMM registers aren't used > #define AV_CPU_FLAG_FMA3 0x10000 ///< Haswell FMA3 functions > +#define AV_CPU_FLAG_BMI1 0x20000 ///< Bit Manipulation Instruction > Set 1 > +#define AV_CPU_FLAG_BMI2 0x40000 ///< Bit Manipulation Instruction > Set 2 > > #define AV_CPU_FLAG_ALTIVEC 0x0001 ///< standard > > diff --git a/libavutil/x86/cpu.c b/libavutil/x86/cpu.c > index bf5e9fc..4c96c27 100644 > --- a/libavutil/x86/cpu.c > +++ b/libavutil/x86/cpu.c > @@ -137,16 +137,22 @@ int ff_get_cpu_flags_x86(void) > rval |= AV_CPU_FLAG_FMA3; > } > } > -#if HAVE_AVX2 > +#endif /* HAVE_AVX */ > +#endif /* HAVE_SSE */ > if (max_std_level >= 7) { > cpuid(7, eax, ebx, ecx, edx); > +#if HAVE_AVX2 > if (ebx&0x00000020) > rval |= AV_CPU_FLAG_AVX2; > - /* TODO: BMI1/2 */ > - } > #endif /* HAVE_AVX2 */ > -#endif /* HAVE_AVX */ > -#endif /* HAVE_SSE */ > + /* BMI1/2 don't need OS support */ > + if (ebx&0x00000008) > + {
braces please on the same line a the if/while/... fixed with the missing operators around spaces > + rval |= AV_CPU_FLAG_BMI1; > + if (ebx&0x00000100) > + rval |= AV_CPU_FLAG_BMI2; > + } > + } > } > > cpuid(0x80000000, max_ext_level, ebx, ecx, edx); ok, Do you plan to write assembly using any of these instructions? Having the tests while not using the instructions is just an exercise in completeness. Janne > -- > 1.8.3.2 > > _______________________________________________ > libav-devel mailing list > [email protected] > https://lists.libav.org/mailman/listinfo/libav-devel _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
