Skip to content
  • Damien George's avatar
    py: Add inline Xtensa assembler. · f76b1bfa
    Damien George authored
    This patch adds the MICROPY_EMIT_INLINE_XTENSA option, which, when
    enabled, allows the @micropython.asm_xtensa decorator to be used.
    
    The following opcodes are currently supported (ax is a register, a0-a15):
    
        ret_n()
        callx0(ax)
        j(label)
        jx(ax)
    
        beqz(ax, label)
        bnez(ax, label)
        mov(ax, ay)
        movi(ax, imm) # imm can be full 32-bit, uses l32r if needed
    
        and_(ax, ay, az)
        or_(ax, ay, az)
        xor(ax, ay, az)
        add(ax, ay, az)
        sub(ax, ay, az)
        mull(ax, ay, az)
    
        l8ui(ax, ay, imm)
        l16ui(ax, ay, imm)
        l32i(ax, ay, imm)
        s8i(ax, ay, imm)
        s16i(ax, ay, imm)
        s32i(ax, ay, imm)
        l16si(ax, ay, imm)
        addi(ax, ay, imm)
    
        ball(ax, ay, label)
        bany(ax, ay, label)
        bbc(ax, ay, label)
        bbs(ax, ay, label)
        beq(ax, ay, label)
        bge(ax, ay, label)
        bgeu(ax, ay, label)
        blt(ax, ay, label)
        bnall(ax, ay, label)
        bne(ax, ay, label)
        bnone(ax, ay, label)
    
    Upon entry to the assembly function the registers a0, a12, a13, a14 are
    pushed to the stack and the stack pointer (a1) decreased by 16.  Upon
    exit, these registers and the stack pointer are restored, and ret.n is
    executed to return to the caller (caller address is in a0).
    
    Note that the ABI for the Xtensa emitters is non-windowing.
    f76b1bfa