[FFmpeg-devel] [PATCH 05/31] lavu/cpu: CPU flags for the RISC-V Vector extension

Lynne dev at lynne.ee
Mon Sep 26 09:51:43 EEST 2022


Sep 25, 2022, 16:25 by remi at remlab.net:

> From: Rémi Denis-Courmont <remi at remlab.net>
> -    if ((flags & AV_CPU_FLAG_RVD) && !(flags & AV_CPU_FLAG_RVF)) {
> +    if ((flags & AV_CPU_FLAG_RV_ZVE64D) && !(flags & AV_CPU_FLAG_RV_ZVE64X)) {
> +        av_log(NULL, AV_LOG_WARNING, "RV%s implied by specified flags\n",
> +               "_ZVE64X");
> +        flags |= AV_CPU_FLAG_RV_ZVE64X;
> +    }
> +
> +    if ((flags & AV_CPU_FLAG_RV_ZVE64D) && !(flags & AV_CPU_FLAG_RV_ZVE32F)) {
> +        av_log(NULL, AV_LOG_WARNING, "RV%s implied by specified flags\n",
> +               "_ZVE32F");
>

I remember someone complaining about NULL contexts in av_log (mkver?).
I think it's okay, but I have no opinion on this.


> +        flags |= AV_CPU_FLAG_RV_ZVE32F;
> +    }
> +
> +    if ((flags & (AV_CPU_FLAG_RV_ZVE64X | AV_CPU_FLAG_RV_ZVE32F))
> +        && !(flags & AV_CPU_FLAG_RV_ZVE32X)) {
> +        av_log(NULL, AV_LOG_WARNING, "RV%s implied by specified flags\n",
> +               "_ZVE32X");
> +        flags |= AV_CPU_FLAG_RV_ZVE32X;
> +    }
> +
> +    if ((flags & AV_CPU_FLAG_RV_ZVE64D) && !(flags & AV_CPU_FLAG_RVD)) {
> +        av_log(NULL, AV_LOG_WARNING, "RV%s implied by specified flags\n", "D");
> +        flags |= AV_CPU_FLAG_RVD;
> +    }
> +
> +    if ((flags & (AV_CPU_FLAG_RVD | AV_CPU_FLAG_RV_ZVE32F))
> +        && !(flags & AV_CPU_FLAG_RVF)) {
>  av_log(NULL, AV_LOG_WARNING, "RV%s implied by specified flags\n", "F");
>  flags |= AV_CPU_FLAG_RVF;
>  }
> @@ -50,6 +75,11 @@ int ff_get_cpu_flags_riscv(void)
>  ret |= AV_CPU_FLAG_RVF;
>  if (hwcap & HWCAP_RV('D'))
>  ret |= AV_CPU_FLAG_RVD;
> +
> +    /* The V extension implies all Zve* functional subsets */
> +    if (hwcap & HWCAP_RV('V'))
> +        ret |= AV_CPU_FLAG_RV_ZVE32X | AV_CPU_FLAG_RV_ZVE64X
> +             | AV_CPU_FLAG_RV_ZVE32F | AV_CPU_FLAG_RV_ZVE64D;
>  #endif
>  
>  #ifdef __riscv_i
> @@ -60,6 +90,20 @@ int ff_get_cpu_flags_riscv(void)
>  #if (__riscv_flen >= 64)
>  ret |= AV_CPU_FLAG_RVD;
>  #endif
> +#endif
> +
> +    /* If RV-V is enabled statically at compile-time, check the details. */
> +#ifdef __riscv_vectors
> +    ret |= AV_CPU_FLAG_RV_ZVE32X;
> +#if __riscv_v_elen >= 64
> +    ret |= AV_CPU_FLAG_RV_ZVE64X;
> +#endif
> +#if __riscv_v_elen_fp >= 32
> +    ret |= AV_CPU_FLAG_RV_ZVE32F;
> +#if __riscv_v_elen_fp >= 64
> +    ret |= AV_CPU_FLAG_RV_ZVE64F;
> +#endif
> +#endif
>  #endif
>  
>  return ret;
> diff --git a/tests/checkasm/checkasm.c b/tests/checkasm/checkasm.c
> index e1135a84ac..f7d108e8ea 100644
> --- a/tests/checkasm/checkasm.c
> +++ b/tests/checkasm/checkasm.c
> @@ -233,9 +233,13 @@ static const struct {
>  { "VSX",      "vsx",      AV_CPU_FLAG_VSX },
>  { "POWER8",   "power8",   AV_CPU_FLAG_POWER8 },
>  #elif ARCH_RISCV
> -    { "RVI",      "rvi",      AV_CPU_FLAG_RVI },
> -    { "RVF",      "rvf",      AV_CPU_FLAG_RVF },
> -    { "RVD",      "rvd",      AV_CPU_FLAG_RVD },
> +    { "RVI",        "rvi",       AV_CPU_FLAG_RVI },
> +    { "RVF",        "rvf",       AV_CPU_FLAG_RVF },
> +    { "RVD",        "rvd",       AV_CPU_FLAG_RVD },
> +    { "RV_Zve32x",  "rv_zve32x", AV_CPU_FLAG_RV_ZVE32X },
> +    { "RV_Zve32f",  "rv_zve32f", AV_CPU_FLAG_RV_ZVE32F },
> +    { "RV_Zve64x",  "rv_zve64x", AV_CPU_FLAG_RV_ZVE64X },
> +    { "RV_Zve64d",  "rv_zve64d", AV_CPU_FLAG_RV_ZVE64D }, 
>

I get that this is the official name for the extension, but... what about
simplifying it to something less like a password, like RVV32I/RVV32F/RVV64I/RVV64F?


More information about the ffmpeg-devel mailing list