110037SARM gem5 Developers// -*- mode:c++ -*- 210037SARM gem5 Developers 314058Sgiacomo.travaglini@arm.com// Copyright (c) 2011-2014, 2017, 2019 ARM Limited 410037SARM gem5 Developers// All rights reserved 510037SARM gem5 Developers// 610037SARM gem5 Developers// The license below extends only to copyright in the software and shall 710037SARM gem5 Developers// not be construed as granting a license to any other intellectual 810037SARM gem5 Developers// property including but not limited to intellectual property relating 910037SARM gem5 Developers// to a hardware implementation of the functionality of the software 1010037SARM gem5 Developers// licensed hereunder. You may use the software subject to the license 1110037SARM gem5 Developers// terms below provided that you ensure that this notice is replicated 1210037SARM gem5 Developers// unmodified and in its entirety in all distributions of the software, 1310037SARM gem5 Developers// modified or unmodified, in source code or in binary form. 1410037SARM gem5 Developers// 1510037SARM gem5 Developers// Redistribution and use in source and binary forms, with or without 1610037SARM gem5 Developers// modification, are permitted provided that the following conditions are 1710037SARM gem5 Developers// met: redistributions of source code must retain the above copyright 1810037SARM gem5 Developers// notice, this list of conditions and the following disclaimer; 1910037SARM gem5 Developers// redistributions in binary form must reproduce the above copyright 2010037SARM gem5 Developers// notice, this list of conditions and the following disclaimer in the 2110037SARM gem5 Developers// documentation and/or other materials provided with the distribution; 2210037SARM gem5 Developers// neither the name of the copyright holders nor the names of its 2310037SARM gem5 Developers// contributors may be used to endorse or promote products derived from 2410037SARM gem5 Developers// this software without specific prior written permission. 2510037SARM gem5 Developers// 2610037SARM gem5 Developers// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2710037SARM gem5 Developers// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2810037SARM gem5 Developers// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2910037SARM gem5 Developers// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3010037SARM gem5 Developers// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3110037SARM gem5 Developers// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3210037SARM gem5 Developers// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3310037SARM gem5 Developers// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3410037SARM gem5 Developers// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3510037SARM gem5 Developers// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3610037SARM gem5 Developers// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3710037SARM gem5 Developers// 3810037SARM gem5 Developers// Authors: Gabe Black 3910037SARM gem5 Developers 4010037SARM gem5 Developerslet {{ 4110037SARM gem5 Developers SPAlignmentCheckCode = ''' 4210037SARM gem5 Developers if (baseIsSP && bits(XBase, 3, 0) && 4310037SARM gem5 Developers SPAlignmentCheckEnabled(xc->tcBase())) { 4410474Sandreas.hansson@arm.com return std::make_shared<SPAlignmentFault>(); 4510037SARM gem5 Developers } 4610037SARM gem5 Developers ''' 4710037SARM gem5 Developers}}; 4810037SARM gem5 Developers 4910037SARM gem5 Developersdef template Load64Execute {{ 5012234Sgabeblack@google.com Fault %(class_name)s::execute(ExecContext *xc, 5110037SARM gem5 Developers Trace::InstRecord *traceData) const 5210037SARM gem5 Developers { 5310037SARM gem5 Developers Addr EA; 5410037SARM gem5 Developers Fault fault = NoFault; 5510037SARM gem5 Developers 5610037SARM gem5 Developers %(op_decl)s; 5710037SARM gem5 Developers %(op_rd)s; 5810037SARM gem5 Developers %(ea_code)s; 5910037SARM gem5 Developers 6010037SARM gem5 Developers if (fault == NoFault) { 6110037SARM gem5 Developers fault = readMemAtomic(xc, traceData, EA, Mem, memAccessFlags); 6210037SARM gem5 Developers %(memacc_code)s; 6310037SARM gem5 Developers } 6410037SARM gem5 Developers 6510037SARM gem5 Developers if (fault == NoFault) { 6610037SARM gem5 Developers %(op_wb)s; 6710037SARM gem5 Developers } 6810037SARM gem5 Developers 6910037SARM gem5 Developers return fault; 7010037SARM gem5 Developers } 7110037SARM gem5 Developers}}; 7210037SARM gem5 Developers 7314058Sgiacomo.travaglini@arm.comdef template Load64FpExecute {{ 7414058Sgiacomo.travaglini@arm.com Fault %(class_name)s::execute(ExecContext *xc, 7514058Sgiacomo.travaglini@arm.com Trace::InstRecord *traceData) const 7614058Sgiacomo.travaglini@arm.com { 7714058Sgiacomo.travaglini@arm.com Addr EA; 7814058Sgiacomo.travaglini@arm.com Fault fault = NoFault; 7914058Sgiacomo.travaglini@arm.com 8014058Sgiacomo.travaglini@arm.com %(op_decl)s; 8114058Sgiacomo.travaglini@arm.com %(op_rd)s; 8214058Sgiacomo.travaglini@arm.com %(ea_code)s; 8314058Sgiacomo.travaglini@arm.com 8414058Sgiacomo.travaglini@arm.com if (fault == NoFault) { 8514058Sgiacomo.travaglini@arm.com fault = readMemAtomic(xc, traceData, EA, Mem, memAccessFlags); 8614058Sgiacomo.travaglini@arm.com } 8714058Sgiacomo.travaglini@arm.com 8814058Sgiacomo.travaglini@arm.com if (fault == NoFault) { 8914058Sgiacomo.travaglini@arm.com %(memacc_code)s; 9014058Sgiacomo.travaglini@arm.com %(op_wb)s; 9114058Sgiacomo.travaglini@arm.com } 9214058Sgiacomo.travaglini@arm.com 9314058Sgiacomo.travaglini@arm.com return fault; 9414058Sgiacomo.travaglini@arm.com } 9514058Sgiacomo.travaglini@arm.com}}; 9614058Sgiacomo.travaglini@arm.com 9710037SARM gem5 Developersdef template Store64Execute {{ 9812234Sgabeblack@google.com Fault %(class_name)s::execute(ExecContext *xc, 9910037SARM gem5 Developers Trace::InstRecord *traceData) const 10010037SARM gem5 Developers { 10110037SARM gem5 Developers Addr EA; 10210037SARM gem5 Developers Fault fault = NoFault; 10310037SARM gem5 Developers 10410037SARM gem5 Developers %(op_decl)s; 10510037SARM gem5 Developers %(op_rd)s; 10610037SARM gem5 Developers %(ea_code)s; 10710037SARM gem5 Developers 10810037SARM gem5 Developers if (fault == NoFault) { 10910037SARM gem5 Developers %(memacc_code)s; 11010037SARM gem5 Developers } 11110037SARM gem5 Developers 11210037SARM gem5 Developers if (fault == NoFault) { 11310037SARM gem5 Developers fault = writeMemAtomic(xc, traceData, Mem, EA, 11410037SARM gem5 Developers memAccessFlags, NULL); 11510037SARM gem5 Developers } 11610037SARM gem5 Developers 11710037SARM gem5 Developers if (fault == NoFault) { 11810037SARM gem5 Developers %(op_wb)s; 11910037SARM gem5 Developers } 12010037SARM gem5 Developers 12110037SARM gem5 Developers return fault; 12210037SARM gem5 Developers } 12310037SARM gem5 Developers}}; 12410037SARM gem5 Developers 12510037SARM gem5 Developersdef template Store64InitiateAcc {{ 12612234Sgabeblack@google.com Fault %(class_name)s::initiateAcc(ExecContext *xc, 12710037SARM gem5 Developers Trace::InstRecord *traceData) const 12810037SARM gem5 Developers { 12910037SARM gem5 Developers Addr EA; 13010037SARM gem5 Developers Fault fault = NoFault; 13110037SARM gem5 Developers 13210037SARM gem5 Developers %(op_decl)s; 13310037SARM gem5 Developers %(op_rd)s; 13410037SARM gem5 Developers %(ea_code)s; 13510037SARM gem5 Developers 13610037SARM gem5 Developers if (fault == NoFault) { 13710037SARM gem5 Developers %(memacc_code)s; 13810037SARM gem5 Developers } 13910037SARM gem5 Developers 14010037SARM gem5 Developers if (fault == NoFault) { 14110037SARM gem5 Developers fault = writeMemTiming(xc, traceData, Mem, EA, memAccessFlags, 14210037SARM gem5 Developers NULL); 14310037SARM gem5 Developers } 14410037SARM gem5 Developers 14510037SARM gem5 Developers return fault; 14610037SARM gem5 Developers } 14710037SARM gem5 Developers}}; 14810037SARM gem5 Developers 14910037SARM gem5 Developersdef template StoreEx64Execute {{ 15012234Sgabeblack@google.com Fault %(class_name)s::execute(ExecContext *xc, 15110037SARM gem5 Developers Trace::InstRecord *traceData) const 15210037SARM gem5 Developers { 15310037SARM gem5 Developers Addr EA; 15410037SARM gem5 Developers Fault fault = NoFault; 15510037SARM gem5 Developers 15610037SARM gem5 Developers %(op_decl)s; 15710037SARM gem5 Developers %(op_rd)s; 15810037SARM gem5 Developers %(ea_code)s; 15910037SARM gem5 Developers 16010037SARM gem5 Developers if (fault == NoFault) { 16110037SARM gem5 Developers %(memacc_code)s; 16210037SARM gem5 Developers } 16310037SARM gem5 Developers 16410037SARM gem5 Developers uint64_t writeResult = 0; 16510037SARM gem5 Developers if (fault == NoFault) { 16610037SARM gem5 Developers fault = writeMemAtomic(xc, traceData, Mem, EA, memAccessFlags, 16710037SARM gem5 Developers &writeResult); 16810037SARM gem5 Developers } 16910037SARM gem5 Developers 17010037SARM gem5 Developers if (fault == NoFault) { 17110037SARM gem5 Developers %(postacc_code)s; 17210037SARM gem5 Developers } 17310037SARM gem5 Developers 17410037SARM gem5 Developers if (fault == NoFault) { 17510037SARM gem5 Developers %(op_wb)s; 17610037SARM gem5 Developers } 17710037SARM gem5 Developers 17810037SARM gem5 Developers return fault; 17910037SARM gem5 Developers } 18010037SARM gem5 Developers}}; 18110037SARM gem5 Developers 18210037SARM gem5 Developersdef template StoreEx64InitiateAcc {{ 18312234Sgabeblack@google.com Fault %(class_name)s::initiateAcc(ExecContext *xc, 18410037SARM gem5 Developers Trace::InstRecord *traceData) const 18510037SARM gem5 Developers { 18610037SARM gem5 Developers Addr EA; 18710037SARM gem5 Developers Fault fault = NoFault; 18810037SARM gem5 Developers 18910037SARM gem5 Developers %(op_decl)s; 19010037SARM gem5 Developers %(op_rd)s; 19110037SARM gem5 Developers %(ea_code)s; 19210037SARM gem5 Developers 19310037SARM gem5 Developers if (fault == NoFault) { 19410037SARM gem5 Developers %(memacc_code)s; 19510037SARM gem5 Developers } 19610037SARM gem5 Developers 19710037SARM gem5 Developers if (fault == NoFault) { 19810037SARM gem5 Developers fault = writeMemTiming(xc, traceData, Mem, EA, memAccessFlags, 19910037SARM gem5 Developers NULL); 20010037SARM gem5 Developers } 20110037SARM gem5 Developers 20210037SARM gem5 Developers return fault; 20310037SARM gem5 Developers } 20410037SARM gem5 Developers}}; 20510037SARM gem5 Developers 20610037SARM gem5 Developersdef template Load64InitiateAcc {{ 20712234Sgabeblack@google.com Fault %(class_name)s::initiateAcc(ExecContext *xc, 20810037SARM gem5 Developers Trace::InstRecord *traceData) const 20910037SARM gem5 Developers { 21010037SARM gem5 Developers Addr EA; 21110037SARM gem5 Developers Fault fault = NoFault; 21210037SARM gem5 Developers 21310037SARM gem5 Developers %(op_src_decl)s; 21410037SARM gem5 Developers %(op_rd)s; 21510037SARM gem5 Developers %(ea_code)s; 21610037SARM gem5 Developers 21710037SARM gem5 Developers if (fault == NoFault) { 21811303Ssteve.reinhardt@amd.com fault = initiateMemRead(xc, traceData, EA, Mem, memAccessFlags); 21910037SARM gem5 Developers } 22010037SARM gem5 Developers 22110037SARM gem5 Developers return fault; 22210037SARM gem5 Developers } 22310037SARM gem5 Developers}}; 22410037SARM gem5 Developers 22510037SARM gem5 Developersdef template Load64CompleteAcc {{ 22612234Sgabeblack@google.com Fault %(class_name)s::completeAcc(PacketPtr pkt, ExecContext *xc, 22710037SARM gem5 Developers Trace::InstRecord *traceData) const 22810037SARM gem5 Developers { 22910037SARM gem5 Developers Fault fault = NoFault; 23010037SARM gem5 Developers 23110037SARM gem5 Developers %(op_decl)s; 23210037SARM gem5 Developers %(op_rd)s; 23310037SARM gem5 Developers 23410037SARM gem5 Developers // ARM instructions will not have a pkt if the predicate is false 23510037SARM gem5 Developers getMem(pkt, Mem, traceData); 23610037SARM gem5 Developers 23710037SARM gem5 Developers if (fault == NoFault) { 23810037SARM gem5 Developers %(memacc_code)s; 23910037SARM gem5 Developers } 24010037SARM gem5 Developers 24110037SARM gem5 Developers if (fault == NoFault) { 24210037SARM gem5 Developers %(op_wb)s; 24310037SARM gem5 Developers } 24410037SARM gem5 Developers 24510037SARM gem5 Developers return fault; 24610037SARM gem5 Developers } 24710037SARM gem5 Developers}}; 24810037SARM gem5 Developers 24910037SARM gem5 Developersdef template Store64CompleteAcc {{ 25012234Sgabeblack@google.com Fault %(class_name)s::completeAcc(PacketPtr pkt, ExecContext *xc, 25110037SARM gem5 Developers Trace::InstRecord *traceData) const 25210037SARM gem5 Developers { 25310037SARM gem5 Developers return NoFault; 25410037SARM gem5 Developers } 25510037SARM gem5 Developers}}; 25610037SARM gem5 Developers 25710037SARM gem5 Developersdef template StoreEx64CompleteAcc {{ 25812234Sgabeblack@google.com Fault %(class_name)s::completeAcc(PacketPtr pkt, ExecContext *xc, 25910037SARM gem5 Developers Trace::InstRecord *traceData) const 26010037SARM gem5 Developers { 26110037SARM gem5 Developers Fault fault = NoFault; 26210037SARM gem5 Developers 26310037SARM gem5 Developers %(op_decl)s; 26410037SARM gem5 Developers %(op_rd)s; 26510037SARM gem5 Developers 26610037SARM gem5 Developers uint64_t writeResult = pkt->req->getExtraData(); 26710037SARM gem5 Developers %(postacc_code)s; 26810037SARM gem5 Developers 26910037SARM gem5 Developers if (fault == NoFault) { 27010037SARM gem5 Developers %(op_wb)s; 27110037SARM gem5 Developers } 27210037SARM gem5 Developers 27310037SARM gem5 Developers return fault; 27410037SARM gem5 Developers } 27510037SARM gem5 Developers}}; 27610037SARM gem5 Developers 27710037SARM gem5 Developersdef template DCStore64Declare {{ 27810037SARM gem5 Developers class %(class_name)s : public %(base_class)s 27910037SARM gem5 Developers { 28010037SARM gem5 Developers public: 28110037SARM gem5 Developers 28210037SARM gem5 Developers /// Constructor. 28312359Snikos.nikoleris@arm.com %(class_name)s(ExtMachInst machInst, IntRegIndex _base, 28412359Snikos.nikoleris@arm.com MiscRegIndex _dest, uint64_t _imm); 28510037SARM gem5 Developers 28612616Sgabeblack@google.com Fault execute(ExecContext *, Trace::InstRecord *) const override; 28712616Sgabeblack@google.com Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override; 28812616Sgabeblack@google.com Fault completeAcc(PacketPtr, ExecContext *, 28912616Sgabeblack@google.com Trace::InstRecord *) const override; 29010037SARM gem5 Developers 29112616Sgabeblack@google.com void 29212616Sgabeblack@google.com annotateFault(ArmFault *fault) override 29312616Sgabeblack@google.com { 29410037SARM gem5 Developers %(fa_code)s 29510037SARM gem5 Developers } 29610037SARM gem5 Developers }; 29710037SARM gem5 Developers}}; 29810037SARM gem5 Developers 29910037SARM gem5 Developersdef template DCStore64Constructor {{ 30012359Snikos.nikoleris@arm.com %(class_name)s::%(class_name)s(ExtMachInst machInst, IntRegIndex _base, 30112359Snikos.nikoleris@arm.com MiscRegIndex _dest, uint64_t _imm) 30210037SARM gem5 Developers : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 30312359Snikos.nikoleris@arm.com _base, _dest, _imm) 30410037SARM gem5 Developers { 30510037SARM gem5 Developers %(constructor)s; 30610037SARM gem5 Developers assert(!%(use_uops)d); 30710037SARM gem5 Developers } 30810037SARM gem5 Developers}}; 30910037SARM gem5 Developers 31010037SARM gem5 Developersdef template DCStore64Execute {{ 31112234Sgabeblack@google.com Fault %(class_name)s::execute(ExecContext *xc, 31210037SARM gem5 Developers Trace::InstRecord *traceData) const 31310037SARM gem5 Developers { 31410037SARM gem5 Developers Addr EA; 31510037SARM gem5 Developers Fault fault = NoFault; 31610037SARM gem5 Developers 31710037SARM gem5 Developers %(op_decl)s; 31810037SARM gem5 Developers %(op_rd)s; 31910037SARM gem5 Developers %(ea_code)s; 32010037SARM gem5 Developers 32110037SARM gem5 Developers 32210037SARM gem5 Developers if (fault == NoFault) { 32310037SARM gem5 Developers %(memacc_code)s; 32410037SARM gem5 Developers } 32510037SARM gem5 Developers 32610037SARM gem5 Developers if (fault == NoFault) { 32710037SARM gem5 Developers fault = xc->writeMem(NULL, op_size, EA, memAccessFlags, NULL); 32810037SARM gem5 Developers } 32910037SARM gem5 Developers 33010037SARM gem5 Developers if (fault == NoFault) { 33110037SARM gem5 Developers %(op_wb)s; 33210037SARM gem5 Developers } 33310037SARM gem5 Developers 33410037SARM gem5 Developers return fault; 33510037SARM gem5 Developers } 33610037SARM gem5 Developers}}; 33710037SARM gem5 Developers 33810037SARM gem5 Developersdef template DCStore64InitiateAcc {{ 33912234Sgabeblack@google.com Fault %(class_name)s::initiateAcc(ExecContext *xc, 34010037SARM gem5 Developers Trace::InstRecord *traceData) const 34110037SARM gem5 Developers { 34210037SARM gem5 Developers Addr EA; 34310037SARM gem5 Developers Fault fault = NoFault; 34410037SARM gem5 Developers 34510037SARM gem5 Developers %(op_decl)s; 34610037SARM gem5 Developers %(op_rd)s; 34710037SARM gem5 Developers %(ea_code)s; 34810037SARM gem5 Developers 34910037SARM gem5 Developers if (fault == NoFault) { 35010037SARM gem5 Developers %(memacc_code)s; 35110037SARM gem5 Developers } 35210037SARM gem5 Developers 35310037SARM gem5 Developers if (fault == NoFault) { 35410037SARM gem5 Developers fault = xc->writeMem(NULL, op_size, EA, memAccessFlags, NULL); 35510037SARM gem5 Developers } 35610037SARM gem5 Developers 35710037SARM gem5 Developers return fault; 35810037SARM gem5 Developers } 35910037SARM gem5 Developers}}; 36010037SARM gem5 Developers 36110037SARM gem5 Developers 36210037SARM gem5 Developersdef template LoadStoreImm64Declare {{ 36310037SARM gem5 Developers class %(class_name)s : public %(base_class)s 36410037SARM gem5 Developers { 36510037SARM gem5 Developers public: 36610037SARM gem5 Developers 36710037SARM gem5 Developers /// Constructor. 36810037SARM gem5 Developers %(class_name)s(ExtMachInst machInst, 36910037SARM gem5 Developers IntRegIndex _dest, IntRegIndex _base, int64_t _imm); 37010037SARM gem5 Developers 37112616Sgabeblack@google.com Fault execute(ExecContext *, Trace::InstRecord *) const override; 37212616Sgabeblack@google.com Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override; 37312616Sgabeblack@google.com Fault completeAcc(PacketPtr, ExecContext *, 37412616Sgabeblack@google.com Trace::InstRecord *) const override; 37510037SARM gem5 Developers 37612616Sgabeblack@google.com void 37712616Sgabeblack@google.com annotateFault(ArmFault *fault) override 37812616Sgabeblack@google.com { 37910037SARM gem5 Developers %(fa_code)s 38010037SARM gem5 Developers } 38110037SARM gem5 Developers }; 38210037SARM gem5 Developers}}; 38310037SARM gem5 Developers 38410037SARM gem5 Developersdef template LoadStoreImmU64Declare {{ 38510037SARM gem5 Developers class %(class_name)s : public %(base_class)s 38610037SARM gem5 Developers { 38710037SARM gem5 Developers public: 38810037SARM gem5 Developers 38910037SARM gem5 Developers /// Constructor. 39010037SARM gem5 Developers %(class_name)s(ExtMachInst machInst, 39110037SARM gem5 Developers IntRegIndex _dest, IntRegIndex _base, int64_t _imm, 39210037SARM gem5 Developers bool noAlloc = false, bool exclusive = false, 39310037SARM gem5 Developers bool acrel = false); 39410037SARM gem5 Developers 39512616Sgabeblack@google.com Fault execute(ExecContext *, Trace::InstRecord *) const override; 39612616Sgabeblack@google.com Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override; 39712616Sgabeblack@google.com Fault completeAcc(PacketPtr, ExecContext *, 39812616Sgabeblack@google.com Trace::InstRecord *) const override; 39910037SARM gem5 Developers 40012616Sgabeblack@google.com void 40112616Sgabeblack@google.com annotateFault(ArmFault *fault) override 40212616Sgabeblack@google.com { 40310037SARM gem5 Developers %(fa_code)s 40410037SARM gem5 Developers } 40510037SARM gem5 Developers }; 40610037SARM gem5 Developers}}; 40710037SARM gem5 Developers 40810037SARM gem5 Developersdef template LoadStoreImmDU64Declare {{ 40910037SARM gem5 Developers class %(class_name)s : public %(base_class)s 41010037SARM gem5 Developers { 41110037SARM gem5 Developers public: 41210037SARM gem5 Developers 41310037SARM gem5 Developers /// Constructor. 41410037SARM gem5 Developers %(class_name)s(ExtMachInst machInst, 41510037SARM gem5 Developers IntRegIndex _dest, IntRegIndex _dest2, IntRegIndex _base, 41610037SARM gem5 Developers int64_t _imm = 0, bool noAlloc = false, bool exclusive = false, 41710037SARM gem5 Developers bool acrel = false); 41810037SARM gem5 Developers 41912616Sgabeblack@google.com Fault execute(ExecContext *, Trace::InstRecord *) const override; 42012616Sgabeblack@google.com Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override; 42112616Sgabeblack@google.com Fault completeAcc(PacketPtr, ExecContext *, 42212616Sgabeblack@google.com Trace::InstRecord *) const override; 42310037SARM gem5 Developers 42412616Sgabeblack@google.com void 42512616Sgabeblack@google.com annotateFault(ArmFault *fault) override 42612616Sgabeblack@google.com { 42710037SARM gem5 Developers %(fa_code)s 42810037SARM gem5 Developers } 42910037SARM gem5 Developers }; 43010037SARM gem5 Developers}}; 43110037SARM gem5 Developers 43210037SARM gem5 Developersdef template StoreImmDEx64Declare {{ 43310037SARM gem5 Developers /** 43410037SARM gem5 Developers * Static instruction class for "%(mnemonic)s". 43510037SARM gem5 Developers */ 43610037SARM gem5 Developers class %(class_name)s : public %(base_class)s 43710037SARM gem5 Developers { 43810037SARM gem5 Developers public: 43910037SARM gem5 Developers 44010037SARM gem5 Developers /// Constructor. 44110037SARM gem5 Developers %(class_name)s(ExtMachInst machInst, 44210037SARM gem5 Developers IntRegIndex _result, IntRegIndex _dest, IntRegIndex _dest2, 44310037SARM gem5 Developers IntRegIndex _base, int64_t _imm = 0); 44410037SARM gem5 Developers 44512616Sgabeblack@google.com Fault execute(ExecContext *, Trace::InstRecord *) const override; 44612616Sgabeblack@google.com Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override; 44712616Sgabeblack@google.com Fault completeAcc(PacketPtr, ExecContext *, 44812616Sgabeblack@google.com Trace::InstRecord *) const override; 44910037SARM gem5 Developers }; 45010037SARM gem5 Developers}}; 45110037SARM gem5 Developers 45210037SARM gem5 Developers 45310037SARM gem5 Developersdef template LoadStoreReg64Declare {{ 45410037SARM gem5 Developers class %(class_name)s : public %(base_class)s 45510037SARM gem5 Developers { 45610037SARM gem5 Developers public: 45710037SARM gem5 Developers 45810037SARM gem5 Developers /// Constructor. 45910037SARM gem5 Developers %(class_name)s(ExtMachInst machInst, 46010037SARM gem5 Developers IntRegIndex _dest, IntRegIndex _base, IntRegIndex _offset, 46110037SARM gem5 Developers ArmExtendType _type, uint32_t _shiftAmt); 46210037SARM gem5 Developers 46312616Sgabeblack@google.com Fault execute(ExecContext *, Trace::InstRecord *) const override; 46412616Sgabeblack@google.com Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override; 46512616Sgabeblack@google.com Fault completeAcc(PacketPtr, ExecContext *, 46612616Sgabeblack@google.com Trace::InstRecord *) const override; 46710037SARM gem5 Developers 46812616Sgabeblack@google.com void 46912616Sgabeblack@google.com annotateFault(ArmFault *fault) override 47012616Sgabeblack@google.com { 47110037SARM gem5 Developers %(fa_code)s 47210037SARM gem5 Developers } 47310037SARM gem5 Developers }; 47410037SARM gem5 Developers}}; 47510037SARM gem5 Developers 47610037SARM gem5 Developersdef template LoadStoreRegU64Declare {{ 47710037SARM gem5 Developers class %(class_name)s : public %(base_class)s 47810037SARM gem5 Developers { 47910037SARM gem5 Developers public: 48010037SARM gem5 Developers 48110037SARM gem5 Developers /// Constructor. 48210037SARM gem5 Developers %(class_name)s(ExtMachInst machInst, 48310037SARM gem5 Developers IntRegIndex _dest, IntRegIndex _base, IntRegIndex _offset, 48410037SARM gem5 Developers ArmExtendType _type, uint32_t _shiftAmt, 48510037SARM gem5 Developers bool noAlloc = false, bool exclusive = false, 48610037SARM gem5 Developers bool acrel = false); 48710037SARM gem5 Developers 48812616Sgabeblack@google.com Fault execute(ExecContext *, Trace::InstRecord *) const override; 48912616Sgabeblack@google.com Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override; 49012616Sgabeblack@google.com Fault completeAcc(PacketPtr, ExecContext *, 49112616Sgabeblack@google.com Trace::InstRecord *) const override; 49210037SARM gem5 Developers 49312616Sgabeblack@google.com void 49412616Sgabeblack@google.com annotateFault(ArmFault *fault) override 49512616Sgabeblack@google.com { 49610037SARM gem5 Developers %(fa_code)s 49710037SARM gem5 Developers } 49810037SARM gem5 Developers }; 49910037SARM gem5 Developers}}; 50010037SARM gem5 Developers 50110037SARM gem5 Developersdef template LoadStoreRaw64Declare {{ 50210037SARM gem5 Developers class %(class_name)s : public %(base_class)s 50310037SARM gem5 Developers { 50410037SARM gem5 Developers public: 50510037SARM gem5 Developers 50610037SARM gem5 Developers /// Constructor. 50710037SARM gem5 Developers %(class_name)s(ExtMachInst machInst, IntRegIndex _dest, 50810037SARM gem5 Developers IntRegIndex _base); 50910037SARM gem5 Developers 51012616Sgabeblack@google.com Fault execute(ExecContext *, Trace::InstRecord *) const override; 51112616Sgabeblack@google.com Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override; 51212616Sgabeblack@google.com Fault completeAcc(PacketPtr, ExecContext *, 51312616Sgabeblack@google.com Trace::InstRecord *) const override; 51410037SARM gem5 Developers 51512616Sgabeblack@google.com void 51612616Sgabeblack@google.com annotateFault(ArmFault *fault) override 51712616Sgabeblack@google.com { 51810037SARM gem5 Developers %(fa_code)s 51910037SARM gem5 Developers } 52010037SARM gem5 Developers }; 52110037SARM gem5 Developers}}; 52210037SARM gem5 Developers 52310037SARM gem5 Developersdef template LoadStoreEx64Declare {{ 52410037SARM gem5 Developers class %(class_name)s : public %(base_class)s 52510037SARM gem5 Developers { 52610037SARM gem5 Developers public: 52710037SARM gem5 Developers 52810037SARM gem5 Developers /// Constructor. 52910037SARM gem5 Developers %(class_name)s(ExtMachInst machInst, IntRegIndex _dest, 53010037SARM gem5 Developers IntRegIndex _base, IntRegIndex _result); 53110037SARM gem5 Developers 53212616Sgabeblack@google.com Fault execute(ExecContext *, Trace::InstRecord *) const override; 53312616Sgabeblack@google.com Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override; 53412616Sgabeblack@google.com Fault completeAcc(PacketPtr, ExecContext *, 53512616Sgabeblack@google.com Trace::InstRecord *) const override; 53610037SARM gem5 Developers 53712616Sgabeblack@google.com void 53812616Sgabeblack@google.com annotateFault(ArmFault *fault) override 53912616Sgabeblack@google.com { 54010037SARM gem5 Developers %(fa_code)s 54110037SARM gem5 Developers } 54210037SARM gem5 Developers }; 54310037SARM gem5 Developers}}; 54410037SARM gem5 Developers 54510037SARM gem5 Developersdef template LoadStoreLit64Declare {{ 54610037SARM gem5 Developers class %(class_name)s : public %(base_class)s 54710037SARM gem5 Developers { 54810037SARM gem5 Developers public: 54910037SARM gem5 Developers 55010037SARM gem5 Developers /// Constructor. 55110037SARM gem5 Developers %(class_name)s(ExtMachInst machInst, IntRegIndex _dest, int64_t _imm); 55210037SARM gem5 Developers 55312616Sgabeblack@google.com Fault execute(ExecContext *, Trace::InstRecord *) const override; 55412616Sgabeblack@google.com Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override; 55512616Sgabeblack@google.com Fault completeAcc(PacketPtr, ExecContext *, 55612616Sgabeblack@google.com Trace::InstRecord *) const override; 55710037SARM gem5 Developers 55812616Sgabeblack@google.com void 55912616Sgabeblack@google.com annotateFault(ArmFault *fault) override 56012616Sgabeblack@google.com { 56110037SARM gem5 Developers %(fa_code)s 56210037SARM gem5 Developers } 56310037SARM gem5 Developers }; 56410037SARM gem5 Developers}}; 56510037SARM gem5 Developers 56610037SARM gem5 Developersdef template LoadStoreLitU64Declare {{ 56710037SARM gem5 Developers class %(class_name)s : public %(base_class)s 56810037SARM gem5 Developers { 56910037SARM gem5 Developers public: 57010037SARM gem5 Developers 57110037SARM gem5 Developers /// Constructor. 57210037SARM gem5 Developers %(class_name)s(ExtMachInst machInst, IntRegIndex _dest, int64_t _imm, 57310037SARM gem5 Developers bool noAlloc = false, bool exclusive = false, 57410037SARM gem5 Developers bool acrel = false); 57510037SARM gem5 Developers 57612616Sgabeblack@google.com Fault execute(ExecContext *, Trace::InstRecord *) const override; 57712616Sgabeblack@google.com Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override; 57812616Sgabeblack@google.com Fault completeAcc(PacketPtr, ExecContext *, 57912616Sgabeblack@google.com Trace::InstRecord *) const override; 58010037SARM gem5 Developers 58112616Sgabeblack@google.com void 58212616Sgabeblack@google.com annotateFault(ArmFault *fault) override 58312616Sgabeblack@google.com { 58410037SARM gem5 Developers %(fa_code)s 58510037SARM gem5 Developers } 58610037SARM gem5 Developers }; 58710037SARM gem5 Developers}}; 58810037SARM gem5 Developers 58910037SARM gem5 Developersdef template LoadStoreImm64Constructor {{ 59010037SARM gem5 Developers %(class_name)s::%(class_name)s(ExtMachInst machInst, 59110037SARM gem5 Developers IntRegIndex _dest, IntRegIndex _base, int64_t _imm) 59210037SARM gem5 Developers : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 59310037SARM gem5 Developers (IntRegIndex)_dest, (IntRegIndex)_base, _imm) 59410037SARM gem5 Developers { 59510037SARM gem5 Developers %(constructor)s; 59610037SARM gem5 Developers#if %(use_uops)d 59710037SARM gem5 Developers assert(numMicroops >= 2); 59810037SARM gem5 Developers uops = new StaticInstPtr[numMicroops]; 59910037SARM gem5 Developers uops[0] = new %(acc_name)s(machInst, _dest, _base, _imm); 60010037SARM gem5 Developers uops[0]->setDelayedCommit(); 60110666SAli.Saidi@ARM.com uops[0]->setFirstMicroop(); 60210037SARM gem5 Developers uops[1] = new %(wb_decl)s; 60310037SARM gem5 Developers uops[1]->setLastMicroop(); 60410037SARM gem5 Developers#endif 60510037SARM gem5 Developers } 60610037SARM gem5 Developers}}; 60710037SARM gem5 Developers 60810037SARM gem5 Developersdef template LoadStoreImmU64Constructor {{ 60910037SARM gem5 Developers %(class_name)s::%(class_name)s(ExtMachInst machInst, 61010037SARM gem5 Developers IntRegIndex _dest, IntRegIndex _base, int64_t _imm, 61110037SARM gem5 Developers bool noAlloc, bool exclusive, bool acrel) 61210037SARM gem5 Developers : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 61310037SARM gem5 Developers _dest, _base, _imm) 61410037SARM gem5 Developers { 61510037SARM gem5 Developers %(constructor)s; 61610037SARM gem5 Developers assert(!%(use_uops)d); 61710037SARM gem5 Developers setExcAcRel(exclusive, acrel); 61810037SARM gem5 Developers } 61910037SARM gem5 Developers}}; 62010037SARM gem5 Developers 62110037SARM gem5 Developersdef template LoadStoreImmDU64Constructor {{ 62210037SARM gem5 Developers %(class_name)s::%(class_name)s(ExtMachInst machInst, 62310037SARM gem5 Developers IntRegIndex _dest, IntRegIndex _dest2, IntRegIndex _base, 62410037SARM gem5 Developers int64_t _imm, bool noAlloc, bool exclusive, bool acrel) 62510037SARM gem5 Developers : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 62610037SARM gem5 Developers _dest, _dest2, _base, _imm) 62710037SARM gem5 Developers { 62810037SARM gem5 Developers %(constructor)s; 62910037SARM gem5 Developers assert(!%(use_uops)d); 63010037SARM gem5 Developers setExcAcRel(exclusive, acrel); 63110037SARM gem5 Developers } 63210037SARM gem5 Developers}}; 63310037SARM gem5 Developers 63410037SARM gem5 Developersdef template StoreImmDEx64Constructor {{ 63510184SCurtis.Dunham@arm.com %(class_name)s::%(class_name)s(ExtMachInst machInst, 63610037SARM gem5 Developers IntRegIndex _result, IntRegIndex _dest, IntRegIndex _dest2, 63710037SARM gem5 Developers IntRegIndex _base, int64_t _imm) 63810037SARM gem5 Developers : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 63910037SARM gem5 Developers _result, _dest, _dest2, _base, _imm) 64010037SARM gem5 Developers { 64110037SARM gem5 Developers %(constructor)s; 64210037SARM gem5 Developers assert(!%(use_uops)d); 64310037SARM gem5 Developers } 64410037SARM gem5 Developers}}; 64510037SARM gem5 Developers 64610037SARM gem5 Developers 64710037SARM gem5 Developersdef template LoadStoreReg64Constructor {{ 64810037SARM gem5 Developers %(class_name)s::%(class_name)s(ExtMachInst machInst, 64910037SARM gem5 Developers IntRegIndex _dest, IntRegIndex _base, IntRegIndex _offset, 65010037SARM gem5 Developers ArmExtendType _type, uint32_t _shiftAmt) 65110037SARM gem5 Developers : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 65210037SARM gem5 Developers _dest, _base, _offset, _type, _shiftAmt) 65310037SARM gem5 Developers { 65410037SARM gem5 Developers %(constructor)s; 65510037SARM gem5 Developers#if %(use_uops)d 65610037SARM gem5 Developers assert(numMicroops >= 2); 65710037SARM gem5 Developers uops = new StaticInstPtr[numMicroops]; 65810037SARM gem5 Developers uops[0] = new %(acc_name)s(machInst, _dest, _base, _offset, 65910037SARM gem5 Developers _type, _shiftAmt); 66010037SARM gem5 Developers uops[0]->setDelayedCommit(); 66110666SAli.Saidi@ARM.com uops[0]->setFirstMicroop(); 66210037SARM gem5 Developers uops[1] = new %(wb_decl)s; 66310037SARM gem5 Developers uops[1]->setLastMicroop(); 66410037SARM gem5 Developers#endif 66510037SARM gem5 Developers } 66610037SARM gem5 Developers}}; 66710037SARM gem5 Developers 66810037SARM gem5 Developersdef template LoadStoreRegU64Constructor {{ 66910037SARM gem5 Developers %(class_name)s::%(class_name)s(ExtMachInst machInst, 67010037SARM gem5 Developers IntRegIndex _dest, IntRegIndex _base, IntRegIndex _offset, 67110037SARM gem5 Developers ArmExtendType _type, uint32_t _shiftAmt, 67210037SARM gem5 Developers bool noAlloc, bool exclusive, bool acrel) 67310037SARM gem5 Developers : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 67410037SARM gem5 Developers _dest, _base, _offset, _type, _shiftAmt) 67510037SARM gem5 Developers { 67610037SARM gem5 Developers %(constructor)s; 67710037SARM gem5 Developers assert(!%(use_uops)d); 67810037SARM gem5 Developers setExcAcRel(exclusive, acrel); 67910037SARM gem5 Developers } 68010037SARM gem5 Developers}}; 68110037SARM gem5 Developers 68210037SARM gem5 Developersdef template LoadStoreRaw64Constructor {{ 68310037SARM gem5 Developers %(class_name)s::%(class_name)s(ExtMachInst machInst, 68410037SARM gem5 Developers IntRegIndex _dest, IntRegIndex _base) 68510037SARM gem5 Developers : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _dest, _base) 68610037SARM gem5 Developers { 68710037SARM gem5 Developers %(constructor)s; 68810037SARM gem5 Developers } 68910037SARM gem5 Developers}}; 69010037SARM gem5 Developers 69110037SARM gem5 Developersdef template LoadStoreEx64Constructor {{ 69210037SARM gem5 Developers %(class_name)s::%(class_name)s(ExtMachInst machInst, 69310037SARM gem5 Developers IntRegIndex _dest, IntRegIndex _base, IntRegIndex _result) 69410037SARM gem5 Developers : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 69510037SARM gem5 Developers _dest, _base, _result) 69610037SARM gem5 Developers { 69710037SARM gem5 Developers %(constructor)s; 69810037SARM gem5 Developers } 69910037SARM gem5 Developers}}; 70010037SARM gem5 Developers 70110037SARM gem5 Developersdef template LoadStoreLit64Constructor {{ 70210037SARM gem5 Developers %(class_name)s::%(class_name)s(ExtMachInst machInst, 70310037SARM gem5 Developers IntRegIndex _dest, int64_t _imm) 70410037SARM gem5 Developers : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 70510037SARM gem5 Developers (IntRegIndex)_dest, _imm) 70610037SARM gem5 Developers { 70710037SARM gem5 Developers %(constructor)s; 70810037SARM gem5 Developers#if %(use_uops)d 70910037SARM gem5 Developers assert(numMicroops >= 2); 71010037SARM gem5 Developers uops = new StaticInstPtr[numMicroops]; 71110037SARM gem5 Developers uops[0] = new %(acc_name)s(machInst, _dest, _imm); 71210037SARM gem5 Developers uops[0]->setDelayedCommit(); 71310666SAli.Saidi@ARM.com uops[0]->setFirstMicroop(); 71410037SARM gem5 Developers uops[1] = new %(wb_decl)s; 71510037SARM gem5 Developers uops[1]->setLastMicroop(); 71610037SARM gem5 Developers#endif 71710037SARM gem5 Developers } 71810037SARM gem5 Developers}}; 71910037SARM gem5 Developers 72010037SARM gem5 Developersdef template LoadStoreLitU64Constructor {{ 72110037SARM gem5 Developers %(class_name)s::%(class_name)s(ExtMachInst machInst, 72210037SARM gem5 Developers IntRegIndex _dest, int64_t _imm, 72310037SARM gem5 Developers bool noAlloc, bool exclusive, bool acrel) 72410037SARM gem5 Developers : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 72510037SARM gem5 Developers (IntRegIndex)_dest, _imm) 72610037SARM gem5 Developers { 72710037SARM gem5 Developers %(constructor)s; 72810037SARM gem5 Developers assert(!%(use_uops)d); 72910037SARM gem5 Developers setExcAcRel(exclusive, acrel); 73010037SARM gem5 Developers } 73110037SARM gem5 Developers}}; 73214150Sjordi.vaquero@metempsy.com 73314150Sjordi.vaquero@metempsy.com// Atomic operations in memory 73414150Sjordi.vaquero@metempsy.com 73514150Sjordi.vaquero@metempsy.comdef template AmoOpExecute {{ 73614150Sjordi.vaquero@metempsy.com Fault %(class_name)s::execute(ExecContext *xc, 73714150Sjordi.vaquero@metempsy.com Trace::InstRecord *traceData) const 73814150Sjordi.vaquero@metempsy.com { 73914150Sjordi.vaquero@metempsy.com Addr EA; 74014150Sjordi.vaquero@metempsy.com Fault fault = NoFault; 74114150Sjordi.vaquero@metempsy.com 74214150Sjordi.vaquero@metempsy.com %(op_decl)s; 74314150Sjordi.vaquero@metempsy.com %(op_rd)s; 74414150Sjordi.vaquero@metempsy.com %(ea_code)s; 74514150Sjordi.vaquero@metempsy.com 74614150Sjordi.vaquero@metempsy.com %(usrDecl)s; 74714150Sjordi.vaquero@metempsy.com if (fault == NoFault) { 74814150Sjordi.vaquero@metempsy.com %(memacc_code)s; 74914150Sjordi.vaquero@metempsy.com } 75014150Sjordi.vaquero@metempsy.com 75114150Sjordi.vaquero@metempsy.com %(amo_code)s 75214150Sjordi.vaquero@metempsy.com assert(amo_op); 75314150Sjordi.vaquero@metempsy.com 75414150Sjordi.vaquero@metempsy.com if (fault == NoFault) { 75514150Sjordi.vaquero@metempsy.com fault = amoMemAtomic(xc, traceData, Mem, EA, 75614150Sjordi.vaquero@metempsy.com memAccessFlags, amo_op); 75714150Sjordi.vaquero@metempsy.com } 75814150Sjordi.vaquero@metempsy.com 75914150Sjordi.vaquero@metempsy.com if (fault == NoFault) { 76014150Sjordi.vaquero@metempsy.com %(postacc_code)s; 76114150Sjordi.vaquero@metempsy.com } 76214150Sjordi.vaquero@metempsy.com 76314150Sjordi.vaquero@metempsy.com if (fault == NoFault) { 76414150Sjordi.vaquero@metempsy.com %(op_wb)s; 76514150Sjordi.vaquero@metempsy.com } 76614150Sjordi.vaquero@metempsy.com 76714150Sjordi.vaquero@metempsy.com return fault; 76814150Sjordi.vaquero@metempsy.com } 76914150Sjordi.vaquero@metempsy.com}}; 77014150Sjordi.vaquero@metempsy.com 77114150Sjordi.vaquero@metempsy.comdef template AmoOpInitiateAcc {{ 77214150Sjordi.vaquero@metempsy.com Fault %(class_name)s::initiateAcc(ExecContext *xc, 77314150Sjordi.vaquero@metempsy.com Trace::InstRecord *traceData) const 77414150Sjordi.vaquero@metempsy.com { 77514150Sjordi.vaquero@metempsy.com Addr EA; 77614150Sjordi.vaquero@metempsy.com Fault fault = NoFault; 77714150Sjordi.vaquero@metempsy.com 77814150Sjordi.vaquero@metempsy.com %(op_src_decl)s; 77914150Sjordi.vaquero@metempsy.com %(op_rd)s; 78014150Sjordi.vaquero@metempsy.com %(ea_code)s; 78114150Sjordi.vaquero@metempsy.com %(usrDecl)s; 78214150Sjordi.vaquero@metempsy.com 78314150Sjordi.vaquero@metempsy.com if (fault == NoFault) { 78414150Sjordi.vaquero@metempsy.com %(memacc_code)s; 78514150Sjordi.vaquero@metempsy.com } 78614150Sjordi.vaquero@metempsy.com 78714150Sjordi.vaquero@metempsy.com %(amo_code)s; 78814150Sjordi.vaquero@metempsy.com 78914150Sjordi.vaquero@metempsy.com assert(amo_op); 79014150Sjordi.vaquero@metempsy.com if (fault == NoFault) { 79114150Sjordi.vaquero@metempsy.com fault = initiateMemAMO(xc, traceData, EA, Mem, memAccessFlags, 79214150Sjordi.vaquero@metempsy.com amo_op); 79314150Sjordi.vaquero@metempsy.com } 79414150Sjordi.vaquero@metempsy.com 79514150Sjordi.vaquero@metempsy.com return fault; 79614150Sjordi.vaquero@metempsy.com } 79714150Sjordi.vaquero@metempsy.com}}; 79814150Sjordi.vaquero@metempsy.com 79914150Sjordi.vaquero@metempsy.comdef template AmoOpCompleteAcc {{ 80014150Sjordi.vaquero@metempsy.com Fault %(class_name)s::completeAcc(PacketPtr pkt, ExecContext *xc, 80114150Sjordi.vaquero@metempsy.com Trace::InstRecord *traceData) const 80214150Sjordi.vaquero@metempsy.com { 80314150Sjordi.vaquero@metempsy.com Fault fault = NoFault; 80414150Sjordi.vaquero@metempsy.com 80514150Sjordi.vaquero@metempsy.com %(op_decl)s; 80614150Sjordi.vaquero@metempsy.com %(op_rd)s; 80714150Sjordi.vaquero@metempsy.com 80814150Sjordi.vaquero@metempsy.com // ARM instructions will not have a pkt if the predicate is false 80914150Sjordi.vaquero@metempsy.com getMem(pkt, Mem, traceData); 81014150Sjordi.vaquero@metempsy.com 81114150Sjordi.vaquero@metempsy.com if (fault == NoFault) { 81214150Sjordi.vaquero@metempsy.com %(postacc_code)s; 81314150Sjordi.vaquero@metempsy.com } 81414150Sjordi.vaquero@metempsy.com 81514150Sjordi.vaquero@metempsy.com if (fault == NoFault) { 81614150Sjordi.vaquero@metempsy.com %(op_wb)s; 81714150Sjordi.vaquero@metempsy.com } 81814150Sjordi.vaquero@metempsy.com 81914150Sjordi.vaquero@metempsy.com return fault; 82014150Sjordi.vaquero@metempsy.com } 82114150Sjordi.vaquero@metempsy.com 82214150Sjordi.vaquero@metempsy.com}}; 82314150Sjordi.vaquero@metempsy.com 82414150Sjordi.vaquero@metempsy.comdef template AmoOpDeclare {{ 82514150Sjordi.vaquero@metempsy.com class %(class_name)s : public %(base_class)s 82614150Sjordi.vaquero@metempsy.com { 82714150Sjordi.vaquero@metempsy.com public: 82814150Sjordi.vaquero@metempsy.com 82914150Sjordi.vaquero@metempsy.com /// Constructor. 83014150Sjordi.vaquero@metempsy.com %(class_name)s(ExtMachInst machInst, IntRegIndex _dest, 83114150Sjordi.vaquero@metempsy.com IntRegIndex _base, IntRegIndex _result); 83214150Sjordi.vaquero@metempsy.com 83314150Sjordi.vaquero@metempsy.com Fault execute(ExecContext *, Trace::InstRecord *) const override; 83414150Sjordi.vaquero@metempsy.com Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override; 83514150Sjordi.vaquero@metempsy.com Fault completeAcc(PacketPtr, ExecContext *, 83614150Sjordi.vaquero@metempsy.com Trace::InstRecord *) const override; 83714150Sjordi.vaquero@metempsy.com 83814150Sjordi.vaquero@metempsy.com void 83914150Sjordi.vaquero@metempsy.com annotateFault(ArmFault *fault) override 84014150Sjordi.vaquero@metempsy.com { 84114150Sjordi.vaquero@metempsy.com %(fa_code)s 84214150Sjordi.vaquero@metempsy.com } 84314150Sjordi.vaquero@metempsy.com }; 84414150Sjordi.vaquero@metempsy.com}}; 84514150Sjordi.vaquero@metempsy.com 84614150Sjordi.vaquero@metempsy.com 84714150Sjordi.vaquero@metempsy.comdef template AmoOpConstructor {{ 84814150Sjordi.vaquero@metempsy.com %(class_name)s::%(class_name)s(ExtMachInst machInst, 84914150Sjordi.vaquero@metempsy.com IntRegIndex _dest, IntRegIndex _base, IntRegIndex _result) 85014150Sjordi.vaquero@metempsy.com : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 85114150Sjordi.vaquero@metempsy.com _dest, _base, _result) 85214150Sjordi.vaquero@metempsy.com { 85314150Sjordi.vaquero@metempsy.com %(constructor)s; 85414157Sjordi.vaquero@metempsy.com flags[IsStore] = false; 85514157Sjordi.vaquero@metempsy.com flags[IsLoad] = false; 85614150Sjordi.vaquero@metempsy.com } 85714150Sjordi.vaquero@metempsy.com}}; 85814150Sjordi.vaquero@metempsy.com 85914150Sjordi.vaquero@metempsy.comdef template AmoPairOpDeclare {{ 86014150Sjordi.vaquero@metempsy.com class %(class_name)s : public %(base_class)s 86114150Sjordi.vaquero@metempsy.com { 86214150Sjordi.vaquero@metempsy.com public: 86314150Sjordi.vaquero@metempsy.com uint32_t d2_src ; 86414150Sjordi.vaquero@metempsy.com uint32_t r2_src ; 86514150Sjordi.vaquero@metempsy.com uint32_t r2_dst ; 86614150Sjordi.vaquero@metempsy.com /// Constructor. 86714150Sjordi.vaquero@metempsy.com %(class_name)s(ExtMachInst machInst, IntRegIndex _dest, 86814150Sjordi.vaquero@metempsy.com IntRegIndex _base, IntRegIndex _result); 86914150Sjordi.vaquero@metempsy.com 87014150Sjordi.vaquero@metempsy.com Fault execute(ExecContext *, Trace::InstRecord *) const override; 87114150Sjordi.vaquero@metempsy.com Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override; 87214150Sjordi.vaquero@metempsy.com Fault completeAcc(PacketPtr, ExecContext *, 87314150Sjordi.vaquero@metempsy.com Trace::InstRecord *) const override; 87414150Sjordi.vaquero@metempsy.com 87514150Sjordi.vaquero@metempsy.com void 87614150Sjordi.vaquero@metempsy.com annotateFault(ArmFault *fault) override 87714150Sjordi.vaquero@metempsy.com { 87814150Sjordi.vaquero@metempsy.com %(fa_code)s 87914150Sjordi.vaquero@metempsy.com } 88014150Sjordi.vaquero@metempsy.com }; 88114150Sjordi.vaquero@metempsy.com}}; 88214150Sjordi.vaquero@metempsy.com 88314150Sjordi.vaquero@metempsy.com 88414150Sjordi.vaquero@metempsy.comdef template AmoPairOpConstructor {{ 88514150Sjordi.vaquero@metempsy.com %(class_name)s::%(class_name)s(ExtMachInst machInst, 88614150Sjordi.vaquero@metempsy.com IntRegIndex _dest, IntRegIndex _base, IntRegIndex _result) 88714150Sjordi.vaquero@metempsy.com : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 88814150Sjordi.vaquero@metempsy.com _dest, _base, _result) 88914150Sjordi.vaquero@metempsy.com { 89014150Sjordi.vaquero@metempsy.com %(constructor)s; 89114150Sjordi.vaquero@metempsy.com 89214150Sjordi.vaquero@metempsy.com uint32_t d2 = RegId(IntRegClass, dest).index() + 1 ; 89314150Sjordi.vaquero@metempsy.com uint32_t r2 = RegId(IntRegClass, result).index() + 1 ; 89414150Sjordi.vaquero@metempsy.com 89514150Sjordi.vaquero@metempsy.com d2_src = _numSrcRegs ; 89614150Sjordi.vaquero@metempsy.com _srcRegIdx[_numSrcRegs++] = RegId(IntRegClass, d2); 89714150Sjordi.vaquero@metempsy.com r2_src = _numSrcRegs ; 89814150Sjordi.vaquero@metempsy.com _srcRegIdx[_numSrcRegs++] = RegId(IntRegClass, r2); 89914150Sjordi.vaquero@metempsy.com r2_dst = _numDestRegs ; 90014150Sjordi.vaquero@metempsy.com _destRegIdx[_numDestRegs++] = RegId(IntRegClass, r2); 90114157Sjordi.vaquero@metempsy.com flags[IsStore] = false; 90214157Sjordi.vaquero@metempsy.com flags[IsLoad] = false; 90314150Sjordi.vaquero@metempsy.com } 90414150Sjordi.vaquero@metempsy.com}}; 90514150Sjordi.vaquero@metempsy.com 90614150Sjordi.vaquero@metempsy.comdef template AmoArithmeticOpDeclare {{ 90714150Sjordi.vaquero@metempsy.com class %(class_name)s : public %(base_class)s 90814150Sjordi.vaquero@metempsy.com { 90914150Sjordi.vaquero@metempsy.com public: 91014150Sjordi.vaquero@metempsy.com bool isXZR ; 91114150Sjordi.vaquero@metempsy.com /// Constructor. 91214150Sjordi.vaquero@metempsy.com %(class_name)s(ExtMachInst machInst, IntRegIndex _dest, 91314150Sjordi.vaquero@metempsy.com IntRegIndex _base, IntRegIndex _result); 91414150Sjordi.vaquero@metempsy.com 91514150Sjordi.vaquero@metempsy.com Fault execute(ExecContext *, Trace::InstRecord *) const override; 91614150Sjordi.vaquero@metempsy.com Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override; 91714150Sjordi.vaquero@metempsy.com Fault completeAcc(PacketPtr, ExecContext *, 91814150Sjordi.vaquero@metempsy.com Trace::InstRecord *) const override; 91914150Sjordi.vaquero@metempsy.com 92014150Sjordi.vaquero@metempsy.com void 92114150Sjordi.vaquero@metempsy.com annotateFault(ArmFault *fault) override 92214150Sjordi.vaquero@metempsy.com { 92314150Sjordi.vaquero@metempsy.com %(fa_code)s 92414150Sjordi.vaquero@metempsy.com } 92514150Sjordi.vaquero@metempsy.com }; 92614150Sjordi.vaquero@metempsy.com}}; 92714150Sjordi.vaquero@metempsy.com 92814150Sjordi.vaquero@metempsy.comdef template AmoArithmeticOpConstructor {{ 92914150Sjordi.vaquero@metempsy.com %(class_name)s::%(class_name)s(ExtMachInst machInst, 93014150Sjordi.vaquero@metempsy.com IntRegIndex _dest, IntRegIndex _base, IntRegIndex _result) 93114150Sjordi.vaquero@metempsy.com : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 93214150Sjordi.vaquero@metempsy.com _dest, _base, _result) 93314150Sjordi.vaquero@metempsy.com { 93414150Sjordi.vaquero@metempsy.com %(constructor)s; 93514150Sjordi.vaquero@metempsy.com isXZR = false; 93614150Sjordi.vaquero@metempsy.com uint32_t r2 = RegId(IntRegClass, dest).index() ; 93714157Sjordi.vaquero@metempsy.com flags[IsStore] = false; 93814157Sjordi.vaquero@metempsy.com flags[IsLoad] = false; 93914150Sjordi.vaquero@metempsy.com if (r2 == 31){ 94014150Sjordi.vaquero@metempsy.com isXZR = true; 94114150Sjordi.vaquero@metempsy.com } 94214150Sjordi.vaquero@metempsy.com } 94314150Sjordi.vaquero@metempsy.com}}; 944