aboutsummaryrefslogtreecommitdiff
path: root/sim/testsuite
diff options
context:
space:
mode:
Diffstat (limited to 'sim/testsuite')
-rw-r--r--sim/testsuite/riscv/jalr.s22
-rw-r--r--sim/testsuite/riscv/testutils.inc12
2 files changed, 31 insertions, 3 deletions
diff --git a/sim/testsuite/riscv/jalr.s b/sim/testsuite/riscv/jalr.s
new file mode 100644
index 0000000..daccf4f
--- /dev/null
+++ b/sim/testsuite/riscv/jalr.s
@@ -0,0 +1,22 @@
+# Basic jalr tests.
+# mach: riscv
+
+.include "testutils.inc"
+
+ start
+
+ # Load desination into register a0.
+ la a0, good_dest
+
+ # Jump to the destination in a0.
+ jalr a0, a0, 0
+
+ # If we write destination into a0 before reading it in order
+ # to jump, we might end up here.
+bad_dest:
+ fail
+
+ # We should end up here.
+good_dest:
+ pass
+ fail
diff --git a/sim/testsuite/riscv/testutils.inc b/sim/testsuite/riscv/testutils.inc
index b9680b9..c5e09eb 100644
--- a/sim/testsuite/riscv/testutils.inc
+++ b/sim/testsuite/riscv/testutils.inc
@@ -21,8 +21,9 @@
# Trigger OS trap.
ecall;
exit 0;
- .data
+ .pushsection .data
1: .asciz "pass\n"
+ .popsection
.endm
# MACRO: fail
@@ -33,14 +34,15 @@
# Use stdout.
li a0, 1;
# Point to the string.
- lla a1, 1f;
+ la a1, 1f;
# Number of bytes to write.
li a2, 5;
# Trigger OS trap.
ecall;
exit 0;
- .data
+ .pushsection .data
1: .asciz "fail\n"
+ .popsection
.endm
# MACRO: start
@@ -49,4 +51,8 @@
.text
.global _start
_start:
+ .option push
+ .option norelax
+ lla gp, __global_pointer$
+ .option pop
.endm