diff options
| author | Alessandro Gatti <a.gatti@frob.it> | 2024-07-25 18:42:30 +0200 |
|---|---|---|
| committer | Damien George <damien@micropython.org> | 2024-08-07 16:23:21 +1000 |
| commit | 55b2720687b6bcd71b8a5c9a5d87bea53c57743a (patch) | |
| tree | 948196cf12eb757f3e4633491d2e07ed49d2d4ea /shared/runtime/gchelper_generic.c | |
| parent | aa0b8f340d0e660cf3c1688fa1e755fdbc3ef574 (diff) | |
shared/runtime/gchelper: Add RISC-V RV64I native gchelper.
Add native gchelper support for 64 bits RISC-V RV64I targets.
Now that RV64 is under CI, this also enables platform-specific ghelper
in the Unix port.
Also changes the data type holding the register contents to something more
appropriate, so in the remote eventuality somebody wants to use this with
RV128 all they have to do is update the `__riscv_xlen` check.
Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
Diffstat (limited to 'shared/runtime/gchelper_generic.c')
| -rw-r--r-- | shared/runtime/gchelper_generic.c | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/shared/runtime/gchelper_generic.c b/shared/runtime/gchelper_generic.c index f1087e199..093723137 100644 --- a/shared/runtime/gchelper_generic.c +++ b/shared/runtime/gchelper_generic.c @@ -150,23 +150,24 @@ static void gc_helper_get_regs(gc_helper_regs_t arr) { arr[10] = x29; } -#elif defined(__riscv) && defined(__riscv_xlen) && (__riscv_xlen == 32) +#elif defined(__riscv) && (__riscv_xlen <= 64) -// Fallback implementation for RV32I, prefer gchelper_rv32i.s +// Fallback implementation for RV32I and RV64I, prefer gchelper_rv32i.s +// for RV32I targets or gchelper_rv64i.s for RV64I targets. static void gc_helper_get_regs(gc_helper_regs_t arr) { - register long s0 asm ("x8"); - register long s1 asm ("x9"); - register long s2 asm ("x18"); - register long s3 asm ("x19"); - register long s4 asm ("x20"); - register long s5 asm ("x21"); - register long s6 asm ("x22"); - register long s7 asm ("x23"); - register long s8 asm ("x24"); - register long s9 asm ("x25"); - register long s10 asm ("x26"); - register long s11 asm ("x27"); + register uintptr_t s0 asm ("x8"); + register uintptr_t s1 asm ("x9"); + register uintptr_t s2 asm ("x18"); + register uintptr_t s3 asm ("x19"); + register uintptr_t s4 asm ("x20"); + register uintptr_t s5 asm ("x21"); + register uintptr_t s6 asm ("x22"); + register uintptr_t s7 asm ("x23"); + register uintptr_t s8 asm ("x24"); + register uintptr_t s9 asm ("x25"); + register uintptr_t s10 asm ("x26"); + register uintptr_t s11 asm ("x27"); arr[0] = s0; arr[1] = s1; arr[2] = s2; |
