Mercurial > pub > dyncall > dyncall
changeset 659:b8969b7b4876
riscv64 callbacks:
- corrected frame pointer of callback code to args to handler (makes maybe some debuggers happier)
- refactored, saving two instructions
- simplified asm a bit, using more fitting instructions (and cleaned up comments)
author | Tassilo Philipp |
---|---|
date | Tue, 12 Mar 2024 23:12:15 +0100 |
parents | a111a62e20fd |
children | 17dff20b9c10 |
files | dyncallback/dyncall_callback_riscv64.S |
diffstat | 1 files changed, 37 insertions(+), 48 deletions(-) [+] |
line wrap: on
line diff
--- a/dyncallback/dyncall_callback_riscv64.S Tue Mar 12 23:09:08 2024 +0100 +++ b/dyncallback/dyncall_callback_riscv64.S Tue Mar 12 23:12:15 2024 +0100 @@ -54,79 +54,68 @@ ra - ret addr s0/fp - frame ptr - - locals: - t0: orig sp - t1: DCArgs* args */ - mv t0, sp +/* prolog */ add sp, sp, -176 - - /* save ra and s0 */ - sd ra, 0(sp) - sd s0, 8(sp) + sd ra, 168(sp) + sd s0, 160(sp) + add s0, sp, 176 - /* save frame ptr */ - mv s0, sp - - add t1, s0, 16 - - /* just saving everything on stack, as defined in DCArgs in dyncall_args_riscv64.c */ - -/* save regs */ +/* fill DCArgs data (see dyncall_args_riscv64.c) */ - sd a0, 0(t1) - sd a1, 8(t1) - sd a2, 16(t1) - sd a3, 24(t1) - sd a4, 32(t1) - sd a5, 40(t1) - sd a6, 48(t1) - sd a7, 56(t1) + sd a0, 0(sp) /* I */ + sd a1, 8(sp) + sd a2, 16(sp) + sd a3, 24(sp) + sd a4, 32(sp) + sd a5, 40(sp) + sd a6, 48(sp) + sd a7, 56(sp) - fsd fa0, 64(t1) - fsd fa1, 72(t1) - fsd fa2, 80(t1) - fsd fa3, 88(t1) - fsd fa4, 96(t1) - fsd fa5, 104(t1) - fsd fa6, 112(t1) - fsd fa7, 120(t1) + fsd fa0, 64(sp) /* F */ + fsd fa1, 72(sp) + fsd fa2, 80(sp) + fsd fa3, 88(sp) + fsd fa4, 96(sp) + fsd fa5, 104(sp) + fsd fa6, 112(sp) + fsd fa7, 120(sp) - sd t0, 128(t1) /* sp=sp */ - sd zero, 136(t1) /* i=f=0 */ + sd s0, 128(sp) /* sp=sp */ + sd zero, 136(sp) /* i=f=0 */ /* call handler/callback */ - mv a0, t5 /* DCCallback* pcb */ - add a1, s0, 16 /* DCArgs* args */ - add a2, s0, 160 /* DCValue* result */ - ld a3, 40(t5) /* void* userdata */ + mv a0, t5 /* DCCallback* pcb */ + mv a1, sp /* DCArgs* args */ + add a2, sp, 144 /* DCValue* result */ + ld a3, 40(t5) /* void* userdata */ ld t2, 32(t5) jalr ra, 0(t2) and t3, a0, 255 - add t4, zero, 'f' /* single precition floats are sign extended on */ - beq t3, t4, .retf /* riscv with the D extension, handle specifically */ - add t4, zero, 'd' + li t4, 'f' /* single prec floats need reg's 32 MSBs */ + beq t3, t4, .retf /* all set (on riscv with the D extension) */ + li t4, 'd' beq t3, t4, .retd .reti: - ld a0, 160(s0) + ld a0, 144(sp) j .ret .retf: - flw fa0, 160(s0) + flw fa0, 144(sp) j .ret .retd: - fld fa0, 160(s0) + fld fa0, 144(sp) .ret: - /* recover ra and s0 */ - ld ra, 0(sp) - ld s0, 8(sp) + +/* epilog */ + ld ra, 168(sp) + ld s0, 160(sp) add sp, sp, 176 ret