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