Skip to content

Commit ed5d95f

Browse files
authored
Merge pull request #367 from visitorckw/fix-A-extension
Fix RV32A error
2 parents 1011ff9 + 2718a26 commit ed5d95f

File tree

2 files changed

+60
-20
lines changed

2 files changed

+60
-20
lines changed

src/rv32_constopt.c

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -554,37 +554,67 @@ CONSTOPT(remu, {
554554
#if RV32_HAS(EXT_A)
555555

556556
/* LR.W: Load Reserved */
557-
CONSTOPT(lrw, {})
557+
CONSTOPT(lrw, {
558+
if (ir->rd)
559+
info->is_constant[ir->rd] = false;
560+
})
558561

559562
/* SC.W: Store Conditional */
560563
CONSTOPT(scw, {})
561564

562565
/* AMOSWAP.W: Atomic Swap */
563-
CONSTOPT(amoswapw, {})
566+
CONSTOPT(amoswapw, {
567+
if (ir->rd)
568+
info->is_constant[ir->rd] = false;
569+
})
564570

565571
/* AMOADD.W: Atomic ADD */
566-
CONSTOPT(amoaddw, {})
572+
CONSTOPT(amoaddw, {
573+
if (ir->rd)
574+
info->is_constant[ir->rd] = false;
575+
})
567576

568577
/* AMOXOR.W: Atomic XOR */
569-
CONSTOPT(amoxorw, {})
578+
CONSTOPT(amoxorw, {
579+
if (ir->rd)
580+
info->is_constant[ir->rd] = false;
581+
})
570582

571583
/* AMOAND.W: Atomic AND */
572-
CONSTOPT(amoandw, {})
584+
CONSTOPT(amoandw, {
585+
if (ir->rd)
586+
info->is_constant[ir->rd] = false;
587+
})
573588

574589
/* AMOOR.W: Atomic OR */
575-
CONSTOPT(amoorw, {})
590+
CONSTOPT(amoorw, {
591+
if (ir->rd)
592+
info->is_constant[ir->rd] = false;
593+
})
576594

577595
/* AMOMIN.W: Atomic MIN */
578-
CONSTOPT(amominw, {})
596+
CONSTOPT(amominw, {
597+
if (ir->rd)
598+
info->is_constant[ir->rd] = false;
599+
})
579600

580601
/* AMOMAX.W: Atomic MAX */
581-
CONSTOPT(amomaxw, {})
602+
CONSTOPT(amomaxw, {
603+
if (ir->rd)
604+
info->is_constant[ir->rd] = false;
605+
})
582606

583607
/* AMOMINU.W */
584-
CONSTOPT(amominuw, {})
608+
CONSTOPT(amominuw, {
609+
if (ir->rd)
610+
info->is_constant[ir->rd] = false;
611+
})
585612

586613
/* AMOMAXU.W */
587-
CONSTOPT(amomaxuw, {})
614+
CONSTOPT(amomaxuw, {
615+
if (ir->rd)
616+
info->is_constant[ir->rd] = false;
617+
})
588618
#endif /* RV32_HAS(EXT_A) */
589619

590620
/* RV32F Standard Extension */

src/rv32_template.c

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1321,7 +1321,8 @@ GEN({
13211321
RVOP(
13221322
lrw,
13231323
{
1324-
rv->X[ir->rd] = rv->io.mem_read_w(rv->X[ir->rs1]);
1324+
if (ir->rd)
1325+
rv->X[ir->rd] = rv->io.mem_read_w(rv->X[ir->rs1]);
13251326
/* skip registration of the 'reservation set'
13261327
* FIXME: uimplemented
13271328
*/
@@ -1348,7 +1349,8 @@ RVOP(
13481349
RVOP(
13491350
amoswapw,
13501351
{
1351-
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
1352+
if (ir->rd)
1353+
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
13521354
rv->io.mem_write_s(ir->rs1, rv->X[ir->rs2]);
13531355
},
13541356
GEN({
@@ -1359,7 +1361,8 @@ RVOP(
13591361
RVOP(
13601362
amoaddw,
13611363
{
1362-
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
1364+
if (ir->rd)
1365+
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
13631366
const int32_t res = (int32_t) rv->X[ir->rd] + (int32_t) rv->X[ir->rs2];
13641367
rv->io.mem_write_s(ir->rs1, res);
13651368
},
@@ -1371,7 +1374,8 @@ RVOP(
13711374
RVOP(
13721375
amoxorw,
13731376
{
1374-
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
1377+
if (ir->rd)
1378+
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
13751379
const int32_t res = rv->X[ir->rd] ^ rv->X[ir->rs2];
13761380
rv->io.mem_write_s(ir->rs1, res);
13771381
},
@@ -1383,7 +1387,8 @@ RVOP(
13831387
RVOP(
13841388
amoandw,
13851389
{
1386-
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
1390+
if (ir->rd)
1391+
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
13871392
const int32_t res = rv->X[ir->rd] & rv->X[ir->rs2];
13881393
rv->io.mem_write_s(ir->rs1, res);
13891394
},
@@ -1395,7 +1400,8 @@ RVOP(
13951400
RVOP(
13961401
amoorw,
13971402
{
1398-
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
1403+
if (ir->rd)
1404+
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
13991405
const int32_t res = rv->X[ir->rd] | rv->X[ir->rs2];
14001406
rv->io.mem_write_s(ir->rs1, res);
14011407
},
@@ -1407,7 +1413,8 @@ RVOP(
14071413
RVOP(
14081414
amominw,
14091415
{
1410-
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
1416+
if (ir->rd)
1417+
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
14111418
const int32_t a = rv->X[ir->rd];
14121419
const int32_t b = rv->X[ir->rs2];
14131420
const uint32_t res = a < b ? rv->X[ir->rd] : rv->X[ir->rs2];
@@ -1421,7 +1428,8 @@ RVOP(
14211428
RVOP(
14221429
amomaxw,
14231430
{
1424-
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
1431+
if (ir->rd)
1432+
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
14251433
const int32_t a = rv->X[ir->rd];
14261434
const int32_t b = rv->X[ir->rs2];
14271435
const uint32_t res = a > b ? rv->X[ir->rd] : rv->X[ir->rs2];
@@ -1435,7 +1443,8 @@ RVOP(
14351443
RVOP(
14361444
amominuw,
14371445
{
1438-
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
1446+
if (ir->rd)
1447+
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
14391448
const uint32_t ures =
14401449
rv->X[ir->rd] < rv->X[ir->rs2] ? rv->X[ir->rd] : rv->X[ir->rs2];
14411450
rv->io.mem_write_s(ir->rs1, ures);
@@ -1448,7 +1457,8 @@ RVOP(
14481457
RVOP(
14491458
amomaxuw,
14501459
{
1451-
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
1460+
if (ir->rd)
1461+
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
14521462
const uint32_t ures =
14531463
rv->X[ir->rd] > rv->X[ir->rs2] ? rv->X[ir->rd] : rv->X[ir->rs2];
14541464
rv->io.mem_write_s(ir->rs1, ures);

0 commit comments

Comments
 (0)