// -*- mode:c++ -*-

// Copyright (c) 2010-2012 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.

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, size=4, sign=False, faCode=None):
            # 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 += ('|'.join(memFlags) + ';')

            codeBlobs["ea_code"] = eaCode

            if faCode:
                # For AArch64 the fa_code snippet comes already assembled here
                codeBlobs["fa_code"] = faCode
            elif wbDecl == None:
                codeBlobs["fa_code"] = '''
                    if (dest != INTREG_PC) {
                        fault->annotate(ArmISA::ArmFault::SAS, %s);
                        fault->annotate(ArmISA::ArmFault::SSE, %s);
                        fault->annotate(ArmISA::ArmFault::SRT, dest);
                    }
                ''' %("0"    if size == 1 else
                      "1"    if size == 2 else "2",
                      "true" if sign      else "false")
            else:
                codeBlobs["fa_code"] = ''

            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
            if 'memacc_epilog_code' in codeBlobsCopy:
                del codeBlobsCopy['memacc_epilog_code']

            iop = ArmInstObjParams(name, Name, base,
                                   codeBlobsCopy, instFlagsCopy)
            if 'memacc_epilog_code' in codeBlobs:
                iop.snippets['memacc_code'] += codeBlobs['memacc_epilog_code']
            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 = ArmInstObjParams(name, macroName, base,
                                       { "wb_decl" : wbDecl,
                                         "pc_decl" : pcDecl,
                                         "acc_name" : Name,
                                         "use_uops" : use_uops,
                                         "use_pc" : use_pc,
                                         "use_wb" : use_wb,
                                         "fa_code" : '',
                                         "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('(?<!Opt)CondCodesNZ(?!.*=)', val):
                opt_nz = False
            if re.search('OptShiftRmCondCodesC(?!.*=)', val):
                opt_c = 'opt_shift_rm'
            elif re.search('(?<!Opt)CondCodesC(?!.*=)', val):
                opt_c = 'none'
            if re.search('(?<!Opt)CondCodesV(?!.*=)', val):
                opt_v = False

        # Build up the predicate piece by piece depending on which
        # flags the instruction needs
        predicate = 'testPredicate('
        if opt_nz:
            predicate += 'OptCondCodesNZ, '
        else:
            predicate += 'CondCodesNZ, '
        if opt_c == 'opt':
            predicate += 'OptCondCodesC, '
        elif opt_c == 'opt_shift_rm':
            predicate += 'OptShiftRmCondCodesC, '
        else:
            predicate += 'CondCodesC, '
        if opt_v:
            predicate += 'OptCondCodesV, '
        else:
            predicate += 'CondCodesV, '
        predicate += 'condCode)'
        predicate += '/*auto*/'
        return predicate

    def memClassName(base, post, add, writeback, \
                     size=4, sign=False, user=False):
        Name = base

        parts = { "P" : post, "A" : add, "W" : writeback,
                  "S" : sign, "U" : user }

        for (letter, val) in parts.items():
            if val:
                Name += "_%sY" % letter
            else:
                Name += "_%sN" % letter

        Name += ('_SZ%d' % size)

        return Name

    def buildMemSuffix(sign, size):
        if size == 16:
            memSuffix = '_tud'
        elif size == 8:
            memSuffix = '_ud'
        elif size == 4:
            if sign:
                memSuffix = '_sw'
            else:
                memSuffix = '_uw'
        elif size == 2:
            if sign:
                memSuffix = '_sh'
            else:
                memSuffix = '_uh'
        elif size == 1:
            if sign:
                memSuffix = '_sb'
            else:
                memSuffix = '_ub'
        else:
            raise Exception("Unrecognized size for access {}".format(size))

        return memSuffix

    def buildMemBase(base, post, writeback):
        if post and writeback:
            base = "MemoryPostIndex<%s>" % 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
}};

