[FFmpeg-devel] [PATCH 6/7] avutil/riscv/asm: add generic push/pop helpers

Rémi Denis-Courmont remi at remlab.net
Tue Aug 13 18:55:24 EEST 2024



Le 13 août 2024 17:03:35 GMT+03:00, "J. Dekker" <jdek at itanimul.li> a écrit :
>From: Niklas Haas <git at haasn.dev>
>
>Generic helper macros to push/pop multiple registers at once. Expands to
>a single `addi` plus a sequence of XLEN-sized stores/loads.
>---
> libavutil/riscv/asm.S | 37 +++++++++++++++++++++++++++++++++++++
> 1 file changed, 37 insertions(+)
>
>diff --git a/libavutil/riscv/asm.S b/libavutil/riscv/asm.S
>index db190e99ca..3955530e4e 100644
>--- a/libavutil/riscv/asm.S
>+++ b/libavutil/riscv/asm.S
>@@ -288,3 +288,40 @@
>         .macro  count_args args:vararg
>         count_args_inner 0, \args
>         .endm
>+
>+        /**
>+         * Helper macro to iterate over constant sized elements in memory
>+         * @param op operation to perform on each element (sized load/store)
>+         * @param size size in bytes per element
>+         * @param offset starting offset of first element
>+         * @param addr base address to load/store
>+         * @param regs registers to iterate over
>+         */
>+        .macro  for_mem op, size, offset, addr, reg, regs:vararg
>+        .ifnb \reg
>+        \op     \reg, \offset(\addr)
>+        for_mem \op, \size, \offset + \size, \addr, \regs
>+        .endif
>+        .endm
>+
>+        /**
>+         * Push a variable number of registers to the stack.
>+         * @param n number of registers to push
>+         * @param regs registers to push
>+         */
>+        .macro  push regs:vararg
>+        count_args \regs
>+        addi    sp, sp, -(num_args * (__riscv_xlen >> 3))
>+        for_mem sx, __riscv_xlen >> 3, 0, sp, \regs
>+        .endm

This is not in line with the psABI specification for RV32 and RV64. Ditto below.

It's also not in line with the RV128 ABI since that doesn't even exist yet.

>+
>+        /**
>+         * Pop a variable number of registers from the stack.
>+         * @param n number of registers to pop
>+         * @param[out] regs registers to pop
>+         */
>+        .macro  pop regs:vararg
>+        count_args \regs
>+        for_mem lx, __riscv_xlen >> 3, 0, sp, \regs
>+        addi    sp, sp, num_args * (__riscv_xlen >> 3)
>+        .endm


More information about the ffmpeg-devel mailing list