* commit 'e2710e790c09e49e86baa58c6063af0097cc8cb0': arm: add a cpu flag for the VFPv2 vector mode Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>tags/n3.0
@@ -59,7 +59,7 @@ av_cold void ff_dcadsp_init_arm(DCADSPContext *s) | |||||
{ | { | ||||
int cpu_flags = av_get_cpu_flags(); | int cpu_flags = av_get_cpu_flags(); | ||||
if (have_vfp(cpu_flags) && !have_vfpv3(cpu_flags)) { | |||||
if (have_vfp_vm(cpu_flags)) { | |||||
s->lfe_fir[0] = ff_dca_lfe_fir32_vfp; | s->lfe_fir[0] = ff_dca_lfe_fir32_vfp; | ||||
s->lfe_fir[1] = ff_dca_lfe_fir64_vfp; | s->lfe_fir[1] = ff_dca_lfe_fir64_vfp; | ||||
s->qmf_32_subbands = ff_dca_qmf_32_subbands_vfp; | s->qmf_32_subbands = ff_dca_qmf_32_subbands_vfp; | ||||
@@ -75,7 +75,7 @@ av_cold void ff_synth_filter_init_arm(SynthFilterContext *s) | |||||
{ | { | ||||
int cpu_flags = av_get_cpu_flags(); | int cpu_flags = av_get_cpu_flags(); | ||||
if (have_vfp(cpu_flags) && !have_vfpv3(cpu_flags)) | |||||
if (have_vfp_vm(cpu_flags)) | |||||
s->synth_filter_float = ff_synth_filter_float_vfp; | s->synth_filter_float = ff_synth_filter_float_vfp; | ||||
if (have_neon(cpu_flags)) | if (have_neon(cpu_flags)) | ||||
s->synth_filter_float = ff_synth_filter_float_neon; | s->synth_filter_float = ff_synth_filter_float_neon; | ||||
@@ -40,7 +40,7 @@ av_cold void ff_fft_init_arm(FFTContext *s) | |||||
{ | { | ||||
int cpu_flags = av_get_cpu_flags(); | int cpu_flags = av_get_cpu_flags(); | ||||
if (have_vfp(cpu_flags) && !have_vfpv3(cpu_flags)) { | |||||
if (have_vfp_vm(cpu_flags)) { | |||||
s->fft_calc = ff_fft_calc_vfp; | s->fft_calc = ff_fft_calc_vfp; | ||||
#if CONFIG_MDCT | #if CONFIG_MDCT | ||||
s->imdct_half = ff_imdct_half_vfp; | s->imdct_half = ff_imdct_half_vfp; | ||||
@@ -38,7 +38,7 @@ av_cold void ff_fmt_convert_init_arm(FmtConvertContext *c, AVCodecContext *avctx | |||||
{ | { | ||||
int cpu_flags = av_get_cpu_flags(); | int cpu_flags = av_get_cpu_flags(); | ||||
if (have_vfp(cpu_flags)) { | |||||
if (have_vfp_vm(cpu_flags)) { | |||||
if (!have_vfpv3(cpu_flags)) { | if (!have_vfpv3(cpu_flags)) { | ||||
c->int32_to_float_fmul_scalar = ff_int32_to_float_fmul_scalar_vfp; | c->int32_to_float_fmul_scalar = ff_int32_to_float_fmul_scalar_vfp; | ||||
c->int32_to_float_fmul_array8 = ff_int32_to_float_fmul_array8_vfp; | c->int32_to_float_fmul_array8 = ff_int32_to_float_fmul_array8_vfp; | ||||
@@ -137,6 +137,10 @@ int ff_get_cpu_flags_arm(void) | |||||
if (flags & AV_CPU_FLAG_ARMV6T2) | if (flags & AV_CPU_FLAG_ARMV6T2) | ||||
flags |= AV_CPU_FLAG_ARMV6; | flags |= AV_CPU_FLAG_ARMV6; | ||||
/* set the virtual VFPv2 vector mode flag */ | |||||
if ((flags & AV_CPU_FLAG_VFP) && !(flags & (AV_CPU_FLAG_VFPV3 | AV_CPU_FLAG_NEON))) | |||||
flags |= AV_CPU_FLAG_VFP_VM; | |||||
return flags; | return flags; | ||||
} | } | ||||
@@ -31,4 +31,9 @@ | |||||
#define have_neon(flags) CPUEXT(flags, NEON) | #define have_neon(flags) CPUEXT(flags, NEON) | ||||
#define have_setend(flags) CPUEXT(flags, SETEND) | #define have_setend(flags) CPUEXT(flags, SETEND) | ||||
/* some functions use the VFPv2 vector mode which is deprecated in ARMv7-A | |||||
* and might trap on such CPU depending on the OS configuration */ | |||||
#define have_vfp_vm(flags) \ | |||||
(have_armv6(flags) && ((flags) & AV_CPU_FLAG_VFP_VM)) | |||||
#endif /* AVUTIL_ARM_CPU_H */ | #endif /* AVUTIL_ARM_CPU_H */ |
@@ -152,6 +152,7 @@ int av_parse_cpu_flags(const char *s) | |||||
{ "armv6", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_ARMV6 }, .unit = "flags" }, | { "armv6", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_ARMV6 }, .unit = "flags" }, | ||||
{ "armv6t2", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_ARMV6T2 }, .unit = "flags" }, | { "armv6t2", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_ARMV6T2 }, .unit = "flags" }, | ||||
{ "vfp", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_VFP }, .unit = "flags" }, | { "vfp", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_VFP }, .unit = "flags" }, | ||||
{ "vfp_vm", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_VFP_VM }, .unit = "flags" }, | |||||
{ "vfpv3", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_VFPV3 }, .unit = "flags" }, | { "vfpv3", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_VFPV3 }, .unit = "flags" }, | ||||
{ "neon", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_NEON }, .unit = "flags" }, | { "neon", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_CPU_FLAG_NEON }, .unit = "flags" }, | ||||
#elif ARCH_AARCH64 | #elif ARCH_AARCH64 | ||||
@@ -315,6 +316,7 @@ static const struct { | |||||
{ AV_CPU_FLAG_ARMV6, "armv6" }, | { AV_CPU_FLAG_ARMV6, "armv6" }, | ||||
{ AV_CPU_FLAG_ARMV6T2, "armv6t2" }, | { AV_CPU_FLAG_ARMV6T2, "armv6t2" }, | ||||
{ AV_CPU_FLAG_VFP, "vfp" }, | { AV_CPU_FLAG_VFP, "vfp" }, | ||||
{ AV_CPU_FLAG_VFP_VM, "vfp_vm" }, | |||||
{ AV_CPU_FLAG_VFPV3, "vfpv3" }, | { AV_CPU_FLAG_VFPV3, "vfpv3" }, | ||||
{ AV_CPU_FLAG_NEON, "neon" }, | { AV_CPU_FLAG_NEON, "neon" }, | ||||
{ AV_CPU_FLAG_SETEND, "setend" }, | { AV_CPU_FLAG_SETEND, "setend" }, | ||||
@@ -64,6 +64,7 @@ | |||||
#define AV_CPU_FLAG_VFPV3 (1 << 4) | #define AV_CPU_FLAG_VFPV3 (1 << 4) | ||||
#define AV_CPU_FLAG_NEON (1 << 5) | #define AV_CPU_FLAG_NEON (1 << 5) | ||||
#define AV_CPU_FLAG_ARMV8 (1 << 6) | #define AV_CPU_FLAG_ARMV8 (1 << 6) | ||||
#define AV_CPU_FLAG_VFP_VM (1 << 7) ///< VFPv2 vector mode, deprecated in ARMv7-A and unavailable in various CPUs implementations | |||||
#define AV_CPU_FLAG_SETEND (1 <<16) | #define AV_CPU_FLAG_SETEND (1 <<16) | ||||
/** | /** | ||||
@@ -64,7 +64,7 @@ | |||||
*/ | */ | ||||
#define LIBAVUTIL_VERSION_MAJOR 55 | #define LIBAVUTIL_VERSION_MAJOR 55 | ||||
#define LIBAVUTIL_VERSION_MINOR 11 | |||||
#define LIBAVUTIL_VERSION_MINOR 12 | |||||
#define LIBAVUTIL_VERSION_MICRO 100 | #define LIBAVUTIL_VERSION_MICRO 100 | ||||
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ | #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ | ||||
@@ -103,6 +103,7 @@ static const struct { | |||||
{ "ARMV6", "armv6", AV_CPU_FLAG_ARMV6 }, | { "ARMV6", "armv6", AV_CPU_FLAG_ARMV6 }, | ||||
{ "ARMV6T2", "armv6t2", AV_CPU_FLAG_ARMV6T2 }, | { "ARMV6T2", "armv6t2", AV_CPU_FLAG_ARMV6T2 }, | ||||
{ "VFP", "vfp", AV_CPU_FLAG_VFP }, | { "VFP", "vfp", AV_CPU_FLAG_VFP }, | ||||
{ "VFP_VM", "vfp_vm", AV_CPU_FLAG_VFP_VM }, | |||||
{ "VFPV3", "vfp3", AV_CPU_FLAG_VFPV3 }, | { "VFPV3", "vfp3", AV_CPU_FLAG_VFPV3 }, | ||||
{ "NEON", "neon", AV_CPU_FLAG_NEON }, | { "NEON", "neon", AV_CPU_FLAG_NEON }, | ||||
#elif ARCH_PPC | #elif ARCH_PPC | ||||