Skip to content

Commit f59f70c

Browse files
committed
Fix memory write operation in RV32A
The current implementation incorrectly writes only half word instead of the entire word when storing computation results back to memory in A extension instructions. Fix this issue by replacing the usage of mem_write_s() function with mem_write_w() function, ensuring that the entire word is properly written to memory.
1 parent e3ba953 commit f59f70c

File tree

1 file changed

+9
-9
lines changed

1 file changed

+9
-9
lines changed

src/rv32_template.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1351,7 +1351,7 @@ RVOP(
13511351
{
13521352
if (ir->rd)
13531353
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]);
1354+
rv->io.mem_write_w(rv->X[ir->rs1], rv->X[ir->rs2]);
13551355
},
13561356
GEN({
13571357
assert; /* FIXME: Implement */
@@ -1364,7 +1364,7 @@ RVOP(
13641364
if (ir->rd)
13651365
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(rv->X[ir->rs1], res);
1367+
rv->io.mem_write_w(rv->X[ir->rs1], res);
13681368
},
13691369
GEN({
13701370
assert; /* FIXME: Implement */
@@ -1377,7 +1377,7 @@ RVOP(
13771377
if (ir->rd)
13781378
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(rv->X[ir->rs1], res);
1380+
rv->io.mem_write_w(rv->X[ir->rs1], res);
13811381
},
13821382
GEN({
13831383
assert; /* FIXME: Implement */
@@ -1390,7 +1390,7 @@ RVOP(
13901390
if (ir->rd)
13911391
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(rv->X[ir->rs1], res);
1393+
rv->io.mem_write_w(rv->X[ir->rs1], res);
13941394
},
13951395
GEN({
13961396
assert; /* FIXME: Implement */
@@ -1403,7 +1403,7 @@ RVOP(
14031403
if (ir->rd)
14041404
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(rv->X[ir->rs1], res);
1406+
rv->io.mem_write_w(rv->X[ir->rs1], res);
14071407
},
14081408
GEN({
14091409
assert; /* FIXME: Implement */
@@ -1418,7 +1418,7 @@ RVOP(
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(rv->X[ir->rs1], res);
1421+
rv->io.mem_write_w(rv->X[ir->rs1], res);
14221422
},
14231423
GEN({
14241424
assert; /* FIXME: Implement */
@@ -1433,7 +1433,7 @@ RVOP(
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(rv->X[ir->rs1], res);
1436+
rv->io.mem_write_w(rv->X[ir->rs1], res);
14371437
},
14381438
GEN({
14391439
assert; /* FIXME: Implement */
@@ -1447,7 +1447,7 @@ RVOP(
14471447
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(rv->X[ir->rs1], ures);
1450+
rv->io.mem_write_w(rv->X[ir->rs1], ures);
14511451
},
14521452
GEN({
14531453
assert; /* FIXME: Implement */
@@ -1461,7 +1461,7 @@ RVOP(
14611461
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(rv->X[ir->rs1], ures);
1464+
rv->io.mem_write_w(rv->X[ir->rs1], ures);
14651465
},
14661466
GEN({
14671467
assert; /* FIXME: Implement */

0 commit comments

Comments
 (0)