diff --git a/py/asmrv32.c b/py/asmrv32.c index 8b643af562..e58e42012d 100644 --- a/py/asmrv32.c +++ b/py/asmrv32.c @@ -620,28 +620,31 @@ void asm_rv32_emit_optimised_xor(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs) asm_rv32_opcode_xor(state, rd, rd, rs); } +// WARNING: The scaled offset will be stored in REG_TEMP2. static void asm_rv32_fix_up_scaled_reg_reg_reg(asm_rv32_t *state, mp_uint_t rs1, mp_uint_t rs2, mp_uint_t operation_size) { assert(operation_size <= 2 && "Operation size value out of range."); if (operation_size > 0 && asm_rv32_allow_zba_opcodes()) { // sh{1,2}add rs1, rs2, rs1 - asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_R(0x33, 1 << operation_size, 0x10, rs1, rs2, rs1)); + asm_rv32_emit_word_opcode(state, RV32_ENCODE_TYPE_R(0x33, 1 << operation_size, 0x10, REG_TEMP2, rs2, rs1)); } else { if (operation_size > 0) { - asm_rv32_opcode_cslli(state, rs2, operation_size); + asm_rv32_opcode_slli(state, REG_TEMP2, rs2, operation_size); + asm_rv32_opcode_cadd(state, REG_TEMP2, rs1); + } else { + asm_rv32_opcode_add(state, REG_TEMP2, rs1, rs2); } - asm_rv32_opcode_cadd(state, rs1, rs2); } } void asm_rv32_emit_load_reg_reg_reg(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs1, mp_uint_t rs2, mp_uint_t operation_size) { asm_rv32_fix_up_scaled_reg_reg_reg(state, rs1, rs2, operation_size); - asm_rv32_emit_load_reg_reg_offset(state, rd, rs1, 0, operation_size); + asm_rv32_emit_load_reg_reg_offset(state, rd, REG_TEMP2, 0, operation_size); } void asm_rv32_emit_store_reg_reg_reg(asm_rv32_t *state, mp_uint_t rd, mp_uint_t rs1, mp_uint_t rs2, mp_uint_t operation_size) { asm_rv32_fix_up_scaled_reg_reg_reg(state, rs1, rs2, operation_size); - asm_rv32_emit_store_reg_reg_offset(state, rd, rs1, 0, operation_size); + asm_rv32_emit_store_reg_reg_offset(state, rd, REG_TEMP2, 0, operation_size); } void asm_rv32_meta_comparison_eq(asm_rv32_t *state, mp_uint_t rs1, mp_uint_t rs2, mp_uint_t rd) {