diff options
author | Rémi Denis-Courmont <remi@remlab.net> | 2024-07-28 21:17:58 +0300 |
---|---|---|
committer | Rémi Denis-Courmont <remi@remlab.net> | 2024-08-01 18:43:04 +0300 |
commit | 952b426f3bcc6206eff2fa338ff7da475a28692b (patch) | |
tree | bac4859011a792b227faa77b81c0a1901e4af40f /libavcodec/riscv | |
parent | f4daf633b2e31e2e0fb3e0fcf1c7deacbc57b93e (diff) | |
download | ffmpeg-952b426f3bcc6206eff2fa338ff7da475a28692b.tar.gz |
lavc/bswapdsp: add RV Zvbb bswap16 and bswap32
Diffstat (limited to 'libavcodec/riscv')
-rw-r--r-- | libavcodec/riscv/Makefile | 1 | ||||
-rw-r--r-- | libavcodec/riscv/bswapdsp_init.c | 13 | ||||
-rw-r--r-- | libavcodec/riscv/bswapdsp_rvvb.S | 52 |
3 files changed, 63 insertions, 3 deletions
diff --git a/libavcodec/riscv/Makefile b/libavcodec/riscv/Makefile index 1491b6c067..58666e1d35 100644 --- a/libavcodec/riscv/Makefile +++ b/libavcodec/riscv/Makefile @@ -16,6 +16,7 @@ RVV-OBJS-$(CONFIG_BLOCKDSP) += riscv/blockdsp_rvv.o OBJS-$(CONFIG_BSWAPDSP) += riscv/bswapdsp_init.o RV-OBJS-$(CONFIG_BSWAPDSP) += riscv/bswapdsp_rvb.o RVV-OBJS-$(CONFIG_BSWAPDSP) += riscv/bswapdsp_rvv.o +RVVB-OBJS-$(CONFIG_BSWAPDSP) += riscv/bswapdsp_rvvb.o OBJS-$(CONFIG_EXR_DECODER) += riscv/exrdsp_init.o RVV-OBJS-$(CONFIG_EXR_DECODER) += riscv/exrdsp_rvv.o OBJS-$(CONFIG_FLAC_DECODER) += riscv/flacdsp_init.o diff --git a/libavcodec/riscv/bswapdsp_init.c b/libavcodec/riscv/bswapdsp_init.c index c13387c232..43d74a4e98 100644 --- a/libavcodec/riscv/bswapdsp_init.c +++ b/libavcodec/riscv/bswapdsp_init.c @@ -27,6 +27,8 @@ void ff_bswap32_buf_rvb(uint32_t *dst, const uint32_t *src, int len); void ff_bswap16_buf_rvv(uint16_t *dst, const uint16_t *src, int len); +void ff_bswap32_buf_rvvb(uint32_t *dst, const uint32_t *src, int len); +void ff_bswap16_buf_rvvb(uint16_t *dst, const uint16_t *src, int len); av_cold void ff_bswapdsp_init_riscv(BswapDSPContext *c) { @@ -38,9 +40,14 @@ av_cold void ff_bswapdsp_init_riscv(BswapDSPContext *c) c->bswap_buf = ff_bswap32_buf_rvb; #endif #if HAVE_RVV - if (flags & AV_CPU_FLAG_RVB_ADDR) { - if (flags & AV_CPU_FLAG_RVV_I32) - c->bswap16_buf = ff_bswap16_buf_rvv; + if ((flags & AV_CPU_FLAG_RVV_I32) && (flags & AV_CPU_FLAG_RVB)) { + c->bswap16_buf = ff_bswap16_buf_rvv; +#if HAVE_RV_ZVBB + if (flags & AV_CPU_FLAG_RV_ZVBB) { + c->bswap_buf = ff_bswap32_buf_rvvb; + c->bswap16_buf = ff_bswap16_buf_rvvb; + } +#endif } #endif #endif diff --git a/libavcodec/riscv/bswapdsp_rvvb.S b/libavcodec/riscv/bswapdsp_rvvb.S new file mode 100644 index 0000000000..165ac104a9 --- /dev/null +++ b/libavcodec/riscv/bswapdsp_rvvb.S @@ -0,0 +1,52 @@ +/* + * Copyright © 2024 Rémi Denis-Courmont. + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "config.h" +#include "libavutil/riscv/asm.S" + +func ff_bswap32_buf_rvvb, zve32x, zvbb, zba + lpad 0 +1: + vsetvli t0, a2, e32, m8, ta, ma + vle32.v v8, (a1) + sub a2, a2, t0 + vrev8.v v8, v8 + sh2add a1, t0, a1 + vse32.v v8, (a0) + sh2add a0, t0, a0 + bnez a2, 1b + + ret +endfunc + +func ff_bswap16_buf_rvvb, zve32x, zvbb, zba + lpad 0 +1: + vsetvli t0, a2, e16, m8, ta, ma + vle16.v v8, (a1) + sub a2, a2, t0 + vrev8.v v8, v8 + sh1add a1, t0, a1 + vse16.v v8, (a0) + sh1add a0, t0, a0 + bnez a2, 1b + + ret +endfunc |