Skip to content

Commit 1b80449

Browse files
authored
Merge pull request #1783 from riscv-software-src/fix-1782
Fix exception priority for RV32E JAL[R], loads, AMOs
2 parents a8c9d9c + 73bc678 commit 1b80449

File tree

4 files changed

+27
-25
lines changed

4 files changed

+27
-25
lines changed

riscv/decode_macros.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#define RS2 READ_REG(insn.rs2())
2323
#define RS3 READ_REG(insn.rs3())
2424
#define WRITE_RD(value) WRITE_REG(insn.rd(), value)
25+
#define CHECK_RD() CHECK_REG(insn.rd())
2526

2627
/* 0 : int
2728
* 1 : floating
@@ -30,9 +31,9 @@
3031
* 4 : csr
3132
*/
3233
#define WRITE_REG(reg, value) ({ \
34+
CHECK_REG(reg); \
3335
reg_t wdata = (value); /* value may have side effects */ \
3436
if (DECODE_MACRO_USAGE_LOGGED) STATE.log_reg_write[(reg) << 4] = {wdata, 0}; \
35-
CHECK_REG(reg); \
3637
STATE.XPR.write(reg, wdata); \
3738
})
3839
#define WRITE_FREG(reg, value) ({ \

riscv/insn_template.cc

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,29 @@
55

66
#define DECODE_MACRO_USAGE_LOGGED 0
77

8+
#define PROLOGUE \
9+
reg_t npc = sext_xlen(pc + insn_length(OPCODE))
10+
11+
#define EPILOGUE \
12+
trace_opcode(p, OPCODE, insn); \
13+
return npc
14+
815
reg_t fast_rv32i_NAME(processor_t* p, insn_t insn, reg_t pc)
916
{
1017
#define xlen 32
11-
reg_t npc = sext_xlen(pc + insn_length(OPCODE));
18+
PROLOGUE;
1219
#include "insns/NAME.h"
13-
trace_opcode(p, OPCODE, insn);
20+
EPILOGUE;
1421
#undef xlen
15-
return npc;
1622
}
1723

1824
reg_t fast_rv64i_NAME(processor_t* p, insn_t insn, reg_t pc)
1925
{
2026
#define xlen 64
21-
reg_t npc = sext_xlen(pc + insn_length(OPCODE));
27+
PROLOGUE;
2228
#include "insns/NAME.h"
23-
trace_opcode(p, OPCODE, insn);
29+
EPILOGUE;
2430
#undef xlen
25-
return npc;
2631
}
2732

2833
#undef DECODE_MACRO_USAGE_LOGGED
@@ -31,21 +36,19 @@ reg_t fast_rv64i_NAME(processor_t* p, insn_t insn, reg_t pc)
3136
reg_t logged_rv32i_NAME(processor_t* p, insn_t insn, reg_t pc)
3237
{
3338
#define xlen 32
34-
reg_t npc = sext_xlen(pc + insn_length(OPCODE));
39+
PROLOGUE;
3540
#include "insns/NAME.h"
36-
trace_opcode(p, OPCODE, insn);
41+
EPILOGUE;
3742
#undef xlen
38-
return npc;
3943
}
4044

4145
reg_t logged_rv64i_NAME(processor_t* p, insn_t insn, reg_t pc)
4246
{
4347
#define xlen 64
44-
reg_t npc = sext_xlen(pc + insn_length(OPCODE));
48+
PROLOGUE;
4549
#include "insns/NAME.h"
46-
trace_opcode(p, OPCODE, insn);
50+
EPILOGUE;
4751
#undef xlen
48-
return npc;
4952
}
5053

5154
#undef CHECK_REG
@@ -57,21 +60,19 @@ reg_t logged_rv64i_NAME(processor_t* p, insn_t insn, reg_t pc)
5760
reg_t fast_rv32e_NAME(processor_t* p, insn_t insn, reg_t pc)
5861
{
5962
#define xlen 32
60-
reg_t npc = sext_xlen(pc + insn_length(OPCODE));
63+
PROLOGUE;
6164
#include "insns/NAME.h"
62-
trace_opcode(p, OPCODE, insn);
65+
EPILOGUE;
6366
#undef xlen
64-
return npc;
6567
}
6668

6769
reg_t fast_rv64e_NAME(processor_t* p, insn_t insn, reg_t pc)
6870
{
6971
#define xlen 64
70-
reg_t npc = sext_xlen(pc + insn_length(OPCODE));
72+
PROLOGUE;
7173
#include "insns/NAME.h"
72-
trace_opcode(p, OPCODE, insn);
74+
EPILOGUE;
7375
#undef xlen
74-
return npc;
7576
}
7677

7778
#undef DECODE_MACRO_USAGE_LOGGED
@@ -80,19 +81,17 @@ reg_t fast_rv64e_NAME(processor_t* p, insn_t insn, reg_t pc)
8081
reg_t logged_rv32e_NAME(processor_t* p, insn_t insn, reg_t pc)
8182
{
8283
#define xlen 32
83-
reg_t npc = sext_xlen(pc + insn_length(OPCODE));
84+
PROLOGUE;
8485
#include "insns/NAME.h"
85-
trace_opcode(p, OPCODE, insn);
86+
EPILOGUE;
8687
#undef xlen
87-
return npc;
8888
}
8989

9090
reg_t logged_rv64e_NAME(processor_t* p, insn_t insn, reg_t pc)
9191
{
9292
#define xlen 64
93-
reg_t npc = sext_xlen(pc + insn_length(OPCODE));
93+
PROLOGUE;
9494
#include "insns/NAME.h"
95-
trace_opcode(p, OPCODE, insn);
95+
EPILOGUE;
9696
#undef xlen
97-
return npc;
9897
}

riscv/insns/jal.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
CHECK_RD();
12
reg_t tmp = npc;
23
set_pc(JUMP_TARGET);
34
WRITE_RD(tmp);

riscv/insns/jalr.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
CHECK_RD();
12
reg_t tmp = npc;
23
set_pc((RS1 + insn.i_imm()) & ~reg_t(1));
34
WRITE_RD(tmp);

0 commit comments

Comments
 (0)