* [FFmpeg-devel] [PATCH] checkasm/riscv: check other ABIs than 64-bit hard double (PR #21324)
@ 2025-12-30 19:31 Rémi Denis-Courmont via ffmpeg-devel
0 siblings, 0 replies; only message in thread
From: Rémi Denis-Courmont via ffmpeg-devel @ 2025-12-30 19:31 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Rémi Denis-Courmont
PR #21324 opened by Rémi Denis-Courmont (Courmisch)
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21324
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21324.patch
From a665a59e8aa0d25eccc2758a18b5ef1ab2783d89 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9mi=20Denis-Courmont?= <remi@remlab.net>
Date: Mon, 22 Dec 2025 22:42:47 +0200
Subject: [PATCH 1/5] checkasm/riscv: factor out the vector clobbers
No functional changes.
---
tests/checkasm/riscv/checkasm.S | 31 +++++++++++++++++--------------
1 file changed, 17 insertions(+), 14 deletions(-)
diff --git a/tests/checkasm/riscv/checkasm.S b/tests/checkasm/riscv/checkasm.S
index c4b034ae23..5283596575 100644
--- a/tests/checkasm/riscv/checkasm.S
+++ b/tests/checkasm/riscv/checkasm.S
@@ -79,20 +79,7 @@ func checkasm_get_wrapper, v
.align 2
2: /* <-- Entry point with the Vector extension --> */
lpad 0
- /* Clobber the vectors */
- vsetvli t0, zero, e32, m8, ta, ma
- li t0, 0xdeadbeef
- vmv.v.x v0, t0
- vmv.v.x v8, t0
- vmv.v.x v16, t0
- vmv.v.x v24, t0
-
- /* Clobber the vector configuration */
- li t0, 0 /* Vector length: zero */
- li t2, -4 /* Vector type: illegal */
- vsetvl zero, t0, t2
- csrwi vxrm, 3 /* Rounding mode: round-to-odd */
- csrwi vxsat, 1 /* Saturation: encountered */
+ jal t0, .Lclobber_v
.align 2
3: /* <-- Entry point without the Vector extension --> */
@@ -181,5 +168,21 @@ func checkasm_get_wrapper, v
lla a0, fail_fs_reg
call checkasm_fail_func
j 4b
+
+.Lclobber_v:
+ # Clobber the vector registers
+ vsetvli t1, zero, e32, m8, ta, ma
+ li t1, -0xdeadbeef
+ vmv.v.x v0, t1
+ vmv.v.x v8, t1
+ vmv.v.x v16, t1
+ vmv.v.x v24, t1
+ # Clobber the vector configuration
+ li t1, 0 /* Vector length: zero */
+ li t3, -4 /* Vector type: illegal */
+ vsetvl zero, t1, t3
+ csrwi vxrm, 3 /* Rounding mode: round-to-odd */
+ csrwi vxsat, 1 /* Saturation: encountered */
+ jr t0
endfunc
#endif
--
2.49.1
From 86a8944491729939c352713d32a700a8a25ba96b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9mi=20Denis-Courmont?= <remi@remlab.net>
Date: Mon, 22 Dec 2025 22:47:46 +0200
Subject: [PATCH 2/5] checkasm/riscv: restore stack before failure reporting
The faiure handling code is C and requires correct stack, global and
thread pointers. This restores them before returning to C. At the same
time, we no longer need to abort() afterwards.
---
tests/checkasm/riscv/checkasm.S | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/tests/checkasm/riscv/checkasm.S b/tests/checkasm/riscv/checkasm.S
index 5283596575..adbf0c0b10 100644
--- a/tests/checkasm/riscv/checkasm.S
+++ b/tests/checkasm/riscv/checkasm.S
@@ -155,9 +155,13 @@ func checkasm_get_wrapper, v
ret
5:
+ # checkasm_fail_func() needs valid SP, GP and TP. Restore them.
+ ld sp, 8(t0)
+ ld gp, 16(t0)
+ ld tp, 24(t0)
lla a0, fail_rsvd_reg
call checkasm_fail_func
- tail abort /* The test harness would probably crash anyway */
+ j 4b
6:
lla a0, fail_s_reg
--
2.49.1
From 810b6761425dc46f04cc36ab3733819772b04363 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9mi=20Denis-Courmont?= <remi@remlab.net>
Date: Mon, 22 Dec 2025 22:58:08 +0200
Subject: [PATCH 3/5] checkasm/riscv: print clobbered register name
checkasm_fail_func takes a format string, so we can.
---
tests/checkasm/riscv/checkasm.S | 53 +++++++++++++++++----------------
1 file changed, 27 insertions(+), 26 deletions(-)
diff --git a/tests/checkasm/riscv/checkasm.S b/tests/checkasm/riscv/checkasm.S
index adbf0c0b10..1b8fdfe51a 100644
--- a/tests/checkasm/riscv/checkasm.S
+++ b/tests/checkasm/riscv/checkasm.S
@@ -22,18 +22,6 @@
#if (__riscv_xlen == 64)
-const fail_s_reg
- .asciz "callee-saved integer register clobbered"
-endconst
-
-const fail_fs_reg
- .asciz "callee-saved floating-point register clobbered"
-endconst
-
-const fail_rsvd_reg
- .asciz "unallocatable register clobbered"
-endconst
-
.section .tbss, "waT"
.align 3
.hidden checked_func
@@ -75,6 +63,15 @@ func checkasm_get_wrapper, v
addi sp, sp, 16
ret
+ .pushsection ".rodata", "a"
+.Lfail_s_reg:
+ .asciz "callee-saved integer register S%d clobbered"
+.Lfail_fs_reg:
+ .asciz "callee-saved floating-point register FS%d clobbered"
+.Lfail_rsvd_reg:
+ .asciz "unallocatable register %cP clobbered"
+ .popsection
+
.option norvc
.align 2
2: /* <-- Entry point with the Vector extension --> */
@@ -125,21 +122,25 @@ func checkasm_get_wrapper, v
/* Check special register values */
la.tls.ie t0, saved_regs
add t0, tp, t0
- ld t1, 8(t0)
- bne t1, sp, 5f
- ld t1, 16(t0)
- bne t1, gp, 5f
- ld t1, 24(t0) // If TP was corrupted, we probably will have...
- bne t1, tp, 5f // ...already crashed before we even get here.
+ ld t2, 8(t0) // SP
+ ld t3, 16(t0) // GP
+ ld t4, 24(t0) // TP
+ li a1, 'S'
+ bne t2, sp, .Lfail_xp
+ li a1, 'G'
+ bne t3, gp, .Lfail_xp
+ li a1, 'T'
+ bne t4, tp, .Lfail_xp
/* Check value of saved registers */
li t0, 0xdeadbeef1badf00d
.irp n, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
- bne t0, s\n, 6f
+ li a1, \n
+ bne t0, s\n, .Lfail_s
#ifdef __riscv_float_abi_double
/* TODO: check float ABI single too */
fmv.x.d t1, fs\n
- bne t0, t1, 7f
+ bne t0, t1, .Lfail_fs
#endif
.endr
@@ -154,22 +155,22 @@ func checkasm_get_wrapper, v
.endr
ret
-5:
+.Lfail_xp:
# checkasm_fail_func() needs valid SP, GP and TP. Restore them.
ld sp, 8(t0)
ld gp, 16(t0)
ld tp, 24(t0)
- lla a0, fail_rsvd_reg
+ lla a0, .Lfail_rsvd_reg
call checkasm_fail_func
j 4b
-6:
- lla a0, fail_s_reg
+.Lfail_s:
+ lla a0, .Lfail_s_reg
call checkasm_fail_func
j 4b
-7:
- lla a0, fail_fs_reg
+.Lfail_fs:
+ lla a0, .Lfail_fs_reg
call checkasm_fail_func
j 4b
--
2.49.1
From 494493e729b8ece54f54ecca8726aedb0da8578b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9mi=20Denis-Courmont?= <remi@remlab.net>
Date: Tue, 30 Dec 2025 21:08:23 +0200
Subject: [PATCH 4/5] 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 a54231dd0d..90aeee27b7 100644
--- a/tests/checkasm/checkasm.h
+++ b/tests/checkasm/checkasm.h
@@ -301,7 +301,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 call_new(...) \
diff --git a/tests/checkasm/riscv/checkasm.S b/tests/checkasm/riscv/checkasm.S
index 1b8fdfe51a..84c081cbfb 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"
+#if defined(__riscv_float_abi_soft) || defined(__riscv_float_abi_single)
+ .align 2
+.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
- .option norvc
- .align 2
-2: /* <-- Entry point with the Vector extension --> */
- lpad 0
- jal t0, .Lclobber_v
-
- .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 a1, \n
bne t0, s\n, .Lfail_s
-#ifdef __riscv_float_abi_double
- /* TODO: check float ABI single too */
- fmv.x.d t1, fs\n
- bne t0, t1, .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
@@ -168,11 +210,82 @@ func checkasm_get_wrapper, v
lla a0, .Lfail_s_reg
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 a1, \n
+#if defined(__riscv_float_abi_single)
+ feq.s t1, ft0, fs\n
+#elif defined(__riscv_float_abi_double)
+ feq.d t1, ft0, fs\n
+#else
+ feq.q t1, ft0, fs\n
+#endif
+ beqz t1, .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
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
--
2.49.1
From 50108118944adae533b2b99dfc7548d5a7fa417d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9mi=20Denis-Courmont?= <remi@remlab.net>
Date: Tue, 30 Dec 2025 21:26:46 +0200
Subject: [PATCH 5/5] checkasm/riscv: add call checks for riscv32
---
tests/checkasm/checkasm.h | 2 +-
tests/checkasm/riscv/checkasm.S | 128 +++++++++++++++++++-------------
2 files changed, 79 insertions(+), 51 deletions(-)
diff --git a/tests/checkasm/checkasm.h b/tests/checkasm/checkasm.h
index 90aeee27b7..4bd7f3ee0c 100644
--- a/tests/checkasm/checkasm.h
+++ b/tests/checkasm/checkasm.h
@@ -301,7 +301,7 @@ void checkasm_checked_call(void *func, ...);
void checkasm_set_function(void *);
void *checkasm_get_wrapper(void);
-#if HAVE_RV && (__riscv_xlen == 64)
+#if HAVE_RV
#define declare_new(ret, ...) \
ret (*checked_call)(__VA_ARGS__) = checkasm_get_wrapper();
#define call_new(...) \
diff --git a/tests/checkasm/riscv/checkasm.S b/tests/checkasm/riscv/checkasm.S
index 84c081cbfb..c35c9f1113 100644
--- a/tests/checkasm/riscv/checkasm.S
+++ b/tests/checkasm/riscv/checkasm.S
@@ -20,6 +20,38 @@
#include "libavutil/riscv/asm.S"
+#if (__riscv_xlen == 32)
+.macro lx rd, addr
+ lw \rd, \addr
+.endm
+
+.macro sx rs, addr
+ sw \rs, \addr
+.endm
+#define REG_MAGIC 0xdeadbeef
+#elif (__riscv_xlen == 64)
+.macro lx rd, addr
+ ld \rd, \addr
+.endm
+
+.macro sx rs, addr
+ sd \rs, \addr
+.endm
+#define REG_MAGIC 0xdeadbeef0badf00d
+#else
+.macro lx rd, addr
+ lq \rd, \addr
+.endm
+
+.macro sx rs, addr
+ sq \rs, \addr
+.endm
+#define REG_MAGIC 0xdeadbeef0badf00daaaabbbbccccdddd
+#endif
+#define XSZ (__riscv_xlen / 8)
+#define STACK_ALIGN 16
+#define STACK_SPACE(sz) (((sz) + (STACK_ALIGN - 1)) & -STACK_ALIGN)
+
#if defined(__riscv_float_abi_soft)
.macro flf rd, addr
.endm
@@ -54,38 +86,33 @@
#error "Unknown float ABI"
#endif
-#if (__riscv_xlen == 64)
-
.pushsection .tbss, "waT"
- .align 3
- .hidden checked_func
-
-checked_func:
- .quad 0
-
- .align 3
+ .align 4
+.Lchecked_func:
+ .fill 1, XSZ, 0
+ .align 4
.Lsaved_xregs:
- .fill 4 + 12, 8, 0 // RA, SP, GP, TP, S0-S11
+ .fill 4 + 12, XSZ, 0 // RA, SP, GP, TP, S0-S11
.align 4
.Lsaved_fregs:
.fill 12, FSZ, 0 // FS0-FS11
- .fill 1, 8, 0 // RA
+ .fill 1, XSZ, 0 // RA
.popsection
func checkasm_set_function
lpad 0
- la.tls.ie t0, checked_func
+ la.tls.ie t0, .Lchecked_func
add t0, tp, t0
- sd a0, (t0)
+ sx a0, (t0)
ret
endfunc
func checkasm_get_wrapper, v
lpad 0
- addi sp, sp, -16
- sd fp, (sp)
- sd ra, 8(sp)
- addi fp, sp, 16
+ addi sp, sp, -STACK_SPACE(2 * XSZ)
+ sx fp, (sp)
+ sx ra, XSZ(sp)
+ addi fp, sp, STACK_SPACE(2 * XSZ)
call av_get_cpu_flags
andi t0, a0, 8 /* AV_CPU_FLAG_RVV_I32 */
@@ -101,8 +128,8 @@ func checkasm_get_wrapper, v
#endif
lla a0, checkasm_checked_call_ifv
1:
- ld ra, 8(sp)
- ld fp, (sp)
+ lx ra, XSZ(sp)
+ lx fp, (sp)
addi sp, sp, 16
ret
endfunc
@@ -135,44 +162,46 @@ func checkasm_checked_call_i
/* Save RA, unallocatable and callee-saved registers */
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)
+ sx ra, (t0)
+ sx sp, 1 * XSZ(t0)
+ sx gp, 2 * XSZ(t0)
+ sx tp, 3 * XSZ(t0)
.irp n, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
- sd s\n, (32 + (8 * \n))(t0)
+ sx s\n, (4 + \n) * XSZ(t0)
.endr
/* Clobber the stack space right below SP */
- li t0, 0xdeadbeef1badf00d
- .rept 16
- addi sp, sp, -16
- sd t0, (sp)
- sd t0, 8(sp)
- .endr
- addi sp, sp, 256
+ li t1, REG_MAGIC
+ li t0, 16
+1:
+ addi sp, sp, -XSZ
+ addi t0, t0, -1
+ sx t1, (sp)
+ bnez t0, 1b
- /* Clobber the saved and temporary registers */
+ addi sp, sp, 16 * XSZ
+ # Clobber temporary registers (except T2, FE-CFI label)
+ .irp n, 0, 1, 3, 4, 5, 6
+ mv t\n, t1
+ .endr
+ # Clobber the saved registers
.irp n, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
- .if (\n > 1 && \n < 7)
- mv t\n, t0
- .endif
- mv s\n, t0
+ mv s\n, t1
.endr
/* Call the tested function */
- la.tls.ie t0, checked_func
+ la.tls.ie t0, .Lchecked_func
add t0, tp, t0
- ld t3, (t0)
- sd zero, (t0)
+ lx t3, (t0)
+ sx zero, (t0)
jalr t3
/* Check special register values */
la.tls.ie t0, .Lsaved_xregs
add t0, tp, t0
- ld t2, 8(t0) // SP
- ld t3, 16(t0) // GP
- ld t4, 24(t0) // TP
+ lx t2, 1 * XSZ(t0) // SP
+ lx t3, 2 * XSZ(t0) // GP
+ lx t4, 3 * XSZ(t0) // TP
li a1, 'S'
bne t2, sp, .Lfail_xp
li a1, 'G'
@@ -181,27 +210,27 @@ func checkasm_checked_call_i
bne t4, tp, .Lfail_xp
/* Check value of saved registers */
- li t0, 0xdeadbeef1badf00d
+ li t1, REG_MAGIC
.irp n, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
li a1, \n
- bne t0, s\n, .Lfail_s
+ bne t1, s\n, .Lfail_s
.endr
4:
/* Restore RA and saved registers */
la.tls.ie t0, .Lsaved_xregs
add t0, tp, t0
- ld ra, (t0)
+ lx ra, (t0)
.irp n, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
- ld s\n, (32 + (8 * \n))(t0)
+ lx s\n, (4 + \n) * XSZ(t0)
.endr
ret
.Lfail_xp:
# checkasm_fail_func() needs valid SP, GP and TP. Restore them.
- ld sp, 8(t0)
- ld gp, 16(t0)
- ld tp, 24(t0)
+ lx sp, 1 * XSZ(t0)
+ lx gp, 2 * XSZ(t0)
+ lx tp, 3 * XSZ(t0)
lla a0, .Lfail_rsvd_reg
call checkasm_fail_func
j 4b
@@ -303,4 +332,3 @@ func checkasm_checked_call_ifv, zve32x
csrwi vxsat, 1 /* Saturation: encountered */
jr t0
endfunc
-#endif
--
2.49.1
_______________________________________________
ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org
To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2025-12-30 19:32 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-12-30 19:31 [FFmpeg-devel] [PATCH] checkasm/riscv: check other ABIs than 64-bit hard double (PR #21324) Rémi Denis-Courmont via ffmpeg-devel
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git