Update MIPS ISA description to work with new write result interface

for store conditional.

--HG--
extra : convert_revision : 73efd2ca17994e0e19c08746441874a2ac8183af
This commit is contained in:
Steve Reinhardt 2007-02-13 08:09:09 -08:00
parent ca5cd68df4
commit f55fd68f88
3 changed files with 74 additions and 4 deletions

View file

@ -1093,6 +1093,9 @@ decode OPCODE_HI default Unknown::unknown() {
0x0: StoreCond::sc({{ Mem.uw = Rt.uw;}}, 0x0: StoreCond::sc({{ Mem.uw = Rt.uw;}},
{{ uint64_t tmp = write_result; {{ uint64_t tmp = write_result;
Rt.uw = (tmp == 0 || tmp == 1) ? tmp : Rt.uw; Rt.uw = (tmp == 0 || tmp == 1) ? tmp : Rt.uw;
if (tmp == 1) {
xc->setStCondFailures(0);
}
}}, mem_flags=LOCKED, inst_flags = IsStoreConditional); }}, mem_flags=LOCKED, inst_flags = IsStoreConditional);
format StoreMemory { format StoreMemory {

View file

@ -319,6 +319,41 @@ def template LoadCompleteAcc {{
def template StoreMemAccExecute {{ def template StoreMemAccExecute {{
Fault
%(class_name)s::MemAcc::execute(%(CPU_exec_context)s *xc,
Trace::InstRecord *traceData) const
{
Addr EA;
Fault fault = NoFault;
%(fp_enable_check)s;
%(op_decl)s;
%(op_rd)s;
EA = xc->getEA();
if (fault == NoFault) {
%(memacc_code)s;
}
if (fault == NoFault) {
fault = xc->write((uint%(mem_acc_size)d_t&)Mem, EA,
memAccessFlags, NULL);
if (traceData) { traceData->setData(Mem); }
}
if (fault == NoFault) {
%(postacc_code)s;
}
if (fault == NoFault) {
%(op_wb)s;
}
return fault;
}
}};
def template StoreCondMemAccExecute {{
Fault Fault
%(class_name)s::MemAcc::execute(%(CPU_exec_context)s *xc, %(class_name)s::MemAcc::execute(%(CPU_exec_context)s *xc,
Trace::InstRecord *traceData) const Trace::InstRecord *traceData) const
@ -356,6 +391,40 @@ def template StoreMemAccExecute {{
def template StoreExecute {{ def template StoreExecute {{
Fault %(class_name)s::execute(%(CPU_exec_context)s *xc,
Trace::InstRecord *traceData) const
{
Addr EA;
Fault fault = NoFault;
%(fp_enable_check)s;
%(op_decl)s;
%(op_rd)s;
%(ea_code)s;
if (fault == NoFault) {
%(memacc_code)s;
}
if (fault == NoFault) {
fault = xc->write((uint%(mem_acc_size)d_t&)Mem, EA,
memAccessFlags, NULL);
if (traceData) { traceData->setData(Mem); }
}
if (fault == NoFault) {
%(postacc_code)s;
}
if (fault == NoFault) {
%(op_wb)s;
}
return fault;
}
}};
def template StoreCondExecute {{
Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, Fault %(class_name)s::execute(%(CPU_exec_context)s *xc,
Trace::InstRecord *traceData) const Trace::InstRecord *traceData) const
{ {

View file

@ -66,10 +66,8 @@ def LoadStoreBase(name, Name, ea_code, memacc_code, mem_flags, inst_flags,
# select templates # select templates
# define aliases... most StoreCond templates are the same as the # The InitiateAcc template is the same for StoreCond templates as the
# corresponding Store templates (only CompleteAcc is different). # corresponding Store template..
StoreCondMemAccExecute = StoreMemAccExecute
StoreCondExecute = StoreExecute
StoreCondInitiateAcc = StoreInitiateAcc StoreCondInitiateAcc = StoreInitiateAcc
memAccExecTemplate = eval(exec_template_base + 'MemAccExecute') memAccExecTemplate = eval(exec_template_base + 'MemAccExecute')