swap.isa revision 4412
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            {
544040Ssaidi@eecs.umich.edu                fault = xc->write((uint%(mem_acc_size)s_t)Mem,
554040Ssaidi@eecs.umich.edu                        EA, %(asi_val)s, &mem_data);
564040Ssaidi@eecs.umich.edu            }
574040Ssaidi@eecs.umich.edu            if(fault == NoFault)
584040Ssaidi@eecs.umich.edu            {
594040Ssaidi@eecs.umich.edu                    //Handle the swapping
604040Ssaidi@eecs.umich.edu                    %(postacc_code)s;
614040Ssaidi@eecs.umich.edu            }
624040Ssaidi@eecs.umich.edu            if(fault == NoFault)
634040Ssaidi@eecs.umich.edu            {
644040Ssaidi@eecs.umich.edu                    //Write the resulting state to the execution context
654040Ssaidi@eecs.umich.edu                    %(op_wb)s;
664040Ssaidi@eecs.umich.edu            }
674040Ssaidi@eecs.umich.edu
684040Ssaidi@eecs.umich.edu            return fault;
694040Ssaidi@eecs.umich.edu        }
704040Ssaidi@eecs.umich.edu}};
714040Ssaidi@eecs.umich.edu
724040Ssaidi@eecs.umich.edu
734040Ssaidi@eecs.umich.edudef template SwapInitiateAcc {{
744040Ssaidi@eecs.umich.edu        Fault %(class_name)s::initiateAcc(%(CPU_exec_context)s * xc,
754040Ssaidi@eecs.umich.edu                Trace::InstRecord * traceData) const
764040Ssaidi@eecs.umich.edu        {
774040Ssaidi@eecs.umich.edu            Fault fault = NoFault;
784040Ssaidi@eecs.umich.edu            Addr EA;
794040Ssaidi@eecs.umich.edu            %(fp_enable_check)s;
804040Ssaidi@eecs.umich.edu            uint64_t mem_data = 0;
814040Ssaidi@eecs.umich.edu            %(op_decl)s;
824040Ssaidi@eecs.umich.edu            %(op_rd)s;
834040Ssaidi@eecs.umich.edu            %(ea_code)s;
844040Ssaidi@eecs.umich.edu
854040Ssaidi@eecs.umich.edu            DPRINTF(Sparc, "%s: The address is 0x%x\n", mnemonic, EA);
864040Ssaidi@eecs.umich.edu            %(fault_check)s;
874040Ssaidi@eecs.umich.edu
884040Ssaidi@eecs.umich.edu            if(fault == NoFault)
894040Ssaidi@eecs.umich.edu            {
904040Ssaidi@eecs.umich.edu                %(code)s;
914040Ssaidi@eecs.umich.edu            }
924040Ssaidi@eecs.umich.edu            if(fault == NoFault)
934040Ssaidi@eecs.umich.edu            {
944040Ssaidi@eecs.umich.edu                fault = xc->write((uint%(mem_acc_size)s_t)Mem,
954040Ssaidi@eecs.umich.edu                        EA, %(asi_val)s, &mem_data);
964040Ssaidi@eecs.umich.edu            }
974040Ssaidi@eecs.umich.edu            return fault;
984040Ssaidi@eecs.umich.edu        }
994040Ssaidi@eecs.umich.edu}};
1004040Ssaidi@eecs.umich.edu
1014040Ssaidi@eecs.umich.edu
1024040Ssaidi@eecs.umich.edu
1034040Ssaidi@eecs.umich.edudef template SwapCompleteAcc {{
1044040Ssaidi@eecs.umich.edu        Fault %(class_name)s::completeAcc(PacketPtr pkt, %(CPU_exec_context)s * xc,
1054040Ssaidi@eecs.umich.edu                Trace::InstRecord * traceData) const
1064040Ssaidi@eecs.umich.edu        {
1074040Ssaidi@eecs.umich.edu            Fault fault = NoFault;
1084040Ssaidi@eecs.umich.edu            %(op_decl)s;
1094040Ssaidi@eecs.umich.edu
1104040Ssaidi@eecs.umich.edu            uint64_t mem_data = pkt->get<uint%(mem_acc_size)s_t>();
1114040Ssaidi@eecs.umich.edu
1124040Ssaidi@eecs.umich.edu            if(fault == NoFault)
1134040Ssaidi@eecs.umich.edu            {
1144040Ssaidi@eecs.umich.edu                    //Handle the swapping
1154040Ssaidi@eecs.umich.edu                    %(postacc_code)s;
1164040Ssaidi@eecs.umich.edu            }
1174040Ssaidi@eecs.umich.edu            if(fault == NoFault)
1184040Ssaidi@eecs.umich.edu            {
1194040Ssaidi@eecs.umich.edu                    //Write the resulting state to the execution context
1204040Ssaidi@eecs.umich.edu                    %(op_wb)s;
1214040Ssaidi@eecs.umich.edu            }
1224040Ssaidi@eecs.umich.edu
1234040Ssaidi@eecs.umich.edu            return fault;
1244040Ssaidi@eecs.umich.edu        }
1254040Ssaidi@eecs.umich.edu}};
1264040Ssaidi@eecs.umich.edu
1274040Ssaidi@eecs.umich.edulet {{
1284040Ssaidi@eecs.umich.edu    SwapFuncs = [SwapExecute, SwapInitiateAcc, SwapCompleteAcc]
1294040Ssaidi@eecs.umich.edu}};
1304040Ssaidi@eecs.umich.edu
1314040Ssaidi@eecs.umich.edu
1324040Ssaidi@eecs.umich.edudef format Swap(code, postacc_code, mem_flags, *opt_flags) {{
1334040Ssaidi@eecs.umich.edu    mem_flags = makeList(mem_flags)
1344040Ssaidi@eecs.umich.edu    flags = string.join(mem_flags, '|')
1354040Ssaidi@eecs.umich.edu
1364040Ssaidi@eecs.umich.edu    (header_output,
1374040Ssaidi@eecs.umich.edu     decoder_output,
1384040Ssaidi@eecs.umich.edu     exec_output,
1394040Ssaidi@eecs.umich.edu     decode_block) = doMemFormat(code, SwapFuncs, '', name, Name, flags,
1404350Sgblack@eecs.umich.edu         ["IsStoreConditional"], postacc_code)
1414040Ssaidi@eecs.umich.edu}};
1424040Ssaidi@eecs.umich.edu
1434040Ssaidi@eecs.umich.edudef format SwapAlt(code, postacc_code, asi, mem_flags, *opt_flags) {{
1444040Ssaidi@eecs.umich.edu    mem_flags = makeList(mem_flags)
1454040Ssaidi@eecs.umich.edu    mem_flags.append(asi)
1464040Ssaidi@eecs.umich.edu    flags = string.join(mem_flags, '|')
1474040Ssaidi@eecs.umich.edu    (header_output,
1484040Ssaidi@eecs.umich.edu     decoder_output,
1494040Ssaidi@eecs.umich.edu     exec_output,
1504040Ssaidi@eecs.umich.edu     decode_block) = doMemFormat(code, SwapFuncs, AlternateASIPrivFaultCheck,
1514350Sgblack@eecs.umich.edu         name, Name, flags, ["IsStoreConditional"], postacc_code)
1524040Ssaidi@eecs.umich.edu}};
1534040Ssaidi@eecs.umich.edu
1544040Ssaidi@eecs.umich.edu
1554040Ssaidi@eecs.umich.edulet {{
1564040Ssaidi@eecs.umich.edu    def doCasFormat(code, execute, faultCode, name, Name, asi, opt_flags, postacc_code = ''):
1574040Ssaidi@eecs.umich.edu        addrCalcReg = 'EA = Rs1;'
1584040Ssaidi@eecs.umich.edu        iop = InstObjParams(name, Name, 'Mem',
1594040Ssaidi@eecs.umich.edu                {"code": code, "postacc_code" : postacc_code,
1604040Ssaidi@eecs.umich.edu                 "fault_check": faultCode, "ea_code": addrCalcReg}, opt_flags)
1614040Ssaidi@eecs.umich.edu        header_output = MemDeclare.subst(iop)
1624040Ssaidi@eecs.umich.edu        decoder_output = BasicConstructor.subst(iop)
1634040Ssaidi@eecs.umich.edu        decode_block = BasicDecode.subst(iop)
1644040Ssaidi@eecs.umich.edu        microParams = {"code": code, "postacc_code" : postacc_code,
1654040Ssaidi@eecs.umich.edu            "ea_code" : addrCalcReg, "fault_check" : faultCode}
1664350Sgblack@eecs.umich.edu        exec_output = doSplitExecute(execute, name, Name, asi,
1674350Sgblack@eecs.umich.edu                ["IsStoreConditional"], microParams);
1684040Ssaidi@eecs.umich.edu        return (header_output, decoder_output, exec_output, decode_block)
1694040Ssaidi@eecs.umich.edu}};
1704040Ssaidi@eecs.umich.edu
1714040Ssaidi@eecs.umich.edu
1724040Ssaidi@eecs.umich.edudef format CasAlt(code, postacc_code, asi, mem_flags, *opt_flags) {{
1734040Ssaidi@eecs.umich.edu    mem_flags = makeList(mem_flags)
1744040Ssaidi@eecs.umich.edu    mem_flags.append(asi)
1754040Ssaidi@eecs.umich.edu    flags = string.join(mem_flags, '|')
1764040Ssaidi@eecs.umich.edu    (header_output,
1774040Ssaidi@eecs.umich.edu     decoder_output,
1784040Ssaidi@eecs.umich.edu     exec_output,
1794040Ssaidi@eecs.umich.edu     decode_block) = doCasFormat(code, SwapFuncs, AlternateASIPrivFaultCheck,
1804350Sgblack@eecs.umich.edu         name, Name, flags, ["IsStoreConditional"], postacc_code)
1814040Ssaidi@eecs.umich.edu}};
1824040Ssaidi@eecs.umich.edu
1834040Ssaidi@eecs.umich.edu
184