Skip to content

Commit f15e4c4

Browse files
committed
Fix signed integer comparison in AMOMIN.W and AMOMAX.W
The current implementation of the AMOMIN.W and AMOMAX.W instructions incorrectly compares the values of registers rd and rs2 as unsigned integers instead of signed integers. Correct this behavior by properly treating rd and rs2 as signed integers before performing the comparison.
1 parent 2fd87db commit f15e4c4

File tree

1 file changed

+6
-4
lines changed

1 file changed

+6
-4
lines changed

src/rv32_template.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1376,8 +1376,9 @@ RVOP(
13761376
amominw,
13771377
{
13781378
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
1379-
const int32_t res =
1380-
rv->X[ir->rd] < rv->X[ir->rs2] ? rv->X[ir->rd] : rv->X[ir->rs2];
1379+
const int32_t a = rv->X[ir->rd];
1380+
const int32_t b = rv->X[ir->rs2];
1381+
const uint32_t res = a < b ? rv->X[ir->rd] : rv->X[ir->rs2];
13811382
rv->io.mem_write_s(ir->rs1, res);
13821383
},
13831384
GEN({
@@ -1389,8 +1390,9 @@ RVOP(
13891390
amomaxw,
13901391
{
13911392
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
1392-
const int32_t res =
1393-
rv->X[ir->rd] > rv->X[ir->rs2] ? rv->X[ir->rd] : rv->X[ir->rs2];
1393+
const int32_t a = rv->X[ir->rd];
1394+
const int32_t b = rv->X[ir->rs2];
1395+
const uint32_t res = a > b ? rv->X[ir->rd] : rv->X[ir->rs2];
13941396
rv->io.mem_write_s(ir->rs1, res);
13951397
},
13961398
GEN({

0 commit comments

Comments
 (0)