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