// 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.

def format ArmUnconditional() {{
    decode_block = '''
    {
        const RegIndex rn = (RegIndex)(uint32_t)bits(machInst, 19, 16);
        const uint32_t op1 = bits(machInst, 27, 20);
        if (bits(op1, 7) == 0) {
            const uint32_t op2 = bits(machInst, 7, 4);
            if (op1 == 0x10) {
                if (bits((uint32_t)rn, 0) == 1 && op2 == 0) {
                    return new Setend(machInst, bits(machInst, 9));
                } else if (bits((uint32_t)rn, 0) == 0 && bits(op2, 1) == 0) {
                    const bool enable = bits(machInst, 19, 18) == 0x2;
                    const uint32_t mods = bits(machInst, 4, 0) |
                                          (bits(machInst, 8, 6) << 5) |
                                          (bits(machInst, 17) << 8) |
                                          ((enable ? 1 : 0) << 9);
                    return new Cps(machInst, mods);
                }
            } else if (bits(op1, 6, 5) == 0x1) {
                return decodeNeonData(machInst);
            } else if (bits(op1, 6, 4) == 0x4) {
                if (bits(op1, 0) == 0) {
                    return decodeNeonMem(machInst);
                } else if (bits(op1, 2, 0) == 1) {
                    // Unallocated memory hint
                    return new NopInst(machInst);
                } else if (bits(op1, 2, 0) == 5) {
                    const bool add = bits(machInst, 23);
                    const uint32_t imm12 = bits(machInst, 11, 0);
                    if (add) {
                        return new %(pli_iadd)s(machInst, int_reg::Zero,
                                                rn, add, imm12);
                    } else {
                        return new %(pli_isub)s(machInst, int_reg::Zero,
                                                rn, add, imm12);
                    }
                }
            } else if (bits(op1, 6, 4) == 0x5) {
                if (bits(op1, 1, 0) == 0x1) {
                    const bool add = bits(machInst, 23);
                    const bool pldw = bits(machInst, 22);
                    const uint32_t imm12 = bits(machInst, 11, 0);
                    if (pldw) {
                        if (add) {
                            return new %(pldw_iadd)s(machInst, int_reg::Zero,
                                                     rn, add, imm12);
                        } else {
                            return new %(pldw_isub)s(machInst, int_reg::Zero,
                                                     rn, add, imm12);
                        }
                    } else {
                        if (add) {
                            return new %(pld_iadd)s(machInst, int_reg::Zero,
                                                    rn, add, imm12);
                        } else {
                            return new %(pld_isub)s(machInst, int_reg::Zero,
                                                    rn, add, imm12);
                        }
                    }
                } else if (op1 == 0x57) {
                    switch (op2) {
                      case 0x1:
                        return new Clrex(machInst);
                      case 0x4:
                        return new Dsb(machInst, 0);
                      case 0x5:
                        return new Dmb(machInst, 0);
                      case 0x6:
                        return new Isb(machInst, 0);
                    }
                }
            } else if (bits(op2, 0) == 0) {
                switch (op1 & 0xf7) {
                  case 0x61:
                    // Unallocated memory hint
                    return new NopInst(machInst);
                  case 0x65:
                    {
                        const uint32_t imm5 = bits(machInst, 11, 7);
                        const uint32_t type = bits(machInst, 6, 5);
                        const bool add = bits(machInst, 23);
                        const RegIndex rm =
                            (RegIndex)(uint32_t)bits(machInst, 3, 0);
                        if (add) {
                            return new %(pli_radd)s(machInst, int_reg::Zero,
                                                    rn, add, imm5, type, rm);
                        } else {
                            return new %(pli_rsub)s(machInst, int_reg::Zero,
                                                    rn, add, imm5, type, rm);
                        }
                    }
                  case 0x71:
                  case 0x75:
                    {
                        const uint32_t imm5 = bits(machInst, 11, 7);
                        const uint32_t type = bits(machInst, 6, 5);
                        const bool add = bits(machInst, 23);
                        const bool pldw = bits(machInst, 22);
                        const RegIndex rm =
                            (RegIndex)(uint32_t)bits(machInst, 3, 0);
                        if (pldw) {
                            if (add) {
                                return new %(pldw_radd)s(machInst,
                                                         int_reg::Zero,
                                                         rn, add, imm5,
                                                         type, rm);
                            } else {
                                return new %(pldw_rsub)s(machInst,
                                                         int_reg::Zero,
                                                         rn, add, imm5,
                                                         type, rm);
                            }
                        } else {
                            if (add) {
                                return new %(pld_radd)s(machInst,
                                                        int_reg::Zero,
                                                        rn, add, imm5,
                                                        type, rm);
                            } else {
                                return new %(pld_rsub)s(machInst,
                                                        int_reg::Zero,
                                                        rn, add, imm5,
                                                        type, rm);
                            }
                        }
                    }
                }
            }
        } else {
            switch (bits(machInst, 26, 25)) {
              case 0x0:
                {
                    const uint32_t val = ((machInst >> 20) & 0x5);
                    if (val == 0x4) {
                        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);
                        switch (bits(machInst, 24, 21)) {
                          case 0x2:
                            return new %(srs)s(machInst, mode,
                                    SrsOp::DecrementAfter, false);
                          case 0x3:
                            return new %(srs_w)s(machInst, mode,
                                    SrsOp::DecrementAfter, true);
                          case 0x6:
                            return new %(srs_u)s(machInst, mode,
                                    SrsOp::IncrementAfter, false);
                          case 0x7:
                            return new %(srs_uw)s(machInst, mode,
                                    SrsOp::IncrementAfter, true);
                          case 0xa:
                            return new %(srs_p)s(machInst, mode,
                                    SrsOp::DecrementBefore, false);
                          case 0xb:
                            return new %(srs_pw)s(machInst, mode,
                                    SrsOp::DecrementBefore, true);
                          case 0xe:
                            return new %(srs_pu)s(machInst, mode,
                                    SrsOp::IncrementBefore, false);
                          case 0xf:
                            return new %(srs_puw)s(machInst, mode,
                                    SrsOp::IncrementBefore, true);
                        }
                        return new Unknown(machInst);
                    } else if (val == 0x1) {
                        switch (bits(machInst, 24, 21)) {
                          case 0x0:
                            return new %(rfe)s(machInst, rn,
                                    RfeOp::DecrementAfter, false);
                          case 0x1:
                            return new %(rfe_w)s(machInst, rn,
                                    RfeOp::DecrementAfter, true);
                          case 0x4:
                            return new %(rfe_u)s(machInst, rn,
                                    RfeOp::IncrementAfter, false);
                          case 0x5:
                            return new %(rfe_uw)s(machInst, rn,
                                    RfeOp::IncrementAfter, true);
                          case 0x8:
                            return new %(rfe_p)s(machInst, rn,
                                    RfeOp::DecrementBefore, false);
                          case 0x9:
                            return new %(rfe_pw)s(machInst, rn,
                                    RfeOp::DecrementBefore, true);
                          case 0xc:
                            return new %(rfe_pu)s(machInst, rn,
                                    RfeOp::IncrementBefore, false);
                          case 0xd:
                            return new %(rfe_puw)s(machInst, rn,
                                    RfeOp::IncrementBefore, true);
                        }
                        return new Unknown(machInst);
                    }
                }
                break;
              case 0x1:
                {
                    const uint32_t imm =
                        (sext<26>(bits(machInst, 23, 0) << 2)) |
                        (bits(machInst, 24) << 1);
                    return new BlxImm(machInst, imm, COND_UC);
                }
              case 0x2:
                if (bits(machInst, 31, 25) == 0x7e){
                    return decodeAdvancedSIMD(machInst);
                } else if (bits(op1, 4, 0) != 0) {
                    if (CPNUM == 0xa || CPNUM == 0xb) {
                        return decodeExtensionRegLoadStore(machInst);
                    }
                    if (bits(op1, 0) == 1) {
                        if (rn == int_reg::Pc) {
                            if (bits(op1, 4, 3) != 0x0) {
                                return new WarnUnimplemented(
                                        "ldc, ldc2 (literal)", machInst);
                            }
                        } else {
                            if (op1 == 0xC3 || op1 == 0xC7) {
                                return new WarnUnimplemented(
                                        "ldc, ldc2 (immediate)", machInst);
                            }
                        }
                    } else {
                        if (bits(op1, 4, 3) != 0 || bits(op1, 1) == 1) {
                            return new WarnUnimplemented(
                                    "stc, stc2", machInst);
                        }
                    }
                }
                break;
              case 0x3:
                if (bits(machInst, 31, 24) == 0xfe) {
                    return decodeAdvancedSIMD(machInst);
                } else if (bits(op1, 4) == 0) {
                    if (CPNUM == 0xa || CPNUM == 0xb) {
                        return decodeShortFpTransfer(machInst);
                    } else if (CPNUM == 0xe) {
                        return decodeMcrMrc14(machInst);
                    } else if (CPNUM == 0xf) {
                        return decodeMcrMrc15(machInst);
                    }
                    const bool op = bits(machInst, 4);
                    if (op) {
                        if (bits(op1, 0)) {
                            return new WarnUnimplemented(
                                    "mrc, mrc2", machInst);
                        } else {
                            return new WarnUnimplemented(
                                    "mcr, mcr2", machInst);
                        }
                    } else {
                        return new WarnUnimplemented("cdp, cdp2", machInst);
                    }
                }
                break;
            }
        }
        return new Unknown(machInst);
    }
    ''' % {
        "pli_iadd" : "PLI_" + loadImmClassName(False, True, False, 1),
        "pli_isub" : "PLI_" + loadImmClassName(False, False, False, 1),
        "pld_iadd" : "PLD_" + loadImmClassName(False, True, False, 1),
        "pld_isub" : "PLD_" + loadImmClassName(False, False, False, 1),
        "pldw_iadd" : "PLDW_" + loadImmClassName(False, True, False, 1),
        "pldw_isub" : "PLDW_" + loadImmClassName(False, False, False, 1),
        "pli_radd" : "PLI_" + loadRegClassName(False, True, False, 1),
        "pli_rsub" : "PLI_" + loadRegClassName(False, False, False, 1),
        "pld_radd" : "PLD_" + loadRegClassName(False, True, False, 1),
        "pld_rsub" : "PLD_" + loadRegClassName(False, False, False, 1),
        "pldw_radd" : "PLDW_" + loadRegClassName(False, True, False, 1),
        "pldw_rsub" : "PLDW_" + loadRegClassName(False, False, False, 1),
        "rfe" : "RFE_" + loadImmClassName(True, False, False, 8),
        "rfe_w" : "RFE_" + loadImmClassName(True, False, True, 8),
        "rfe_u" : "RFE_" + loadImmClassName(True, True, False, 8),
        "rfe_uw" : "RFE_" + loadImmClassName(True, True, True, 8),
        "rfe_p" : "RFE_" + loadImmClassName(False, False, False, 8),
        "rfe_pw" : "RFE_" + loadImmClassName(False, False, True, 8),
        "rfe_pu" : "RFE_" + loadImmClassName(False, True, False, 8),
        "rfe_puw" : "RFE_" + loadImmClassName(False, True, True, 8),
        "srs" : "SRS_" + storeImmClassName(True, False, False, 8),
        "srs_w" : "SRS_" + storeImmClassName(True, False, True, 8),
        "srs_u" : "SRS_" + storeImmClassName(True, True, False, 8),
        "srs_uw" : "SRS_" + storeImmClassName(True, True, True, 8),
        "srs_p" : "SRS_" + storeImmClassName(False, False, False, 8),
        "srs_pw" : "SRS_" + storeImmClassName(False, False, True, 8),
        "srs_pu" : "SRS_" + storeImmClassName(False, True, False, 8),
        "srs_puw" : "SRS_" + storeImmClassName(False, True, True, 8)
    };
}};
