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

// Copyright (c) 2010,2019 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.
//
// Copyright (c) 2007-2008 The Florida State University
// All rights reserved.
//
// 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.

def format AddrMode2(imm) {{
    if eval(imm):
        imm = True
    else:
        imm = False

    def buildPUBWLCase(p, u, b, w, l):
        return (p << 4) + (u << 3) + (b << 2) + (w << 1) + (l << 0)

    header_output = decoder_output = exec_output = ""
    decode_block = "switch(PUBWL) {\n"

    # Loop over all the values of p, u, b, w and l and build instructions and
    # a decode block for them.
    for p in (0, 1):
        for u in (0, 1):
            for b in (0, 1):
                for w in (0, 1):
                    post = (p == 0)
                    user = (p == 0 and w == 1)
                    writeback = (p == 0 or w == 1)
                    add = (u == 1)
                    if b == 0:
                        size = 4
                    else:
                        size = 1
                    if add:
                        addStr = "true"
                    else:
                        addStr = "false"
                    if imm:
                        newDecode = "return new %s(machInst, RD, RN," + \
                                                  "%s, machInst.immed11_0);"
                        loadClass = loadImmClassName(post, add, writeback,
                                                     size, False, user)
                        storeClass = storeImmClassName(post, add, writeback,
                                                       size, False, user)
                        loadDecode = newDecode % (loadClass, addStr)
                        storeDecode = newDecode % (storeClass, addStr)
                    else:
                        newDecode = "return new %s(machInst, RD, RN, %s," + \
                                                  "machInst.shiftSize," + \
                                                  "machInst.shift, RM);"
                        loadClass = loadRegClassName(post, add, writeback,
                                                     size, False, user)
                        storeClass = storeRegClassName(post, add, writeback,
                                                       size, False, user)
                        loadDecode = newDecode % (loadClass, addStr)
                        storeDecode = newDecode % (storeClass, addStr)
                    decode = '''
                        case %#x:
                          {%s}
                          break;
                    '''
                    decode_block += decode % \
                        (buildPUBWLCase(p,u,b,w,1), loadDecode)
                    decode_block += decode % \
                        (buildPUBWLCase(p,u,b,w,0), storeDecode)
    decode_block += '''
        default:
          return new Unknown(machInst);
        break;
    }'''
}};

def format AddrMode3() {{
    decode = '''
    {
        const uint32_t op1 = bits(machInst, 24, 20);
        const uint32_t op2 = bits(machInst, 6, 5);
        const uint32_t puiw = bits(machInst, 24, 21);
        const uint32_t imm = IMMED_HI_11_8 << 4 | IMMED_LO_3_0;
        switch (op2) {
          case 0x1:
            if (op1 & 0x1) {
                %(ldrh)s
            } else {
                %(strh)s
            }
          case 0x2:
            if (op1 & 0x1) {
                %(ldrsb)s
            } else if ((RT %% 2) == 0) {
                %(ldrd)s
            } else {
                return new Unknown(machInst);
            }
          case 0x3:
            if (op1 & 0x1) {
                %(ldrsh)s
            } else {
                %(strd)s
            }
          default:
            return new Unknown(machInst);
        }
    }
    '''

    def decodePuiwCase(load, d, p, u, i, w, size=4, sign=False):
        post = (p == 0)
        user = (p == 0 and w == 1)
        writeback = (p == 0 or w == 1)
        add = (u == 1)
        caseVal = (p << 3) + (u << 2) + (i << 1) + (w << 0)
        decode = '''
          case %#x:
            return new '''% caseVal
        if add:
            addStr = "true"
        else:
            addStr = "false"
        if d:
            dests = "RT & ~1, RT | 1"
        else:
            dests = "RT"
        if i:
            if load:
                if d:
                    className = loadDoubleImmClassName(post, add, writeback)
                else:
                    className = loadImmClassName(post, add, writeback, \
                                                 size=size, sign=sign, \
                                                 user=user)
            else:
                if d:
                    className = storeDoubleImmClassName(post, add, writeback)
                else:
                    className = storeImmClassName(post, add, writeback, \
                                                  size=size, sign=sign, \
                                                  user=user)
            decode += ("%s(machInst, %s, RN, %s, imm);\n" % \
                       (className, dests, addStr))
        else:
            if load:
                if d:
                    className = loadDoubleRegClassName(post, add, writeback)
                else:
                    className = loadRegClassName(post, add, writeback, \
                                                 size=size, sign=sign, \
                                                 user=user)
            else:
                if d:
                    className = storeDoubleRegClassName(post, add, writeback)
                else:
                    className = storeRegClassName(post, add, writeback, \
                                                  size=size, sign=sign, \
                                                  user=user)
            decode += ("%s(machInst, %s, RN, %s, 0, LSL, RM);\n" % \
                       (className, dests, addStr))
        return decode

    def decodePuiw(load, d, size=4, sign=False):
        global decodePuiwCase
        decode = "switch (puiw) {\n"
        for p in (0, 1):
            for u in (0, 1):
                for i in (0, 1):
                    for w in (0, 1):
                        decode += decodePuiwCase(load, d, p, u, i, w,
                                                 size, sign)
        decode += '''
          default:
            return new Unknown(machInst);
        }
        '''
        return decode

    subs = {
        "ldrh" : decodePuiw(True, False, size=2),
        "strh" : decodePuiw(False, False, size=2),
        "ldrsb" : decodePuiw(True, False, size=1, sign=True),
        "ldrd" : decodePuiw(True, True),
        "ldrsh" : decodePuiw(True, False, size=2, sign=True),
        "strd" : decodePuiw(False, True)
    }
    decode_block = decode % subs
}};

def format ArmSyncMem() {{
    decode_block = '''
    {
        const RegIndex rn = (RegIndex)(uint32_t)bits(machInst, 19, 16);
        const RegIndex rt = (RegIndex)(uint32_t)bits(machInst, 15, 12);
        const RegIndex rt2 = (RegIndex)(uint32_t)bits(machInst, 3, 0);

        const auto type_L = bits(machInst, 22, 20);
        const auto ex_ord = bits(machInst, 9, 8);
        const auto dec_fields = (type_L << 2) | ex_ord;

        switch (dec_fields) {
          case 0x00:
            return new %(stl)s(machInst, rt, rn, true, 0);
          case 0x02:
            return new %(stlex)s(machInst, rt, rt2, rn, true, 0);
          case 0x03:
            return new %(strex)s(machInst, rt, rt2, rn, true, 0);
          case 0x04:
            return new %(lda)s(machInst, rt, rn, true, 0);
          case 0x06:
            return new %(ldaex)s(machInst, rt, rn, true, 0);
          case 0x07:
            return new %(ldrex)s(machInst, rt, rn, true, 0);
          case 0x0a:
            return new %(stlexd)s(machInst, rt, rt2, rt2 + 1, rn, true, 0);
          case 0x0b:
            return new %(strexd)s(machInst, rt, rt2, rt2 + 1, rn, true, 0);
          case 0x0e:
            return new %(ldaexd)s(machInst, rt, rt + 1, rn, true, 0);
          case 0x0f:
            return new %(ldrexd)s(machInst, rt, rt + 1, rn, true, 0);
          case 0x10:
            return new %(stlb)s(machInst, rt, rn, true, 0);
          case 0x12:
            return new %(stlexb)s(machInst, rt, rt2, rn, true, 0);
          case 0x13:
            return new %(strexb)s(machInst, rt, rt2, rn, true, 0);
          case 0x14:
            return new %(ldab)s(machInst, rt, rn, true, 0);
          case 0x16:
            return new %(ldaexb)s(machInst, rt, rn, true, 0);
          case 0x17:
            return new %(ldrexb)s(machInst, rt, rn, true, 0);
          case 0x18:
            return new %(stlh)s(machInst, rt, rn, true, 0);
          case 0x1a:
            return new %(stlexh)s(machInst, rt, rt2, rn, true, 0);
          case 0x1b:
            return new %(strexh)s(machInst, rt, rt2, rn, true, 0);
          case 0x1c:
            return new %(ldah)s(machInst, rt, rn, true, 0);
          case 0x1e:
            return new %(ldaexh)s(machInst, rt, rn, true, 0);
          case 0x1f:
            return new %(ldrexh)s(machInst, rt, rn, true, 0);
          default:
            return new Unknown(machInst);
        }
    }
    ''' % {
        "ldrex" : "LDREX_" + loadImmClassName(False, True, False, size=4),
        "ldrexb" : "LDREXB_" + loadImmClassName(False, True, False, size=1),
        "ldrexh" : "LDREXH_" + loadImmClassName(False, True, False, size=2),
        "ldrexd" : "LDREXD_" + loadDoubleImmClassName(False, True, False),
        "strex" : "STREX_" + storeImmClassName(False, True, False, size=4),
        "strexb" : "STREXB_" + storeImmClassName(False, True, False, size=1),
        "strexh" : "STREXH_" + storeImmClassName(False, True, False, size=2),
        "strexd" : "STREXD_" + storeDoubleImmClassName(False, True, False),

        "lda" : "LDA_" + loadImmClassName(False, True, False, size=4),
        "ldab" : "LDAB_" + loadImmClassName(False, True, False, size=1),
        "ldah" : "LDAH_" + loadImmClassName(False, True, False, size=2),
        "ldaex" : "LDAEX_" + loadImmClassName(False, True, False, size=4),
        "ldaexb" : "LDAEXB_" + loadImmClassName(False, True, False, size=1),
        "ldaexh" : "LDAEXH_" + loadImmClassName(False, True, False, size=2),
        "ldaexd" : "LDAEXD_" + loadDoubleImmClassName(False, True, False),

        "stl" : "STL_" + storeImmClassName(False, True, False, size=4),
        "stlb" : "STLB_" + storeImmClassName(False, True, False, size=1),
        "stlh" : "STLH_" + storeImmClassName(False, True, False, size=2),
        "stlex" : "STLEX_" + storeImmClassName(False, True, False, size=4),
        "stlexb" : "STLEXB_" + storeImmClassName(False, True, False, size=1),
        "stlexh" : "STLEXH_" + storeImmClassName(False, True, False, size=2),
        "stlexd" : "STLEXD_" + storeDoubleImmClassName(False, True, False)
    }
}};

def format Thumb32SrsRfe() {{
    decode_block = '''
    {
        const bool wb = (bits(machInst, 21) == 1);
        const bool add = (bits(machInst, 24, 23) == 0x3);
        if (bits(machInst, 20) == 1) {
            // post == add
            const RegIndex rn =
                (RegIndex)(uint32_t)bits(machInst, 19, 16);
            if (!add && !wb) {
                return new %(rfe)s(machInst, rn, RfeOp::DecrementBefore, wb);
            } else if (add && !wb) {
                return new %(rfe_u)s(machInst, rn, RfeOp::IncrementAfter, wb);
            } else if (!add && wb) {
                return new %(rfe_w)s(machInst, rn, RfeOp::DecrementBefore, wb);
            } else {
                return new %(rfe_uw)s(machInst, rn, RfeOp::IncrementAfter, wb);
            }
        } else {
            const uint32_t mode = bits(machInst, 4, 0);
            // We check at decode stage if the mode exists even
            // if the checking is re-done by Srs::execute.
            // This is done because we will otherwise panic if
            // trying to read the banked stack pointer of an
            // unrecognized mode.
            if (unknownMode32((OperatingMode)mode))
                return new Unknown(machInst);
            if (!add && !wb) {
                return new %(srs)s(machInst, mode,
                        SrsOp::DecrementBefore, wb);
            } else if (add && !wb) {
                return new %(srs_u)s(machInst, mode,
                        SrsOp::IncrementAfter, wb);
            } else if (!add && wb) {
                return new %(srs_w)s(machInst, mode,
                        SrsOp::DecrementBefore, wb);
            } else {
                return new %(srs_uw)s(machInst, mode,
                        SrsOp::IncrementAfter, wb);
            }
        }
    }
    ''' % {
        "rfe" : "RFE_" + loadImmClassName(False, False, False, 8),
        "rfe_u" : "RFE_" + loadImmClassName(True, True, False, 8),
        "rfe_w" : "RFE_" + loadImmClassName(False, False, True, 8),
        "rfe_uw" : "RFE_" + loadImmClassName(True, True, True, 8),
        "srs" : "SRS_" + storeImmClassName(False, False, False, 8),
        "srs_u" : "SRS_" + storeImmClassName(True, True, False, 8),
        "srs_w" : "SRS_" + storeImmClassName(False, False, True, 8),
        "srs_uw" : "SRS_" + storeImmClassName(True, True, True, 8)
    }
}};

def format Thumb32LdrStrDExTbh() {{
    decode_block = '''
    {
        const uint32_t op1 = bits(machInst, 24, 23);
        const uint32_t op2 = bits(machInst, 21, 20);
        const uint32_t op3 = bits(machInst, 7, 4);
        const RegIndex rn = (RegIndex)(uint32_t)bits(machInst, 19, 16);
        const RegIndex rt = (RegIndex)(uint32_t)bits(machInst, 15, 12);
        const RegIndex rt2 = (RegIndex)(uint32_t)bits(machInst, 11, 8);
        const RegIndex rd = (RegIndex)(uint32_t)bits(machInst, 3, 0);
        const uint32_t imm8 = bits(machInst, 7, 0);
        if (bits(op1, 1) == 0 && bits(op2, 1) == 0) {
            if (op1 == 0) {
                const uint32_t imm = bits(machInst, 7, 0) << 2;
                if (op2 == 0) {
                    return new %(strex)s(machInst, rt2, rt, rn, true, imm);
                } else {
                    return new %(ldrex)s(machInst, rt, rn, true, imm);
                }
            } else {
                if (op2 == 0) {
                    switch (op3) {
                      case 0x4:
                        return new %(strexb)s(machInst, rd, rt, rn, true, 0);
                      case 0x5:
                        return new %(strexh)s(machInst, rd, rt, rn, true, 0);
                      case 0x7:
                        return new %(strexd)s(machInst, rd, rt,
                                              rt2, rn, true, 0);
                      case 0x8:
                        return new %(stlb)s(machInst, rt, rn, true, 0);
                      case 0x9:
                        return new %(stlh)s(machInst, rt, rn, true, 0);
                      case 0xa:
                        return new %(stl)s(machInst, rt, rn, true, 0);
                      case 0xc:
                        return new %(stlexb)s(machInst, rd, rt, rn, true, 0);
                      case 0xd:
                        return new %(stlexh)s(machInst, rd, rt, rn, true, 0);
                      case 0xe:
                        return new %(stlex)s(machInst, rd, rt, rn, true, 0);
                      case 0xf:
                        return new %(stlexd)s(machInst, rd, rt,
                                              rt2, rn, true, 0);
                      default:
                        return new Unknown(machInst);
                    }
                } else {
                    switch (op3) {
                      case 0x0:
                        return new Tbb(machInst, rn, rd);
                      case 0x1:
                        return new Tbh(machInst, rn, rd);
                      case 0x4:
                        return new %(ldrexb)s(machInst, rt, rn, true, 0);
                      case 0x5:
                        return new %(ldrexh)s(machInst, rt, rn, true, 0);
                      case 0x7:
                        return new %(ldrexd)s(machInst, rt, rt2, rn, true, 0);
                      case 0x8:
                        return new %(ldab)s(machInst, rt, rn, true, 0);
                      case 0x9:
                        return new %(ldah)s(machInst, rt, rn, true, 0);
                      case 0xa:
                        return new %(lda)s(machInst, rt, rn, true, 0);
                      case 0xc:
                        return new %(ldaexb)s(machInst, rt, rn, true, 0);
                      case 0xd:
                        return new %(ldaexh)s(machInst, rt, rn, true, 0);
                      case 0xe:
                        return new %(ldaex)s(machInst, rt, rn, true, 0);
                      case 0xf:
                        return new %(ldaexd)s(machInst, rt, rt2, rn, true, 0);
                      default:
                        return new Unknown(machInst);
                    }
                }
            }
        } else {
            const uint32_t puw = (bits(machInst, 24, 23) << 1) |
                                  bits(machInst, 21);
            const uint32_t dimm = imm8 << 2;
            if (bits(op2, 0) == 0) {
                switch (puw) {
                  case 0x1:
                    return new %(strd_w)s(machInst, rt, rt2, rn, false, dimm);
                  case 0x3:
                    return new %(strd_uw)s(machInst, rt, rt2, rn, true, dimm);
                  case 0x4:
                    return new %(strd_p)s(machInst, rt, rt2, rn, false, dimm);
                  case 0x5:
                    return new %(strd_pw)s(machInst, rt, rt2, rn, false, dimm);
                  case 0x6:
                    return new %(strd_pu)s(machInst, rt, rt2, rn, true, dimm);
                  case 0x7:
                    return new %(strd_puw)s(machInst, rt, rt2, rn, true, dimm);
                  default:
                    return new Unknown(machInst);
                }
            } else {
                switch (puw) {
                  case 0x1:
                    return new %(ldrd_w)s(machInst, rt, rt2, rn, false, dimm);
                  case 0x3:
                    return new %(ldrd_uw)s(machInst, rt, rt2, rn, true, dimm);
                  case 0x4:
                    return new %(ldrd_p)s(machInst, rt, rt2, rn, false, dimm);
                  case 0x5:
                    return new %(ldrd_pw)s(machInst, rt, rt2, rn, false, dimm);
                  case 0x6:
                    return new %(ldrd_pu)s(machInst, rt, rt2, rn, true, dimm);
                  case 0x7:
                    return new %(ldrd_puw)s(machInst, rt, rt2, rn, true, dimm);
                  default:
                    return new Unknown(machInst);
                }
            }
        }
    }
    ''' % {
        "ldrex" : "LDREX_" + loadImmClassName(False, True, False, size=4),
        "ldrexb" : "LDREXB_" + loadImmClassName(False, True, False, size=1),
        "ldrexh" : "LDREXH_" + loadImmClassName(False, True, False, size=2),
        "ldrexd" : "LDREXD_" + loadDoubleImmClassName(False, True, False),
        "strex" : "STREX_" + storeImmClassName(False, True, False, size=4),
        "strexb" : "STREXB_" + storeImmClassName(False, True, False, size=1),
        "strexh" : "STREXH_" + storeImmClassName(False, True, False, size=2),
        "strexd" : "STREXD_" + storeDoubleImmClassName(False, True, False),
        "ldrd_w" : loadDoubleImmClassName(True, False, True),
        "ldrd_uw" : loadDoubleImmClassName(True, True, True),
        "ldrd_p" : loadDoubleImmClassName(False, False, False),
        "ldrd_pw" : loadDoubleImmClassName(False, False, True),
        "ldrd_pu" : loadDoubleImmClassName(False, True, False),
        "ldrd_puw" : loadDoubleImmClassName(False, True, True),
        "strd_w" : storeDoubleImmClassName(True, False, True),
        "strd_uw" : storeDoubleImmClassName(True, True, True),
        "strd_p" : storeDoubleImmClassName(False, False, False),
        "strd_pw" : storeDoubleImmClassName(False, False, True),
        "strd_pu" : storeDoubleImmClassName(False, True, False),
        "strd_puw" : storeDoubleImmClassName(False, True, True),

        "stl" : "STL_" + storeImmClassName(False, True, False, size=4),
        "stlh" : "STLH_" + storeImmClassName(False, True, False, size=2),
        "stlb" : "STLB_" + storeImmClassName(False, True, False, size=1),
        "stlex" : "STLEX_" + storeImmClassName(False, True, False, size=4),
        "stlexh" : "STLEXH_" + storeImmClassName(False, True, False, size=2),
        "stlexb" : "STLEXB_" + storeImmClassName(False, True, False, size=1),
        "stlexd" : "STLEXD_" + storeDoubleImmClassName(False, True, False),
        "lda" : "LDA_" + loadImmClassName(False, True, False, size=4),
        "ldah" : "LDAH_" + loadImmClassName(False, True, False, size=2),
        "ldab" : "LDAB_" + loadImmClassName(False, True, False, size=1),
        "ldaex" : "LDAEX_" + loadImmClassName(False, True, False, size=4),
        "ldaexh" : "LDAEXH_" + loadImmClassName(False, True, False, size=2),
        "ldaexb" : "LDAEXB_" + loadImmClassName(False, True, False, size=1),
        "ldaexd" : "LDAEXD_" + loadDoubleImmClassName(False, True, False)
    }
}};

def format Thumb32LoadWord() {{
    decode = '''
    {
        uint32_t op1 = bits(machInst, 24, 23);
        if (bits(op1, 1) == 0) {
            uint32_t op2 = bits(machInst, 11, 6);
            if (HTRN == 0xF) {
                if (UP) {
                    return new %(literal_u)s(machInst, RT, int_reg::Pc,
                                             true, IMMED_11_0);
                } else {
                    return new %(literal)s(machInst, RT, int_reg::Pc,
                                           false, IMMED_11_0);
                }
            } else if (op1 == 0x1) {
                return new %(imm_pu)s(machInst, RT, RN, true, IMMED_11_0);
            } else if (op2 == 0) {
                return new %(register)s(machInst, RT, RN, UP,
                                        bits(machInst, 5, 4), LSL, RM);
            } else if ((op2 & 0x3c) == 0x38) {
                return new %(ldrt)s(machInst, RT, RN, true, IMMED_7_0);
            } else if ((op2 & 0x3c) == 0x30 || //P
                       (op2 & 0x24) == 0x24) { //W
                uint32_t puw = bits(machInst, 10, 8);
                uint32_t imm = IMMED_7_0;
                switch (puw) {
                  case 0:
                  case 2:
                    // If we're here, either P or W must have been set.
                    panic("Neither P or W set, but that "
                            "shouldn't be possible.\\n");
                  case 1:
                    return new %(imm_w)s(machInst, RT, RN, false, imm);
                  case 3:
                    return new %(imm_uw)s(machInst, RT, RN, true, imm);
                  case 4:
                    return new %(imm_p)s(machInst, RT, RN, false, imm);
                  case 5:
                    return new %(imm_pw)s(machInst, RT, RN, false, imm);
                  case 6:
                    return new %(imm_pu)s(machInst, RT, RN, true, imm);
                  case 7:
                    return new %(imm_puw)s(machInst, RT, RN, true, imm);
                }
            }
          return new Unknown(machInst);
        } else {
            return new Unknown(machInst);
        }
    }
    '''
    classNames = {
        "literal_u" : loadImmClassName(False, True, False),
        "literal" : loadImmClassName(False, False, False),
        "register" : loadRegClassName(False, True, False),
        "ldrt" : loadImmClassName(False, True, False, user=True),
        "imm_w" : loadImmClassName(True, False, True),
        "imm_uw" : loadImmClassName(True, True, True),
        "imm_p" : loadImmClassName(False, False, False),
        "imm_pw" : loadImmClassName(False, False, True),
        "imm_pu" : loadImmClassName(False, True, False),
        "imm_puw" : loadImmClassName(False, True, True)
    }
    decode_block = decode % classNames
}};

def format Thumb32StoreSingle() {{
    def buildPuwDecode(size):
        puwDecode = '''
                {
                    uint32_t puw = bits(machInst, 10, 8);
                    uint32_t imm = IMMED_7_0;
                    switch (puw) {
                      case 0:
                      case 2:
                        // If we're here, either P or W must have been set.
                        panic("Neither P or W set, but that "
                                "shouldn't be possible.\\n");
                      case 1:
                        return new %(imm_w)s(machInst, RT, RN, false, imm);
                      case 3:
                        return new %(imm_uw)s(machInst, RT, RN, true, imm);
                      case 4:
                        return new %(imm_p)s(machInst, RT, RN, false, imm);
                      case 5:
                        return new %(imm_pw)s(machInst, RT, RN, false, imm);
                      case 6:
                        return new %(imm_pu)s(machInst, RT, RN, true, imm);
                      case 7:
                        return new %(imm_puw)s(machInst, RT, RN, true, imm);
                      default:
                        GEM5_UNREACHABLE;
                    }
                }
        '''
        return puwDecode % {
            "imm_w" : storeImmClassName(True, False, True, size=size),
            "imm_uw" : storeImmClassName(True, True, True, size=size),
            "imm_p" : storeImmClassName(False, False, False, size=size),
            "imm_pw" : storeImmClassName(False, False, True, size=size),
            "imm_pu" : storeImmClassName(False, True, False, size=size),
            "imm_puw" : storeImmClassName(False, True, True, size=size)
        }
    decode = '''
    {
        uint32_t op1 = bits(machInst, 23, 21);
        uint32_t op2 = bits(machInst, 11, 6);
        bool op2Puw = ((op2 & 0x24) == 0x24 ||
                       (op2 & 0x3c) == 0x30);
        if (RN == 0xf) {
            return new Unknown(machInst);
        }
        if (op1 == 4) {
            return new %(strb_imm)s(machInst, RT, RN, true, IMMED_11_0);
        } else if (op1 == 0 && op2Puw) {
            %(strb_puw)s;
        } else if (op1 == 0 && ((op2 & 0x3c) == 0x38)) {
            return new %(strbt)s(machInst, RT, RN, true, IMMED_7_0);
        } else if (op1 == 0 && op2 == 0) {
            return new %(strb_reg)s(machInst, RT, RN, true,
                                    bits(machInst, 5, 4), LSL, RM);
        } else if (op1 == 5) {
            return new %(strh_imm)s(machInst, RT, RN, true, IMMED_11_0);
        } else if (op1 == 1 && op2Puw) {
            %(strh_puw)s;
        } else if (op1 == 1 && ((op2 & 0x3c) == 0x38)) {
            return new %(strht)s(machInst, RT, RN, true, IMMED_7_0);
        } else if (op1 == 1 && op2 == 0) {
            return new %(strh_reg)s(machInst, RT, RN, true,
                                    bits(machInst, 5, 4), LSL, RM);
        } else if (op1 == 6) {
            return new %(str_imm)s(machInst, RT, RN, true, IMMED_11_0);
        } else if (op1 == 2 && op2Puw) {
            %(str_puw)s;
        } else if (op1 == 2 && ((op2 & 0x3c) == 0x38)) {
            return new %(strt)s(machInst, RT, RN, true, IMMED_7_0);
        } else if (op1 == 2 && op2 == 0) {
            return new %(str_reg)s(machInst, RT, RN, true,
                                   bits(machInst, 5, 4), LSL, RM);
        } else {
            return new Unknown(machInst);
        }
    }
    '''
    classNames = {
        "strb_imm" : storeImmClassName(False, True, False, size=1),
        "strb_puw" : buildPuwDecode(1),
        "strbt" : storeImmClassName(False, True, False, user=True, size=1),
        "strb_reg" : storeRegClassName(False, True, False, size=1),
        "strh_imm" : storeImmClassName(False, True, False, size=2),
        "strh_puw" : buildPuwDecode(2),
        "strht" : storeImmClassName(False, True, False, user=True, size=2),
        "strh_reg" : storeRegClassName(False, True, False, size=2),
        "str_imm" : storeImmClassName(False, True, False),
        "str_puw" : buildPuwDecode(4),
        "strt" : storeImmClassName(False, True, False, user=True),
        "str_reg" : storeRegClassName(False, True, False)
    }
    decode_block = decode % classNames
}};

def format LoadByteMemoryHints() {{
    decode = '''
    {
        const uint32_t op1 = bits(machInst, 24, 23);
        const uint32_t op2 = bits(machInst, 11, 6);
        const RegIndex rn = (RegIndex)(uint32_t)bits(machInst, 19, 16);
        const RegIndex rt = (RegIndex)(uint32_t)bits(machInst, 15, 12);
        const RegIndex rm = (RegIndex)(uint32_t)bits(machInst, 3, 0);
        const uint32_t imm12 = bits(machInst, 11, 0);
        const uint32_t imm8 = bits(machInst, 7, 0);
        bool pldw = bits(machInst, 21);
        const uint32_t imm2 = bits(machInst, 5, 4);
        if (rn == 0xf) {
            if (rt == 0xf) {
                const bool add = bits(machInst, 23);
                if (bits(op1, 1) == 1) {
                    if (add) {
                        return new %(pli_iulit)s(machInst, int_reg::Zero,
                                                 int_reg::Pc, true, imm12);
                    } else {
                        return new %(pli_ilit)s(machInst, int_reg::Zero,
                                                int_reg::Pc, false, imm12);
                    }
                } else {
                    if (add) {
                        return new %(pld_iulit)s(machInst, int_reg::Zero,
                                                 int_reg::Pc, true, imm12);
                    } else {
                        return new %(pld_ilit)s(machInst, int_reg::Zero,
                                                int_reg::Pc, false, imm12);
                    }
                }
            } else {
                if (bits(op1, 1) == 1) {
                    if (bits(machInst, 23)) {
                        return new %(ldrsb_lit_u)s(machInst, rt, int_reg::Pc,
                                                   true, imm12);
                    } else {
                        return new %(ldrsb_lit)s(machInst, rt, int_reg::Pc,
                                                 false, imm12);
                    }
                } else {
                    if (bits(machInst, 23)) {
                        return new %(ldrb_lit_u)s(machInst, rt, int_reg::Pc,
                                                  true, imm12);
                    } else {
                        return new %(ldrb_lit)s(machInst, rt, int_reg::Pc,
                                                false, imm12);
                    }
                }
            }
        } else if (rt == 0xf) {
            switch (op1) {
              case 0x0:
                if (op2 == 0x0) {
                    if (pldw) {
                        return new %(pldw_radd)s(machInst, int_reg::Zero,
                                                 rn, true, imm2, LSL, rm);
                    } else {
                        return new %(pld_radd)s(machInst, int_reg::Zero,
                                                rn, true, imm2, LSL, rm);
                    }
                } else if (bits(op2, 5, 2) == 0xc) {
                    if (pldw) {
                        return new %(pldw_isub)s(machInst, int_reg::Zero,
                                                 rn, false, imm8);
                    } else {
                        return new %(pld_isub)s(machInst, int_reg::Zero,
                                                rn, false, imm8);
                    }
                }
                break;
              case 0x1:
                if (pldw) {
                    return new %(pldw_iadd)s(machInst, int_reg::Zero,
                                             rn, true, imm12);
                } else {
                    return new %(pld_iadd)s(machInst, int_reg::Zero,
                                            rn, true, imm12);
                }
              case 0x2:
                if (op2 == 0x0) {
                    return new %(pli_radd)s(machInst, int_reg::Zero, rn,
                                            true, imm2, LSL, rm);
                } else if (bits(op2, 5, 2) == 0xc) {
                    return new %(pli_ilit)s(machInst, int_reg::Zero,
                                            int_reg::Pc, false, imm8);
                }
                break;
              case 0x3:
                return new %(pli_iulit)s(machInst, int_reg::Zero,
                                        int_reg::Pc, true, imm12);
            }
            return new Unknown(machInst);
        } else {
            switch (op1) {
              case 0x0:
                if (op2 == 0) {
                    return new %(ldrb_radd)s(machInst, rt, rn, true,
                                             imm2, LSL, rm);
                } else if (bits(op2, 5, 2) == 0xe) {
                    return new %(ldrbt)s(machInst, rt, rn, true, imm8);
                } else if ((op2 & 0x24) == 0x24 || bits(op2, 5, 2) == 0xc) {
                    const uint32_t puw = bits(machInst, 10, 8);
                    switch (puw) {
                      case 0x1:
                        return new %(ldrb_iw)s(machInst, rt,
                                               rn, false, imm8);
                      case 0x3:
                        return new %(ldrb_iuw)s(machInst, rt,
                                                rn, true, imm8);
                      case 0x4:
                        return new %(ldrb_ip)s(machInst, rt,
                                               rn, false, imm8);
                      case 0x5:
                        return new %(ldrb_ipw)s(machInst, rt,
                                                rn, false, imm8);
                      case 0x7:
                        return new %(ldrb_ipuw)s(machInst, rt,
                                                 rn, true, imm8);
                    }
                }
                break;
              case 0x1:
                return new %(ldrb_iadd)s(machInst, rt, rn, true, imm12);
              case 0x2:
                if (op2 == 0) {
                    return new %(ldrsb_radd)s(machInst, rt, rn, true,
                                              imm2, LSL, rm);
                } else if (bits(op2, 5, 2) == 0xe) {
                    return new %(ldrsbt)s(machInst, rt, rn, true, imm8);
                } else if ((op2 & 0x24) == 0x24 || bits(op2, 5, 2) == 0xc) {
                    const uint32_t puw = bits(machInst, 10, 8);
                    switch (puw) {
                      case 0x1:
                        return new %(ldrsb_iw)s(machInst, rt,
                                                rn, false, imm8);
                      case 0x3:
                        return new %(ldrsb_iuw)s(machInst, rt,
                                                 rn, true, imm8);
                      case 0x4:
                        return new %(ldrsb_ip)s(machInst, rt,
                                                rn, false, imm8);
                      case 0x5:
                        return new %(ldrsb_ipw)s(machInst, rt,
                                                 rn, false, imm8);
                      case 0x7:
                        return new %(ldrsb_ipuw)s(machInst, rt,
                                                  rn, true, imm8);
                    }
                }
                break;
              case 0x3:
                return new %(ldrsb_iadd)s(machInst, rt, rn, true, imm12);
            }
            return new Unknown(machInst);
        }
    }
    '''
    substDict = {
        "ldrsb_lit_u" : loadImmClassName(False, True, False, 1, True),
        "ldrsb_lit" : loadImmClassName(False, False, False, 1, True),
        "ldrb_lit_u" : loadImmClassName(False, True, False, 1),
        "ldrb_lit" : loadImmClassName(False, False, False, 1),
        "ldrsb_radd" : loadRegClassName(False, True, False, 1, True),
        "ldrb_radd" : loadRegClassName(False, True, False, 1),
        "ldrsb_iw" : loadImmClassName(True, False, True, 1, True),
        "ldrsb_iuw" : loadImmClassName(True, True, True, 1, True),
        "ldrsb_ip" : loadImmClassName(False, False, False, 1, True),
        "ldrsb_ipw" : loadImmClassName(False, False, True, 1, True),
        "ldrsb_ipuw" : loadImmClassName(False, True, True, 1, True),
        "ldrsb_iadd" : loadImmClassName(False, True, False, 1, True),
        "ldrb_iw" : loadImmClassName(True, False, True, 1),
        "ldrb_iuw" : loadImmClassName(True, True, True, 1),
        "ldrb_ip" : loadImmClassName(False, False, False, 1),
        "ldrb_ipw" : loadImmClassName(False, False, True, 1),
        "ldrb_ipuw" : loadImmClassName(False, True, True, 1),
        "ldrb_iadd" : loadImmClassName(False, True, False, 1),
        "ldrbt" : loadImmClassName(False, True, False, 1, user=True),
        "ldrsbt" : loadImmClassName(False, True, False, 1, True, user=True),
        "pldw_radd" : "PLDW_" + loadRegClassName(False, True, False, 1),
        "pld_radd" : "PLD_" + loadRegClassName(False, True, False, 1),
        "pldw_isub" : "PLDW_" + loadImmClassName(False, False, False, 1),
        "pld_isub" : "PLD_" + loadImmClassName(False, False, False, 1),
        "pldw_iadd" : "PLDW_" + loadImmClassName(False, True, False, 1),
        "pld_iadd" : "PLD_" + loadImmClassName(False, True, False, 1),
        "pld_iulit" : "PLD_" + loadImmClassName(False, True, False, 1),
        "pld_ilit" : "PLD_" + loadImmClassName(False, False, False, 1),
        "pli_iulit" : "PLI_" + loadImmClassName(False, True, False, 1),
        "pli_ilit" : "PLI_" + loadImmClassName(False, False, False, 1),
        "pli_radd" : "PLI_" + loadRegClassName(False, True, False, 1),
        "pli_iulit" : "PLI_" + loadImmClassName(False, True, False, 1),
        "pli_ilit" : "PLI_" + loadImmClassName(False, False, False, 1)
    }
    decode_block = decode % substDict
}};

def format LoadHalfwordMemoryHints() {{
    decode = '''
    {
        const uint32_t op1 = bits(machInst, 24, 23);
        const uint32_t op2 = bits(machInst, 11, 6);
        const RegIndex rn = (RegIndex)(uint32_t)bits(machInst, 19, 16);
        const RegIndex rt = (RegIndex)(uint32_t)bits(machInst, 15, 12);
        const RegIndex rm = (RegIndex)(uint32_t)bits(machInst, 3, 0);
        const uint32_t imm12 = bits(machInst, 11, 0);
        const uint32_t imm8 = bits(machInst, 7, 0);
        bool pldw = bits(machInst, 21);
        const uint32_t imm2 = bits(machInst, 5, 4);
        if (rn == 0xf) {
            if (rt == 0xf) {
                if (bits(op1, 1) == 1) {
                    // Unallocated memory hint
                    return new NopInst(machInst);
                } else {
                    return new Unknown(machInst);
                }
            } else {
                if (bits(op1, 1) == 1) {
                    if (bits(machInst, 23)) {
                        return new %(ldrsh_lit_u)s(machInst, rt, int_reg::Pc,
                                                   true, imm12);
                    } else {
                        return new %(ldrsh_lit)s(machInst, rt, int_reg::Pc,
                                                 false, imm12);
                    }
                } else {
                    if (bits(machInst, 23)) {
                        return new %(ldrh_lit_u)s(machInst, rt, int_reg::Pc,
                                                  true, imm12);
                    } else {
                        return new %(ldrh_lit)s(machInst, rt, int_reg::Pc,
                                                false, imm12);
                    }
                }
            }
        } else if (rt == 0xf) {
            switch (op1) {
              case 0x0:
                if (op2 == 0x0) {
                    if (pldw) {
                        return new %(pldw_radd)s(machInst, int_reg::Zero,
                                                 rn, true, imm2, LSL, rm);
                    } else {
                        return new %(pld_radd)s(machInst, int_reg::Zero,
                                                rn, true, imm2, LSL, rm);
                    }
                } else if (bits(op2, 5, 2) == 0xc) {
                    if (pldw) {
                        return new %(pldw_isub)s(machInst, int_reg::Zero,
                                                 rn, false, imm8);
                    } else {
                        return new %(pld_isub)s(machInst, int_reg::Zero,
                                                rn, false, imm8);
                    }
                }
                break;
              case 0x1:
                if (pldw) {
                    return new %(pldw_iadd)s(machInst, int_reg::Zero,
                                             rn, true, imm12);
                } else {
                    return new %(pld_iadd)s(machInst, int_reg::Zero,
                                            rn, true, imm12);
                }
              case 0x2:
                if (op2 == 0x0 || bits(op2, 5, 2) == 0xc) {
                    // Unallocated memory hint
                    return new NopInst(machInst);
                }
                break;
              case 0x3:
                return new NopInst(machInst);
            }
            return new Unknown(machInst);
        } else {
            switch (op1) {
              case 0x0:
                if (op2 == 0) {
                    return new %(ldrh_radd)s(machInst, rt, rn, true,
                                             imm2, LSL, rm);
                } else if (bits(op2, 5, 2) == 0xe) {
                    return new %(ldrht)s(machInst, rt, rn, true, imm8);
                } else if ((op2 & 0x24) == 0x24 || bits(op2, 5, 2) == 0xc) {
                    const uint32_t puw = bits(machInst, 10, 8);
                    switch (puw) {
                      case 0x1:
                        return new %(ldrh_iw)s(machInst, rt,
                                               rn, false, imm8);
                      case 0x3:
                        return new %(ldrh_iuw)s(machInst, rt,
                                                rn, true, imm8);
                      case 0x4:
                        return new %(ldrh_ip)s(machInst, rt,
                                               rn, false, imm8);
                      case 0x5:
                        return new %(ldrh_ipw)s(machInst, rt,
                                                rn, false, imm8);
                      case 0x7:
                        return new %(ldrh_ipuw)s(machInst, rt,
                                                 rn, true, imm8);
                    }
                }
                break;
              case 0x1:
                return new %(ldrh_iadd)s(machInst, rt, rn, true, imm12);
              case 0x2:
                if (op2 == 0) {
                    return new %(ldrsh_radd)s(machInst, rt, rn, true,
                                              imm2, LSL, rm);
                } else if (bits(op2, 5, 2) == 0xe) {
                    return new %(ldrsht)s(machInst, rt, rn, true, imm8);
                } else if ((op2 & 0x24) == 0x24 || bits(op2, 5, 2) == 0xc) {
                    const uint32_t puw = bits(machInst, 10, 8);
                    switch (puw) {
                      case 0x1:
                        return new %(ldrsh_iw)s(machInst, rt,
                                                rn, false, imm8);
                      case 0x3:
                        return new %(ldrsh_iuw)s(machInst, rt,
                                                 rn, true, imm8);
                      case 0x4:
                        return new %(ldrsh_ip)s(machInst, rt,
                                                rn, false, imm8);
                      case 0x5:
                        return new %(ldrsh_ipw)s(machInst, rt,
                                                 rn, false, imm8);
                      case 0x7:
                        return new %(ldrsh_ipuw)s(machInst, rt,
                                                  rn, true, imm8);
                    }
                }
                break;
              case 0x3:
                return new %(ldrsh_iadd)s(machInst, rt, rn, true, imm12);
            }
            return new Unknown(machInst);
        }
    }
    '''
    substDict = {
        "ldrsh_lit_u" : loadImmClassName(False, True, False, 2, True),
        "ldrsh_lit" : loadImmClassName(False, False, False, 2, True),
        "ldrh_lit_u" : loadImmClassName(False, True, False, 2),
        "ldrh_lit" : loadImmClassName(False, False, False, 2),
        "ldrsh_radd" : loadRegClassName(False, True, False, 2, True),
        "ldrh_radd" : loadRegClassName(False, True, False, 2),
        "ldrsh_iw" : loadImmClassName(True, False, True, 2, True),
        "ldrsh_iuw" : loadImmClassName(True, True, True, 2, True),
        "ldrsh_ip" : loadImmClassName(False, False, False, 2, True),
        "ldrsh_ipw" : loadImmClassName(False, False, True, 2, True),
        "ldrsh_ipuw" : loadImmClassName(False, True, True, 2, True),
        "ldrsh_iadd" : loadImmClassName(False, True, False, 2, True),
        "ldrh_iw" : loadImmClassName(True, False, True, 2),
        "ldrh_iuw" : loadImmClassName(True, True, True, 2),
        "ldrh_ip" : loadImmClassName(False, False, False, 2),
        "ldrh_ipw" : loadImmClassName(False, False, True, 2),
        "ldrh_ipuw" : loadImmClassName(False, True, True, 2),
        "ldrh_iadd" : loadImmClassName(False, True, False, 2),
        "ldrht" : loadImmClassName(False, True, False, 2, user=True),
        "ldrsht" : loadImmClassName(False, True, False, 2, True, user=True),
        "pldw_radd" : "PLDW_" + loadRegClassName(False, True, False, 1),
        "pld_radd" : "PLD_" + loadRegClassName(False, True, False, 1),
        "pldw_isub" : "PLDW_" + loadImmClassName(False, False, False, 1),
        "pld_isub" : "PLD_" + loadImmClassName(False, False, False, 1),
        "pldw_iadd" : "PLDW_" + loadImmClassName(False, True, False, 1),
        "pld_iadd" : "PLD_" + loadImmClassName(False, True, False, 1)
    }
    decode_block = decode % substDict
}};

def format Thumb16MemReg() {{
    decode = '''
    {
        const uint32_t opb = bits(machInst, 11, 9);
        const uint32_t rt = bits(machInst, 2, 0);
        const uint32_t rn = bits(machInst, 5, 3);
        const uint32_t rm = bits(machInst, 8, 6);
        switch (opb) {
          case 0x0:
            return new %(str)s(machInst, rt, rn, true, 0, LSL, rm);
          case 0x1:
            return new %(strh)s(machInst, rt, rn, true, 0, LSL, rm);
          case 0x2:
            return new %(strb)s(machInst, rt, rn, true, 0, LSL, rm);
          case 0x3:
            return new %(ldrsb)s(machInst, rt, rn, true, 0, LSL, rm);
          case 0x4:
            return new %(ldr)s(machInst, rt, rn, true, 0, LSL, rm);
          case 0x5:
            return new %(ldrh)s(machInst, rt, rn, true, 0, LSL, rm);
          case 0x6:
            return new %(ldrb)s(machInst, rt, rn, true, 0, LSL, rm);
          case 0x7:
            return new %(ldrsh)s(machInst, rt, rn, true, 0, LSL, rm);
          default:
            GEM5_UNREACHABLE;
        }
    }
    '''
    classNames = {
        "str" : storeRegClassName(False, True, False),
        "strh" : storeRegClassName(False, True, False, size=2),
        "strb" : storeRegClassName(False, True, False, size=1),
        "ldrsb" : loadRegClassName(False, True, False, sign=True, size=1),
        "ldr" : loadRegClassName(False, True, False),
        "ldrh" : loadRegClassName(False, True, False, size=2),
        "ldrb" : loadRegClassName(False, True, False, size=1),
        "ldrsh" : loadRegClassName(False, True, False, sign=True, size=2),
    }
    decode_block = decode % classNames
}};

def format Thumb16MemImm() {{
    decode = '''
    {
        const uint32_t opa = bits(machInst, 15, 12);
        const uint32_t opb = bits(machInst, 11, 9);
        const uint32_t lrt = bits(machInst, 2, 0);
        const uint32_t lrn = bits(machInst, 5, 3);
        const uint32_t hrt = bits(machInst, 10, 8);
        const uint32_t imm5 = bits(machInst, 10, 6);
        const uint32_t imm8 = bits(machInst, 7, 0);
        const bool load = bits(opb, 2);
        switch (opa) {
          case 0x6:
            if (load) {
                return new %(ldr)s(machInst, lrt, lrn, true, imm5 << 2);
            } else {
                return new %(str)s(machInst, lrt, lrn, true, imm5 << 2);
            }
          case 0x7:
            if (load) {
                return new %(ldrb)s(machInst, lrt, lrn, true, imm5);
            } else {
                return new %(strb)s(machInst, lrt, lrn, true, imm5);
            }
          case 0x8:
            if (load) {
                return new %(ldrh)s(machInst, lrt, lrn, true, imm5 << 1);
            } else {
                return new %(strh)s(machInst, lrt, lrn, true, imm5 << 1);
            }
          case 0x9:
            if (load) {
                return new %(ldr)s(machInst, hrt, int_reg::Sp, true,
                                   imm8 << 2);
            } else {
                return new %(str)s(machInst, hrt, int_reg::Sp, true,
                                   imm8 << 2);
            }
          default:
            return new Unknown(machInst);
        }
    }
    '''
    classNames = {
        "ldr" : loadImmClassName(False, True, False),
        "str" : storeImmClassName(False, True, False),
        "ldrh" : loadImmClassName(False, True, False, size=2),
        "strh" : storeImmClassName(False, True, False, size=2),
        "ldrb" : loadImmClassName(False, True, False, size=1),
        "strb" : storeImmClassName(False, True, False, size=1),
    }
    decode_block = decode % classNames
}};

def format Thumb16MemLit() {{
    decode_block = '''
    {
        const uint32_t rt = bits(machInst, 10, 8);
        const uint32_t imm8 = bits(machInst, 7, 0);
        return new %s(machInst, rt, int_reg::Pc, true, imm8 << 2);
    }
    ''' % loadImmClassName(False, True, False)
}};

