@@ -90,6 +90,24 @@ 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
+ * @mask_or_pc: mask for load/store and pc for insn misaligned handler.
95
+ * @type: type of misaligned handler
96
+ * @compress: compressed instruction or not
97
+ * @IO: whether the misaligned handler is for load/store or insn.
98
+ */
99
+ #define RV_EXC_MISALIGN_HANDLER (mask_or_pc , type , compress , IO ) \
100
+ IIF(IO) \
101
+ (if (!rv->io.allow_misalign && unlikely(addr & (mask_or_pc))), \
102
+ if (unlikely(insn_is_misaligned(rv->PC)))) \
103
+ { \
104
+ rv->compressed = compress; \
105
+ IIF(IO) \
106
+ (rv_except_##type##_misaligned(rv, addr), \
107
+ rv_except_##type##_misaligned(rv, mask_or_pc)); \
108
+ return false; \
109
+ }
110
+
93
111
/* Get current time in microsecnds and update csr_time register */
94
112
static inline void update_time (riscv_t * rv )
95
113
{
@@ -310,11 +328,7 @@ RVOP(jal, {
310
328
if (ir -> rd )
311
329
rv -> X [ir -> rd ] = pc + ir -> insn_len ;
312
330
/* 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
- }
331
+ RV_EXC_MISALIGN_HANDLER (pc , insn , false, 0 );
318
332
return true;
319
333
})
320
334
@@ -333,11 +347,7 @@ RVOP(jalr, {
333
347
if (ir -> rd )
334
348
rv -> X [ir -> rd ] = pc + ir -> insn_len ;
335
349
/* 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
- }
350
+ RV_EXC_MISALIGN_HANDLER (pc , insn , false, 0 );
341
351
return true;
342
352
})
343
353
@@ -352,11 +362,7 @@ RVOP(beq, {
352
362
}
353
363
rv -> PC += ir -> imm ;
354
364
/* 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
- }
365
+ RV_EXC_MISALIGN_HANDLER (pc , insn , false, 0 );
360
366
if (ir -> branch_taken )
361
367
return ir -> branch_taken -> impl (rv , ir -> branch_taken );
362
368
return true;
@@ -373,11 +379,7 @@ RVOP(bne, {
373
379
}
374
380
rv -> PC += ir -> imm ;
375
381
/* 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
- }
382
+ RV_EXC_MISALIGN_HANDLER (pc , insn , false, 0 );
381
383
if (ir -> branch_taken )
382
384
return ir -> branch_taken -> impl (rv , ir -> branch_taken );
383
385
return true;
@@ -394,11 +396,7 @@ RVOP(blt, {
394
396
}
395
397
rv -> PC += ir -> imm ;
396
398
/* 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
- }
399
+ RV_EXC_MISALIGN_HANDLER (pc , insn , false, 0 );
402
400
if (ir -> branch_taken )
403
401
return ir -> branch_taken -> impl (rv , ir -> branch_taken );
404
402
return true;
@@ -415,11 +413,7 @@ RVOP(bge, {
415
413
}
416
414
rv -> PC += ir -> imm ;
417
415
/* 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
- }
416
+ RV_EXC_MISALIGN_HANDLER (pc , insn , false, 0 );
423
417
if (ir -> branch_taken )
424
418
return ir -> branch_taken -> impl (rv , ir -> branch_taken );
425
419
return true;
@@ -436,11 +430,7 @@ RVOP(bltu, {
436
430
}
437
431
rv -> PC += ir -> imm ;
438
432
/* 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
- }
433
+ RV_EXC_MISALIGN_HANDLER (pc , insn , false, 0 );
444
434
if (ir -> branch_taken )
445
435
return ir -> branch_taken -> impl (rv , ir -> branch_taken );
446
436
return true;
@@ -457,11 +447,7 @@ RVOP(bgeu, {
457
447
}
458
448
rv -> PC += ir -> imm ;
459
449
/* 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
- }
450
+ RV_EXC_MISALIGN_HANDLER (pc , insn , false, 0 );
465
451
if (ir -> branch_taken )
466
452
return ir -> branch_taken -> impl (rv , ir -> branch_taken );
467
453
return true;
@@ -476,22 +462,14 @@ RVOP(lb, {
476
462
/* LH: Load Halfword */
477
463
RVOP (lh , {
478
464
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
- }
465
+ RV_EXC_MISALIGN_HANDLER (1 , load , false, 1 );
484
466
rv -> X [ir -> rd ] = sign_extend_h (rv -> io .mem_read_s (rv , addr ));
485
467
})
486
468
487
469
/* LW: Load Word */
488
470
RVOP (lw , {
489
471
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
- }
472
+ RV_EXC_MISALIGN_HANDLER (3 , load , false, 1 );
495
473
rv -> X [ir -> rd ] = rv -> io .mem_read_w (rv , addr );
496
474
})
497
475
@@ -501,11 +479,7 @@ RVOP(lbu, { rv->X[ir->rd] = rv->io.mem_read_b(rv, rv->X[ir->rs1] + ir->imm); })
501
479
/* LHU: Load Halfword Unsigned */
502
480
RVOP (lhu , {
503
481
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
- }
482
+ RV_EXC_MISALIGN_HANDLER (1 , load , false, 1 );
509
483
rv -> X [ir -> rd ] = rv -> io .mem_read_s (rv , addr );
510
484
})
511
485
@@ -515,22 +489,14 @@ RVOP(sb, { rv->io.mem_write_b(rv, rv->X[ir->rs1] + ir->imm, rv->X[ir->rs2]); })
515
489
/* SH: Store Halfword */
516
490
RVOP (sh , {
517
491
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
- }
492
+ RV_EXC_MISALIGN_HANDLER (1 , store , false, 1 );
523
493
rv -> io .mem_write_s (rv , addr , rv -> X [ir -> rs2 ]);
524
494
})
525
495
526
496
/* SW: Store Word */
527
497
RVOP (sw , {
528
498
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
- }
499
+ RV_EXC_MISALIGN_HANDLER (3 , store , false, 1 );
534
500
rv -> io .mem_write_w (rv , addr , rv -> X [ir -> rs2 ]);
535
501
})
536
502
@@ -1088,11 +1054,7 @@ RVOP(caddi4spn, { rv->X[ir->rd] = rv->X[2] + (uint16_t) ir->imm; })
1088
1054
*/
1089
1055
RVOP (clw , {
1090
1056
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
- }
1057
+ RV_EXC_MISALIGN_HANDLER (3 , load , true, 1 );
1096
1058
rv -> X [ir -> rd ] = rv -> io .mem_read_w (rv , addr );
1097
1059
})
1098
1060
@@ -1103,11 +1065,7 @@ RVOP(clw, {
1103
1065
*/
1104
1066
RVOP (csw , {
1105
1067
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
- }
1068
+ RV_EXC_MISALIGN_HANDLER (3 , store , true, 1 );
1111
1069
rv -> io .mem_write_w (rv , addr , rv -> X [ir -> rs2 ]);
1112
1070
})
1113
1071
@@ -1126,11 +1084,7 @@ RVOP(caddi, { rv->X[ir->rd] += (int16_t) ir->imm; })
1126
1084
RVOP (cjal , {
1127
1085
rv -> X [1 ] = rv -> PC + ir -> insn_len ;
1128
1086
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
- }
1087
+ RV_EXC_MISALIGN_HANDLER (rv -> PC , insn , true, 0 );
1134
1088
return true;
1135
1089
})
1136
1090
@@ -1198,11 +1152,7 @@ RVOP(cand, { rv->X[ir->rd] = rv->X[ir->rs1] & rv->X[ir->rs2]; })
1198
1152
*/
1199
1153
RVOP (cj , {
1200
1154
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
- }
1155
+ RV_EXC_MISALIGN_HANDLER (rv -> PC , insn , true, 0 );
1206
1156
return true;
1207
1157
})
1208
1158
@@ -1249,11 +1199,7 @@ RVOP(cslli, { rv->X[ir->rd] <<= (uint8_t) ir->imm; })
1249
1199
/* C.LWSP */
1250
1200
RVOP (clwsp , {
1251
1201
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
- }
1202
+ RV_EXC_MISALIGN_HANDLER (3 , load , true, 1 );
1257
1203
rv -> X [ir -> rd ] = rv -> io .mem_read_w (rv , addr );
1258
1204
})
1259
1205
@@ -1279,11 +1225,7 @@ RVOP(cjalr, {
1279
1225
const int32_t jump_to = rv -> X [ir -> rs1 ];
1280
1226
rv -> X [rv_reg_ra ] = rv -> PC + ir -> insn_len ;
1281
1227
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
- }
1228
+ RV_EXC_MISALIGN_HANDLER (rv -> PC , insn , true, 0 );
1287
1229
return true;
1288
1230
})
1289
1231
@@ -1299,11 +1241,7 @@ RVOP(cadd, { rv->X[ir->rd] = rv->X[ir->rs1] + rv->X[ir->rs2]; })
1299
1241
/* C.SWSP */
1300
1242
RVOP (cswsp , {
1301
1243
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
- }
1244
+ RV_EXC_MISALIGN_HANDLER (3 , store , true, 1 );
1307
1245
rv -> io .mem_write_w (rv , addr , rv -> X [ir -> rs2 ]);
1308
1246
})
1309
1247
#endif
0 commit comments