@@ -142,7 +142,9 @@ RVOP(
142
142
if (ir -> rd )
143
143
rv -> X [ir -> rd ] = pc + 4 ;
144
144
/* check instruction misaligned */
145
+ #if !RV32_HAS (EXT_C )
145
146
RV_EXC_MISALIGN_HANDLER (pc , insn , false, 0 );
147
+ #endif
146
148
struct rv_insn * taken = ir -> branch_taken ;
147
149
if (taken ) {
148
150
#if RV32_HAS (JIT )
@@ -213,7 +215,9 @@ RVOP(
213
215
if (ir -> rd )
214
216
rv -> X [ir -> rd ] = pc + 4 ;
215
217
/* check instruction misaligned */
218
+ #if !RV32_HAS (EXT_C )
216
219
RV_EXC_MISALIGN_HANDLER (pc , insn , false, 0 );
220
+ #endif
217
221
#if !RV32_HAS (JIT )
218
222
LOOKUP_OR_UPDATE_BRANCH_HISTORY_TABLE ();
219
223
#endif
@@ -238,51 +242,52 @@ RVOP(
238
242
(type) x cond (type) y
239
243
/* clang-format on */
240
244
241
- #define BRANCH_FUNC (type , cond ) \
242
- const uint32_t pc = PC; \
243
- if (BRANCH_COND(type, rv->X[ir->rs1], rv->X[ir->rs2], cond)) { \
244
- is_branch_taken = false; \
245
- struct rv_insn *untaken = ir->branch_untaken; \
246
- if (!untaken) \
247
- goto nextop; \
248
- IIF(RV32_HAS(JIT)) \
249
- ({ \
250
- block_t *block = cache_get(rv->block_cache, PC + 4); \
251
- if (!block) { \
252
- ir->branch_untaken = NULL; \
253
- goto nextop; \
254
- } \
255
- untaken = ir->branch_untaken = block->ir_head; \
256
- if (cache_hot(rv->block_cache, PC + 4)) \
257
- goto nextop; \
258
- }, ); \
259
- PC += 4; \
260
- last_pc = PC; \
261
- MUST_TAIL return untaken->impl(rv, untaken, cycle, PC); \
262
- } \
263
- is_branch_taken = true; \
264
- PC += ir->imm; \
265
- /* check instruction misaligned */ \
266
- RV_EXC_MISALIGN_HANDLER (pc , insn , false, 0 ); \
267
- struct rv_insn * taken = ir -> branch_taken ; \
268
- if (taken ) { \
269
- IIF (RV32_HAS (JIT )) \
270
- ({ \
271
- block_t * block = cache_get (rv -> block_cache , PC ); \
272
- if (!block ) { \
273
- ir -> branch_taken = NULL ; \
274
- goto end_insn ; \
275
- } \
276
- taken = ir -> branch_taken = block -> ir_head ; \
277
- if (cache_hot (rv -> block_cache , PC )) \
278
- goto end_insn ; \
279
- }, ); \
280
- last_pc = PC ; \
281
- MUST_TAIL return taken -> impl (rv , taken , cycle , PC ); \
282
- } \
283
- end_insn : \
284
- rv -> csr_cycle = cycle ; \
285
- rv -> PC = PC ; \
245
+ #define BRANCH_FUNC (type , cond ) \
246
+ IIF(RV32_HAS(EXT_C))(, const uint32_t pc = PC;); \
247
+ if (BRANCH_COND(type, rv->X[ir->rs1], rv->X[ir->rs2], cond)) { \
248
+ is_branch_taken = false; \
249
+ struct rv_insn *untaken = ir->branch_untaken; \
250
+ if (!untaken) \
251
+ goto nextop; \
252
+ IIF(RV32_HAS(JIT)) \
253
+ ({ \
254
+ block_t *block = cache_get(rv->block_cache, PC + 4); \
255
+ if (!block) { \
256
+ ir->branch_untaken = NULL; \
257
+ goto nextop; \
258
+ } \
259
+ untaken = ir->branch_untaken = block->ir_head; \
260
+ if (cache_hot(rv->block_cache, PC + 4)) \
261
+ goto nextop; \
262
+ }, ); \
263
+ PC += 4; \
264
+ last_pc = PC; \
265
+ MUST_TAIL return untaken->impl(rv, untaken, cycle, PC); \
266
+ } \
267
+ is_branch_taken = true; \
268
+ PC += ir->imm; \
269
+ /* check instruction misaligned */ \
270
+ IIF (RV32_HAS (EXT_C )) \
271
+ (, RV_EXC_MISALIGN_HANDLER (pc , insn , false, 0 );) struct rv_insn * taken = \
272
+ ir -> branch_taken ; \
273
+ if (taken ) { \
274
+ IIF (RV32_HAS (JIT )) \
275
+ ({ \
276
+ block_t * block = cache_get (rv -> block_cache , PC ); \
277
+ if (!block ) { \
278
+ ir -> branch_taken = NULL ; \
279
+ goto end_insn ; \
280
+ } \
281
+ taken = ir -> branch_taken = block -> ir_head ; \
282
+ if (cache_hot (rv -> block_cache , PC )) \
283
+ goto end_insn ; \
284
+ }, ); \
285
+ last_pc = PC ; \
286
+ MUST_TAIL return taken -> impl (rv , taken , cycle , PC ); \
287
+ } \
288
+ end_insn : \
289
+ rv -> csr_cycle = cycle ; \
290
+ rv -> PC = PC ; \
286
291
return true;
287
292
288
293
/* In RV32I and RV64I, if the branch is taken, set pc = pc + offset, where
@@ -1815,7 +1820,6 @@ RVOP(
1815
1820
{
1816
1821
rv -> X [rv_reg_ra ] = PC + 2 ;
1817
1822
PC += ir -> imm ;
1818
- RV_EXC_MISALIGN_HANDLER (PC , insn , true, 0 );
1819
1823
struct rv_insn * taken = ir -> branch_taken ;
1820
1824
if (taken ) {
1821
1825
#if RV32_HAS (JIT )
@@ -1981,7 +1985,6 @@ RVOP(
1981
1985
cj ,
1982
1986
{
1983
1987
PC += ir -> imm ;
1984
- RV_EXC_MISALIGN_HANDLER (PC , insn , true, 0 );
1985
1988
struct rv_insn * taken = ir -> branch_taken ;
1986
1989
if (taken ) {
1987
1990
#if RV32_HAS (JIT )
@@ -2224,7 +2227,6 @@ RVOP(
2224
2227
const int32_t jump_to = rv -> X [ir -> rs1 ];
2225
2228
rv -> X [rv_reg_ra ] = PC + 2 ;
2226
2229
PC = jump_to ;
2227
- RV_EXC_MISALIGN_HANDLER (PC , insn , true, 0 );
2228
2230
#if !RV32_HAS (JIT )
2229
2231
LOOKUP_OR_UPDATE_BRANCH_HISTORY_TABLE ();
2230
2232
#endif
0 commit comments