@@ -1321,8 +1321,10 @@ GEN({
1321
1321
RVOP (
1322
1322
lrw ,
1323
1323
{
1324
+ const uint32_t addr = rv -> X [ir -> rs1 ];
1325
+ RV_EXC_MISALIGN_HANDLER (3 , load , false, 1 );
1324
1326
if (ir -> rd )
1325
- rv -> X [ir -> rd ] = rv -> io .mem_read_w (rv -> X [ ir -> rs1 ] );
1327
+ rv -> X [ir -> rd ] = rv -> io .mem_read_w (addr );
1326
1328
/* skip registration of the 'reservation set'
1327
1329
* FIXME: uimplemented
1328
1330
*/
@@ -1338,7 +1340,9 @@ RVOP(
1338
1340
/* assume the 'reservation set' is valid
1339
1341
* FIXME: unimplemented
1340
1342
*/
1341
- rv -> io .mem_write_w (rv -> X [ir -> rs1 ], rv -> X [ir -> rs2 ]);
1343
+ const uint32_t addr = rv -> X [ir -> rs1 ];
1344
+ RV_EXC_MISALIGN_HANDLER (3 , store , false, 1 );
1345
+ rv -> io .mem_write_w (addr , rv -> X [ir -> rs2 ]);
1342
1346
rv -> X [ir -> rd ] = 0 ;
1343
1347
},
1344
1348
GEN ({
@@ -1350,6 +1354,7 @@ RVOP(
1350
1354
amoswapw ,
1351
1355
{
1352
1356
const uint32_t addr = rv -> X [ir -> rs1 ];
1357
+ RV_EXC_MISALIGN_HANDLER (3 , load , false, 1 );
1353
1358
const uint32_t value1 = rv -> io .mem_read_w (rv -> X [ir -> rs1 ]);
1354
1359
const uint32_t value2 = rv -> X [ir -> rs2 ];
1355
1360
if (ir -> rd )
@@ -1365,6 +1370,7 @@ RVOP(
1365
1370
amoaddw ,
1366
1371
{
1367
1372
const uint32_t addr = rv -> X [ir -> rs1 ];
1373
+ RV_EXC_MISALIGN_HANDLER (3 , load , false, 1 );
1368
1374
const uint32_t value1 = rv -> io .mem_read_w (rv -> X [ir -> rs1 ]);
1369
1375
const uint32_t value2 = rv -> X [ir -> rs2 ];
1370
1376
if (ir -> rd )
@@ -1381,6 +1387,7 @@ RVOP(
1381
1387
amoxorw ,
1382
1388
{
1383
1389
const uint32_t addr = rv -> X [ir -> rs1 ];
1390
+ RV_EXC_MISALIGN_HANDLER (3 , load , false, 1 );
1384
1391
const uint32_t value1 = rv -> io .mem_read_w (rv -> X [ir -> rs1 ]);
1385
1392
const uint32_t value2 = rv -> X [ir -> rs2 ];
1386
1393
if (ir -> rd )
@@ -1397,6 +1404,7 @@ RVOP(
1397
1404
amoandw ,
1398
1405
{
1399
1406
const uint32_t addr = rv -> X [ir -> rs1 ];
1407
+ RV_EXC_MISALIGN_HANDLER (3 , load , false, 1 );
1400
1408
const uint32_t value1 = rv -> io .mem_read_w (rv -> X [ir -> rs1 ]);
1401
1409
const uint32_t value2 = rv -> X [ir -> rs2 ];
1402
1410
if (ir -> rd )
@@ -1413,6 +1421,7 @@ RVOP(
1413
1421
amoorw ,
1414
1422
{
1415
1423
const uint32_t addr = rv -> X [ir -> rs1 ];
1424
+ RV_EXC_MISALIGN_HANDLER (3 , load , false, 1 );
1416
1425
const uint32_t value1 = rv -> io .mem_read_w (rv -> X [ir -> rs1 ]);
1417
1426
const uint32_t value2 = rv -> X [ir -> rs2 ];
1418
1427
if (ir -> rd )
@@ -1429,6 +1438,7 @@ RVOP(
1429
1438
amominw ,
1430
1439
{
1431
1440
const uint32_t addr = rv -> X [ir -> rs1 ];
1441
+ RV_EXC_MISALIGN_HANDLER (3 , load , false, 1 );
1432
1442
const uint32_t value1 = rv -> io .mem_read_w (rv -> X [ir -> rs1 ]);
1433
1443
const uint32_t value2 = rv -> X [ir -> rs2 ];
1434
1444
if (ir -> rd )
@@ -1447,6 +1457,7 @@ RVOP(
1447
1457
amomaxw ,
1448
1458
{
1449
1459
const uint32_t addr = rv -> X [ir -> rs1 ];
1460
+ RV_EXC_MISALIGN_HANDLER (3 , load , false, 1 );
1450
1461
const uint32_t value1 = rv -> io .mem_read_w (rv -> X [ir -> rs1 ]);
1451
1462
const uint32_t value2 = rv -> X [ir -> rs2 ];
1452
1463
if (ir -> rd )
@@ -1465,6 +1476,7 @@ RVOP(
1465
1476
amominuw ,
1466
1477
{
1467
1478
const uint32_t addr = rv -> X [ir -> rs1 ];
1479
+ RV_EXC_MISALIGN_HANDLER (3 , load , false, 1 );
1468
1480
const uint32_t value1 = rv -> io .mem_read_w (rv -> X [ir -> rs1 ]);
1469
1481
const uint32_t value2 = rv -> X [ir -> rs2 ];
1470
1482
if (ir -> rd )
@@ -1481,6 +1493,7 @@ RVOP(
1481
1493
amomaxuw ,
1482
1494
{
1483
1495
const uint32_t addr = rv -> X [ir -> rs1 ];
1496
+ RV_EXC_MISALIGN_HANDLER (3 , load , false, 1 );
1484
1497
const uint32_t value1 = rv -> io .mem_read_w (rv -> X [ir -> rs1 ]);
1485
1498
const uint32_t value2 = rv -> X [ir -> rs2 ];
1486
1499
if (ir -> rd )
0 commit comments