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]
