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

// Copyright (c) 2010-2013,2017 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.
//
// Authors: Stephen Hines

////////////////////////////////////////////////////////////////////
//
// The actual ARM ISA decoder
// --------------------------
// The following instructions are specified in the ARM ISA
// Specification. Decoding closely follows the style specified
// in the ARM ISA specification document starting with Table B.1 or 3-1
//
//

decode COND_CODE {
0xF: ArmUnconditional::armUnconditional();
default: decode ENCODING {
format DataOp {
    0x0: decode SEVEN_AND_FOUR {
        1: decode MISC_OPCODE {
            0x9: decode PREPOST {
                0: ArmMultAndMultAcc::armMultAndMultAcc();
                1: ArmSyncMem::armSyncMem();
            }
            0xb, 0xd, 0xf: AddrMode3::addrMode3();
        }
        0: decode IS_MISC {
            0: ArmDataProcReg::armDataProcReg();
            1: decode OPCODE_7 {
                0x0: decode MISC_OPCODE {
                    0x0: ArmMsrMrs::armMsrMrs();
                    // bxj unimplemented, treated as bx
                    0x1,0x2: ArmBxClz::armBxClz();
                    0x3: decode OPCODE {
                        0x9: ArmBlxReg::armBlxReg();
                    }
                    0x4: Crc32::crc32();
                    0x5: ArmSatAddSub::armSatAddSub();
                    0x6: ArmERet::armERet();
                    0x7: decode OPCODE_22 {
                        0: Breakpoint::bkpt();
                        1: ArmSmcHyp::armSmcHyp();
                    }
                }
                0x1: ArmHalfWordMultAndMultAcc::armHalfWordMultAndMultAcc();
            }
        }
    }
    0x1: decode IS_MISC {
        0: ArmDataProcImm::armDataProcImm();
        1: ArmMisc::armMisc();
    }
    0x2: AddrMode2::addrMode2(True);
    0x3: decode OPCODE_4 {
        0: AddrMode2::addrMode2(False);
        1: decode OPCODE_24_23 {
            0x0: ArmParallelAddSubtract::armParallelAddSubtract();
            0x1: ArmPackUnpackSatReverse::armPackUnpackSatReverse();
            0x2: ArmSignedMultiplies::armSignedMultiplies();
            0x3: decode MEDIA_OPCODE {
                     0x1F: decode OPC2 {
                         default: ArmMiscMedia::armMiscMedia();
                     }
                     default: ArmMiscMedia::armMiscMedia();
                 }
        }
    }
    0x4: ArmMacroMem::armMacroMem();
    0x5: decode OPCODE_24 {
        0: ArmBBlxImm::armBBlxImm();
        1: ArmBlBlxImm::armBlBlxImm();
    }
    0x6: decode CPNUM {
        0xa, 0xb: ExtensionRegLoadStore::extensionRegLoadStore();
        0xf: decode OPCODE_20 {
            0: Mcrr15::Mcrr15();
            1: Mrrc15::Mrrc15();
        }
    }
    0x7: decode OPCODE_24 {
        0: decode OPCODE_4 {
            0: decode CPNUM {
                0xa, 0xb: VfpData::vfpData();
            } // CPNUM
            1: decode CPNUM { // 27-24=1110,4 ==1
                0x1: M5ops::m5ops();
                0xa, 0xb: ShortFpTransfer::shortFpTransfer();
                0xe: McrMrc14::mcrMrc14();
                0xf: McrMrc15::mcrMrc15();
            } // CPNUM  (OP4 == 1)
        } //OPCODE_4

        1: Svc::svc();
    } // OPCODE_24

}
}
}

