47,50d46
< /// Pointer to EAComp object.
< const StaticInstPtr eaCompPtr;
< /// Pointer to MemAcc object.
< const StaticInstPtr memAccPtr;
53,57c49,50
< Memory(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
< StaticInstPtr _eaCompPtr = nullStaticInstPtr,
< StaticInstPtr _memAccPtr = nullStaticInstPtr)
< : AlphaStaticInst(mnem, _machInst, __opClass),
< eaCompPtr(_eaCompPtr), memAccPtr(_memAccPtr)
---
> Memory(const char *mnem, ExtMachInst _machInst, OpClass __opClass)
> : AlphaStaticInst(mnem, _machInst, __opClass)
64c57
< public:
---
> public:
66,68d58
< const StaticInstPtr &eaCompInst() const { return eaCompPtr; }
< const StaticInstPtr &memAccInst() const { return memAccPtr; }
<
83,86c73,74
< MemoryDisp32(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
< StaticInstPtr _eaCompPtr = nullStaticInstPtr,
< StaticInstPtr _memAccPtr = nullStaticInstPtr)
< : Memory(mnem, _machInst, __opClass, _eaCompPtr, _memAccPtr),
---
> MemoryDisp32(const char *mnem, ExtMachInst _machInst, OpClass __opClass)
> : Memory(mnem, _machInst, __opClass),
102,105c90,91
< MemoryNoDisp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
< StaticInstPtr _eaCompPtr = nullStaticInstPtr,
< StaticInstPtr _memAccPtr = nullStaticInstPtr)
< : Memory(mnem, _machInst, __opClass, _eaCompPtr, _memAccPtr)
---
> MemoryNoDisp(const char *mnem, ExtMachInst _machInst, OpClass __opClass)
> : Memory(mnem, _machInst, __opClass)
145,170d130
< protected:
<
< /**
< * "Fake" effective address computation class for "%(mnemonic)s".
< */
< class EAComp : public %(base_class)s
< {
< public:
< /// Constructor
< EAComp(ExtMachInst machInst);
<
< %(BasicExecDeclare)s
< };
<
< /**
< * "Fake" memory access instruction class for "%(mnemonic)s".
< */
< class MemAcc : public %(base_class)s
< {
< public:
< /// Constructor
< MemAcc(ExtMachInst machInst);
<
< %(BasicExecDeclare)s
< };
<
177a138,139
> %(EACompDeclare)s
>
186a149,152
> def template EACompDeclare {{
> Fault eaComp(%(CPU_exec_context)s *, Trace::InstRecord *) const;
> }};
>
217,226d182
< def template EACompConstructor {{
< /** TODO: change op_class to AddrGenOp or something (requires
< * creating new member of OpClass enum in op_class.hh, updating
< * config files, etc.). */
< inline %(class_name)s::EAComp::EAComp(ExtMachInst machInst)
< : %(base_class)s("%(mnemonic)s (EAComp)", machInst, IntAluOp)
< {
< %(constructor)s;
< }
< }};
228,237d183
<
< def template MemAccConstructor {{
< inline %(class_name)s::MemAcc::MemAcc(ExtMachInst machInst)
< : %(base_class)s("%(mnemonic)s (MemAcc)", machInst, %(op_class)s)
< {
< %(constructor)s;
< }
< }};
<
<
240,241c186
< : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
< new EAComp(machInst), new MemAcc(machInst))
---
> : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s)
247d191
<
249,251c193,194
< Fault
< %(class_name)s::EAComp::execute(%(CPU_exec_context)s *xc,
< Trace::InstRecord *traceData) const
---
> Fault %(class_name)s::eaComp(%(CPU_exec_context)s *xc,
> Trace::InstRecord *traceData) const
270,276d212
< def template LoadMemAccExecute {{
< Fault
< %(class_name)s::MemAcc::execute(%(CPU_exec_context)s *xc,
< Trace::InstRecord *traceData) const
< {
< Addr EA;
< Fault fault = NoFault;
278,296d213
< %(fp_enable_check)s;
< %(op_decl)s;
< %(op_rd)s;
< EA = xc->getEA();
<
< if (fault == NoFault) {
< fault = xc->read(EA, (uint%(mem_acc_size)d_t&)Mem, memAccessFlags);
< %(memacc_code)s;
< }
<
< if (fault == NoFault) {
< %(op_wb)s;
< }
<
< return fault;
< }
< }};
<
<
369,440d285
< 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
< %(class_name)s::MemAcc::execute(%(CPU_exec_context)s *xc,
< Trace::InstRecord *traceData) const
< {
< Addr EA;
< Fault fault = NoFault;
< uint64_t write_result = 0;
<
< %(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, &write_result);
< if (traceData) { traceData->setData(Mem); }
< }
<
< if (fault == NoFault) {
< %(postacc_code)s;
< }
<
< if (fault == NoFault) {
< %(op_wb)s;
< }
<
< return fault;
< }
< }};
<
<
585,604d429
< def template MiscMemAccExecute {{
< 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;
< }
<
< return NoFault;
< }
< }};
<
703,705d527
< ea_iop = InstObjParams(name, Name, base_class,
< { 'ea_code':ea_code },
< inst_flags)
722d543
< memAccExecTemplate = eval(exec_template_base + 'MemAccExecute')
734,736c555
< EACompConstructor.subst(ea_iop)
< + MemAccConstructor.subst(memacc_iop)
< + LoadStoreConstructor.subst(iop),
---
> LoadStoreConstructor.subst(iop),
738,740c557,558
< EACompExecute.subst(ea_iop)
< + memAccExecTemplate.subst(memacc_iop)
< + fullExecTemplate.subst(iop)
---
> fullExecTemplate.subst(iop)
> + EACompExecute.subst(iop)