@@ -1315,8 +1315,10 @@ GEN({
1315
1315
RVOP (
1316
1316
lrw ,
1317
1317
{
1318
+ const uint32_t addr = rv -> X [ir -> rs1 ];
1319
+ RV_EXC_MISALIGN_HANDLER (3 , load , false, 1 );
1318
1320
if (ir -> rd )
1319
- rv -> X [ir -> rd ] = rv -> io .mem_read_w (rv -> X [ ir -> rs1 ] );
1321
+ rv -> X [ir -> rd ] = rv -> io .mem_read_w (addr );
1320
1322
/* skip registration of the 'reservation set'
1321
1323
* FIXME: uimplemented
1322
1324
*/
@@ -1332,7 +1334,9 @@ RVOP(
1332
1334
/* assume the 'reservation set' is valid
1333
1335
* FIXME: unimplemented
1334
1336
*/
1335
- rv -> io .mem_write_w (rv -> X [ir -> rs1 ], rv -> X [ir -> rs2 ]);
1337
+ const uint32_t addr = rv -> X [ir -> rs1 ];
1338
+ RV_EXC_MISALIGN_HANDLER (3 , store , false, 1 );
1339
+ rv -> io .mem_write_w (addr , rv -> X [ir -> rs2 ]);
1336
1340
rv -> X [ir -> rd ] = 0 ;
1337
1341
},
1338
1342
GEN ({
@@ -1343,9 +1347,13 @@ RVOP(
1343
1347
RVOP (
1344
1348
amoswapw ,
1345
1349
{
1350
+ const uint32_t addr = rv -> X [ir -> rs1 ];
1351
+ RV_EXC_MISALIGN_HANDLER (3 , load , false, 1 );
1352
+ const uint32_t value1 = rv -> io .mem_read_w (rv -> X [ir -> rs1 ]);
1353
+ const uint32_t value2 = rv -> X [ir -> rs2 ];
1346
1354
if (ir -> rd )
1347
- rv -> X [ir -> rd ] = rv -> io . mem_read_w ( ir -> rs1 ) ;
1348
- rv -> io .mem_write_s ( ir -> rs1 , rv -> X [ ir -> rs2 ] );
1355
+ rv -> X [ir -> rd ] = value1 ;
1356
+ rv -> io .mem_write_w ( addr , value2 );
1349
1357
},
1350
1358
GEN ({
1351
1359
assert ; /* FIXME: Implement */
@@ -1355,10 +1363,14 @@ RVOP(
1355
1363
RVOP (
1356
1364
amoaddw ,
1357
1365
{
1366
+ const uint32_t addr = rv -> X [ir -> rs1 ];
1367
+ RV_EXC_MISALIGN_HANDLER (3 , load , false, 1 );
1368
+ const uint32_t value1 = rv -> io .mem_read_w (rv -> X [ir -> rs1 ]);
1369
+ const uint32_t value2 = rv -> X [ir -> rs2 ];
1358
1370
if (ir -> rd )
1359
- rv -> X [ir -> rd ] = rv -> io . mem_read_w ( ir -> rs1 ) ;
1360
- const int32_t res = ( int32_t ) rv -> X [ ir -> rd ] + ( int32_t ) rv -> X [ ir -> rs2 ] ;
1361
- rv -> io .mem_write_s ( ir -> rs1 , res );
1371
+ rv -> X [ir -> rd ] = value1 ;
1372
+ const uint32_t res = value1 + value2 ;
1373
+ rv -> io .mem_write_w ( addr , res );
1362
1374
},
1363
1375
GEN ({
1364
1376
assert ; /* FIXME: Implement */
@@ -1368,10 +1380,14 @@ RVOP(
1368
1380
RVOP (
1369
1381
amoxorw ,
1370
1382
{
1383
+ const uint32_t addr = rv -> X [ir -> rs1 ];
1384
+ RV_EXC_MISALIGN_HANDLER (3 , load , false, 1 );
1385
+ const uint32_t value1 = rv -> io .mem_read_w (rv -> X [ir -> rs1 ]);
1386
+ const uint32_t value2 = rv -> X [ir -> rs2 ];
1371
1387
if (ir -> rd )
1372
- rv -> X [ir -> rd ] = rv -> io . mem_read_w ( ir -> rs1 ) ;
1373
- const int32_t res = rv -> X [ ir -> rd ] ^ rv -> X [ ir -> rs2 ] ;
1374
- rv -> io .mem_write_s ( ir -> rs1 , res );
1388
+ rv -> X [ir -> rd ] = value1 ;
1389
+ const uint32_t res = value1 ^ value2 ;
1390
+ rv -> io .mem_write_w ( addr , res );
1375
1391
},
1376
1392
GEN ({
1377
1393
assert ; /* FIXME: Implement */
@@ -1381,10 +1397,14 @@ RVOP(
1381
1397
RVOP (
1382
1398
amoandw ,
1383
1399
{
1400
+ const uint32_t addr = rv -> X [ir -> rs1 ];
1401
+ RV_EXC_MISALIGN_HANDLER (3 , load , false, 1 );
1402
+ const uint32_t value1 = rv -> io .mem_read_w (rv -> X [ir -> rs1 ]);
1403
+ const uint32_t value2 = rv -> X [ir -> rs2 ];
1384
1404
if (ir -> rd )
1385
- rv -> X [ir -> rd ] = rv -> io . mem_read_w ( ir -> rs1 ) ;
1386
- const int32_t res = rv -> X [ ir -> rd ] & rv -> X [ ir -> rs2 ] ;
1387
- rv -> io .mem_write_s ( ir -> rs1 , res );
1405
+ rv -> X [ir -> rd ] = value1 ;
1406
+ const uint32_t res = value1 & value2 ;
1407
+ rv -> io .mem_write_w ( addr , res );
1388
1408
},
1389
1409
GEN ({
1390
1410
assert ; /* FIXME: Implement */
@@ -1394,10 +1414,14 @@ RVOP(
1394
1414
RVOP (
1395
1415
amoorw ,
1396
1416
{
1417
+ const uint32_t addr = rv -> X [ir -> rs1 ];
1418
+ RV_EXC_MISALIGN_HANDLER (3 , load , false, 1 );
1419
+ const uint32_t value1 = rv -> io .mem_read_w (rv -> X [ir -> rs1 ]);
1420
+ const uint32_t value2 = rv -> X [ir -> rs2 ];
1397
1421
if (ir -> rd )
1398
- rv -> X [ir -> rd ] = rv -> io . mem_read_w ( ir -> rs1 ) ;
1399
- const int32_t res = rv -> X [ ir -> rd ] | rv -> X [ ir -> rs2 ] ;
1400
- rv -> io .mem_write_s ( ir -> rs1 , res );
1422
+ rv -> X [ir -> rd ] = value1 ;
1423
+ const uint32_t res = value1 | value2 ;
1424
+ rv -> io .mem_write_w ( addr , res );
1401
1425
},
1402
1426
GEN ({
1403
1427
assert ; /* FIXME: Implement */
@@ -1407,12 +1431,16 @@ RVOP(
1407
1431
RVOP (
1408
1432
amominw ,
1409
1433
{
1434
+ const uint32_t addr = rv -> X [ir -> rs1 ];
1435
+ RV_EXC_MISALIGN_HANDLER (3 , load , false, 1 );
1436
+ const uint32_t value1 = rv -> io .mem_read_w (rv -> X [ir -> rs1 ]);
1437
+ const uint32_t value2 = rv -> X [ir -> rs2 ];
1410
1438
if (ir -> rd )
1411
- rv -> X [ir -> rd ] = rv -> io . mem_read_w ( ir -> rs1 ) ;
1412
- const int32_t a = rv -> X [ ir -> rd ] ;
1413
- const int32_t b = rv -> X [ ir -> rs2 ] ;
1414
- const uint32_t res = a < b ? rv -> X [ ir -> rd ] : rv -> X [ ir -> rs2 ] ;
1415
- rv -> io .mem_write_s ( ir -> rs1 , res );
1439
+ rv -> X [ir -> rd ] = value1 ;
1440
+ const int32_t a = value1 ;
1441
+ const int32_t b = value2 ;
1442
+ const uint32_t res = a < b ? value1 : value2 ;
1443
+ rv -> io .mem_write_w ( addr , res );
1416
1444
},
1417
1445
GEN ({
1418
1446
assert ; /* FIXME: Implement */
@@ -1422,12 +1450,16 @@ RVOP(
1422
1450
RVOP (
1423
1451
amomaxw ,
1424
1452
{
1453
+ const uint32_t addr = rv -> X [ir -> rs1 ];
1454
+ RV_EXC_MISALIGN_HANDLER (3 , load , false, 1 );
1455
+ const uint32_t value1 = rv -> io .mem_read_w (rv -> X [ir -> rs1 ]);
1456
+ const uint32_t value2 = rv -> X [ir -> rs2 ];
1425
1457
if (ir -> rd )
1426
- rv -> X [ir -> rd ] = rv -> io . mem_read_w ( ir -> rs1 ) ;
1427
- const int32_t a = rv -> X [ ir -> rd ] ;
1428
- const int32_t b = rv -> X [ ir -> rs2 ] ;
1429
- const uint32_t res = a > b ? rv -> X [ ir -> rd ] : rv -> X [ ir -> rs2 ] ;
1430
- rv -> io .mem_write_s ( ir -> rs1 , res );
1458
+ rv -> X [ir -> rd ] = value1 ;
1459
+ const int32_t a = value1 ;
1460
+ const int32_t b = value2 ;
1461
+ const uint32_t res = a > b ? value1 : value2 ;
1462
+ rv -> io .mem_write_w ( addr , res );
1431
1463
},
1432
1464
GEN ({
1433
1465
assert ; /* FIXME: Implement */
@@ -1437,11 +1469,14 @@ RVOP(
1437
1469
RVOP (
1438
1470
amominuw ,
1439
1471
{
1472
+ const uint32_t addr = rv -> X [ir -> rs1 ];
1473
+ RV_EXC_MISALIGN_HANDLER (3 , load , false, 1 );
1474
+ const uint32_t value1 = rv -> io .mem_read_w (rv -> X [ir -> rs1 ]);
1475
+ const uint32_t value2 = rv -> X [ir -> rs2 ];
1440
1476
if (ir -> rd )
1441
- rv -> X [ir -> rd ] = rv -> io .mem_read_w (ir -> rs1 );
1442
- const uint32_t ures =
1443
- rv -> X [ir -> rd ] < rv -> X [ir -> rs2 ] ? rv -> X [ir -> rd ] : rv -> X [ir -> rs2 ];
1444
- rv -> io .mem_write_s (ir -> rs1 , ures );
1477
+ rv -> X [ir -> rd ] = value1 ;
1478
+ const uint32_t ures = value1 < value2 ? value1 : value2 ;
1479
+ rv -> io .mem_write_w (addr , ures );
1445
1480
},
1446
1481
GEN ({
1447
1482
assert ; /* FIXME: Implement */
@@ -1451,11 +1486,14 @@ RVOP(
1451
1486
RVOP (
1452
1487
amomaxuw ,
1453
1488
{
1489
+ const uint32_t addr = rv -> X [ir -> rs1 ];
1490
+ RV_EXC_MISALIGN_HANDLER (3 , load , false, 1 );
1491
+ const uint32_t value1 = rv -> io .mem_read_w (rv -> X [ir -> rs1 ]);
1492
+ const uint32_t value2 = rv -> X [ir -> rs2 ];
1454
1493
if (ir -> rd )
1455
- rv -> X [ir -> rd ] = rv -> io .mem_read_w (ir -> rs1 );
1456
- const uint32_t ures =
1457
- rv -> X [ir -> rd ] > rv -> X [ir -> rs2 ] ? rv -> X [ir -> rd ] : rv -> X [ir -> rs2 ];
1458
- rv -> io .mem_write_s (ir -> rs1 , ures );
1494
+ rv -> X [ir -> rd ] = value1 ;
1495
+ const uint32_t ures = value1 > value2 ? value1 : value2 ;
1496
+ rv -> io .mem_write_w (addr , ures );
1459
1497
},
1460
1498
GEN ({
1461
1499
assert ; /* FIXME: Implement */
0 commit comments