@@ -16,7 +16,7 @@ union FJT_Result = {
16
16
}
17
17
18
18
function fetch_jump_table(table_address : bits(xlen)) -> FJT_Result = {
19
- /* Fetching jump table address needs execute permission */
19
+ /* Executable permission required to fetch jump table address */
20
20
match ext_data_get_addr_from_bits(table_address, Execute(), xlen_bytes) {
21
21
Ext_DataAddr_Error(e) => { ext_handle_data_check_error(e); FJT_Failure() },
22
22
Ext_DataAddr_OK(vaddr) => {
@@ -36,41 +36,56 @@ function fetch_jump_table(table_address : bits(xlen)) -> FJT_Result = {
36
36
37
37
union clause ast = CM_JALT : (bits(8))
38
38
39
- mapping clause encdec_compressed = CM_JALT(index) if extensionEnabled(Ext_Zcmt) & 32 <= unsigned(index)
40
- <-> 0b101 @ 0b000 @ index : bits(8) @ 0b10 if extensionEnabled(Ext_Zcmt) & 32 <= unsigned(index)
39
+ mapping clause encdec_compressed = CM_JALT(index)
40
+ <-> 0b101 @ 0b000 @ index : bits(8) @ 0b10
41
+ when extensionEnabled(Ext_Zcmt) & 32 <= unsigned(index)
41
42
42
43
function clause execute (CM_JALT(index)) = {
43
- let base : bits(xlen) = jvt[base] @ 0b000000;
44
+ let base : bits(xlen) = jvt[base] @ 0b000000;
44
45
let index : bits(xlen) = zero_extend(index);
45
46
if jvt[mode] == 0b000000 then {
46
47
let table_address = base + index << log2_xlen_bytes;
47
48
match fetch_jump_table(table_address) {
48
49
FJT_Failure(_) => { RETIRE_FAIL },
49
- FJT_Success(target_address) => { X(1) = get_next_pc(); set_next_pc(target_address & ~(zero_extend(0x1))); RETIRE_SUCCESS }
50
+ FJT_Success(target_address) => {
51
+ X(ra) = get_next_pc();
52
+ set_next_pc(target_address & ~(zero_extend(0x1)));
53
+ RETIRE_SUCCESS
54
+ }
50
55
};
51
- } else { handle_illegal(); RETIRE_FAIL };
56
+ } else {
57
+ handle_illegal();
58
+ RETIRE_FAIL
59
+ };
52
60
}
53
61
54
- mapping clause assembly = CM_JALT(index) if (xlen == 32 | xlen == 64) <->
55
- "cm.jalt" ^ spc() ^ hex_bits_8(index) if (xlen == 32 | xlen == 64 )
62
+ mapping clause assembly = CM_JALT(index)
63
+ <-> "cm.jalt" ^ spc() ^ hex_bits_8(index)
56
64
57
65
/* ****************************************************************** */
58
66
union clause ast = CM_JT : (bits(8))
59
67
60
- mapping clause encdec_compressed = CM_JT(index) if extensionEnabled(Ext_Zcmt) & unsigned(index) < 32
61
- <-> 0b101 @ 0b000 @ index : bits(8) @ 0b10 if extensionEnabled(Ext_Zcmt) & unsigned(index) < 32
68
+ mapping clause encdec_compressed = CM_JT(index)
69
+ <-> 0b101 @ 0b000 @ index : bits(8) @ 0b10
70
+ when extensionEnabled(Ext_Zcmt) & unsigned(index) < 32
62
71
63
72
function clause execute (CM_JT(index)) = {
64
- let base : bits(xlen) = jvt[base] @ 0b000000;
73
+ let base : bits(xlen) = jvt[base] @ 0b000000;
65
74
let index : bits(xlen) = zero_extend(index);
66
75
if jvt[mode] == 0b000000 then {
67
76
let table_address = base + index << log2_xlen_bytes;
68
77
match fetch_jump_table(table_address) {
69
78
FJT_Failure(_) => { RETIRE_FAIL },
70
- FJT_Success(target_address) => { set_next_pc(target_address & ~(zero_extend(0x1))); RETIRE_SUCCESS }
79
+ FJT_Success(target_address) => {
80
+ set_next_pc(target_address & ~(zero_extend(0x1)));
81
+ RETIRE_SUCCESS
82
+ }
83
+ };
84
+ } else {
85
+ handle_illegal();
86
+ RETIRE_FAIL
71
87
};
72
- } else { handle_illegal(); RETIRE_FAIL };
73
88
}
74
89
75
- mapping clause assembly = CM_JT(index) if (xlen == 32 | xlen == 64) <->
76
- "cm.jt" ^ spc() ^ hex_bits_8(index) if (xlen == 32 | xlen == 64 )
90
+ mapping clause assembly = CM_JT(index)
91
+ <-> "cm.jt" ^ spc() ^ hex_bits_8(index)
0 commit comments