summaryrefslogtreecommitdiff
path: root/tests/inlineasm/rv32/asmbranch.py
diff options
context:
space:
mode:
authorAlessandro Gatti <a.gatti@frob.it>2024-08-25 16:28:35 +0200
committerDamien George <damien@micropython.org>2025-01-02 11:49:10 +1100
commit268acb714dd79fa5eeeb82c1fca022bc4ea126b7 (patch)
tree428ed75070ee89847fd5087095e3d7331d5f9b26 /tests/inlineasm/rv32/asmbranch.py
parent3044233ea3726e9d8727d8f6a76f32c48e6fae5e (diff)
py/emitinlinerv32: Add inline assembler support for RV32.
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>
Diffstat (limited to 'tests/inlineasm/rv32/asmbranch.py')
-rw-r--r--tests/inlineasm/rv32/asmbranch.py161
1 files changed, 161 insertions, 0 deletions
diff --git a/tests/inlineasm/rv32/asmbranch.py b/tests/inlineasm/rv32/asmbranch.py
new file mode 100644
index 000000000..d7d059d40
--- /dev/null
+++ b/tests/inlineasm/rv32/asmbranch.py
@@ -0,0 +1,161 @@
+# test branch instructions
+
+
+@micropython.asm_rv32
+def tbeq(a0):
+ mv(a1, a0)
+
+ li(a0, 10)
+ li(a2, 1)
+ beq(a1, a2, end)
+
+ li(a0, 20)
+ li(a2, 2)
+ beq(a1, a2, end)
+
+ li(a0, 30)
+ li(a2, 3)
+ beq(a1, a2, end)
+
+ li(a0, 0)
+
+ label(end)
+
+
+print(tbeq(0))
+print(tbeq(1))
+print(tbeq(2))
+print(tbeq(3))
+
+
+@micropython.asm_rv32
+def tbne(a0):
+ mv(a1, a0)
+
+ li(a0, 10)
+ li(a2, 1)
+ bne(a1, a2, end)
+
+ li(a0, 20)
+ li(a2, 2)
+ bne(a1, a2, end)
+
+ li(a0, 30)
+ li(a2, 3)
+ bne(a1, a2, end)
+
+ li(a0, 0)
+
+ label(end)
+
+
+print(tbne(0))
+print(tbne(1))
+print(tbne(2))
+print(tbne(3))
+
+
+@micropython.asm_rv32
+def tbgeu(a0):
+ mv(a1, a0)
+
+ li(a0, 1)
+ li(a2, 2)
+ bgeu(a1, a2, end)
+ li(a0, 0)
+
+ label(end)
+
+
+print(tbgeu(0))
+print(tbgeu(1))
+print(tbgeu(2))
+print(tbgeu(3))
+
+
+@micropython.asm_rv32
+def tbltu(a0):
+ mv(a1, a0)
+
+ li(a0, 1)
+ li(a2, 2)
+ bltu(a1, a2, end)
+ li(a0, 0)
+
+ label(end)
+
+
+print(tbltu(0))
+print(tbltu(1))
+print(tbltu(2))
+print(tbltu(3))
+
+
+@micropython.asm_rv32
+def tbge(a0):
+ mv(a1, a0)
+
+ li(a0, 1)
+ li(a2, -2)
+ bge(a1, a2, end)
+ li(a0, 0)
+
+ label(end)
+
+
+print(tbge(-3))
+print(tbge(-2))
+print(tbge(-1))
+print(tbge(0))
+
+
+@micropython.asm_rv32
+def tblt(a0):
+ mv(a1, a0)
+
+ li(a0, 1)
+ li(a2, -2)
+ blt(a1, a2, end)
+ li(a0, 0)
+
+ label(end)
+
+
+print(tblt(-3))
+print(tblt(-2))
+print(tblt(-1))
+print(tblt(0))
+
+
+@micropython.asm_rv32
+def tcbeqz(a0):
+ mv(a1, a0)
+
+ li(a0, 1)
+ c_beqz(a1, end)
+ li(a0, 0)
+
+ label(end)
+
+
+print(tcbeqz(0))
+print(tcbeqz(1))
+print(tcbeqz(2))
+print(tcbeqz(3))
+
+
+@micropython.asm_rv32
+def tcbnez(a0):
+ mv(a1, a0)
+
+ li(a0, 1)
+ c_bnez(a1, end)
+ li(a0, 0)
+
+ label(end)
+
+
+print(tcbnez(0))
+print(tcbnez(1))
+print(tcbnez(2))
+print(tcbnez(3))