@@ -709,14 +709,13 @@ void asm_rv32_emit_call_ind(asm_rv32_t *state, mp_uint_t index);
709709void asm_rv32_emit_jump (asm_rv32_t * state , mp_uint_t label );
710710void asm_rv32_emit_jump_if_reg_eq (asm_rv32_t * state , mp_uint_t rs1 , mp_uint_t rs2 , mp_uint_t label );
711711void asm_rv32_emit_jump_if_reg_nonzero (asm_rv32_t * state , mp_uint_t rs , mp_uint_t label );
712- void asm_rv32_emit_load16_reg_reg_offset (asm_rv32_t * state , mp_uint_t rd , mp_uint_t rs , mp_int_t offset );
713- void asm_rv32_emit_load_reg_reg_offset (asm_rv32_t * state , mp_uint_t rd , mp_uint_t rs , mp_int_t offset );
712+ void asm_rv32_emit_load_reg_reg_offset (asm_rv32_t * state , mp_uint_t rd , mp_uint_t rs , int32_t offset , mp_uint_t operation_size );
714713void asm_rv32_emit_mov_local_reg (asm_rv32_t * state , mp_uint_t local , mp_uint_t rs );
715714void asm_rv32_emit_mov_reg_local_addr (asm_rv32_t * state , mp_uint_t rd , mp_uint_t local );
716715void asm_rv32_emit_mov_reg_local (asm_rv32_t * state , mp_uint_t rd , mp_uint_t local );
717716void asm_rv32_emit_mov_reg_pcrel (asm_rv32_t * state , mp_uint_t rd , mp_uint_t label );
718717void asm_rv32_emit_optimised_xor (asm_rv32_t * state , mp_uint_t rd , mp_uint_t rs );
719- void asm_rv32_emit_store_reg_reg_offset (asm_rv32_t * state , mp_uint_t source , mp_uint_t base , mp_int_t offset );
718+ void asm_rv32_emit_store_reg_reg_offset (asm_rv32_t * state , mp_uint_t source , mp_uint_t base , int32_t offset , mp_uint_t operation_size );
720719
721720#define ASM_T asm_rv32_t
722721#define ASM_ENTRY (state , labels ) asm_rv32_entry(state, labels)
@@ -733,11 +732,12 @@ void asm_rv32_emit_store_reg_reg_offset(asm_rv32_t *state, mp_uint_t source, mp_
733732#define ASM_JUMP_IF_REG_ZERO (state , rs , label , bool_test ) asm_rv32_emit_jump_if_reg_eq(state, rs, ASM_RV32_REG_ZERO, label)
734733#define ASM_JUMP_REG (state , rs ) asm_rv32_opcode_cjr(state, rs)
735734#define ASM_LOAD_REG_REG_OFFSET (state , rd , rs , offset ) ASM_LOAD32_REG_REG_OFFSET(state, rd, rs, offset)
736- #define ASM_LOAD16_REG_REG_OFFSET (state , rd , rs , offset ) asm_rv32_emit_load16_reg_reg_offset (state, rd, rs, offset )
737- #define ASM_LOAD16_REG_REG (state , rd , rs ) asm_rv32_opcode_lhu (state, rd, rs, 0)
735+ #define ASM_LOAD8_REG_REG (state , rd , rs ) ASM_LOAD8_REG_REG_OFFSET (state, rd, rs, 0 )
736+ #define ASM_LOAD16_REG_REG (state , rd , rs ) ASM_LOAD16_REG_REG_OFFSET (state, rd, rs, 0)
738737#define ASM_LOAD32_REG_REG (state , rd , rs ) ASM_LOAD32_REG_REG_OFFSET(state, rd, rs, 0)
739- #define ASM_LOAD32_REG_REG_OFFSET (state , rd , rs , offset ) asm_rv32_emit_load_reg_reg_offset(state, rd, rs, offset)
740- #define ASM_LOAD8_REG_REG (state , rd , rs ) asm_rv32_opcode_lbu(state, rd, rs, 0)
738+ #define ASM_LOAD8_REG_REG_OFFSET (state , rd , rs , offset ) asm_rv32_emit_load_reg_reg_offset(state, rd, rs, offset, 0)
739+ #define ASM_LOAD16_REG_REG_OFFSET (state , rd , rs , offset ) asm_rv32_emit_load_reg_reg_offset(state, rd, rs, offset, 1)
740+ #define ASM_LOAD32_REG_REG_OFFSET (state , rd , rs , offset ) asm_rv32_emit_load_reg_reg_offset(state, rd, rs, offset, 2)
741741#define ASM_LSL_REG_REG (state , rd , rs ) asm_rv32_opcode_sll(state, rd, rd, rs)
742742#define ASM_LSR_REG_REG (state , rd , rs ) asm_rv32_opcode_srl(state, rd, rd, rs)
743743#define ASM_MOV_LOCAL_REG (state , local , rs ) asm_rv32_emit_mov_local_reg(state, local, rs)
@@ -751,13 +751,20 @@ void asm_rv32_emit_store_reg_reg_offset(asm_rv32_t *state, mp_uint_t source, mp_
751751#define ASM_NOT_REG (state , rd ) asm_rv32_opcode_xori(state, rd, rd, -1)
752752#define ASM_OR_REG_REG (state , rd , rs ) asm_rv32_opcode_or(state, rd, rd, rs)
753753#define ASM_STORE_REG_REG_OFFSET (state , rd , rs , offset ) ASM_STORE32_REG_REG_OFFSET(state, rd, rs, offset)
754- #define ASM_STORE16_REG_REG (state , rs1 , rs2 ) asm_rv32_opcode_sh(state, rs1, rs2, 0)
754+ #define ASM_STORE8_REG_REG (state , rs1 , rs2 ) ASM_STORE8_REG_REG_OFFSET(state, rs1, rs2, 0)
755+ #define ASM_STORE16_REG_REG (state , rs1 , rs2 ) ASM_STORE16_REG_REG_OFFSET(state, rs1, rs2, 0)
755756#define ASM_STORE32_REG_REG (state , rs1 , rs2 ) ASM_STORE32_REG_REG_OFFSET(state, rs1, rs2, 0)
756- #define ASM_STORE32_REG_REG_OFFSET (state , rd , rs , offset ) asm_rv32_emit_store_reg_reg_offset(state, rd, rs, offset)
757- #define ASM_STORE8_REG_REG (state , rs1 , rs2 ) asm_rv32_opcode_sb(state, rs1, rs2, 0)
757+ #define ASM_STORE8_REG_REG_OFFSET (state , rd , rs , offset ) asm_rv32_emit_store_reg_reg_offset(state, rd, rs, offset, 0)
758+ #define ASM_STORE16_REG_REG_OFFSET (state , rd , rs , offset ) asm_rv32_emit_store_reg_reg_offset(state, rd, rs, offset, 1)
759+ #define ASM_STORE32_REG_REG_OFFSET (state , rd , rs , offset ) asm_rv32_emit_store_reg_reg_offset(state, rd, rs, offset, 2)
758760#define ASM_SUB_REG_REG (state , rd , rs ) asm_rv32_opcode_sub(state, rd, rd, rs)
759761#define ASM_XOR_REG_REG (state , rd , rs ) asm_rv32_emit_optimised_xor(state, rd, rs)
760762#define ASM_CLR_REG (state , rd )
763+ #define ASM_LOAD8_REG_REG_REG (state , rd , rs1 , rs2 ) \
764+ do { \
765+ asm_rv32_opcode_cadd(state, rs1, rs2); \
766+ asm_rv32_opcode_lbu(state, rd, rs1, 0); \
767+ } while (0)
761768#define ASM_LOAD16_REG_REG_REG (state , rd , rs1 , rs2 ) \
762769 do { \
763770 asm_rv32_opcode_slli(state, rs2, rs2, 1); \
@@ -770,6 +777,11 @@ void asm_rv32_emit_store_reg_reg_offset(asm_rv32_t *state, mp_uint_t source, mp_
770777 asm_rv32_opcode_cadd(state, rs1, rs2); \
771778 asm_rv32_opcode_lw(state, rd, rs1, 0); \
772779 } while (0)
780+ #define ASM_STORE8_REG_REG_REG (state , rd , rs1 , rs2 ) \
781+ do { \
782+ asm_rv32_opcode_cadd(state, rs1, rs2); \
783+ asm_rv32_opcode_sb(state, rd, rs1, 0); \
784+ } while (0)
773785#define ASM_STORE16_REG_REG_REG (state , rd , rs1 , rs2 ) \
774786 do { \
775787 asm_rv32_opcode_slli(state, rs2, rs2, 1); \
0 commit comments