swap.isa revision 5096
14040Ssaidi@eecs.umich.edu// Copyright (c) 2007 The Regents of The University of Michigan
24040Ssaidi@eecs.umich.edu// All rights reserved.
34040Ssaidi@eecs.umich.edu//
44040Ssaidi@eecs.umich.edu// Redistribution and use in source and binary forms, with or without
54040Ssaidi@eecs.umich.edu// modification, are permitted provided that the following conditions are
64040Ssaidi@eecs.umich.edu// met: redistributions of source code must retain the above copyright
74040Ssaidi@eecs.umich.edu// notice, this list of conditions and the following disclaimer;
84040Ssaidi@eecs.umich.edu// redistributions in binary form must reproduce the above copyright
94040Ssaidi@eecs.umich.edu// notice, this list of conditions and the following disclaimer in the
104040Ssaidi@eecs.umich.edu// documentation and/or other materials provided with the distribution;
114040Ssaidi@eecs.umich.edu// neither the name of the copyright holders nor the names of its
124040Ssaidi@eecs.umich.edu// contributors may be used to endorse or promote products derived from
134040Ssaidi@eecs.umich.edu// this software without specific prior written permission.
144040Ssaidi@eecs.umich.edu//
154040Ssaidi@eecs.umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
164040Ssaidi@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
174040Ssaidi@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
184040Ssaidi@eecs.umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
194040Ssaidi@eecs.umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
204040Ssaidi@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
214040Ssaidi@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
224040Ssaidi@eecs.umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
234040Ssaidi@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
244040Ssaidi@eecs.umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
254040Ssaidi@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
264040Ssaidi@eecs.umich.edu//
274040Ssaidi@eecs.umich.edu// Authors: Gabe Black
284040Ssaidi@eecs.umich.edu//          Ali Saidi
294040Ssaidi@eecs.umich.edu
304040Ssaidi@eecs.umich.edu//This template provides the execute functions for a swap
314040Ssaidi@eecs.umich.edudef template SwapExecute {{
324040Ssaidi@eecs.umich.edu        Fault %(class_name)s::execute(%(CPU_exec_context)s *xc,
334040Ssaidi@eecs.umich.edu                Trace::InstRecord *traceData) const
344040Ssaidi@eecs.umich.edu        {
354040Ssaidi@eecs.umich.edu            Fault fault = NoFault;
364040Ssaidi@eecs.umich.edu            //This is to support the conditional store in cas instructions.
374040Ssaidi@eecs.umich.edu            //It should be optomized out in all the others
384040Ssaidi@eecs.umich.edu            bool storeCond = true;
394040Ssaidi@eecs.umich.edu            Addr EA;
404040Ssaidi@eecs.umich.edu            %(fp_enable_check)s;
414040Ssaidi@eecs.umich.edu            %(op_decl)s;
424412Sbinkertn@umich.edu            uint64_t mem_data = 0;
434040Ssaidi@eecs.umich.edu
444040Ssaidi@eecs.umich.edu            %(op_rd)s;
454040Ssaidi@eecs.umich.edu            %(ea_code)s;
464040Ssaidi@eecs.umich.edu            DPRINTF(Sparc, "%s: The address is 0x%x\n", mnemonic, EA);
474040Ssaidi@eecs.umich.edu            %(fault_check)s;
484040Ssaidi@eecs.umich.edu            if(fault == NoFault)
494040Ssaidi@eecs.umich.edu            {
504040Ssaidi@eecs.umich.edu                %(code)s;
514040Ssaidi@eecs.umich.edu            }
524040Ssaidi@eecs.umich.edu            if(storeCond && fault == NoFault)
534040Ssaidi@eecs.umich.edu            {
544648Sgblack@eecs.umich.edu                %(EA_trunc)s
554040Ssaidi@eecs.umich.edu                fault = xc->write((uint%(mem_acc_size)s_t)Mem,
564040Ssaidi@eecs.umich.edu                        EA, %(asi_val)s, &mem_data);
574040Ssaidi@eecs.umich.edu            }
584040Ssaidi@eecs.umich.edu            if(fault == NoFault)
594040Ssaidi@eecs.umich.edu            {
604040Ssaidi@eecs.umich.edu                    //Handle the swapping
614040Ssaidi@eecs.umich.edu                    %(postacc_code)s;
624040Ssaidi@eecs.umich.edu            }
634040Ssaidi@eecs.umich.edu            if(fault == NoFault)
644040Ssaidi@eecs.umich.edu            {
654040Ssaidi@eecs.umich.edu                    //Write the resulting state to the execution context
664040Ssaidi@eecs.umich.edu                    %(op_wb)s;
674040Ssaidi@eecs.umich.edu            }
684040Ssaidi@eecs.umich.edu
694040Ssaidi@eecs.umich.edu            return fault;
704040Ssaidi@eecs.umich.edu        }
714040Ssaidi@eecs.umich.edu}};
724040Ssaidi@eecs.umich.edu
734040Ssaidi@eecs.umich.edu
744040Ssaidi@eecs.umich.edudef template SwapInitiateAcc {{
754040Ssaidi@eecs.umich.edu        Fault %(class_name)s::initiateAcc(%(CPU_exec_context)s * xc,
764040Ssaidi@eecs.umich.edu                Trace::InstRecord * traceData) const
774040Ssaidi@eecs.umich.edu        {
784040Ssaidi@eecs.umich.edu            Fault fault = NoFault;
794040Ssaidi@eecs.umich.edu            Addr EA;
804040Ssaidi@eecs.umich.edu            %(fp_enable_check)s;
814040Ssaidi@eecs.umich.edu            uint64_t mem_data = 0;
824040Ssaidi@eecs.umich.edu            %(op_decl)s;
834040Ssaidi@eecs.umich.edu            %(op_rd)s;
844040Ssaidi@eecs.umich.edu            %(ea_code)s;
854040Ssaidi@eecs.umich.edu
864040Ssaidi@eecs.umich.edu            DPRINTF(Sparc, "%s: The address is 0x%x\n", mnemonic, EA);
874040Ssaidi@eecs.umich.edu            %(fault_check)s;
884040Ssaidi@eecs.umich.edu
894040Ssaidi@eecs.umich.edu            if(fault == NoFault)
904040Ssaidi@eecs.umich.edu            {
914040Ssaidi@eecs.umich.edu                %(code)s;
924040Ssaidi@eecs.umich.edu            }
934040Ssaidi@eecs.umich.edu            if(fault == NoFault)
944040Ssaidi@eecs.umich.edu            {
954648Sgblack@eecs.umich.edu                %(EA_trunc)s
964040Ssaidi@eecs.umich.edu                fault = xc->write((uint%(mem_acc_size)s_t)Mem,
974040Ssaidi@eecs.umich.edu                        EA, %(asi_val)s, &mem_data);
984040Ssaidi@eecs.umich.edu            }
994040Ssaidi@eecs.umich.edu            return fault;
1004040Ssaidi@eecs.umich.edu        }
1014040Ssaidi@eecs.umich.edu}};
1024040Ssaidi@eecs.umich.edu
1034040Ssaidi@eecs.umich.edu
1044040Ssaidi@eecs.umich.edu
1054040Ssaidi@eecs.umich.edudef template SwapCompleteAcc {{
1064040Ssaidi@eecs.umich.edu        Fault %(class_name)s::completeAcc(PacketPtr pkt, %(CPU_exec_context)s * xc,
1074040Ssaidi@eecs.umich.edu                Trace::InstRecord * traceData) const
1084040Ssaidi@eecs.umich.edu        {
1094040Ssaidi@eecs.umich.edu            Fault fault = NoFault;
1104040Ssaidi@eecs.umich.edu            %(op_decl)s;
1114040Ssaidi@eecs.umich.edu
1124040Ssaidi@eecs.umich.edu            uint64_t mem_data = pkt->get<uint%(mem_acc_size)s_t>();
1134040Ssaidi@eecs.umich.edu
1144040Ssaidi@eecs.umich.edu            if(fault == NoFault)
1154040Ssaidi@eecs.umich.edu            {
1164040Ssaidi@eecs.umich.edu                    //Handle the swapping
1174040Ssaidi@eecs.umich.edu                    %(postacc_code)s;
1184040Ssaidi@eecs.umich.edu            }
1194040Ssaidi@eecs.umich.edu            if(fault == NoFault)
1204040Ssaidi@eecs.umich.edu            {
1214040Ssaidi@eecs.umich.edu                    //Write the resulting state to the execution context
1224040Ssaidi@eecs.umich.edu                    %(op_wb)s;
1234040Ssaidi@eecs.umich.edu            }
1244040Ssaidi@eecs.umich.edu
1254040Ssaidi@eecs.umich.edu            return fault;
1264040Ssaidi@eecs.umich.edu        }
1274040Ssaidi@eecs.umich.edu}};
1284040Ssaidi@eecs.umich.edu
1294040Ssaidi@eecs.umich.edulet {{
1304040Ssaidi@eecs.umich.edu    SwapFuncs = [SwapExecute, SwapInitiateAcc, SwapCompleteAcc]
1314040Ssaidi@eecs.umich.edu}};
1324040Ssaidi@eecs.umich.edu
1334040Ssaidi@eecs.umich.edu
1344040Ssaidi@eecs.umich.edudef format Swap(code, postacc_code, mem_flags, *opt_flags) {{
1354040Ssaidi@eecs.umich.edu    mem_flags = makeList(mem_flags)
1364040Ssaidi@eecs.umich.edu    flags = string.join(mem_flags, '|')
1374040Ssaidi@eecs.umich.edu
1384040Ssaidi@eecs.umich.edu    (header_output,
1394040Ssaidi@eecs.umich.edu     decoder_output,
1404040Ssaidi@eecs.umich.edu     exec_output,
1414040Ssaidi@eecs.umich.edu     decode_block) = doMemFormat(code, SwapFuncs, '', name, Name, flags,
1424350Sgblack@eecs.umich.edu         ["IsStoreConditional"], postacc_code)
1434040Ssaidi@eecs.umich.edu}};
1444040Ssaidi@eecs.umich.edu
1455096Sgblack@eecs.umich.edudef format SwapAlt(code, postacc_code, mem_flags, *opt_flags) {{
1464040Ssaidi@eecs.umich.edu    mem_flags = makeList(mem_flags)
1475096Sgblack@eecs.umich.edu    mem_flags.append("EXT_ASI")
1484040Ssaidi@eecs.umich.edu    flags = string.join(mem_flags, '|')
1494040Ssaidi@eecs.umich.edu    (header_output,
1504040Ssaidi@eecs.umich.edu     decoder_output,
1514040Ssaidi@eecs.umich.edu     exec_output,
1524040Ssaidi@eecs.umich.edu     decode_block) = doMemFormat(code, SwapFuncs, AlternateASIPrivFaultCheck,
1534350Sgblack@eecs.umich.edu         name, Name, flags, ["IsStoreConditional"], postacc_code)
1544040Ssaidi@eecs.umich.edu}};
1554040Ssaidi@eecs.umich.edu
1564040Ssaidi@eecs.umich.edu
1574040Ssaidi@eecs.umich.edulet {{
1585096Sgblack@eecs.umich.edu    def doCasFormat(code, execute, faultCode, name, Name, mem_flags, opt_flags, postacc_code = ''):
1594040Ssaidi@eecs.umich.edu        addrCalcReg = 'EA = Rs1;'
1604040Ssaidi@eecs.umich.edu        iop = InstObjParams(name, Name, 'Mem',
1614040Ssaidi@eecs.umich.edu                {"code": code, "postacc_code" : postacc_code,
1624648Sgblack@eecs.umich.edu                 "fault_check": faultCode, "ea_code": addrCalcReg,
1634648Sgblack@eecs.umich.edu                 "EA_trunc" : TruncateEA}, opt_flags)
1644040Ssaidi@eecs.umich.edu        header_output = MemDeclare.subst(iop)
1654040Ssaidi@eecs.umich.edu        decoder_output = BasicConstructor.subst(iop)
1664040Ssaidi@eecs.umich.edu        decode_block = BasicDecode.subst(iop)
1674040Ssaidi@eecs.umich.edu        microParams = {"code": code, "postacc_code" : postacc_code,
1684648Sgblack@eecs.umich.edu            "ea_code" : addrCalcReg, "fault_check" : faultCode,
1694648Sgblack@eecs.umich.edu            "EA_trunc" : TruncateEA}
1705096Sgblack@eecs.umich.edu        exec_output = doSplitExecute(execute, name, Name, mem_flags,
1714350Sgblack@eecs.umich.edu                ["IsStoreConditional"], microParams);
1724040Ssaidi@eecs.umich.edu        return (header_output, decoder_output, exec_output, decode_block)
1734040Ssaidi@eecs.umich.edu}};
1744040Ssaidi@eecs.umich.edu
1754040Ssaidi@eecs.umich.edu
1765096Sgblack@eecs.umich.edudef format CasAlt(code, postacc_code, mem_flags, *opt_flags) {{
1774040Ssaidi@eecs.umich.edu    mem_flags = makeList(mem_flags)
1785096Sgblack@eecs.umich.edu    mem_flags.append("EXT_ASI")
1794040Ssaidi@eecs.umich.edu    flags = string.join(mem_flags, '|')
1804040Ssaidi@eecs.umich.edu    (header_output,
1814040Ssaidi@eecs.umich.edu     decoder_output,
1824040Ssaidi@eecs.umich.edu     exec_output,
1834040Ssaidi@eecs.umich.edu     decode_block) = doCasFormat(code, SwapFuncs, AlternateASIPrivFaultCheck,
1844350Sgblack@eecs.umich.edu         name, Name, flags, ["IsStoreConditional"], postacc_code)
1854040Ssaidi@eecs.umich.edu}};
1864040Ssaidi@eecs.umich.edu
1874040Ssaidi@eecs.umich.edu
188