arch-riscv: Move FCSR implementation to isa.cc
Change-Id: I132edfe2c0ae4caecaa9e6209249662895b5c608
This commit is contained in:
@@ -576,6 +576,11 @@ ISA::readMiscReg(RegIndex idx)
|
||||
{
|
||||
return readMiscRegNoEffect(MISCREG_FFLAGS) & FFLAGS_MASK;
|
||||
}
|
||||
case MISCREG_FCSR:
|
||||
{
|
||||
return readMiscRegNoEffect(MISCREG_FFLAGS) |
|
||||
(readMiscRegNoEffect(MISCREG_FRM) << FRM_OFFSET);
|
||||
}
|
||||
default:
|
||||
// Try reading HPM counters
|
||||
// As a placeholder, all HPM counters are just cycle counters
|
||||
@@ -782,6 +787,12 @@ ISA::setMiscReg(RegIndex idx, RegVal val)
|
||||
setMiscRegNoEffect(MISCREG_FFLAGS, new_val);
|
||||
}
|
||||
break;
|
||||
case MISCREG_FCSR:
|
||||
{
|
||||
setMiscRegNoEffect(MISCREG_FFLAGS, bits(val, 4, 0));
|
||||
setMiscRegNoEffect(MISCREG_FRM, bits(val, 7, 5));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
setMiscRegNoEffect(idx, val);
|
||||
}
|
||||
|
||||
@@ -389,13 +389,7 @@ def template CSRExecute {{
|
||||
break;
|
||||
}
|
||||
|
||||
if (csr == CSR_FCSR) {
|
||||
olddata = xc->readMiscReg(MISCREG_FFLAGS) |
|
||||
(xc->readMiscReg(MISCREG_FRM) << FRM_OFFSET);
|
||||
} else {
|
||||
olddata = xc->readMiscReg(midx);
|
||||
}
|
||||
olddata = rvZext(olddata);
|
||||
olddata = rvZext(xc->readMiscReg(midx));
|
||||
auto olddata_all = olddata;
|
||||
|
||||
olddata &= maskVal;
|
||||
@@ -417,15 +411,7 @@ def template CSRExecute {{
|
||||
newdata_all = (olddata_all & ~maskVal) | data;
|
||||
DPRINTF(RiscvMisc, "Writing %#x to CSR %s.\n",
|
||||
newdata_all, csrName);
|
||||
switch (csr) {
|
||||
case CSR_FCSR:
|
||||
xc->setMiscReg(MISCREG_FFLAGS, bits(data, 4, 0));
|
||||
xc->setMiscReg(MISCREG_FRM, bits(data, 7, 5));
|
||||
break;
|
||||
default:
|
||||
xc->setMiscReg(midx, newdata_all);
|
||||
break;
|
||||
}
|
||||
xc->setMiscReg(midx, newdata_all);
|
||||
}
|
||||
%(op_wb)s;
|
||||
return NoFault;
|
||||
|
||||
@@ -250,6 +250,7 @@ enum MiscRegIndex
|
||||
|
||||
// This CSR shared the same space with MISCREG_FFLAGS
|
||||
MISCREG_FFLAGS_EXE = NUM_PHYS_MISCREGS,
|
||||
MISCREG_FCSR,
|
||||
|
||||
NUM_MISCREGS
|
||||
};
|
||||
@@ -548,9 +549,8 @@ const std::unordered_map<int, CSRMetadata> CSRData = {
|
||||
isaExtsFlags('f')}},
|
||||
{CSR_FRM,
|
||||
{"frm", MISCREG_FRM, rvTypeFlags(RV64, RV32), isaExtsFlags('f')}},
|
||||
// Actually FRM << 5 | FFLAGS
|
||||
{CSR_FCSR,
|
||||
{"fcsr", MISCREG_FFLAGS, rvTypeFlags(RV64, RV32), isaExtsFlags('f')}},
|
||||
{"fcsr", MISCREG_FCSR, rvTypeFlags(RV64, RV32), isaExtsFlags('f')}},
|
||||
{CSR_CYCLE,
|
||||
{"cycle", MISCREG_CYCLE, rvTypeFlags(RV64, RV32), isaExtsFlags()}},
|
||||
{CSR_TIME,
|
||||
|
||||
Reference in New Issue
Block a user