This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

commit 83477e2e1879d3e2195786f7f2d7b32e667f1624
Author:     Rémi Denis-Courmont <[email protected]>
AuthorDate: Tue Dec 30 21:08:23 2025 +0200
Commit:     Rémi Denis-Courmont <[email protected]>
CommitDate: Sat Jan 10 17:20:07 2026 +0200

    checkasm/riscv: handle other float ABIs than double
    
    This splits out the integer and floating point handling to add
    support for software, single and quad float ABI's.
---
 tests/checkasm/checkasm.h       |   2 +-
 tests/checkasm/riscv/checkasm.S | 179 ++++++++++++++++++++++++++++++++--------
 2 files changed, 147 insertions(+), 34 deletions(-)

diff --git a/tests/checkasm/checkasm.h b/tests/checkasm/checkasm.h
index f288320069..1798547f93 100644
--- a/tests/checkasm/checkasm.h
+++ b/tests/checkasm/checkasm.h
@@ -309,7 +309,7 @@ void checkasm_checked_call(void *func, ...);
 void checkasm_set_function(void *);
 void *checkasm_get_wrapper(void);
 
-#if HAVE_RV && (__riscv_xlen == 64) && defined (__riscv_d)
+#if HAVE_RV && (__riscv_xlen == 64)
 #define declare_new(ret, ...) \
     ret (*checked_call)(__VA_ARGS__) = checkasm_get_wrapper();
 #define checkasm_call_checked(func, ...) \
diff --git a/tests/checkasm/riscv/checkasm.S b/tests/checkasm/riscv/checkasm.S
index 97b308308e..5a9f0c649f 100644
--- a/tests/checkasm/riscv/checkasm.S
+++ b/tests/checkasm/riscv/checkasm.S
@@ -20,21 +20,57 @@
 
 #include "libavutil/riscv/asm.S"
 
+#if defined(__riscv_float_abi_soft)
+.macro  flf     rd, addr
+.endm
+.macro  fsf     rs, addr
+.endm
+#define FSZ 0
+#elif defined(__riscv_float_abi_single)
+.macro  flf     rd, addr
+        flw     \rd, \addr
+.endm
+.macro  fsf     rs, addr
+        fsw     \rs, \addr
+.endm
+#define FSZ 4
+#elif defined(__riscv_float_abi_double)
+.macro  flf     rd, addr
+        fld     \rd, \addr
+.endm
+.macro  fsf     rs, addr
+        fsd     \rs, \addr
+.endm
+#define FSZ 8
+#elif defined(__riscv_float_abi_quad)
+.macro  flf     rd, addr
+        flq     \rd, \addr
+.endm
+.macro  fsf     rs, addr
+        fsq     \rs, \addr
+.endm
+#define FSZ 16
+#else
+#error "Unknown float ABI"
+#endif
+
 #if (__riscv_xlen == 64)
 
-        .section .tbss, "waT"
+        .pushsection .tbss, "waT"
         .align  3
         .hidden checked_func
-        .hidden saved_regs
 
 checked_func:
         .quad   0
 
-saved_regs:
-        /* Space to spill RA, SP, GP, TP, S0-S11 and FS0-FS11 */
-        .rept   4 + 12 + 12
-        .quad   0
-        .endr
+        .align  3
+.Lsaved_xregs:
+        .fill   4 + 12, 8, 0 // RA, SP, GP, TP, S0-S11
+        .align  4
+.Lsaved_fregs:
+        .fill   12, FSZ, 0 // FS0-FS11
+        .fill   1, 8, 0 // RA
+        .popsection
 
 func checkasm_set_function
         lpad    0
@@ -53,15 +89,23 @@ func checkasm_get_wrapper, v
 
         call    av_get_cpu_flags
         andi    t0, a0, 8 /* AV_CPU_FLAG_RVV_I32 */
-
-        lla     a0, 3f
+#ifdef __riscv_float_abi_soft
+        andi    t1, a0, 16 /* AV_CPU_FLAG_RVV_F32 (implies F and Zve32x) */
+        lla     a0, checkasm_checked_call_i
         beqz    t0, 1f
-        lla     a0, 2f
+        lla     a0, checkasm_checked_call_iv
+        beqz    t1, 1f
+#else
+        lla     a0, checkasm_checked_call_if
+        beqz    t0, 1f
+#endif
+        lla     a0, checkasm_checked_call_ifv
 1:
         ld      ra, 8(sp)
         ld      fp,  (sp)
         addi    sp, sp, 16
         ret
+endfunc
 
         .pushsection ".rodata", "a"
 .Lfail_s_reg:
@@ -70,27 +114,33 @@ func checkasm_get_wrapper, v
         .asciz  "callee-saved floating-point register FS%d clobbered"
 .Lfail_rsvd_reg:
         .asciz  "unallocatable register %cP clobbered"
-        .popsection
-
-        .option norvc
+#if defined(__riscv_float_abi_soft) || defined(__riscv_float_abi_single)
         .align  2
-2:      /* <-- Entry point with the Vector extension --> */
-        lpad    0
-        jal     t0, .Lclobber_v
+.Lbad_float:
+        .single 123456789
+#elif defined(__riscv_float_abi_double)
+        .align  3
+.Lbad_float:
+        .double 123456789
+#elif defined(__riscv_float_abi_quad)
+        .align  4
+.Lbad_float:
+        .ldouble 123456789
+#endif
+        .popsection
 
-        .align  2
-3:      /* <-- Entry point without the Vector extension --> */
+func checkasm_checked_call_i
+        /* <-- Entry point without the Vector extension --> */
         lpad    0
         /* Save RA, unallocatable and callee-saved registers */
-        la.tls.ie t0, saved_regs
+        la.tls.ie t0, .Lsaved_xregs
         add     t0, tp, t0
         sd      ra,   (t0)
         sd      sp,  8(t0)
         sd      gp, 16(t0)
         sd      tp, 24(t0)
         .irp    n, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
-        sd      s\n, (32 + (16 * \n))(t0)
-        fsd     fs\n, (40 + (16 * \n))(t0)
+        sd      s\n, (32 + (8 * \n))(t0)
         .endr
 
         /* Clobber the stack space right below SP */
@@ -107,9 +157,7 @@ func checkasm_get_wrapper, v
         .if (\n > 1 && \n < 7)
         mv      t\n, t0
         .endif
-        fmv.d.x ft\n, t0
         mv      s\n, t0
-        fmv.d.x fs\n, t0
         .endr
 
         /* Call the tested function */
@@ -120,7 +168,7 @@ func checkasm_get_wrapper, v
         jalr    t3
 
         /* Check special register values */
-        la.tls.ie t0, saved_regs
+        la.tls.ie t0, .Lsaved_xregs
         add     t0, tp, t0
         ld      t2,  8(t0) // SP
         ld      t3, 16(t0) // GP
@@ -137,21 +185,15 @@ func checkasm_get_wrapper, v
         .irp    n, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
         li      t1, \n
         bne     t0, s\n, .Lfail_s
-#ifdef __riscv_float_abi_double
-        /* TODO: check float ABI single too */
-        fmv.x.d t2, fs\n
-        bne     t0, t2, .Lfail_fs
-#endif
         .endr
 
 4:
         /* Restore RA and saved registers */
-        la.tls.ie t0, saved_regs
+        la.tls.ie t0, .Lsaved_xregs
         add     t0, tp, t0
         ld      ra,   (t0)
         .irp    n, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
-        ld      s\n, (32 + (16 * \n))(t0)
-        fld     fs\n, (40 + (16 * \n))(t0)
+        ld      s\n, (32 + (8 * \n))(t0)
         .endr
         ret
 
@@ -170,12 +212,83 @@ func checkasm_get_wrapper, v
         mv      a1, t1
         call    checkasm_fail_func
         j       4b
+endfunc
+
+#ifndef __riscv_float_abi_soft
+func checkasm_checked_call_if, f
+        lpad    0
+        # Save callee-saved floating point registers and RA
+        la.tls.ie t0, .Lsaved_fregs
+        add     t0, t0, tp
+        lla     t1, .Lbad_float
+        sd      ra, 12 * FSZ(t0)
+        .irp    n, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
+        fsf     fs\n, \n * FSZ(t0)
+        .endr
+        # Clobber the saved and temporary floating point registers
+        .irp    n, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
+        flf     ft\n, (t1)
+        flf     fs\n, (t1)
+        .endr
+
+        jal     checkasm_checked_call_i
+
+        # Check value of saved registers
+        lla     t1, .Lbad_float
+        flf     ft0, (t1)
+        .irp    n, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
+        li      t1, \n
+#if defined(__riscv_float_abi_single)
+        feq.s   t0, ft0, fs\n
+#elif defined(__riscv_float_abi_double)
+        feq.d   t0, ft0, fs\n
+#else
+        feq.q   t0, ft0, fs\n
+#endif
+        beqz    t0, .Lfail_fs
+        .endr
+
+1:      # Restore callee-saved floating point registers and RA
+        la.tls.ie t0, .Lsaved_fregs
+        add     t0, t0, tp
+        .irp    n, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
+        flf     fs\n, \n * FSZ(t0)
+        .endr
+        ld      ra, 12 * FSZ(t0)
+        ret
 
 .Lfail_fs:
         lla     a0, .Lfail_fs_reg
         mv      a1, t1
         call    checkasm_fail_func
-        j       4b
+        j       1b
+endfunc
+#else
+func checkasm_checked_call_if, f
+        lpad    0
+        lla     t1, .Lbad_float
+        # Clobber all floating point registers (soft float ABI).
+        .irp    n, 0, 1, 2, 3, 4, 5, 6, 7
+        flw     fa\n, (t1)
+        .endr
+        .irp    n, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
+        flw     ft\n, (t1)
+        flw     fs\n, (t1)
+        .endr
+        j       checkasm_checked_call_i
+endfunc
+
+func checkasm_checked_call_iv, zve32x
+        lpad    0
+        jal     t0, .Lclobber_v
+        j       checkasm_checked_call_i
+endfunc
+#endif
+
+func checkasm_checked_call_ifv, zve32x
+        lpad    0
+        jal     t0, .Lclobber_v
+        j       checkasm_checked_call_if
 
 .Lclobber_v:
         # Clobber the vector registers

_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to