mirror of
https://github.com/micropython/micropython.git
synced 2025-12-16 09:50:15 +01:00
py/emitnative: Optimise Viper register offset load/stores on Xtensa.
This commit improves the emitted code sequences for address generation in the Viper subsystem when loading/storing 16 and 32 bit values via a register offset. The Xtensa opcodes ADDX2 and ADDX4 are used to avoid performing the extra shifts to align the final operation offset. Those opcodes are available on both xtensa and xtensawin MicroPython architectures. Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
This commit is contained in:
committed by
Damien George
parent
13b13d1fdd
commit
bfc0d7b0b9
@@ -1625,6 +1625,11 @@ static void emit_native_load_subscr(emit_t *emit) {
|
||||
}
|
||||
case VTYPE_PTR16: {
|
||||
// pointer to 16-bit memory
|
||||
#if N_XTENSA || N_XTENSAWIN
|
||||
asm_xtensa_op_addx2(emit->as, REG_ARG_1, reg_index, REG_ARG_1);
|
||||
asm_xtensa_op_l16ui(emit->as, REG_RET, REG_ARG_1, 0);
|
||||
break;
|
||||
#endif
|
||||
ASM_ADD_REG_REG(emit->as, REG_ARG_1, reg_index); // add index to base
|
||||
ASM_ADD_REG_REG(emit->as, REG_ARG_1, reg_index); // add index to base
|
||||
ASM_LOAD16_REG_REG(emit->as, REG_RET, REG_ARG_1); // load from (base+2*index)
|
||||
@@ -1637,6 +1642,10 @@ static void emit_native_load_subscr(emit_t *emit) {
|
||||
asm_rv32_opcode_cadd(emit->as, REG_ARG_1, REG_TEMP2);
|
||||
asm_rv32_opcode_lw(emit->as, REG_RET, REG_ARG_1, 0);
|
||||
break;
|
||||
#elif N_XTENSA || N_XTENSAWIN
|
||||
asm_xtensa_op_addx4(emit->as, REG_ARG_1, reg_index, REG_ARG_1);
|
||||
asm_xtensa_op_l32i_n(emit->as, REG_RET, REG_ARG_1, 0);
|
||||
break;
|
||||
#endif
|
||||
ASM_ADD_REG_REG(emit->as, REG_ARG_1, reg_index); // add index to base
|
||||
ASM_ADD_REG_REG(emit->as, REG_ARG_1, reg_index); // add index to base
|
||||
@@ -1900,6 +1909,10 @@ static void emit_native_store_subscr(emit_t *emit) {
|
||||
#if N_ARM
|
||||
asm_arm_strh_reg_reg_reg(emit->as, reg_value, REG_ARG_1, reg_index);
|
||||
break;
|
||||
#elif N_XTENSA || N_XTENSAWIN
|
||||
asm_xtensa_op_addx2(emit->as, REG_ARG_1, reg_index, REG_ARG_1);
|
||||
asm_xtensa_op_s16i(emit->as, reg_value, REG_ARG_1, 0);
|
||||
break;
|
||||
#endif
|
||||
ASM_ADD_REG_REG(emit->as, REG_ARG_1, reg_index); // add index to base
|
||||
ASM_ADD_REG_REG(emit->as, REG_ARG_1, reg_index); // add index to base
|
||||
@@ -1916,6 +1929,10 @@ static void emit_native_store_subscr(emit_t *emit) {
|
||||
asm_rv32_opcode_cadd(emit->as, REG_ARG_1, REG_TEMP2);
|
||||
asm_rv32_opcode_sw(emit->as, reg_value, REG_ARG_1, 0);
|
||||
break;
|
||||
#elif N_XTENSA || N_XTENSAWIN
|
||||
asm_xtensa_op_addx4(emit->as, REG_ARG_1, reg_index, REG_ARG_1);
|
||||
asm_xtensa_op_s32i_n(emit->as, reg_value, REG_ARG_1, 0);
|
||||
break;
|
||||
#endif
|
||||
ASM_ADD_REG_REG(emit->as, REG_ARG_1, reg_index); // add index to base
|
||||
ASM_ADD_REG_REG(emit->as, REG_ARG_1, reg_index); // add index to base
|
||||
|
||||
Reference in New Issue
Block a user