Skip to content

Commit e3ba953

Browse files
committed
Fix incorrect memory address retrieval in RV32A
The current incorrectly retrieves the register number of rs1 instead of its content when calculating memory addresses for A extension instructions. Fix this issue by ensuring that the content of rs1 register is properly used as the memory address.
1 parent 2d89b32 commit e3ba953

File tree

1 file changed

+18
-18
lines changed

1 file changed

+18
-18
lines changed

src/rv32_template.c

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1350,8 +1350,8 @@ RVOP(
13501350
amoswapw,
13511351
{
13521352
if (ir->rd)
1353-
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
1354-
rv->io.mem_write_s(ir->rs1, rv->X[ir->rs2]);
1353+
rv->X[ir->rd] = rv->io.mem_read_w(rv->X[ir->rs1]);
1354+
rv->io.mem_write_s(rv->X[ir->rs1], rv->X[ir->rs2]);
13551355
},
13561356
GEN({
13571357
assert; /* FIXME: Implement */
@@ -1362,9 +1362,9 @@ RVOP(
13621362
amoaddw,
13631363
{
13641364
if (ir->rd)
1365-
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
1365+
rv->X[ir->rd] = rv->io.mem_read_w(rv->X[ir->rs1]);
13661366
const int32_t res = (int32_t) rv->X[ir->rd] + (int32_t) rv->X[ir->rs2];
1367-
rv->io.mem_write_s(ir->rs1, res);
1367+
rv->io.mem_write_s(rv->X[ir->rs1], res);
13681368
},
13691369
GEN({
13701370
assert; /* FIXME: Implement */
@@ -1375,9 +1375,9 @@ RVOP(
13751375
amoxorw,
13761376
{
13771377
if (ir->rd)
1378-
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
1378+
rv->X[ir->rd] = rv->io.mem_read_w(rv->X[ir->rs1]);
13791379
const int32_t res = rv->X[ir->rd] ^ rv->X[ir->rs2];
1380-
rv->io.mem_write_s(ir->rs1, res);
1380+
rv->io.mem_write_s(rv->X[ir->rs1], res);
13811381
},
13821382
GEN({
13831383
assert; /* FIXME: Implement */
@@ -1388,9 +1388,9 @@ RVOP(
13881388
amoandw,
13891389
{
13901390
if (ir->rd)
1391-
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
1391+
rv->X[ir->rd] = rv->io.mem_read_w(rv->X[ir->rs1]);
13921392
const int32_t res = rv->X[ir->rd] & rv->X[ir->rs2];
1393-
rv->io.mem_write_s(ir->rs1, res);
1393+
rv->io.mem_write_s(rv->X[ir->rs1], res);
13941394
},
13951395
GEN({
13961396
assert; /* FIXME: Implement */
@@ -1401,9 +1401,9 @@ RVOP(
14011401
amoorw,
14021402
{
14031403
if (ir->rd)
1404-
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
1404+
rv->X[ir->rd] = rv->io.mem_read_w(rv->X[ir->rs1]);
14051405
const int32_t res = rv->X[ir->rd] | rv->X[ir->rs2];
1406-
rv->io.mem_write_s(ir->rs1, res);
1406+
rv->io.mem_write_s(rv->X[ir->rs1], res);
14071407
},
14081408
GEN({
14091409
assert; /* FIXME: Implement */
@@ -1414,11 +1414,11 @@ RVOP(
14141414
amominw,
14151415
{
14161416
if (ir->rd)
1417-
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
1417+
rv->X[ir->rd] = rv->io.mem_read_w(rv->X[ir->rs1]);
14181418
const int32_t a = rv->X[ir->rd];
14191419
const int32_t b = rv->X[ir->rs2];
14201420
const uint32_t res = a < b ? rv->X[ir->rd] : rv->X[ir->rs2];
1421-
rv->io.mem_write_s(ir->rs1, res);
1421+
rv->io.mem_write_s(rv->X[ir->rs1], res);
14221422
},
14231423
GEN({
14241424
assert; /* FIXME: Implement */
@@ -1429,11 +1429,11 @@ RVOP(
14291429
amomaxw,
14301430
{
14311431
if (ir->rd)
1432-
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
1432+
rv->X[ir->rd] = rv->io.mem_read_w(rv->X[ir->rs1]);
14331433
const int32_t a = rv->X[ir->rd];
14341434
const int32_t b = rv->X[ir->rs2];
14351435
const uint32_t res = a > b ? rv->X[ir->rd] : rv->X[ir->rs2];
1436-
rv->io.mem_write_s(ir->rs1, res);
1436+
rv->io.mem_write_s(rv->X[ir->rs1], res);
14371437
},
14381438
GEN({
14391439
assert; /* FIXME: Implement */
@@ -1444,10 +1444,10 @@ RVOP(
14441444
amominuw,
14451445
{
14461446
if (ir->rd)
1447-
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
1447+
rv->X[ir->rd] = rv->io.mem_read_w(rv->X[ir->rs1]);
14481448
const uint32_t ures =
14491449
rv->X[ir->rd] < rv->X[ir->rs2] ? rv->X[ir->rd] : rv->X[ir->rs2];
1450-
rv->io.mem_write_s(ir->rs1, ures);
1450+
rv->io.mem_write_s(rv->X[ir->rs1], ures);
14511451
},
14521452
GEN({
14531453
assert; /* FIXME: Implement */
@@ -1458,10 +1458,10 @@ RVOP(
14581458
amomaxuw,
14591459
{
14601460
if (ir->rd)
1461-
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
1461+
rv->X[ir->rd] = rv->io.mem_read_w(rv->X[ir->rs1]);
14621462
const uint32_t ures =
14631463
rv->X[ir->rd] > rv->X[ir->rs2] ? rv->X[ir->rd] : rv->X[ir->rs2];
1464-
rv->io.mem_write_s(ir->rs1, ures);
1464+
rv->io.mem_write_s(rv->X[ir->rs1], ures);
14651465
},
14661466
GEN({
14671467
assert; /* FIXME: Implement */

0 commit comments

Comments
 (0)