summaryrefslogtreecommitdiff
path: root/py/emitnative.c
diff options
context:
space:
mode:
authorAlessandro Gatti <a.gatti@frob.it>2024-06-08 11:00:08 +0200
committerDamien George <damien@micropython.org>2024-06-21 15:06:07 +1000
commit8338f663523d675847b8c0b9b92977b76995de8f (patch)
tree7058f782f01fd1a211a18c73456565f4f26f77aa /py/emitnative.c
parent5a778ebc378d7a1bc9716177950c9e8ac000bb56 (diff)
py/asmrv32: Add RISC-V RV32IMC native code emitter.
This adds a native code generation backend for RISC-V RV32I CPUs, currently limited to the I, M, and C instruction sets. Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
Diffstat (limited to 'py/emitnative.c')
-rw-r--r--py/emitnative.c32
1 files changed, 31 insertions, 1 deletions
diff --git a/py/emitnative.c b/py/emitnative.c
index 0b84a2ec8..7557e4ba4 100644
--- a/py/emitnative.c
+++ b/py/emitnative.c
@@ -59,7 +59,7 @@
#endif
// wrapper around everything in this file
-#if N_X64 || N_X86 || N_THUMB || N_ARM || N_XTENSA || N_XTENSAWIN
+#if N_X64 || N_X86 || N_THUMB || N_ARM || N_XTENSA || N_XTENSAWIN || N_RV32
// C stack layout for native functions:
// 0: nlr_buf_t [optional]
@@ -2522,6 +2522,36 @@ static void emit_native_binary_op(emit_t *emit, mp_binary_op_t op) {
} else {
asm_xtensa_setcc_reg_reg_reg(emit->as, cc & ~0x80, REG_RET, reg_rhs, REG_ARG_2);
}
+ #elif N_RV32
+ (void)op_idx;
+ switch (op) {
+ case MP_BINARY_OP_LESS:
+ asm_rv32_meta_comparison_lt(emit->as, REG_ARG_2, reg_rhs, REG_RET, vtype_lhs == VTYPE_UINT);
+ break;
+
+ case MP_BINARY_OP_MORE:
+ asm_rv32_meta_comparison_lt(emit->as, reg_rhs, REG_ARG_2, REG_RET, vtype_lhs == VTYPE_UINT);
+ break;
+
+ case MP_BINARY_OP_EQUAL:
+ asm_rv32_meta_comparison_eq(emit->as, REG_ARG_2, reg_rhs, REG_RET);
+ break;
+
+ case MP_BINARY_OP_LESS_EQUAL:
+ asm_rv32_meta_comparison_le(emit->as, REG_ARG_2, reg_rhs, REG_RET, vtype_lhs == VTYPE_UINT);
+ break;
+
+ case MP_BINARY_OP_MORE_EQUAL:
+ asm_rv32_meta_comparison_le(emit->as, reg_rhs, REG_ARG_2, REG_RET, vtype_lhs == VTYPE_UINT);
+ break;
+
+ case MP_BINARY_OP_NOT_EQUAL:
+ asm_rv32_meta_comparison_ne(emit->as, reg_rhs, REG_ARG_2, REG_RET);
+ break;
+
+ default:
+ break;
+ }
#else
#error not implemented
#endif