mirror of
https://github.com/micropython/micropython.git
synced 2025-07-21 21:11:12 +02:00
This commit adds support for writing inline assembler functions when targeting a RV32IMC processor. Given that this takes up a bit of rodata space due to its large instruction decoding table and its extensive error messages, it is enabled by default only on offline targets such as mpy-cross and the qemu port. Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
116 lines
1.6 KiB
Python
116 lines
1.6 KiB
Python
@micropython.asm_rv32
|
|
def f1():
|
|
li(a0, 0)
|
|
la(a1, END)
|
|
c_jr(a1)
|
|
c_addi(a0, 1)
|
|
c_addi(a0, 1)
|
|
c_addi(a0, 1)
|
|
c_addi(a0, 1)
|
|
c_addi(a0, 1)
|
|
label(END)
|
|
|
|
|
|
print(f1())
|
|
|
|
|
|
@micropython.asm_rv32
|
|
def f2():
|
|
addi(sp, sp, -4)
|
|
c_swsp(ra, 0)
|
|
li(ra, 0)
|
|
li(a0, 0)
|
|
c_jal(END)
|
|
c_addi(a0, 1)
|
|
c_addi(a0, 1)
|
|
c_addi(a0, 1)
|
|
c_addi(a0, 1)
|
|
c_addi(a0, 1)
|
|
label(END)
|
|
bne(ra, zero, SUCCESS)
|
|
c_addi(a0, 2)
|
|
label(SUCCESS)
|
|
c_lwsp(ra, 0)
|
|
addi(sp, sp, 4)
|
|
|
|
|
|
print(f2())
|
|
|
|
|
|
@micropython.asm_rv32
|
|
def f3():
|
|
li(a0, 0)
|
|
c_j(END)
|
|
c_addi(a0, 1)
|
|
c_addi(a0, 1)
|
|
c_addi(a0, 1)
|
|
c_addi(a0, 1)
|
|
c_addi(a0, 1)
|
|
label(END)
|
|
|
|
|
|
print(f3())
|
|
|
|
|
|
@micropython.asm_rv32
|
|
def f4():
|
|
addi(sp, sp, -4)
|
|
c_swsp(ra, 0)
|
|
li(ra, 0)
|
|
li(a0, 0)
|
|
la(a1, END)
|
|
c_jalr(a1)
|
|
c_addi(a0, 1)
|
|
c_addi(a0, 1)
|
|
c_addi(a0, 1)
|
|
c_addi(a0, 1)
|
|
c_addi(a0, 1)
|
|
label(END)
|
|
bne(ra, zero, SUCCESS)
|
|
c_addi(a0, 2)
|
|
label(SUCCESS)
|
|
c_lwsp(ra, 0)
|
|
addi(sp, sp, 4)
|
|
|
|
|
|
print(f4())
|
|
|
|
|
|
@micropython.asm_rv32
|
|
def f5():
|
|
li(a0, 0)
|
|
li(a1, 0)
|
|
jal(a1, END)
|
|
c_addi(a0, 1)
|
|
c_addi(a0, 1)
|
|
c_addi(a0, 1)
|
|
c_addi(a0, 1)
|
|
c_addi(a0, 1)
|
|
label(END)
|
|
bne(a1, zero, SUCCESS)
|
|
c_addi(a0, 2)
|
|
label(SUCCESS)
|
|
|
|
|
|
print(f5())
|
|
|
|
|
|
@micropython.asm_rv32
|
|
def f6():
|
|
li(a0, 0)
|
|
la(a1, JUMP)
|
|
li(a2, 0)
|
|
jalr(a2, a1, 10)
|
|
label(JUMP)
|
|
c_addi(a0, 1)
|
|
c_addi(a0, 1)
|
|
c_addi(a0, 1)
|
|
c_addi(a0, 1)
|
|
c_addi(a0, 1)
|
|
bne(a2, zero, SUCCESS)
|
|
c_addi(a0, 2)
|
|
label(SUCCESS)
|
|
|
|
|
|
print(f6())
|