shared/runtime/gchelper: Add RISC-V RV32I native gchelper.
Add native gchelper support for 32 bits RISC-V RV32I targets. Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
This commit is contained in:
committed by
Damien George
parent
e6ae699998
commit
de0e13a9a8
@@ -41,6 +41,8 @@ typedef uintptr_t gc_helper_regs_t[4];
|
|||||||
typedef uintptr_t gc_helper_regs_t[10];
|
typedef uintptr_t gc_helper_regs_t[10];
|
||||||
#elif defined(__aarch64__)
|
#elif defined(__aarch64__)
|
||||||
typedef uintptr_t gc_helper_regs_t[11]; // x19-x29
|
typedef uintptr_t gc_helper_regs_t[11]; // x19-x29
|
||||||
|
#elif defined(__riscv) && defined(__riscv_xlen) && (__riscv_xlen == 32)
|
||||||
|
typedef uintptr_t gc_helper_regs_t[12]; // S0-S11
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -150,6 +150,37 @@ static void gc_helper_get_regs(gc_helper_regs_t arr) {
|
|||||||
arr[10] = x29;
|
arr[10] = x29;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#elif defined(__riscv) && defined(__riscv_xlen) && (__riscv_xlen == 32)
|
||||||
|
|
||||||
|
// Fallback implementation for RV32I, prefer gchelper_rv32i.s
|
||||||
|
|
||||||
|
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");
|
||||||
|
arr[0] = s0;
|
||||||
|
arr[1] = s1;
|
||||||
|
arr[2] = s2;
|
||||||
|
arr[3] = s3;
|
||||||
|
arr[4] = s4;
|
||||||
|
arr[5] = s5;
|
||||||
|
arr[6] = s6;
|
||||||
|
arr[7] = s7;
|
||||||
|
arr[8] = s8;
|
||||||
|
arr[9] = s9;
|
||||||
|
arr[10] = s10;
|
||||||
|
arr[11] = s11;
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#error "Architecture not supported for gc_helper_get_regs. Set MICROPY_GCREGS_SETJMP to use the fallback implementation."
|
#error "Architecture not supported for gc_helper_get_regs. Set MICROPY_GCREGS_SETJMP to use the fallback implementation."
|
||||||
|
|||||||
52
shared/runtime/gchelper_rv32i.s
Normal file
52
shared/runtime/gchelper_rv32i.s
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2024 Alessandro Gatti
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.global gc_helper_get_regs_and_sp
|
||||||
|
.type gc_helper_get_regs_and_sp, @function
|
||||||
|
|
||||||
|
gc_helper_get_regs_and_sp:
|
||||||
|
|
||||||
|
/* Store registers into the given array. */
|
||||||
|
|
||||||
|
sw x8, 0(x10) /* Save S0. */
|
||||||
|
sw x9, 4(x10) /* Save S1. */
|
||||||
|
sw x18, 8(x10) /* Save S2. */
|
||||||
|
sw x19, 12(x10) /* Save S3. */
|
||||||
|
sw x20, 16(x10) /* Save S4. */
|
||||||
|
sw x21, 20(x10) /* Save S5. */
|
||||||
|
sw x22, 24(x10) /* Save S6. */
|
||||||
|
sw x23, 28(x10) /* Save S7. */
|
||||||
|
sw x24, 32(x10) /* Save S8. */
|
||||||
|
sw x25, 36(x10) /* Save S9. */
|
||||||
|
sw x26, 40(x10) /* Save S10. */
|
||||||
|
sw x27, 44(x10) /* Save S11. */
|
||||||
|
|
||||||
|
/* Return the stack pointer. */
|
||||||
|
|
||||||
|
add x10, x0, x2
|
||||||
|
jalr x0, x1, 0
|
||||||
|
|
||||||
|
.size gc_helper_get_regs_and_sp, .-gc_helper_get_regs_and_sp
|
||||||
Reference in New Issue
Block a user