// -*- mode:c++ -*- // Copyright (c) 2010 ARM Limited // All rights reserved // // The license below extends only to copyright in the software and shall // not be construed as granting a license to any other intellectual // property including but not limited to intellectual property relating // to a hardware implementation of the functionality of the software // licensed hereunder. You may use the software subject to the license // terms below provided that you ensure that this notice is replicated // unmodified and in its entirety in all distributions of the software, // modified or unmodified, in source code or in binary form. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer; // redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution; // neither the name of the copyright holders nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Authors: Gabe Black let {{ class LoadStoreInst(object): def __init__(self): self.fullExecTemplate = eval(self.execBase + 'Execute') self.initiateAccTemplate = eval(self.execBase + 'InitiateAcc') self.completeAccTemplate = eval(self.execBase + 'CompleteAcc') self.declareTemplate = eval(self.decConstBase + 'Declare') self.constructTemplate = eval(self.decConstBase + 'Constructor') def fillTemplates(self, name, Name, codeBlobs, memFlags, instFlags, base = 'Memory', wbDecl = None, pcDecl = None, rasPop = False): # Make sure flags are in lists (convert to lists if not). memFlags = makeList(memFlags) instFlags = makeList(instFlags) eaCode = codeBlobs["ea_code"] # This shouldn't be part of the eaCode, but until the exec templates # are converted over it's the easiest place to put it. eaCode += '\n unsigned memAccessFlags = ' eaCode += (string.join(memFlags, '|') + ';') codeBlobs["ea_code"] = eaCode macroName = Name instFlagsCopy = list(instFlags) codeBlobsCopy = dict(codeBlobs) use_uops = 0 if wbDecl is not None or pcDecl is not None: instFlagsCopy.append('IsMicroop') Name = Name + 'Acc' use_uops = 1 use_wb = 0 use_pc = 0 if wbDecl is not None: use_wb = 1 if pcDecl is not None: use_pc = 1 codeBlobsCopy['acc_name'] = Name codeBlobsCopy['wb_decl'] = wbDecl codeBlobsCopy['pc_decl'] = pcDecl codeBlobsCopy['use_uops'] = 0 codeBlobsCopy['use_wb'] = 0 codeBlobsCopy['use_pc'] = 0 is_ras_pop = "0" if rasPop: is_ras_pop = "1" codeBlobsCopy['is_ras_pop'] = is_ras_pop iop = InstObjParams(name, Name, base, codeBlobsCopy, instFlagsCopy) header_output = self.declareTemplate.subst(iop) decoder_output = self.constructTemplate.subst(iop) exec_output = self.fullExecTemplate.subst(iop) + \ self.initiateAccTemplate.subst(iop) + \ self.completeAccTemplate.subst(iop) if wbDecl is not None or pcDecl is not None: iop = InstObjParams(name, macroName, base, { "wb_decl" : wbDecl, "pc_decl" : pcDecl, "acc_name" : Name, "use_uops" : use_uops, "use_pc" : use_pc, "use_wb" : use_wb, "is_ras_pop" : is_ras_pop }, ['IsMacroop']) header_output += self.declareTemplate.subst(iop) decoder_output += self.constructTemplate.subst(iop) exec_output += PanicExecute.subst(iop) + \ PanicInitiateAcc.subst(iop) + \ PanicCompleteAcc.subst(iop) return (header_output, decoder_output, exec_output) def pickPredicate(blobs): opt_nz = True opt_c = 'opt' opt_v = True if not isinstance(blobs, dict): vals = [blobs] else: vals = blobs.values() for val in vals: if re.search('(?" % base elif not post and writeback: base = "MemoryPreIndex<%s>" % base elif not post and not writeback: base = "MemoryOffset<%s>" % base else: raise Exception, "Illegal combination of post and writeback" return base }};