Fix 32bit 'jalr rd,ra,imm' integer instruction, where RD was written
before using it to calculate destination address.
This commit also improves testutils.inc for riscv; make use of
pushsection and popsection when adding things to .data, and setup the
%gp global pointer register within the 'start' macro.
Approved-By: Andrew Burgess <aburgess@redhat.com>
break;
case MATCH_JALR:
TRACE_INSN (cpu, "jalr %s, %s, %" PRIiTW ";", rd_name, rs1_name, i_imm);
- store_rd (cpu, rd, riscv_cpu->pc + 4);
pc = riscv_cpu->regs[rs1] + i_imm;
+ store_rd (cpu, rd, riscv_cpu->pc + 4);
TRACE_BRANCH (cpu, "to %#" PRIxTW, pc);
break;
--- /dev/null
+# 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
# Trigger OS trap.
ecall;
exit 0;
- .data
+ .pushsection .data
1: .asciz "pass\n"
+ .popsection
.endm
# MACRO: fail
# 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
.text
.global _start
_start:
+ .option push
+ .option norelax
+ lla gp, __global_pointer$
+ .option pop
.endm