summaryrefslogtreecommitdiff
path: root/py/asmxtensa.h
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2018-09-16 00:43:24 +1000
committerDamien George <damien.p.george@gmail.com>2018-09-16 00:43:24 +1000
commit30a45360e73481cce312dd7cb2e344504c889a28 (patch)
tree5b658a28e7cd823c46cca263e37d4a5ba5a5d9bf /py/asmxtensa.h
parent93d71c5436488d52d47d165dd020217415e79a64 (diff)
py/asmxtensa: Make indirect calls using func table, not raw pointers.
Loading a pointer by indexing into the native function table mp_fun_table, rather than loading an immediate value (via a PC-relative load), uses less code space.
Diffstat (limited to 'py/asmxtensa.h')
-rw-r--r--py/asmxtensa.h7
1 files changed, 2 insertions, 5 deletions
diff --git a/py/asmxtensa.h b/py/asmxtensa.h
index d999f5173..ad39f421c 100644
--- a/py/asmxtensa.h
+++ b/py/asmxtensa.h
@@ -243,6 +243,7 @@ void asm_xtensa_mov_local_reg(asm_xtensa_t *as, int local_num, uint reg_src);
void asm_xtensa_mov_reg_local(asm_xtensa_t *as, uint reg_dest, int local_num);
void asm_xtensa_mov_reg_local_addr(asm_xtensa_t *as, uint reg_dest, int local_num);
void asm_xtensa_mov_reg_pcrel(asm_xtensa_t *as, uint reg_dest, uint label);
+void asm_xtensa_call_ind(asm_xtensa_t *as, uint idx);
#if GENERIC_ASM_API
@@ -280,11 +281,7 @@ void asm_xtensa_mov_reg_pcrel(asm_xtensa_t *as, uint reg_dest, uint label);
#define ASM_JUMP_IF_REG_EQ(as, reg1, reg2, label) \
asm_xtensa_bcc_reg_reg_label(as, ASM_XTENSA_CC_EQ, reg1, reg2, label)
#define ASM_JUMP_REG(as, reg) asm_xtensa_op_jx((as), (reg))
-#define ASM_CALL_IND(as, ptr, idx) \
- do { \
- asm_xtensa_mov_reg_i32(as, ASM_XTENSA_REG_A0, (uint32_t)ptr); \
- asm_xtensa_op_callx0(as, ASM_XTENSA_REG_A0); \
- } while (0)
+#define ASM_CALL_IND(as, ptr, idx) asm_xtensa_call_ind((as), (idx))
#define ASM_MOV_LOCAL_REG(as, local_num, reg_src) asm_xtensa_mov_local_reg((as), (local_num), (reg_src))
#define ASM_MOV_REG_IMM(as, reg_dest, imm) asm_xtensa_mov_reg_i32((as), (reg_dest), (imm))