@@ -90,6 +90,18 @@ static void rv_exception_default_handler(riscv_t *rv)
90
90
RV_EXCEPTION_LIST
91
91
#undef _
92
92
93
+ #define RV_EXC_MISAGLIN_HANDLER (mask_or_pc , type , compress , IO ) \
94
+ IIF(IO) \
95
+ (if (!rv->io.allow_misalign && unlikely(addr & (mask_or_pc))), \
96
+ if (unlikely(insn_is_misaligned(rv->PC)))) \
97
+ { \
98
+ rv->compressed = compress; \
99
+ IIF(IO) \
100
+ (rv_except_##type##_misaligned(rv, addr), \
101
+ rv_except_##type##_misaligned(rv, mask_or_pc)); \
102
+ return false; \
103
+ }
104
+
93
105
/* Get current time in microsecnds and update csr_time register */
94
106
static inline void update_time (riscv_t * rv )
95
107
{
@@ -310,11 +322,7 @@ RVOP(jal, {
310
322
if (ir -> rd )
311
323
rv -> X [ir -> rd ] = pc + ir -> insn_len ;
312
324
/* check instruction misaligned */
313
- if (unlikely (insn_is_misaligned (rv -> PC ))) {
314
- rv -> compressed = false;
315
- rv_except_insn_misaligned (rv , pc );
316
- return false;
317
- }
325
+ RV_EXC_MISAGLIN_HANDLER (pc , insn , false, 0 );
318
326
return true;
319
327
})
320
328
@@ -333,11 +341,7 @@ RVOP(jalr, {
333
341
if (ir -> rd )
334
342
rv -> X [ir -> rd ] = pc + ir -> insn_len ;
335
343
/* check instruction misaligned */
336
- if (unlikely (insn_is_misaligned (rv -> PC ))) {
337
- rv -> compressed = false;
338
- rv_except_insn_misaligned (rv , pc );
339
- return false;
340
- }
344
+ RV_EXC_MISAGLIN_HANDLER (pc , insn , false, 0 );
341
345
return true;
342
346
})
343
347
@@ -352,11 +356,7 @@ RVOP(beq, {
352
356
}
353
357
rv -> PC += ir -> imm ;
354
358
/* check instruction misaligned */
355
- if (unlikely (insn_is_misaligned (rv -> PC ))) {
356
- rv -> compressed = false;
357
- rv_except_insn_misaligned (rv , pc );
358
- return false;
359
- }
359
+ RV_EXC_MISAGLIN_HANDLER (pc , insn , false, 0 );
360
360
if (ir -> branch_taken )
361
361
return ir -> branch_taken -> impl (rv , ir -> branch_taken );
362
362
return true;
@@ -373,11 +373,7 @@ RVOP(bne, {
373
373
}
374
374
rv -> PC += ir -> imm ;
375
375
/* check instruction misaligned */
376
- if (unlikely (insn_is_misaligned (rv -> PC ))) {
377
- rv -> compressed = false;
378
- rv_except_insn_misaligned (rv , pc );
379
- return false;
380
- }
376
+ RV_EXC_MISAGLIN_HANDLER (pc , insn , false, 0 );
381
377
if (ir -> branch_taken )
382
378
return ir -> branch_taken -> impl (rv , ir -> branch_taken );
383
379
return true;
@@ -394,11 +390,7 @@ RVOP(blt, {
394
390
}
395
391
rv -> PC += ir -> imm ;
396
392
/* check instruction misaligned */
397
- if (unlikely (insn_is_misaligned (rv -> PC ))) {
398
- rv -> compressed = false;
399
- rv_except_insn_misaligned (rv , pc );
400
- return false;
401
- }
393
+ RV_EXC_MISAGLIN_HANDLER (pc , insn , false, 0 );
402
394
if (ir -> branch_taken )
403
395
return ir -> branch_taken -> impl (rv , ir -> branch_taken );
404
396
return true;
@@ -415,11 +407,7 @@ RVOP(bge, {
415
407
}
416
408
rv -> PC += ir -> imm ;
417
409
/* check instruction misaligned */
418
- if (unlikely (insn_is_misaligned (rv -> PC ))) {
419
- rv -> compressed = false;
420
- rv_except_insn_misaligned (rv , pc );
421
- return false;
422
- }
410
+ RV_EXC_MISAGLIN_HANDLER (pc , insn , false, 0 );
423
411
if (ir -> branch_taken )
424
412
return ir -> branch_taken -> impl (rv , ir -> branch_taken );
425
413
return true;
@@ -436,11 +424,7 @@ RVOP(bltu, {
436
424
}
437
425
rv -> PC += ir -> imm ;
438
426
/* check instruction misaligned */
439
- if (unlikely (insn_is_misaligned (rv -> PC ))) {
440
- rv -> compressed = false;
441
- rv_except_insn_misaligned (rv , pc );
442
- return false;
443
- }
427
+ RV_EXC_MISAGLIN_HANDLER (pc , insn , false, 0 );
444
428
if (ir -> branch_taken )
445
429
return ir -> branch_taken -> impl (rv , ir -> branch_taken );
446
430
return true;
@@ -457,11 +441,7 @@ RVOP(bgeu, {
457
441
}
458
442
rv -> PC += ir -> imm ;
459
443
/* check instruction misaligned */
460
- if (unlikely (insn_is_misaligned (rv -> PC ))) {
461
- rv -> compressed = false;
462
- rv_except_insn_misaligned (rv , pc );
463
- return false;
464
- }
444
+ RV_EXC_MISAGLIN_HANDLER (pc , insn , false, 0 );
465
445
if (ir -> branch_taken )
466
446
return ir -> branch_taken -> impl (rv , ir -> branch_taken );
467
447
return true;
@@ -476,22 +456,14 @@ RVOP(lb, {
476
456
/* LH: Load Halfword */
477
457
RVOP (lh , {
478
458
const uint32_t addr = rv -> X [ir -> rs1 ] + ir -> imm ;
479
- if (unlikely (addr & 1 )) {
480
- rv -> compressed = false;
481
- rv_except_load_misaligned (rv , addr );
482
- return false;
483
- }
459
+ RV_EXC_MISAGLIN_HANDLER (1 , load , false, 1 );
484
460
rv -> X [ir -> rd ] = sign_extend_h (rv -> io .mem_read_s (rv , addr ));
485
461
})
486
462
487
463
/* LW: Load Word */
488
464
RVOP (lw , {
489
465
const uint32_t addr = rv -> X [ir -> rs1 ] + ir -> imm ;
490
- if (unlikely (addr & 3 )) {
491
- rv -> compressed = false;
492
- rv_except_load_misaligned (rv , addr );
493
- return false;
494
- }
466
+ RV_EXC_MISAGLIN_HANDLER (3 , load , false, 1 );
495
467
rv -> X [ir -> rd ] = rv -> io .mem_read_w (rv , addr );
496
468
})
497
469
@@ -501,11 +473,7 @@ RVOP(lbu, { rv->X[ir->rd] = rv->io.mem_read_b(rv, rv->X[ir->rs1] + ir->imm); })
501
473
/* LHU: Load Halfword Unsigned */
502
474
RVOP (lhu , {
503
475
const uint32_t addr = rv -> X [ir -> rs1 ] + ir -> imm ;
504
- if (unlikely (addr & 1 )) {
505
- rv -> compressed = false;
506
- rv_except_load_misaligned (rv , addr );
507
- return false;
508
- }
476
+ RV_EXC_MISAGLIN_HANDLER (1 , load , false, 1 );
509
477
rv -> X [ir -> rd ] = rv -> io .mem_read_s (rv , addr );
510
478
})
511
479
@@ -515,22 +483,14 @@ RVOP(sb, { rv->io.mem_write_b(rv, rv->X[ir->rs1] + ir->imm, rv->X[ir->rs2]); })
515
483
/* SH: Store Halfword */
516
484
RVOP (sh , {
517
485
const uint32_t addr = rv -> X [ir -> rs1 ] + ir -> imm ;
518
- if (unlikely (addr & 1 )) {
519
- rv -> compressed = false;
520
- rv_except_store_misaligned (rv , addr );
521
- return false;
522
- }
486
+ RV_EXC_MISAGLIN_HANDLER (1 , store , false, 1 );
523
487
rv -> io .mem_write_s (rv , addr , rv -> X [ir -> rs2 ]);
524
488
})
525
489
526
490
/* SW: Store Word */
527
491
RVOP (sw , {
528
492
const uint32_t addr = rv -> X [ir -> rs1 ] + ir -> imm ;
529
- if (unlikely (addr & 3 )) {
530
- rv -> compressed = false;
531
- rv_except_store_misaligned (rv , addr );
532
- return false;
533
- }
493
+ RV_EXC_MISAGLIN_HANDLER (3 , store , false, 1 );
534
494
rv -> io .mem_write_w (rv , addr , rv -> X [ir -> rs2 ]);
535
495
})
536
496
@@ -1088,11 +1048,7 @@ RVOP(caddi4spn, { rv->X[ir->rd] = rv->X[2] + (uint16_t) ir->imm; })
1088
1048
*/
1089
1049
RVOP (clw , {
1090
1050
const uint32_t addr = rv -> X [ir -> rs1 ] + (uint32_t ) ir -> imm ;
1091
- if (unlikely (addr & 3 )) {
1092
- rv -> compressed = true;
1093
- rv_except_load_misaligned (rv , addr );
1094
- return false;
1095
- }
1051
+ RV_EXC_MISAGLIN_HANDLER (3 , load , true, 1 );
1096
1052
rv -> X [ir -> rd ] = rv -> io .mem_read_w (rv , addr );
1097
1053
})
1098
1054
@@ -1103,11 +1059,7 @@ RVOP(clw, {
1103
1059
*/
1104
1060
RVOP (csw , {
1105
1061
const uint32_t addr = rv -> X [ir -> rs1 ] + (uint32_t ) ir -> imm ;
1106
- if (unlikely (addr & 3 )) {
1107
- rv -> compressed = true;
1108
- rv_except_store_misaligned (rv , addr );
1109
- return false;
1110
- }
1062
+ RV_EXC_MISAGLIN_HANDLER (3 , store , true, 1 );
1111
1063
rv -> io .mem_write_w (rv , addr , rv -> X [ir -> rs2 ]);
1112
1064
})
1113
1065
@@ -1126,11 +1078,7 @@ RVOP(caddi, { rv->X[ir->rd] += (int16_t) ir->imm; })
1126
1078
RVOP (cjal , {
1127
1079
rv -> X [1 ] = rv -> PC + ir -> insn_len ;
1128
1080
rv -> PC += ir -> imm ;
1129
- if (unlikely (rv -> PC & 0x1 )) {
1130
- rv -> compressed = true;
1131
- rv_except_insn_misaligned (rv , rv -> PC );
1132
- return false;
1133
- }
1081
+ RV_EXC_MISAGLIN_HANDLER (rv -> PC , insn , true, 0 );
1134
1082
return true;
1135
1083
})
1136
1084
@@ -1198,11 +1146,7 @@ RVOP(cand, { rv->X[ir->rd] = rv->X[ir->rs1] & rv->X[ir->rs2]; })
1198
1146
*/
1199
1147
RVOP (cj , {
1200
1148
rv -> PC += ir -> imm ;
1201
- if (unlikely (rv -> PC & 0x1 )) {
1202
- rv -> compressed = true;
1203
- rv_except_insn_misaligned (rv , rv -> PC );
1204
- return false;
1205
- }
1149
+ RV_EXC_MISAGLIN_HANDLER (rv -> PC , insn , true, 0 );
1206
1150
return true;
1207
1151
})
1208
1152
@@ -1249,11 +1193,7 @@ RVOP(cslli, { rv->X[ir->rd] <<= (uint8_t) ir->imm; })
1249
1193
/* C.LWSP */
1250
1194
RVOP (clwsp , {
1251
1195
const uint32_t addr = rv -> X [rv_reg_sp ] + ir -> imm ;
1252
- if (unlikely (addr & 3 )) {
1253
- rv -> compressed = true;
1254
- rv_except_load_misaligned (rv , addr );
1255
- return false;
1256
- }
1196
+ RV_EXC_MISAGLIN_HANDLER (3 , load , true, 1 );
1257
1197
rv -> X [ir -> rd ] = rv -> io .mem_read_w (rv , addr );
1258
1198
})
1259
1199
@@ -1279,11 +1219,7 @@ RVOP(cjalr, {
1279
1219
const int32_t jump_to = rv -> X [ir -> rs1 ];
1280
1220
rv -> X [rv_reg_ra ] = rv -> PC + ir -> insn_len ;
1281
1221
rv -> PC = jump_to ;
1282
- if (unlikely (rv -> PC & 0x1 )) {
1283
- rv -> compressed = true;
1284
- rv_except_insn_misaligned (rv , rv -> PC );
1285
- return false;
1286
- }
1222
+ RV_EXC_MISAGLIN_HANDLER (rv -> PC , insn , true, 0 );
1287
1223
return true;
1288
1224
})
1289
1225
@@ -1299,11 +1235,7 @@ RVOP(cadd, { rv->X[ir->rd] = rv->X[ir->rs1] + rv->X[ir->rs2]; })
1299
1235
/* C.SWSP */
1300
1236
RVOP (cswsp , {
1301
1237
const uint32_t addr = rv -> X [2 ] + ir -> imm ;
1302
- if (unlikely (addr & 3 )) {
1303
- rv -> compressed = true;
1304
- rv_except_store_misaligned (rv , addr );
1305
- return false;
1306
- }
1238
+ RV_EXC_MISAGLIN_HANDLER (3 , store , true, 1 );
1307
1239
rv -> io .mem_write_w (rv , addr , rv -> X [ir -> rs2 ]);
1308
1240
})
1309
1241
#endif
0 commit comments