sve_mem.isa revision 14028
114028Sgiacomo.gabrielli@arm.com// Copyright (c) 2017-2018 ARM Limited 213955Sgiacomo.gabrielli@arm.com// All rights reserved 313955Sgiacomo.gabrielli@arm.com// 413955Sgiacomo.gabrielli@arm.com// The license below extends only to copyright in the software and shall 513955Sgiacomo.gabrielli@arm.com// not be construed as granting a license to any other intellectual 613955Sgiacomo.gabrielli@arm.com// property including but not limited to intellectual property relating 713955Sgiacomo.gabrielli@arm.com// to a hardware implementation of the functionality of the software 813955Sgiacomo.gabrielli@arm.com// licensed hereunder. You may use the software subject to the license 913955Sgiacomo.gabrielli@arm.com// terms below provided that you ensure that this notice is replicated 1013955Sgiacomo.gabrielli@arm.com// unmodified and in its entirety in all distributions of the software, 1113955Sgiacomo.gabrielli@arm.com// modified or unmodified, in source code or in binary form. 1213955Sgiacomo.gabrielli@arm.com// 1313955Sgiacomo.gabrielli@arm.com// Redistribution and use in source and binary forms, with or without 1413955Sgiacomo.gabrielli@arm.com// modification, are permitted provided that the following conditions are 1513955Sgiacomo.gabrielli@arm.com// met: redistributions of source code must retain the above copyright 1613955Sgiacomo.gabrielli@arm.com// notice, this list of conditions and the following disclaimer; 1713955Sgiacomo.gabrielli@arm.com// redistributions in binary form must reproduce the above copyright 1813955Sgiacomo.gabrielli@arm.com// notice, this list of conditions and the following disclaimer in the 1913955Sgiacomo.gabrielli@arm.com// documentation and/or other materials provided with the distribution; 2013955Sgiacomo.gabrielli@arm.com// neither the name of the copyright holders nor the names of its 2113955Sgiacomo.gabrielli@arm.com// contributors may be used to endorse or promote products derived from 2213955Sgiacomo.gabrielli@arm.com// this software without specific prior written permission. 2313955Sgiacomo.gabrielli@arm.com// 2413955Sgiacomo.gabrielli@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2513955Sgiacomo.gabrielli@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2613955Sgiacomo.gabrielli@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2713955Sgiacomo.gabrielli@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2813955Sgiacomo.gabrielli@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2913955Sgiacomo.gabrielli@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3013955Sgiacomo.gabrielli@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3113955Sgiacomo.gabrielli@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3213955Sgiacomo.gabrielli@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3313955Sgiacomo.gabrielli@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3413955Sgiacomo.gabrielli@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3513955Sgiacomo.gabrielli@arm.com// 3613955Sgiacomo.gabrielli@arm.com// Authors: Giacomo Gabrielli 3713955Sgiacomo.gabrielli@arm.com 3813955Sgiacomo.gabrielli@arm.comdef template SveMemFillSpillOpDeclare {{ 3913955Sgiacomo.gabrielli@arm.com class %(class_name)s : public %(base_class)s 4013955Sgiacomo.gabrielli@arm.com { 4113955Sgiacomo.gabrielli@arm.com protected: 4213955Sgiacomo.gabrielli@arm.com typedef uint8_t TPElem; 4313955Sgiacomo.gabrielli@arm.com typedef uint8_t RegElemType; 4413955Sgiacomo.gabrielli@arm.com typedef uint8_t MemElemType; 4513955Sgiacomo.gabrielli@arm.com 4613955Sgiacomo.gabrielli@arm.com public: 4713955Sgiacomo.gabrielli@arm.com %(class_name)s(ExtMachInst machInst, 4813955Sgiacomo.gabrielli@arm.com IntRegIndex _dest, IntRegIndex _base, uint64_t _imm) 4913955Sgiacomo.gabrielli@arm.com : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 5013955Sgiacomo.gabrielli@arm.com _dest, _base, _imm) 5113955Sgiacomo.gabrielli@arm.com { 5213955Sgiacomo.gabrielli@arm.com %(constructor)s; 5313955Sgiacomo.gabrielli@arm.com } 5413955Sgiacomo.gabrielli@arm.com 5513955Sgiacomo.gabrielli@arm.com Fault execute(ExecContext *, Trace::InstRecord *) const; 5613955Sgiacomo.gabrielli@arm.com Fault initiateAcc(ExecContext *, Trace::InstRecord *) const; 5713955Sgiacomo.gabrielli@arm.com Fault completeAcc(PacketPtr, ExecContext *, Trace::InstRecord *) const; 5813955Sgiacomo.gabrielli@arm.com 5913955Sgiacomo.gabrielli@arm.com virtual void 6013955Sgiacomo.gabrielli@arm.com annotateFault(ArmFault *fault) { 6113955Sgiacomo.gabrielli@arm.com %(fa_code)s 6213955Sgiacomo.gabrielli@arm.com } 6313955Sgiacomo.gabrielli@arm.com }; 6413955Sgiacomo.gabrielli@arm.com}}; 6513955Sgiacomo.gabrielli@arm.com 6613955Sgiacomo.gabrielli@arm.comdef template SveContigMemSSOpDeclare {{ 6713955Sgiacomo.gabrielli@arm.com %(tpl_header)s 6813955Sgiacomo.gabrielli@arm.com class %(class_name)s : public %(base_class)s 6913955Sgiacomo.gabrielli@arm.com { 7013955Sgiacomo.gabrielli@arm.com protected: 7113955Sgiacomo.gabrielli@arm.com typedef RegElemType TPElem; 7213955Sgiacomo.gabrielli@arm.com 7313955Sgiacomo.gabrielli@arm.com public: 7413955Sgiacomo.gabrielli@arm.com %(class_name)s(const char* mnem, ExtMachInst machInst, 7513955Sgiacomo.gabrielli@arm.com IntRegIndex _dest, IntRegIndex _gp, IntRegIndex _base, 7613955Sgiacomo.gabrielli@arm.com IntRegIndex _offset) 7713955Sgiacomo.gabrielli@arm.com : %(base_class)s(mnem, machInst, %(op_class)s, 7813955Sgiacomo.gabrielli@arm.com _dest, _gp, _base, _offset) 7913955Sgiacomo.gabrielli@arm.com { 8013955Sgiacomo.gabrielli@arm.com %(constructor)s; 8113955Sgiacomo.gabrielli@arm.com } 8213955Sgiacomo.gabrielli@arm.com 8313955Sgiacomo.gabrielli@arm.com Fault execute(ExecContext *, Trace::InstRecord *) const; 8413955Sgiacomo.gabrielli@arm.com Fault initiateAcc(ExecContext *, Trace::InstRecord *) const; 8513955Sgiacomo.gabrielli@arm.com Fault completeAcc(PacketPtr, ExecContext *, Trace::InstRecord *) const; 8613955Sgiacomo.gabrielli@arm.com 8713955Sgiacomo.gabrielli@arm.com virtual void 8813955Sgiacomo.gabrielli@arm.com annotateFault(ArmFault *fault) { 8913955Sgiacomo.gabrielli@arm.com %(fa_code)s 9013955Sgiacomo.gabrielli@arm.com } 9113955Sgiacomo.gabrielli@arm.com }; 9213955Sgiacomo.gabrielli@arm.com}}; 9313955Sgiacomo.gabrielli@arm.com 9413955Sgiacomo.gabrielli@arm.comdef template SveContigMemSIOpDeclare {{ 9513955Sgiacomo.gabrielli@arm.com %(tpl_header)s 9613955Sgiacomo.gabrielli@arm.com class %(class_name)s : public %(base_class)s 9713955Sgiacomo.gabrielli@arm.com { 9813955Sgiacomo.gabrielli@arm.com protected: 9913955Sgiacomo.gabrielli@arm.com typedef RegElemType TPElem; 10013955Sgiacomo.gabrielli@arm.com 10113955Sgiacomo.gabrielli@arm.com public: 10213955Sgiacomo.gabrielli@arm.com %(class_name)s(const char* mnem, ExtMachInst machInst, 10313955Sgiacomo.gabrielli@arm.com IntRegIndex _dest, IntRegIndex _gp, IntRegIndex _base, 10413955Sgiacomo.gabrielli@arm.com uint64_t _imm) 10513955Sgiacomo.gabrielli@arm.com : %(base_class)s(mnem, machInst, %(op_class)s, 10613955Sgiacomo.gabrielli@arm.com _dest, _gp, _base, _imm) 10713955Sgiacomo.gabrielli@arm.com { 10813955Sgiacomo.gabrielli@arm.com %(constructor)s; 10913955Sgiacomo.gabrielli@arm.com } 11013955Sgiacomo.gabrielli@arm.com 11113955Sgiacomo.gabrielli@arm.com Fault execute(ExecContext *, Trace::InstRecord *) const; 11213955Sgiacomo.gabrielli@arm.com Fault initiateAcc(ExecContext *, Trace::InstRecord *) const; 11313955Sgiacomo.gabrielli@arm.com Fault completeAcc(PacketPtr, ExecContext *, Trace::InstRecord *) const; 11413955Sgiacomo.gabrielli@arm.com 11513955Sgiacomo.gabrielli@arm.com virtual void 11613955Sgiacomo.gabrielli@arm.com annotateFault(ArmFault *fault) { 11713955Sgiacomo.gabrielli@arm.com %(fa_code)s 11813955Sgiacomo.gabrielli@arm.com } 11913955Sgiacomo.gabrielli@arm.com }; 12013955Sgiacomo.gabrielli@arm.com}}; 12113955Sgiacomo.gabrielli@arm.com 12213955Sgiacomo.gabrielli@arm.comdef template SveContigMemExecDeclare {{ 12313955Sgiacomo.gabrielli@arm.com template 12413955Sgiacomo.gabrielli@arm.com Fault %(class_name)s%(tpl_args)s::execute(ExecContext *, 12513955Sgiacomo.gabrielli@arm.com Trace::InstRecord *) const; 12613955Sgiacomo.gabrielli@arm.com 12713955Sgiacomo.gabrielli@arm.com template 12813955Sgiacomo.gabrielli@arm.com Fault %(class_name)s%(tpl_args)s::initiateAcc(ExecContext *, 12913955Sgiacomo.gabrielli@arm.com Trace::InstRecord *) const; 13013955Sgiacomo.gabrielli@arm.com 13113955Sgiacomo.gabrielli@arm.com template 13213955Sgiacomo.gabrielli@arm.com Fault %(class_name)s%(tpl_args)s::completeAcc(PacketPtr, 13313955Sgiacomo.gabrielli@arm.com ExecContext *, Trace::InstRecord *) const; 13413955Sgiacomo.gabrielli@arm.com}}; 13513955Sgiacomo.gabrielli@arm.com 13613955Sgiacomo.gabrielli@arm.comdef template SveContigLoadExecute {{ 13713955Sgiacomo.gabrielli@arm.com %(tpl_header)s 13813955Sgiacomo.gabrielli@arm.com Fault %(class_name)s%(tpl_args)s::execute(ExecContext *xc, 13913955Sgiacomo.gabrielli@arm.com Trace::InstRecord *traceData) const 14013955Sgiacomo.gabrielli@arm.com { 14113955Sgiacomo.gabrielli@arm.com Addr EA; 14213955Sgiacomo.gabrielli@arm.com Fault fault = NoFault; 14313955Sgiacomo.gabrielli@arm.com bool aarch64 M5_VAR_USED = true; 14413955Sgiacomo.gabrielli@arm.com unsigned eCount = ArmStaticInst::getCurSveVecLen<RegElemType>( 14513955Sgiacomo.gabrielli@arm.com xc->tcBase()); 14613955Sgiacomo.gabrielli@arm.com 14713955Sgiacomo.gabrielli@arm.com %(op_decl)s; 14813955Sgiacomo.gabrielli@arm.com %(op_rd)s; 14913955Sgiacomo.gabrielli@arm.com %(ea_code)s; 15013955Sgiacomo.gabrielli@arm.com 15113955Sgiacomo.gabrielli@arm.com TheISA::VecRegContainer memData; 15213955Sgiacomo.gabrielli@arm.com auto memDataView = memData.as<MemElemType>(); 15313955Sgiacomo.gabrielli@arm.com 15413955Sgiacomo.gabrielli@arm.com if (fault == NoFault) { 15513955Sgiacomo.gabrielli@arm.com fault = xc->readMem(EA, memData.raw_ptr<uint8_t>(), memAccessSize, 15613955Sgiacomo.gabrielli@arm.com this->memAccessFlags); 15713955Sgiacomo.gabrielli@arm.com %(memacc_code)s; 15813955Sgiacomo.gabrielli@arm.com } 15913955Sgiacomo.gabrielli@arm.com 16013955Sgiacomo.gabrielli@arm.com if (fault == NoFault) { 16113955Sgiacomo.gabrielli@arm.com %(op_wb)s; 16213955Sgiacomo.gabrielli@arm.com } 16313955Sgiacomo.gabrielli@arm.com 16413955Sgiacomo.gabrielli@arm.com return fault; 16513955Sgiacomo.gabrielli@arm.com } 16613955Sgiacomo.gabrielli@arm.com}}; 16713955Sgiacomo.gabrielli@arm.com 16813955Sgiacomo.gabrielli@arm.comdef template SveContigLoadInitiateAcc {{ 16913955Sgiacomo.gabrielli@arm.com %(tpl_header)s 17013955Sgiacomo.gabrielli@arm.com Fault %(class_name)s%(tpl_args)s::initiateAcc(ExecContext *xc, 17113955Sgiacomo.gabrielli@arm.com Trace::InstRecord *traceData) const 17213955Sgiacomo.gabrielli@arm.com { 17313955Sgiacomo.gabrielli@arm.com Addr EA; 17413955Sgiacomo.gabrielli@arm.com Fault fault = NoFault; 17513955Sgiacomo.gabrielli@arm.com bool aarch64 M5_VAR_USED = true; 17613955Sgiacomo.gabrielli@arm.com unsigned eCount = ArmStaticInst::getCurSveVecLen<RegElemType>( 17713955Sgiacomo.gabrielli@arm.com xc->tcBase()); 17813955Sgiacomo.gabrielli@arm.com 17913955Sgiacomo.gabrielli@arm.com %(op_src_decl)s; 18013955Sgiacomo.gabrielli@arm.com %(op_rd)s; 18113955Sgiacomo.gabrielli@arm.com 18213955Sgiacomo.gabrielli@arm.com %(ea_code)s; 18313955Sgiacomo.gabrielli@arm.com 18413955Sgiacomo.gabrielli@arm.com if (fault == NoFault) { 18513955Sgiacomo.gabrielli@arm.com fault = xc->initiateMemRead(EA, memAccessSize, 18613955Sgiacomo.gabrielli@arm.com this->memAccessFlags); 18713955Sgiacomo.gabrielli@arm.com } 18813955Sgiacomo.gabrielli@arm.com 18913955Sgiacomo.gabrielli@arm.com return fault; 19013955Sgiacomo.gabrielli@arm.com } 19113955Sgiacomo.gabrielli@arm.com}}; 19213955Sgiacomo.gabrielli@arm.com 19313955Sgiacomo.gabrielli@arm.comdef template SveContigLoadCompleteAcc {{ 19413955Sgiacomo.gabrielli@arm.com %(tpl_header)s 19513955Sgiacomo.gabrielli@arm.com Fault %(class_name)s%(tpl_args)s::completeAcc(PacketPtr pkt, 19613955Sgiacomo.gabrielli@arm.com ExecContext *xc, Trace::InstRecord *traceData) const 19713955Sgiacomo.gabrielli@arm.com { 19813955Sgiacomo.gabrielli@arm.com Fault fault = NoFault; 19913955Sgiacomo.gabrielli@arm.com bool aarch64 M5_VAR_USED = true; 20013955Sgiacomo.gabrielli@arm.com unsigned eCount = ArmStaticInst::getCurSveVecLen<RegElemType>( 20113955Sgiacomo.gabrielli@arm.com xc->tcBase()); 20213955Sgiacomo.gabrielli@arm.com 20313955Sgiacomo.gabrielli@arm.com %(op_decl)s; 20413955Sgiacomo.gabrielli@arm.com %(op_rd)s; 20513955Sgiacomo.gabrielli@arm.com 20613955Sgiacomo.gabrielli@arm.com TheISA::VecRegContainer memData; 20713955Sgiacomo.gabrielli@arm.com auto memDataView = memData.as<MemElemType>(); 20813955Sgiacomo.gabrielli@arm.com 20913955Sgiacomo.gabrielli@arm.com memcpy(memData.raw_ptr<uint8_t>(), pkt->getPtr<uint8_t>(), 21013955Sgiacomo.gabrielli@arm.com pkt->getSize()); 21113955Sgiacomo.gabrielli@arm.com 21213955Sgiacomo.gabrielli@arm.com if (fault == NoFault) { 21313955Sgiacomo.gabrielli@arm.com %(memacc_code)s; 21413955Sgiacomo.gabrielli@arm.com } 21513955Sgiacomo.gabrielli@arm.com 21613955Sgiacomo.gabrielli@arm.com if (fault == NoFault) { 21713955Sgiacomo.gabrielli@arm.com %(op_wb)s; 21813955Sgiacomo.gabrielli@arm.com } 21913955Sgiacomo.gabrielli@arm.com 22013955Sgiacomo.gabrielli@arm.com return fault; 22113955Sgiacomo.gabrielli@arm.com } 22213955Sgiacomo.gabrielli@arm.com}}; 22313955Sgiacomo.gabrielli@arm.com 22413955Sgiacomo.gabrielli@arm.comdef template SveContigStoreExecute {{ 22513955Sgiacomo.gabrielli@arm.com %(tpl_header)s 22613955Sgiacomo.gabrielli@arm.com Fault %(class_name)s%(tpl_args)s::execute(ExecContext *xc, 22713955Sgiacomo.gabrielli@arm.com Trace::InstRecord *traceData) const 22813955Sgiacomo.gabrielli@arm.com { 22913955Sgiacomo.gabrielli@arm.com Addr EA; 23013955Sgiacomo.gabrielli@arm.com Fault fault = NoFault; 23113955Sgiacomo.gabrielli@arm.com bool aarch64 M5_VAR_USED = true; 23213955Sgiacomo.gabrielli@arm.com unsigned eCount = ArmStaticInst::getCurSveVecLen<RegElemType>( 23313955Sgiacomo.gabrielli@arm.com xc->tcBase()); 23413955Sgiacomo.gabrielli@arm.com 23513955Sgiacomo.gabrielli@arm.com %(op_decl)s; 23613955Sgiacomo.gabrielli@arm.com %(op_rd)s; 23713955Sgiacomo.gabrielli@arm.com %(ea_code)s; 23813955Sgiacomo.gabrielli@arm.com 23913955Sgiacomo.gabrielli@arm.com TheISA::VecRegContainer memData; 24013955Sgiacomo.gabrielli@arm.com auto memDataView = memData.as<MemElemType>(); 24113955Sgiacomo.gabrielli@arm.com 24213955Sgiacomo.gabrielli@arm.com %(wren_code)s; 24313955Sgiacomo.gabrielli@arm.com 24413955Sgiacomo.gabrielli@arm.com if (fault == NoFault) { 24513955Sgiacomo.gabrielli@arm.com %(memacc_code)s; 24613955Sgiacomo.gabrielli@arm.com } 24713955Sgiacomo.gabrielli@arm.com 24813955Sgiacomo.gabrielli@arm.com if (fault == NoFault) { 24913955Sgiacomo.gabrielli@arm.com fault = xc->writeMem(memData.raw_ptr<uint8_t>(), memAccessSize, EA, 25013955Sgiacomo.gabrielli@arm.com this->memAccessFlags, NULL, wrEn); 25113955Sgiacomo.gabrielli@arm.com } 25213955Sgiacomo.gabrielli@arm.com 25313955Sgiacomo.gabrielli@arm.com if (fault == NoFault) { 25413955Sgiacomo.gabrielli@arm.com %(op_wb)s; 25513955Sgiacomo.gabrielli@arm.com } 25613955Sgiacomo.gabrielli@arm.com 25713955Sgiacomo.gabrielli@arm.com return fault; 25813955Sgiacomo.gabrielli@arm.com } 25913955Sgiacomo.gabrielli@arm.com}}; 26013955Sgiacomo.gabrielli@arm.com 26113955Sgiacomo.gabrielli@arm.comdef template SveContigStoreInitiateAcc {{ 26213955Sgiacomo.gabrielli@arm.com %(tpl_header)s 26313955Sgiacomo.gabrielli@arm.com Fault %(class_name)s%(tpl_args)s::initiateAcc(ExecContext *xc, 26413955Sgiacomo.gabrielli@arm.com Trace::InstRecord *traceData) const 26513955Sgiacomo.gabrielli@arm.com { 26613955Sgiacomo.gabrielli@arm.com Addr EA; 26713955Sgiacomo.gabrielli@arm.com Fault fault = NoFault; 26813955Sgiacomo.gabrielli@arm.com bool aarch64 M5_VAR_USED = true; 26913955Sgiacomo.gabrielli@arm.com unsigned eCount = ArmStaticInst::getCurSveVecLen<RegElemType>( 27013955Sgiacomo.gabrielli@arm.com xc->tcBase()); 27113955Sgiacomo.gabrielli@arm.com 27213955Sgiacomo.gabrielli@arm.com %(op_decl)s; 27313955Sgiacomo.gabrielli@arm.com %(op_rd)s; 27413955Sgiacomo.gabrielli@arm.com %(ea_code)s; 27513955Sgiacomo.gabrielli@arm.com 27613955Sgiacomo.gabrielli@arm.com TheISA::VecRegContainer memData; 27713955Sgiacomo.gabrielli@arm.com auto memDataView = memData.as<MemElemType>(); 27813955Sgiacomo.gabrielli@arm.com 27913955Sgiacomo.gabrielli@arm.com %(wren_code)s; 28013955Sgiacomo.gabrielli@arm.com 28113955Sgiacomo.gabrielli@arm.com if (fault == NoFault) { 28213955Sgiacomo.gabrielli@arm.com %(memacc_code)s; 28313955Sgiacomo.gabrielli@arm.com } 28413955Sgiacomo.gabrielli@arm.com 28513955Sgiacomo.gabrielli@arm.com if (fault == NoFault) { 28613955Sgiacomo.gabrielli@arm.com fault = xc->writeMem(memData.raw_ptr<uint8_t>(), memAccessSize, EA, 28713955Sgiacomo.gabrielli@arm.com this->memAccessFlags, NULL, wrEn); 28813955Sgiacomo.gabrielli@arm.com } 28913955Sgiacomo.gabrielli@arm.com 29013955Sgiacomo.gabrielli@arm.com return fault; 29113955Sgiacomo.gabrielli@arm.com } 29213955Sgiacomo.gabrielli@arm.com}}; 29313955Sgiacomo.gabrielli@arm.com 29413955Sgiacomo.gabrielli@arm.comdef template SveContigStoreCompleteAcc {{ 29513955Sgiacomo.gabrielli@arm.com %(tpl_header)s 29613955Sgiacomo.gabrielli@arm.com Fault %(class_name)s%(tpl_args)s::completeAcc(PacketPtr pkt, 29713955Sgiacomo.gabrielli@arm.com ExecContext *xc, Trace::InstRecord *traceData) const 29813955Sgiacomo.gabrielli@arm.com { 29913955Sgiacomo.gabrielli@arm.com return NoFault; 30013955Sgiacomo.gabrielli@arm.com } 30113955Sgiacomo.gabrielli@arm.com}}; 30213955Sgiacomo.gabrielli@arm.com 30313955Sgiacomo.gabrielli@arm.comdef template SveLoadAndReplExecute {{ 30413955Sgiacomo.gabrielli@arm.com %(tpl_header)s 30513955Sgiacomo.gabrielli@arm.com Fault %(class_name)s%(tpl_args)s::execute(ExecContext *xc, 30613955Sgiacomo.gabrielli@arm.com Trace::InstRecord *traceData) const 30713955Sgiacomo.gabrielli@arm.com { 30813955Sgiacomo.gabrielli@arm.com Addr EA; 30913955Sgiacomo.gabrielli@arm.com Fault fault = NoFault; 31013955Sgiacomo.gabrielli@arm.com bool aarch64 M5_VAR_USED = true; 31113955Sgiacomo.gabrielli@arm.com unsigned eCount = ArmStaticInst::getCurSveVecLen<RegElemType>( 31213955Sgiacomo.gabrielli@arm.com xc->tcBase()); 31313955Sgiacomo.gabrielli@arm.com 31413955Sgiacomo.gabrielli@arm.com %(op_decl)s; 31513955Sgiacomo.gabrielli@arm.com %(op_rd)s; 31613955Sgiacomo.gabrielli@arm.com %(ea_code)s; 31713955Sgiacomo.gabrielli@arm.com 31813955Sgiacomo.gabrielli@arm.com MemElemType memData; 31913955Sgiacomo.gabrielli@arm.com 32013955Sgiacomo.gabrielli@arm.com if (fault == NoFault) { 32113955Sgiacomo.gabrielli@arm.com fault = readMemAtomic(xc, traceData, EA, memData, 32213955Sgiacomo.gabrielli@arm.com this->memAccessFlags); 32313955Sgiacomo.gabrielli@arm.com %(memacc_code)s; 32413955Sgiacomo.gabrielli@arm.com } 32513955Sgiacomo.gabrielli@arm.com 32613955Sgiacomo.gabrielli@arm.com if (fault == NoFault) { 32713955Sgiacomo.gabrielli@arm.com %(op_wb)s; 32813955Sgiacomo.gabrielli@arm.com } 32913955Sgiacomo.gabrielli@arm.com 33013955Sgiacomo.gabrielli@arm.com return fault; 33113955Sgiacomo.gabrielli@arm.com } 33213955Sgiacomo.gabrielli@arm.com}}; 33313955Sgiacomo.gabrielli@arm.com 33413955Sgiacomo.gabrielli@arm.comdef template SveLoadAndReplInitiateAcc {{ 33513955Sgiacomo.gabrielli@arm.com %(tpl_header)s 33613955Sgiacomo.gabrielli@arm.com Fault %(class_name)s%(tpl_args)s::initiateAcc(ExecContext *xc, 33713955Sgiacomo.gabrielli@arm.com Trace::InstRecord *traceData) const 33813955Sgiacomo.gabrielli@arm.com { 33913955Sgiacomo.gabrielli@arm.com Addr EA; 34013955Sgiacomo.gabrielli@arm.com Fault fault = NoFault; 34113955Sgiacomo.gabrielli@arm.com bool aarch64 M5_VAR_USED = true; 34213955Sgiacomo.gabrielli@arm.com 34313955Sgiacomo.gabrielli@arm.com %(op_src_decl)s; 34413955Sgiacomo.gabrielli@arm.com %(op_rd)s; 34513955Sgiacomo.gabrielli@arm.com 34613955Sgiacomo.gabrielli@arm.com %(ea_code)s; 34713955Sgiacomo.gabrielli@arm.com 34813955Sgiacomo.gabrielli@arm.com MemElemType memData; 34913955Sgiacomo.gabrielli@arm.com 35013955Sgiacomo.gabrielli@arm.com if (fault == NoFault) { 35113955Sgiacomo.gabrielli@arm.com fault = initiateMemRead(xc, traceData, EA, memData, 35213955Sgiacomo.gabrielli@arm.com this->memAccessFlags); 35313955Sgiacomo.gabrielli@arm.com } 35413955Sgiacomo.gabrielli@arm.com 35513955Sgiacomo.gabrielli@arm.com return fault; 35613955Sgiacomo.gabrielli@arm.com } 35713955Sgiacomo.gabrielli@arm.com}}; 35813955Sgiacomo.gabrielli@arm.com 35913955Sgiacomo.gabrielli@arm.comdef template SveLoadAndReplCompleteAcc {{ 36013955Sgiacomo.gabrielli@arm.com %(tpl_header)s 36113955Sgiacomo.gabrielli@arm.com Fault %(class_name)s%(tpl_args)s::completeAcc(PacketPtr pkt, 36213955Sgiacomo.gabrielli@arm.com ExecContext *xc, Trace::InstRecord *traceData) const 36313955Sgiacomo.gabrielli@arm.com { 36413955Sgiacomo.gabrielli@arm.com Fault fault = NoFault; 36513955Sgiacomo.gabrielli@arm.com bool aarch64 M5_VAR_USED = true; 36613955Sgiacomo.gabrielli@arm.com unsigned eCount = ArmStaticInst::getCurSveVecLen<RegElemType>( 36713955Sgiacomo.gabrielli@arm.com xc->tcBase()); 36813955Sgiacomo.gabrielli@arm.com 36913955Sgiacomo.gabrielli@arm.com %(op_decl)s; 37013955Sgiacomo.gabrielli@arm.com %(op_rd)s; 37113955Sgiacomo.gabrielli@arm.com 37213955Sgiacomo.gabrielli@arm.com MemElemType memData; 37313955Sgiacomo.gabrielli@arm.com getMem(pkt, memData, traceData); 37413955Sgiacomo.gabrielli@arm.com 37513955Sgiacomo.gabrielli@arm.com if (fault == NoFault) { 37613955Sgiacomo.gabrielli@arm.com %(memacc_code)s; 37713955Sgiacomo.gabrielli@arm.com } 37813955Sgiacomo.gabrielli@arm.com 37913955Sgiacomo.gabrielli@arm.com if (fault == NoFault) { 38013955Sgiacomo.gabrielli@arm.com %(op_wb)s; 38113955Sgiacomo.gabrielli@arm.com } 38213955Sgiacomo.gabrielli@arm.com 38313955Sgiacomo.gabrielli@arm.com return fault; 38413955Sgiacomo.gabrielli@arm.com } 38513955Sgiacomo.gabrielli@arm.com}}; 38613955Sgiacomo.gabrielli@arm.com 38714028Sgiacomo.gabrielli@arm.comdef template SveIndexedMemVIMicroopDeclare {{ 38814028Sgiacomo.gabrielli@arm.com %(tpl_header)s 38914028Sgiacomo.gabrielli@arm.com class %(class_name)s : public %(base_class)s 39014028Sgiacomo.gabrielli@arm.com { 39114028Sgiacomo.gabrielli@arm.com protected: 39214028Sgiacomo.gabrielli@arm.com typedef RegElemType TPElem; 39314028Sgiacomo.gabrielli@arm.com 39414028Sgiacomo.gabrielli@arm.com IntRegIndex dest; 39514028Sgiacomo.gabrielli@arm.com IntRegIndex gp; 39614028Sgiacomo.gabrielli@arm.com IntRegIndex base; 39714028Sgiacomo.gabrielli@arm.com uint64_t imm; 39814028Sgiacomo.gabrielli@arm.com 39914028Sgiacomo.gabrielli@arm.com int elemIndex; 40014028Sgiacomo.gabrielli@arm.com int numElems; 40114028Sgiacomo.gabrielli@arm.com 40214028Sgiacomo.gabrielli@arm.com unsigned memAccessFlags; 40314028Sgiacomo.gabrielli@arm.com 40414028Sgiacomo.gabrielli@arm.com public: 40514028Sgiacomo.gabrielli@arm.com %(class_name)s(const char* mnem, ExtMachInst machInst, 40614028Sgiacomo.gabrielli@arm.com OpClass __opClass, IntRegIndex _dest, IntRegIndex _gp, 40714028Sgiacomo.gabrielli@arm.com IntRegIndex _base, uint64_t _imm, int _elemIndex, int _numElems) 40814028Sgiacomo.gabrielli@arm.com : %(base_class)s(mnem, machInst, %(op_class)s), 40914028Sgiacomo.gabrielli@arm.com dest(_dest), gp(_gp), base(_base), imm(_imm), 41014028Sgiacomo.gabrielli@arm.com elemIndex(_elemIndex), numElems(_numElems), 41114028Sgiacomo.gabrielli@arm.com memAccessFlags(ArmISA::TLB::AllowUnaligned | 41214028Sgiacomo.gabrielli@arm.com ArmISA::TLB::MustBeOne) 41314028Sgiacomo.gabrielli@arm.com { 41414028Sgiacomo.gabrielli@arm.com %(constructor)s; 41514028Sgiacomo.gabrielli@arm.com if (_opClass == MemReadOp && elemIndex == 0) { 41614028Sgiacomo.gabrielli@arm.com // The first micro-op is responsible for pinning the 41714028Sgiacomo.gabrielli@arm.com // destination register 41814028Sgiacomo.gabrielli@arm.com _destRegIdx[0].setNumPinnedWrites(numElems - 1); 41914028Sgiacomo.gabrielli@arm.com } 42014028Sgiacomo.gabrielli@arm.com } 42114028Sgiacomo.gabrielli@arm.com 42214028Sgiacomo.gabrielli@arm.com Fault execute(ExecContext *, Trace::InstRecord *) const; 42314028Sgiacomo.gabrielli@arm.com Fault initiateAcc(ExecContext *, Trace::InstRecord *) const; 42414028Sgiacomo.gabrielli@arm.com Fault completeAcc(PacketPtr, ExecContext *, Trace::InstRecord *) const; 42514028Sgiacomo.gabrielli@arm.com 42614028Sgiacomo.gabrielli@arm.com virtual void 42714028Sgiacomo.gabrielli@arm.com annotateFault(ArmFault *fault) 42814028Sgiacomo.gabrielli@arm.com { 42914028Sgiacomo.gabrielli@arm.com %(fa_code)s 43014028Sgiacomo.gabrielli@arm.com } 43114028Sgiacomo.gabrielli@arm.com 43214028Sgiacomo.gabrielli@arm.com std::string 43314028Sgiacomo.gabrielli@arm.com generateDisassembly(Addr pc, const SymbolTable *symtab) const 43414028Sgiacomo.gabrielli@arm.com { 43514028Sgiacomo.gabrielli@arm.com // TODO: add suffix to transfer register 43614028Sgiacomo.gabrielli@arm.com std::stringstream ss; 43714028Sgiacomo.gabrielli@arm.com printMnemonic(ss, "", false); 43814028Sgiacomo.gabrielli@arm.com ccprintf(ss, "{"); 43914028Sgiacomo.gabrielli@arm.com printVecReg(ss, dest, true); 44014028Sgiacomo.gabrielli@arm.com ccprintf(ss, "}, "); 44114028Sgiacomo.gabrielli@arm.com printVecPredReg(ss, gp); 44214028Sgiacomo.gabrielli@arm.com if (_opClass == MemReadOp) { 44314028Sgiacomo.gabrielli@arm.com ccprintf(ss, "/z"); 44414028Sgiacomo.gabrielli@arm.com } 44514028Sgiacomo.gabrielli@arm.com ccprintf(ss, ", ["); 44614028Sgiacomo.gabrielli@arm.com printVecReg(ss, base, true); 44714028Sgiacomo.gabrielli@arm.com if (imm != 0) { 44814028Sgiacomo.gabrielli@arm.com ccprintf(ss, ", #%d", imm * sizeof(MemElemType)); 44914028Sgiacomo.gabrielli@arm.com } 45014028Sgiacomo.gabrielli@arm.com ccprintf(ss, "] (uop elem %d tfer)", elemIndex); 45114028Sgiacomo.gabrielli@arm.com return ss.str(); 45214028Sgiacomo.gabrielli@arm.com } 45314028Sgiacomo.gabrielli@arm.com }; 45414028Sgiacomo.gabrielli@arm.com}}; 45514028Sgiacomo.gabrielli@arm.com 45614028Sgiacomo.gabrielli@arm.comdef template SveIndexedMemSVMicroopDeclare {{ 45714028Sgiacomo.gabrielli@arm.com %(tpl_header)s 45814028Sgiacomo.gabrielli@arm.com class %(class_name)s : public %(base_class)s 45914028Sgiacomo.gabrielli@arm.com { 46014028Sgiacomo.gabrielli@arm.com protected: 46114028Sgiacomo.gabrielli@arm.com typedef RegElemType TPElem; 46214028Sgiacomo.gabrielli@arm.com 46314028Sgiacomo.gabrielli@arm.com IntRegIndex dest; 46414028Sgiacomo.gabrielli@arm.com IntRegIndex gp; 46514028Sgiacomo.gabrielli@arm.com IntRegIndex base; 46614028Sgiacomo.gabrielli@arm.com IntRegIndex offset; 46714028Sgiacomo.gabrielli@arm.com 46814028Sgiacomo.gabrielli@arm.com bool offsetIs32; 46914028Sgiacomo.gabrielli@arm.com bool offsetIsSigned; 47014028Sgiacomo.gabrielli@arm.com bool offsetIsScaled; 47114028Sgiacomo.gabrielli@arm.com 47214028Sgiacomo.gabrielli@arm.com int elemIndex; 47314028Sgiacomo.gabrielli@arm.com int numElems; 47414028Sgiacomo.gabrielli@arm.com 47514028Sgiacomo.gabrielli@arm.com unsigned memAccessFlags; 47614028Sgiacomo.gabrielli@arm.com 47714028Sgiacomo.gabrielli@arm.com public: 47814028Sgiacomo.gabrielli@arm.com %(class_name)s(const char* mnem, ExtMachInst machInst, 47914028Sgiacomo.gabrielli@arm.com OpClass __opClass, IntRegIndex _dest, IntRegIndex _gp, 48014028Sgiacomo.gabrielli@arm.com IntRegIndex _base, IntRegIndex _offset, bool _offsetIs32, 48114028Sgiacomo.gabrielli@arm.com bool _offsetIsSigned, bool _offsetIsScaled, int _elemIndex, 48214028Sgiacomo.gabrielli@arm.com int _numElems) 48314028Sgiacomo.gabrielli@arm.com : %(base_class)s(mnem, machInst, %(op_class)s), 48414028Sgiacomo.gabrielli@arm.com dest(_dest), gp(_gp), base(_base), offset(_offset), 48514028Sgiacomo.gabrielli@arm.com offsetIs32(_offsetIs32), offsetIsSigned(_offsetIsSigned), 48614028Sgiacomo.gabrielli@arm.com offsetIsScaled(_offsetIsScaled), elemIndex(_elemIndex), 48714028Sgiacomo.gabrielli@arm.com numElems(_numElems), 48814028Sgiacomo.gabrielli@arm.com memAccessFlags(ArmISA::TLB::AllowUnaligned | 48914028Sgiacomo.gabrielli@arm.com ArmISA::TLB::MustBeOne) 49014028Sgiacomo.gabrielli@arm.com { 49114028Sgiacomo.gabrielli@arm.com %(constructor)s; 49214028Sgiacomo.gabrielli@arm.com if (_opClass == MemReadOp && elemIndex == 0) { 49314028Sgiacomo.gabrielli@arm.com // The first micro-op is responsible for pinning the 49414028Sgiacomo.gabrielli@arm.com // destination register 49514028Sgiacomo.gabrielli@arm.com _destRegIdx[0].setNumPinnedWrites(numElems - 1); 49614028Sgiacomo.gabrielli@arm.com } 49714028Sgiacomo.gabrielli@arm.com } 49814028Sgiacomo.gabrielli@arm.com 49914028Sgiacomo.gabrielli@arm.com Fault execute(ExecContext *, Trace::InstRecord *) const; 50014028Sgiacomo.gabrielli@arm.com Fault initiateAcc(ExecContext *, Trace::InstRecord *) const; 50114028Sgiacomo.gabrielli@arm.com Fault completeAcc(PacketPtr, ExecContext *, Trace::InstRecord *) const; 50214028Sgiacomo.gabrielli@arm.com 50314028Sgiacomo.gabrielli@arm.com virtual void 50414028Sgiacomo.gabrielli@arm.com annotateFault(ArmFault *fault) 50514028Sgiacomo.gabrielli@arm.com { 50614028Sgiacomo.gabrielli@arm.com %(fa_code)s 50714028Sgiacomo.gabrielli@arm.com } 50814028Sgiacomo.gabrielli@arm.com 50914028Sgiacomo.gabrielli@arm.com std::string 51014028Sgiacomo.gabrielli@arm.com generateDisassembly(Addr pc, const SymbolTable *symtab) const 51114028Sgiacomo.gabrielli@arm.com { 51214028Sgiacomo.gabrielli@arm.com // TODO: add suffix to transfer and base registers 51314028Sgiacomo.gabrielli@arm.com std::stringstream ss; 51414028Sgiacomo.gabrielli@arm.com printMnemonic(ss, "", false); 51514028Sgiacomo.gabrielli@arm.com ccprintf(ss, "{"); 51614028Sgiacomo.gabrielli@arm.com printVecReg(ss, dest, true); 51714028Sgiacomo.gabrielli@arm.com ccprintf(ss, "}, "); 51814028Sgiacomo.gabrielli@arm.com printVecPredReg(ss, gp); 51914028Sgiacomo.gabrielli@arm.com if (_opClass == MemReadOp) { 52014028Sgiacomo.gabrielli@arm.com ccprintf(ss, "/z"); 52114028Sgiacomo.gabrielli@arm.com } 52214028Sgiacomo.gabrielli@arm.com ccprintf(ss, ", ["); 52314028Sgiacomo.gabrielli@arm.com printIntReg(ss, base); 52414028Sgiacomo.gabrielli@arm.com ccprintf(ss, ", "); 52514028Sgiacomo.gabrielli@arm.com printVecReg(ss, offset, true); 52614028Sgiacomo.gabrielli@arm.com ccprintf(ss, "] (uop elem %d tfer)", elemIndex); 52714028Sgiacomo.gabrielli@arm.com return ss.str(); 52814028Sgiacomo.gabrielli@arm.com } 52914028Sgiacomo.gabrielli@arm.com }; 53014028Sgiacomo.gabrielli@arm.com}}; 53114028Sgiacomo.gabrielli@arm.com 53214028Sgiacomo.gabrielli@arm.comdef template SveGatherLoadMicroopExecute {{ 53314028Sgiacomo.gabrielli@arm.com %(tpl_header)s 53414028Sgiacomo.gabrielli@arm.com Fault %(class_name)s%(tpl_args)s::execute(ExecContext *xc, 53514028Sgiacomo.gabrielli@arm.com Trace::InstRecord *traceData) const 53614028Sgiacomo.gabrielli@arm.com { 53714028Sgiacomo.gabrielli@arm.com Addr EA; 53814028Sgiacomo.gabrielli@arm.com Fault fault = NoFault; 53914028Sgiacomo.gabrielli@arm.com bool aarch64 M5_VAR_USED = true; 54014028Sgiacomo.gabrielli@arm.com 54114028Sgiacomo.gabrielli@arm.com %(op_decl)s; 54214028Sgiacomo.gabrielli@arm.com %(op_rd)s; 54314028Sgiacomo.gabrielli@arm.com %(ea_code)s; 54414028Sgiacomo.gabrielli@arm.com 54514028Sgiacomo.gabrielli@arm.com MemElemType memData; 54614028Sgiacomo.gabrielli@arm.com 54714028Sgiacomo.gabrielli@arm.com if (%(pred_check_code)s) { 54814028Sgiacomo.gabrielli@arm.com fault = readMemAtomic(xc, traceData, EA, memData, 54914028Sgiacomo.gabrielli@arm.com this->memAccessFlags); 55014028Sgiacomo.gabrielli@arm.com } 55114028Sgiacomo.gabrielli@arm.com 55214028Sgiacomo.gabrielli@arm.com if (fault == NoFault) { 55314028Sgiacomo.gabrielli@arm.com %(memacc_code)s; 55414028Sgiacomo.gabrielli@arm.com %(op_wb)s; 55514028Sgiacomo.gabrielli@arm.com } 55614028Sgiacomo.gabrielli@arm.com 55714028Sgiacomo.gabrielli@arm.com return fault; 55814028Sgiacomo.gabrielli@arm.com } 55914028Sgiacomo.gabrielli@arm.com}}; 56014028Sgiacomo.gabrielli@arm.com 56114028Sgiacomo.gabrielli@arm.comdef template SveGatherLoadMicroopInitiateAcc {{ 56214028Sgiacomo.gabrielli@arm.com %(tpl_header)s 56314028Sgiacomo.gabrielli@arm.com Fault %(class_name)s%(tpl_args)s::initiateAcc(ExecContext *xc, 56414028Sgiacomo.gabrielli@arm.com Trace::InstRecord *traceData) const 56514028Sgiacomo.gabrielli@arm.com { 56614028Sgiacomo.gabrielli@arm.com Addr EA; 56714028Sgiacomo.gabrielli@arm.com Fault fault = NoFault; 56814028Sgiacomo.gabrielli@arm.com bool aarch64 M5_VAR_USED = true; 56914028Sgiacomo.gabrielli@arm.com 57014028Sgiacomo.gabrielli@arm.com %(op_src_decl)s; 57114028Sgiacomo.gabrielli@arm.com %(op_rd)s; 57214028Sgiacomo.gabrielli@arm.com %(ea_code)s; 57314028Sgiacomo.gabrielli@arm.com 57414028Sgiacomo.gabrielli@arm.com MemElemType memData; 57514028Sgiacomo.gabrielli@arm.com 57614028Sgiacomo.gabrielli@arm.com if (%(pred_check_code)s) { 57714028Sgiacomo.gabrielli@arm.com fault = initiateMemRead(xc, traceData, EA, memData, 57814028Sgiacomo.gabrielli@arm.com this->memAccessFlags); 57914028Sgiacomo.gabrielli@arm.com } else { 58014028Sgiacomo.gabrielli@arm.com xc->setMemAccPredicate(false); 58114028Sgiacomo.gabrielli@arm.com } 58214028Sgiacomo.gabrielli@arm.com 58314028Sgiacomo.gabrielli@arm.com return fault; 58414028Sgiacomo.gabrielli@arm.com } 58514028Sgiacomo.gabrielli@arm.com}}; 58614028Sgiacomo.gabrielli@arm.com 58714028Sgiacomo.gabrielli@arm.comdef template SveGatherLoadMicroopCompleteAcc {{ 58814028Sgiacomo.gabrielli@arm.com %(tpl_header)s 58914028Sgiacomo.gabrielli@arm.com Fault %(class_name)s%(tpl_args)s::completeAcc(PacketPtr pkt, 59014028Sgiacomo.gabrielli@arm.com ExecContext *xc, Trace::InstRecord *traceData) const 59114028Sgiacomo.gabrielli@arm.com { 59214028Sgiacomo.gabrielli@arm.com Fault fault = NoFault; 59314028Sgiacomo.gabrielli@arm.com bool aarch64 M5_VAR_USED = true; 59414028Sgiacomo.gabrielli@arm.com 59514028Sgiacomo.gabrielli@arm.com %(op_decl)s; 59614028Sgiacomo.gabrielli@arm.com %(op_rd)s; 59714028Sgiacomo.gabrielli@arm.com 59814028Sgiacomo.gabrielli@arm.com MemElemType memData = 0; 59914028Sgiacomo.gabrielli@arm.com if (%(pred_check_code)s) { 60014028Sgiacomo.gabrielli@arm.com getMem(pkt, memData, traceData); 60114028Sgiacomo.gabrielli@arm.com } 60214028Sgiacomo.gabrielli@arm.com 60314028Sgiacomo.gabrielli@arm.com if (fault == NoFault) { 60414028Sgiacomo.gabrielli@arm.com %(memacc_code)s; 60514028Sgiacomo.gabrielli@arm.com } 60614028Sgiacomo.gabrielli@arm.com 60714028Sgiacomo.gabrielli@arm.com if (fault == NoFault) { 60814028Sgiacomo.gabrielli@arm.com %(op_wb)s; 60914028Sgiacomo.gabrielli@arm.com } 61014028Sgiacomo.gabrielli@arm.com 61114028Sgiacomo.gabrielli@arm.com return fault; 61214028Sgiacomo.gabrielli@arm.com } 61314028Sgiacomo.gabrielli@arm.com}}; 61414028Sgiacomo.gabrielli@arm.com 61514028Sgiacomo.gabrielli@arm.comdef template SveScatterStoreMicroopExecute {{ 61614028Sgiacomo.gabrielli@arm.com %(tpl_header)s 61714028Sgiacomo.gabrielli@arm.com Fault %(class_name)s%(tpl_args)s::execute(ExecContext *xc, 61814028Sgiacomo.gabrielli@arm.com Trace::InstRecord *traceData) const 61914028Sgiacomo.gabrielli@arm.com { 62014028Sgiacomo.gabrielli@arm.com Addr EA; 62114028Sgiacomo.gabrielli@arm.com Fault fault = NoFault; 62214028Sgiacomo.gabrielli@arm.com bool aarch64 M5_VAR_USED = true; 62314028Sgiacomo.gabrielli@arm.com 62414028Sgiacomo.gabrielli@arm.com %(op_decl)s; 62514028Sgiacomo.gabrielli@arm.com %(op_rd)s; 62614028Sgiacomo.gabrielli@arm.com %(ea_code)s; 62714028Sgiacomo.gabrielli@arm.com 62814028Sgiacomo.gabrielli@arm.com MemElemType memData; 62914028Sgiacomo.gabrielli@arm.com %(memacc_code)s; 63014028Sgiacomo.gabrielli@arm.com 63114028Sgiacomo.gabrielli@arm.com if (%(pred_check_code)s) { 63214028Sgiacomo.gabrielli@arm.com fault = writeMemAtomic(xc, traceData, memData, EA, 63314028Sgiacomo.gabrielli@arm.com this->memAccessFlags, NULL); 63414028Sgiacomo.gabrielli@arm.com } 63514028Sgiacomo.gabrielli@arm.com 63614028Sgiacomo.gabrielli@arm.com if (fault == NoFault) { 63714028Sgiacomo.gabrielli@arm.com %(op_wb)s; 63814028Sgiacomo.gabrielli@arm.com } 63914028Sgiacomo.gabrielli@arm.com 64014028Sgiacomo.gabrielli@arm.com return fault; 64114028Sgiacomo.gabrielli@arm.com } 64214028Sgiacomo.gabrielli@arm.com}}; 64314028Sgiacomo.gabrielli@arm.com 64414028Sgiacomo.gabrielli@arm.comdef template SveScatterStoreMicroopInitiateAcc {{ 64514028Sgiacomo.gabrielli@arm.com %(tpl_header)s 64614028Sgiacomo.gabrielli@arm.com Fault %(class_name)s%(tpl_args)s::initiateAcc(ExecContext *xc, 64714028Sgiacomo.gabrielli@arm.com Trace::InstRecord *traceData) const 64814028Sgiacomo.gabrielli@arm.com { 64914028Sgiacomo.gabrielli@arm.com Addr EA; 65014028Sgiacomo.gabrielli@arm.com Fault fault = NoFault; 65114028Sgiacomo.gabrielli@arm.com bool aarch64 M5_VAR_USED = true; 65214028Sgiacomo.gabrielli@arm.com 65314028Sgiacomo.gabrielli@arm.com %(op_decl)s; 65414028Sgiacomo.gabrielli@arm.com %(op_rd)s; 65514028Sgiacomo.gabrielli@arm.com %(ea_code)s; 65614028Sgiacomo.gabrielli@arm.com 65714028Sgiacomo.gabrielli@arm.com MemElemType memData; 65814028Sgiacomo.gabrielli@arm.com %(memacc_code)s; 65914028Sgiacomo.gabrielli@arm.com 66014028Sgiacomo.gabrielli@arm.com if (%(pred_check_code)s) { 66114028Sgiacomo.gabrielli@arm.com fault = writeMemTiming(xc, traceData, memData, EA, 66214028Sgiacomo.gabrielli@arm.com this->memAccessFlags, NULL); 66314028Sgiacomo.gabrielli@arm.com } else { 66414028Sgiacomo.gabrielli@arm.com xc->setPredicate(false); 66514028Sgiacomo.gabrielli@arm.com } 66614028Sgiacomo.gabrielli@arm.com 66714028Sgiacomo.gabrielli@arm.com return fault; 66814028Sgiacomo.gabrielli@arm.com } 66914028Sgiacomo.gabrielli@arm.com}}; 67014028Sgiacomo.gabrielli@arm.com 67114028Sgiacomo.gabrielli@arm.comdef template SveScatterStoreMicroopCompleteAcc {{ 67214028Sgiacomo.gabrielli@arm.com %(tpl_header)s 67314028Sgiacomo.gabrielli@arm.com Fault %(class_name)s%(tpl_args)s::completeAcc(PacketPtr pkt, 67414028Sgiacomo.gabrielli@arm.com ExecContext *xc, Trace::InstRecord *traceData) const 67514028Sgiacomo.gabrielli@arm.com { 67614028Sgiacomo.gabrielli@arm.com return NoFault; 67714028Sgiacomo.gabrielli@arm.com } 67814028Sgiacomo.gabrielli@arm.com}}; 67914028Sgiacomo.gabrielli@arm.com 68014028Sgiacomo.gabrielli@arm.comdef template SveGatherLoadCpySrcVecMicroopDeclare {{ 68114028Sgiacomo.gabrielli@arm.com class SveGatherLoadCpySrcVecMicroop : public MicroOp 68214028Sgiacomo.gabrielli@arm.com { 68314028Sgiacomo.gabrielli@arm.com protected: 68414028Sgiacomo.gabrielli@arm.com IntRegIndex op1; 68514028Sgiacomo.gabrielli@arm.com 68614028Sgiacomo.gabrielli@arm.com StaticInst *macroOp; 68714028Sgiacomo.gabrielli@arm.com 68814028Sgiacomo.gabrielli@arm.com public: 68914028Sgiacomo.gabrielli@arm.com SveGatherLoadCpySrcVecMicroop(const char* mnem, ExtMachInst machInst, 69014028Sgiacomo.gabrielli@arm.com IntRegIndex _op1, StaticInst *_macroOp) 69114028Sgiacomo.gabrielli@arm.com : MicroOp(mnem, machInst, SimdAluOp), op1(_op1), macroOp(_macroOp) 69214028Sgiacomo.gabrielli@arm.com { 69314028Sgiacomo.gabrielli@arm.com %(constructor)s; 69414028Sgiacomo.gabrielli@arm.com } 69514028Sgiacomo.gabrielli@arm.com 69614028Sgiacomo.gabrielli@arm.com Fault execute(ExecContext *, Trace::InstRecord *) const; 69714028Sgiacomo.gabrielli@arm.com 69814028Sgiacomo.gabrielli@arm.com std::string 69914028Sgiacomo.gabrielli@arm.com generateDisassembly(Addr pc, const SymbolTable *symtab) const 70014028Sgiacomo.gabrielli@arm.com { 70114028Sgiacomo.gabrielli@arm.com std::stringstream ss; 70214028Sgiacomo.gabrielli@arm.com ccprintf(ss, "%s", macroOp->disassemble(pc, symtab)); 70314028Sgiacomo.gabrielli@arm.com ccprintf(ss, " (uop src vec cpy)"); 70414028Sgiacomo.gabrielli@arm.com return ss.str(); 70514028Sgiacomo.gabrielli@arm.com } 70614028Sgiacomo.gabrielli@arm.com }; 70714028Sgiacomo.gabrielli@arm.com}}; 70814028Sgiacomo.gabrielli@arm.com 70914028Sgiacomo.gabrielli@arm.comdef template SveGatherLoadCpySrcVecMicroopExecute {{ 71014028Sgiacomo.gabrielli@arm.com Fault SveGatherLoadCpySrcVecMicroop::execute(ExecContext *xc, 71114028Sgiacomo.gabrielli@arm.com Trace::InstRecord *traceData) const 71214028Sgiacomo.gabrielli@arm.com { 71314028Sgiacomo.gabrielli@arm.com Fault fault = NoFault; 71414028Sgiacomo.gabrielli@arm.com %(op_decl)s; 71514028Sgiacomo.gabrielli@arm.com %(op_rd)s; 71614028Sgiacomo.gabrielli@arm.com 71714028Sgiacomo.gabrielli@arm.com %(code)s; 71814028Sgiacomo.gabrielli@arm.com if (fault == NoFault) 71914028Sgiacomo.gabrielli@arm.com { 72014028Sgiacomo.gabrielli@arm.com %(op_wb)s; 72114028Sgiacomo.gabrielli@arm.com } 72214028Sgiacomo.gabrielli@arm.com 72314028Sgiacomo.gabrielli@arm.com return fault; 72414028Sgiacomo.gabrielli@arm.com } 72514028Sgiacomo.gabrielli@arm.com}}; 726