154,158c154
< if (fault == NoFault) {
< fault = xc->readMem(EA, memData.raw_ptr<uint8_t>(), memAccessSize,
< this->memAccessFlags);
< %(memacc_code)s;
< }
---
> %(rden_code)s;
159a156,160
> fault = xc->readMem(EA, memData.raw_ptr<uint8_t>(), memAccessSize,
> this->memAccessFlags, rdEn);
>
> %(fault_code)s;
>
160a162
> %(memacc_code)s;
181d182
<
184,187c185
< if (fault == NoFault) {
< fault = xc->initiateMemRead(EA, memAccessSize,
< this->memAccessFlags);
< }
---
> %(rden_code)s;
188a187,191
> fault = xc->initiateMemRead(EA, memAccessSize, this->memAccessFlags,
> rdEn);
>
> %(fault_code)s;
>
198d200
< Fault fault = NoFault;
209,213c211,213
< memcpy(memData.raw_ptr<uint8_t>(), pkt->getPtr<uint8_t>(),
< pkt->getSize());
<
< if (fault == NoFault) {
< %(memacc_code)s;
---
> if (xc->readMemAccPredicate()) {
> memcpy(memData.raw_ptr<uint8_t>(), pkt->getPtr<uint8_t>(),
> pkt->getSize());
216,218c216,217
< if (fault == NoFault) {
< %(op_wb)s;
< }
---
> %(memacc_code)s;
> %(op_wb)s;
220c219
< return fault;
---
> return NoFault;
400a400
> bool firstFault;
407c407,408
< IntRegIndex _base, uint64_t _imm, int _elemIndex, int _numElems)
---
> IntRegIndex _base, uint64_t _imm, int _elemIndex, int _numElems,
> bool _firstFault)
410a412
> firstFault(_firstFault),
417,418c419,422
< // destination register
< _destRegIdx[0].setNumPinnedWrites(numElems - 1);
---
> // destination and the fault status registers
> assert(_numDestRegs == 2);
> _destRegIdx[0].setNumPinnedWrites(numElems - 1);
> _destRegIdx[1].setNumPinnedWrites(numElems - 1);
473a478
> bool firstFault;
482c487
< int _numElems)
---
> int _numElems, bool _firstFault)
487c492
< numElems(_numElems),
---
> numElems(_numElems), firstFault(_firstFault),
494,495c499,502
< // destination register
< _destRegIdx[0].setNumPinnedWrites(numElems - 1);
---
> // destination and the fault status registers
> assert(_numDestRegs == 2);
> _destRegIdx[0].setNumPinnedWrites(numElems - 1);
> _destRegIdx[1].setNumPinnedWrites(numElems - 1);
545c552
< MemElemType memData;
---
> MemElemType memData = 0;
546a554
> int index = elemIndex;
552a561
> %(fault_status_reset_code)s;
555c564,569
< }
---
> } else {
> %(fault_status_set_code)s;
> if (firstFault) {
> for (index = 0;
> index < numElems && !(%(pred_check_code)s);
> index++);
556a571,578
> if (index < elemIndex) {
> fault = NoFault;
> memData = 0;
> %(memacc_code)s;
> %(op_wb)s;
> }
> }
> }
575a598
> int index = elemIndex;
578a602,615
> if (fault != NoFault) {
> %(fault_status_set_code)s;
> if (firstFault) {
> for (index = 0;
> index < numElems && !(%(pred_check_code)s);
> index++);
> if (index < elemIndex) {
> fault = NoFault;
> xc->setMemAccPredicate(false);
> }
> }
> } else {
> %(fault_status_reset_code)s;
> }
580a618
> %(fault_status_reset_code)s;
592d629
< Fault fault = NoFault;
599c636
< if (%(pred_check_code)s) {
---
> if (xc->readMemAccPredicate()) {
603,605c640,641
< if (fault == NoFault) {
< %(memacc_code)s;
< }
---
> %(memacc_code)s;
> %(op_wb)s;
607,611c643
< if (fault == NoFault) {
< %(op_wb)s;
< }
<
< return fault;
---
> return NoFault;
630a663
> int index = elemIndex;
659a693
> int index = elemIndex;
679a714,771
> def template SveFirstFaultWritebackMicroopDeclare {{
> %(tpl_header)s
> class SveFirstFaultWritebackMicroop : public MicroOp
> {
> protected:
> typedef RegElemType TPElem;
>
> int numElems;
> StaticInst *macroOp;
>
> public:
> SveFirstFaultWritebackMicroop(const char* mnem, ExtMachInst machInst,
> OpClass __opClass, int _numElems, StaticInst *_macroOp)
> : MicroOp(mnem, machInst, __opClass),
> numElems(_numElems), macroOp(_macroOp)
> {
> %(constructor)s;
> }
>
> Fault execute(ExecContext *, Trace::InstRecord *) const;
>
> std::string
> generateDisassembly(Addr pc, const SymbolTable *symtab) const
> {
> std::stringstream ss;
> ccprintf(ss, "%s", macroOp->disassemble(pc, symtab));
> ccprintf(ss, " (uop%d)", numElems);
> return ss.str();
> }
> };
> }};
>
> def template SveFirstFaultWritebackMicroopExecute {{
> %(tpl_header)s
> Fault %(class_name)s%(tpl_args)s::execute(ExecContext *xc,
> Trace::InstRecord *traceData) const
> {
> bool aarch64 M5_VAR_USED = true;
>
> %(op_decl)s;
> %(op_rd)s;
>
> int index, firstFaultIndex;
> for (index = 0;
> index < numElems && !%(fault_status_check_code)s;
> index++);
> firstFaultIndex = index;
> for (index = 0; index < numElems; index++) {
> if (index < firstFaultIndex) {
> %(first_fault_forward_code)s;
> } else {
> %(first_fault_reset_code)s;
> }
> }
> return NoFault;
> }
> }};
>