@@ -90,6 +90,19 @@ static void rv_exception_default_handler(riscv_t *rv)
90
90
RV_EXCEPTION_LIST
91
91
#undef _
92
92
93
+ /* wrap load/store and insn misaligned handler */
94
+ #define RV_EXC_MISAGLIN_HANDLER (mask_or_pc , type , compress , IO ) \
95
+ IIF(IO) \
96
+ (if (!rv->io.allow_misalign && unlikely(addr & (mask_or_pc))), \
97
+ if (unlikely(insn_is_misaligned(rv->PC)))) \
98
+ { \
99
+ rv->compressed = compress; \
100
+ IIF(IO) \
101
+ (rv_except_##type##_misaligned(rv, addr), \
102
+ rv_except_##type##_misaligned(rv, mask_or_pc)); \
103
+ return false; \
104
+ }
105
+
93
106
/* Get current time in microsecnds and update csr_time register */
94
107
static inline void update_time (riscv_t * rv )
95
108
{
@@ -310,11 +323,7 @@ RVOP(jal, {
310
323
if (ir -> rd )
311
324
rv -> X [ir -> rd ] = pc + ir -> insn_len ;
312
325
/* 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
- }
326
+ RV_EXC_MISAGLIN_HANDLER (pc , insn , false, 0 );
318
327
return true;
319
328
})
320
329
@@ -333,11 +342,7 @@ RVOP(jalr, {
333
342
if (ir -> rd )
334
343
rv -> X [ir -> rd ] = pc + ir -> insn_len ;
335
344
/* 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
- }
345
+ RV_EXC_MISAGLIN_HANDLER (pc , insn , false, 0 );
341
346
return true;
342
347
})
343
348
@@ -352,11 +357,7 @@ RVOP(beq, {
352
357
}
353
358
rv -> PC += ir -> imm ;
354
359
/* 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
- }
360
+ RV_EXC_MISAGLIN_HANDLER (pc , insn , false, 0 );
360
361
if (ir -> branch_taken )
361
362
return ir -> branch_taken -> impl (rv , ir -> branch_taken );
362
363
return true;
@@ -373,11 +374,7 @@ RVOP(bne, {
373
374
}
374
375
rv -> PC += ir -> imm ;
375
376
/* 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
- }
377
+ RV_EXC_MISAGLIN_HANDLER (pc , insn , false, 0 );
381
378
if (ir -> branch_taken )
382
379
return ir -> branch_taken -> impl (rv , ir -> branch_taken );
383
380
return true;
@@ -394,11 +391,7 @@ RVOP(blt, {
394
391
}
395
392
rv -> PC += ir -> imm ;
396
393
/* 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
- }
394
+ RV_EXC_MISAGLIN_HANDLER (pc , insn , false, 0 );
402
395
if (ir -> branch_taken )
403
396
return ir -> branch_taken -> impl (rv , ir -> branch_taken );
404
397
return true;
@@ -415,11 +408,7 @@ RVOP(bge, {
415
408
}
416
409
rv -> PC += ir -> imm ;
417
410
/* 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
- }
411
+ RV_EXC_MISAGLIN_HANDLER (pc , insn , false, 0 );
423
412
if (ir -> branch_taken )
424
413
return ir -> branch_taken -> impl (rv , ir -> branch_taken );
425
414
return true;
@@ -436,11 +425,7 @@ RVOP(bltu, {
436
425
}
437
426
rv -> PC += ir -> imm ;
438
427
/* 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
- }
428
+ RV_EXC_MISAGLIN_HANDLER (pc , insn , false, 0 );
444
429
if (ir -> branch_taken )
445
430
return ir -> branch_taken -> impl (rv , ir -> branch_taken );
446
431
return true;
@@ -457,11 +442,7 @@ RVOP(bgeu, {
457
442
}
458
443
rv -> PC += ir -> imm ;
459
444
/* 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
- }
445
+ RV_EXC_MISAGLIN_HANDLER (pc , insn , false, 0 );
465
446
if (ir -> branch_taken )
466
447
return ir -> branch_taken -> impl (rv , ir -> branch_taken );
467
448
return true;
@@ -476,22 +457,14 @@ RVOP(lb, {
476
457
/* LH: Load Halfword */
477
458
RVOP (lh , {
478
459
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
- }
460
+ RV_EXC_MISAGLIN_HANDLER (1 , load , false, 1 );
484
461
rv -> X [ir -> rd ] = sign_extend_h (rv -> io .mem_read_s (rv , addr ));
485
462
})
486
463
487
464
/* LW: Load Word */
488
465
RVOP (lw , {
489
466
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
- }
467
+ RV_EXC_MISAGLIN_HANDLER (3 , load , false, 1 );
495
468
rv -> X [ir -> rd ] = rv -> io .mem_read_w (rv , addr );
496
469
})
497
470
@@ -501,11 +474,7 @@ RVOP(lbu, { rv->X[ir->rd] = rv->io.mem_read_b(rv, rv->X[ir->rs1] + ir->imm); })
501
474
/* LHU: Load Halfword Unsigned */
502
475
RVOP (lhu , {
503
476
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
- }
477
+ RV_EXC_MISAGLIN_HANDLER (1 , load , false, 1 );
509
478
rv -> X [ir -> rd ] = rv -> io .mem_read_s (rv , addr );
510
479
})
511
480
@@ -515,22 +484,14 @@ RVOP(sb, { rv->io.mem_write_b(rv, rv->X[ir->rs1] + ir->imm, rv->X[ir->rs2]); })
515
484
/* SH: Store Halfword */
516
485
RVOP (sh , {
517
486
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
- }
487
+ RV_EXC_MISAGLIN_HANDLER (1 , store , false, 1 );
523
488
rv -> io .mem_write_s (rv , addr , rv -> X [ir -> rs2 ]);
524
489
})
525
490
526
491
/* SW: Store Word */
527
492
RVOP (sw , {
528
493
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
- }
494
+ RV_EXC_MISAGLIN_HANDLER (3 , store , false, 1 );
534
495
rv -> io .mem_write_w (rv , addr , rv -> X [ir -> rs2 ]);
535
496
})
536
497
@@ -1088,11 +1049,7 @@ RVOP(caddi4spn, { rv->X[ir->rd] = rv->X[2] + (uint16_t) ir->imm; })
1088
1049
*/
1089
1050
RVOP (clw , {
1090
1051
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
- }
1052
+ RV_EXC_MISAGLIN_HANDLER (3 , load , true, 1 );
1096
1053
rv -> X [ir -> rd ] = rv -> io .mem_read_w (rv , addr );
1097
1054
})
1098
1055
@@ -1103,11 +1060,7 @@ RVOP(clw, {
1103
1060
*/
1104
1061
RVOP (csw , {
1105
1062
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
- }
1063
+ RV_EXC_MISAGLIN_HANDLER (3 , store , true, 1 );
1111
1064
rv -> io .mem_write_w (rv , addr , rv -> X [ir -> rs2 ]);
1112
1065
})
1113
1066
@@ -1126,11 +1079,7 @@ RVOP(caddi, { rv->X[ir->rd] += (int16_t) ir->imm; })
1126
1079
RVOP (cjal , {
1127
1080
rv -> X [1 ] = rv -> PC + ir -> insn_len ;
1128
1081
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
- }
1082
+ RV_EXC_MISAGLIN_HANDLER (rv -> PC , insn , true, 0 );
1134
1083
return true;
1135
1084
})
1136
1085
@@ -1198,11 +1147,7 @@ RVOP(cand, { rv->X[ir->rd] = rv->X[ir->rs1] & rv->X[ir->rs2]; })
1198
1147
*/
1199
1148
RVOP (cj , {
1200
1149
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
- }
1150
+ RV_EXC_MISAGLIN_HANDLER (rv -> PC , insn , true, 0 );
1206
1151
return true;
1207
1152
})
1208
1153
@@ -1249,11 +1194,7 @@ RVOP(cslli, { rv->X[ir->rd] <<= (uint8_t) ir->imm; })
1249
1194
/* C.LWSP */
1250
1195
RVOP (clwsp , {
1251
1196
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
- }
1197
+ RV_EXC_MISAGLIN_HANDLER (3 , load , true, 1 );
1257
1198
rv -> X [ir -> rd ] = rv -> io .mem_read_w (rv , addr );
1258
1199
})
1259
1200
@@ -1279,11 +1220,7 @@ RVOP(cjalr, {
1279
1220
const int32_t jump_to = rv -> X [ir -> rs1 ];
1280
1221
rv -> X [rv_reg_ra ] = rv -> PC + ir -> insn_len ;
1281
1222
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
- }
1223
+ RV_EXC_MISAGLIN_HANDLER (rv -> PC , insn , true, 0 );
1287
1224
return true;
1288
1225
})
1289
1226
@@ -1299,11 +1236,7 @@ RVOP(cadd, { rv->X[ir->rd] = rv->X[ir->rs1] + rv->X[ir->rs2]; })
1299
1236
/* C.SWSP */
1300
1237
RVOP (cswsp , {
1301
1238
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
- }
1239
+ RV_EXC_MISAGLIN_HANDLER (3 , store , true, 1 );
1307
1240
rv -> io .mem_write_w (rv , addr , rv -> X [ir -> rs2 ]);
1308
1241
})
1309
1242
#endif
0 commit comments