17202Sgblack@eecs.umich.edu/*
212504Snikos.nikoleris@arm.com * Copyright (c) 2010, 2012-2013, 2017-2018 ARM Limited
37202Sgblack@eecs.umich.edu * All rights reserved
47202Sgblack@eecs.umich.edu *
57202Sgblack@eecs.umich.edu * The license below extends only to copyright in the software and shall
67202Sgblack@eecs.umich.edu * not be construed as granting a license to any other intellectual
77202Sgblack@eecs.umich.edu * property including but not limited to intellectual property relating
87202Sgblack@eecs.umich.edu * to a hardware implementation of the functionality of the software
97202Sgblack@eecs.umich.edu * licensed hereunder.  You may use the software subject to the license
107202Sgblack@eecs.umich.edu * terms below provided that you ensure that this notice is replicated
117202Sgblack@eecs.umich.edu * unmodified and in its entirety in all distributions of the software,
127202Sgblack@eecs.umich.edu * modified or unmodified, in source code or in binary form.
137202Sgblack@eecs.umich.edu *
147202Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
157202Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
167202Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
177202Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
187202Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
197202Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
207202Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
217202Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
227202Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
237202Sgblack@eecs.umich.edu * this software without specific prior written permission.
247202Sgblack@eecs.umich.edu *
257202Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
267202Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
277202Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
287202Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
297202Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
307202Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
317202Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
327202Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
337202Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
347202Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
357202Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
367202Sgblack@eecs.umich.edu *
377202Sgblack@eecs.umich.edu * Authors: Gabe Black
387202Sgblack@eecs.umich.edu */
397202Sgblack@eecs.umich.edu
407202Sgblack@eecs.umich.edu#ifndef __ARCH_ARM_INSTS_MISC_HH__
417202Sgblack@eecs.umich.edu#define __ARCH_ARM_INSTS_MISC_HH__
427202Sgblack@eecs.umich.edu
437202Sgblack@eecs.umich.edu#include "arch/arm/insts/pred_inst.hh"
447202Sgblack@eecs.umich.edu
457202Sgblack@eecs.umich.educlass MrsOp : public PredOp
467202Sgblack@eecs.umich.edu{
477202Sgblack@eecs.umich.edu  protected:
487202Sgblack@eecs.umich.edu    IntRegIndex dest;
497202Sgblack@eecs.umich.edu
507202Sgblack@eecs.umich.edu    MrsOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
517202Sgblack@eecs.umich.edu            IntRegIndex _dest) :
527202Sgblack@eecs.umich.edu        PredOp(mnem, _machInst, __opClass), dest(_dest)
537202Sgblack@eecs.umich.edu    {}
547202Sgblack@eecs.umich.edu
5512616Sgabeblack@google.com    std::string generateDisassembly(
5612616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
577202Sgblack@eecs.umich.edu};
587202Sgblack@eecs.umich.edu
597202Sgblack@eecs.umich.educlass MsrBase : public PredOp
607202Sgblack@eecs.umich.edu{
617202Sgblack@eecs.umich.edu  protected:
627202Sgblack@eecs.umich.edu    uint8_t byteMask;
637202Sgblack@eecs.umich.edu
647202Sgblack@eecs.umich.edu    MsrBase(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
657202Sgblack@eecs.umich.edu            uint8_t _byteMask) :
667202Sgblack@eecs.umich.edu        PredOp(mnem, _machInst, __opClass), byteMask(_byteMask)
677202Sgblack@eecs.umich.edu    {}
687202Sgblack@eecs.umich.edu
697202Sgblack@eecs.umich.edu    void printMsrBase(std::ostream &os) const;
707202Sgblack@eecs.umich.edu};
717202Sgblack@eecs.umich.edu
727202Sgblack@eecs.umich.educlass MsrImmOp : public MsrBase
737202Sgblack@eecs.umich.edu{
747202Sgblack@eecs.umich.edu  protected:
757202Sgblack@eecs.umich.edu    uint32_t imm;
767202Sgblack@eecs.umich.edu
777202Sgblack@eecs.umich.edu    MsrImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
787202Sgblack@eecs.umich.edu             uint32_t _imm, uint8_t _byteMask) :
797202Sgblack@eecs.umich.edu        MsrBase(mnem, _machInst, __opClass, _byteMask), imm(_imm)
807202Sgblack@eecs.umich.edu    {}
817202Sgblack@eecs.umich.edu
8212616Sgabeblack@google.com    std::string generateDisassembly(
8312616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
847202Sgblack@eecs.umich.edu};
857202Sgblack@eecs.umich.edu
867202Sgblack@eecs.umich.educlass MsrRegOp : public MsrBase
877202Sgblack@eecs.umich.edu{
887202Sgblack@eecs.umich.edu  protected:
897202Sgblack@eecs.umich.edu    IntRegIndex op1;
907202Sgblack@eecs.umich.edu
917202Sgblack@eecs.umich.edu    MsrRegOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
927202Sgblack@eecs.umich.edu             IntRegIndex _op1, uint8_t _byteMask) :
937202Sgblack@eecs.umich.edu        MsrBase(mnem, _machInst, __opClass, _byteMask), op1(_op1)
947202Sgblack@eecs.umich.edu    {}
957202Sgblack@eecs.umich.edu
9612616Sgabeblack@google.com    std::string generateDisassembly(
9712616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
987202Sgblack@eecs.umich.edu};
997202Sgblack@eecs.umich.edu
10010037SARM gem5 Developersclass MrrcOp : public PredOp
10110037SARM gem5 Developers{
10210037SARM gem5 Developers  protected:
10310420Sandreas.hansson@arm.com    MiscRegIndex op1;
10410037SARM gem5 Developers    IntRegIndex dest;
10510037SARM gem5 Developers    IntRegIndex dest2;
10610037SARM gem5 Developers    uint32_t    imm;
10710037SARM gem5 Developers
10810037SARM gem5 Developers    MrrcOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
10910420Sandreas.hansson@arm.com           MiscRegIndex _op1, IntRegIndex _dest, IntRegIndex _dest2,
11010037SARM gem5 Developers           uint32_t _imm) :
11110037SARM gem5 Developers        PredOp(mnem, _machInst, __opClass), op1(_op1), dest(_dest),
11210037SARM gem5 Developers        dest2(_dest2), imm(_imm)
11310037SARM gem5 Developers    {}
11410037SARM gem5 Developers
11512616Sgabeblack@google.com    std::string generateDisassembly(
11612616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
11710037SARM gem5 Developers};
11810037SARM gem5 Developers
11910037SARM gem5 Developersclass McrrOp : public PredOp
12010037SARM gem5 Developers{
12110037SARM gem5 Developers  protected:
12210037SARM gem5 Developers    IntRegIndex op1;
12310037SARM gem5 Developers    IntRegIndex op2;
12410420Sandreas.hansson@arm.com    MiscRegIndex dest;
12510037SARM gem5 Developers    uint32_t    imm;
12610037SARM gem5 Developers
12710037SARM gem5 Developers    McrrOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
12810420Sandreas.hansson@arm.com           IntRegIndex _op1, IntRegIndex _op2, MiscRegIndex _dest,
12910037SARM gem5 Developers           uint32_t _imm) :
13010037SARM gem5 Developers        PredOp(mnem, _machInst, __opClass), op1(_op1), op2(_op2),
13110037SARM gem5 Developers        dest(_dest), imm(_imm)
13210037SARM gem5 Developers    {}
13310037SARM gem5 Developers
13412616Sgabeblack@google.com    std::string generateDisassembly(
13512616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
13610037SARM gem5 Developers};
13710037SARM gem5 Developers
1387306Sgblack@eecs.umich.educlass ImmOp : public PredOp
1397306Sgblack@eecs.umich.edu{
1407306Sgblack@eecs.umich.edu  protected:
1417330Sgblack@eecs.umich.edu    uint64_t imm;
1427306Sgblack@eecs.umich.edu
1437306Sgblack@eecs.umich.edu    ImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
1447330Sgblack@eecs.umich.edu             uint64_t _imm) :
1457306Sgblack@eecs.umich.edu        PredOp(mnem, _machInst, __opClass), imm(_imm)
1467306Sgblack@eecs.umich.edu    {}
1477306Sgblack@eecs.umich.edu
14812616Sgabeblack@google.com    std::string generateDisassembly(
14912616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
1507306Sgblack@eecs.umich.edu};
1517306Sgblack@eecs.umich.edu
1527332Sgblack@eecs.umich.educlass RegImmOp : public PredOp
1537332Sgblack@eecs.umich.edu{
1547332Sgblack@eecs.umich.edu  protected:
1557332Sgblack@eecs.umich.edu    IntRegIndex dest;
1567332Sgblack@eecs.umich.edu    uint64_t imm;
1577332Sgblack@eecs.umich.edu
1587332Sgblack@eecs.umich.edu    RegImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
1597332Sgblack@eecs.umich.edu             IntRegIndex _dest, uint64_t _imm) :
1607332Sgblack@eecs.umich.edu        PredOp(mnem, _machInst, __opClass), dest(_dest), imm(_imm)
1617332Sgblack@eecs.umich.edu    {}
1627332Sgblack@eecs.umich.edu
16312616Sgabeblack@google.com    std::string generateDisassembly(
16412616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
1657332Sgblack@eecs.umich.edu};
1667332Sgblack@eecs.umich.edu
1677261Sgblack@eecs.umich.educlass RegRegOp : public PredOp
1687208Sgblack@eecs.umich.edu{
1697208Sgblack@eecs.umich.edu  protected:
1707208Sgblack@eecs.umich.edu    IntRegIndex dest;
1717208Sgblack@eecs.umich.edu    IntRegIndex op1;
1727208Sgblack@eecs.umich.edu
1737261Sgblack@eecs.umich.edu    RegRegOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
1747261Sgblack@eecs.umich.edu             IntRegIndex _dest, IntRegIndex _op1) :
1757208Sgblack@eecs.umich.edu        PredOp(mnem, _machInst, __opClass), dest(_dest), op1(_op1)
1767208Sgblack@eecs.umich.edu    {}
1777208Sgblack@eecs.umich.edu
17812616Sgabeblack@google.com    std::string generateDisassembly(
17912616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
1807208Sgblack@eecs.umich.edu};
1817208Sgblack@eecs.umich.edu
1827232Sgblack@eecs.umich.educlass RegImmRegOp : public PredOp
1837225Sgblack@eecs.umich.edu{
1847225Sgblack@eecs.umich.edu  protected:
1857225Sgblack@eecs.umich.edu    IntRegIndex dest;
1867330Sgblack@eecs.umich.edu    uint64_t imm;
1877225Sgblack@eecs.umich.edu    IntRegIndex op1;
1887225Sgblack@eecs.umich.edu
1897232Sgblack@eecs.umich.edu    RegImmRegOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
1907330Sgblack@eecs.umich.edu                IntRegIndex _dest, uint64_t _imm, IntRegIndex _op1) :
1917225Sgblack@eecs.umich.edu        PredOp(mnem, _machInst, __opClass),
1927232Sgblack@eecs.umich.edu        dest(_dest), imm(_imm), op1(_op1)
1937225Sgblack@eecs.umich.edu    {}
1947225Sgblack@eecs.umich.edu
19512616Sgabeblack@google.com    std::string generateDisassembly(
19612616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
1977225Sgblack@eecs.umich.edu};
1987225Sgblack@eecs.umich.edu
1997233Sgblack@eecs.umich.educlass RegRegRegImmOp : public PredOp
2007233Sgblack@eecs.umich.edu{
2017233Sgblack@eecs.umich.edu  protected:
2027233Sgblack@eecs.umich.edu    IntRegIndex dest;
2037233Sgblack@eecs.umich.edu    IntRegIndex op1;
2047233Sgblack@eecs.umich.edu    IntRegIndex op2;
2057330Sgblack@eecs.umich.edu    uint64_t imm;
2067233Sgblack@eecs.umich.edu
2077233Sgblack@eecs.umich.edu    RegRegRegImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
2087233Sgblack@eecs.umich.edu                   IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2,
2097330Sgblack@eecs.umich.edu                   uint64_t _imm) :
2107233Sgblack@eecs.umich.edu        PredOp(mnem, _machInst, __opClass),
2117233Sgblack@eecs.umich.edu        dest(_dest), op1(_op1), op2(_op2), imm(_imm)
2127233Sgblack@eecs.umich.edu    {}
2137233Sgblack@eecs.umich.edu
21412616Sgabeblack@google.com    std::string generateDisassembly(
21512616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
2167233Sgblack@eecs.umich.edu};
2177233Sgblack@eecs.umich.edu
2187241Sgblack@eecs.umich.educlass RegRegRegRegOp : public PredOp
2197241Sgblack@eecs.umich.edu{
2207241Sgblack@eecs.umich.edu  protected:
2217241Sgblack@eecs.umich.edu    IntRegIndex dest;
2227241Sgblack@eecs.umich.edu    IntRegIndex op1;
2237241Sgblack@eecs.umich.edu    IntRegIndex op2;
2247241Sgblack@eecs.umich.edu    IntRegIndex op3;
2257241Sgblack@eecs.umich.edu
2267241Sgblack@eecs.umich.edu    RegRegRegRegOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
2277241Sgblack@eecs.umich.edu                   IntRegIndex _dest, IntRegIndex _op1,
2287241Sgblack@eecs.umich.edu                   IntRegIndex _op2, IntRegIndex _op3) :
2297241Sgblack@eecs.umich.edu        PredOp(mnem, _machInst, __opClass),
2307241Sgblack@eecs.umich.edu        dest(_dest), op1(_op1), op2(_op2), op3(_op3)
2317241Sgblack@eecs.umich.edu    {}
2327241Sgblack@eecs.umich.edu
23312616Sgabeblack@google.com    std::string generateDisassembly(
23412616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
2357241Sgblack@eecs.umich.edu};
2367241Sgblack@eecs.umich.edu
2377238Sgblack@eecs.umich.educlass RegRegRegOp : public PredOp
2387238Sgblack@eecs.umich.edu{
2397238Sgblack@eecs.umich.edu  protected:
2407238Sgblack@eecs.umich.edu    IntRegIndex dest;
2417238Sgblack@eecs.umich.edu    IntRegIndex op1;
2427238Sgblack@eecs.umich.edu    IntRegIndex op2;
2437238Sgblack@eecs.umich.edu
2447238Sgblack@eecs.umich.edu    RegRegRegOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
2457238Sgblack@eecs.umich.edu                IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2) :
2467238Sgblack@eecs.umich.edu        PredOp(mnem, _machInst, __opClass),
2477238Sgblack@eecs.umich.edu        dest(_dest), op1(_op1), op2(_op2)
2487238Sgblack@eecs.umich.edu    {}
2497238Sgblack@eecs.umich.edu
25012616Sgabeblack@google.com    std::string generateDisassembly(
25112616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
2527238Sgblack@eecs.umich.edu};
2537238Sgblack@eecs.umich.edu
2547331Sgblack@eecs.umich.educlass RegRegImmOp : public PredOp
2557331Sgblack@eecs.umich.edu{
2567331Sgblack@eecs.umich.edu  protected:
2577331Sgblack@eecs.umich.edu    IntRegIndex dest;
2587331Sgblack@eecs.umich.edu    IntRegIndex op1;
2597331Sgblack@eecs.umich.edu    uint64_t imm;
2607331Sgblack@eecs.umich.edu
2617331Sgblack@eecs.umich.edu    RegRegImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
2627331Sgblack@eecs.umich.edu                IntRegIndex _dest, IntRegIndex _op1,
2637331Sgblack@eecs.umich.edu                uint64_t _imm) :
2647331Sgblack@eecs.umich.edu        PredOp(mnem, _machInst, __opClass),
2657331Sgblack@eecs.umich.edu        dest(_dest), op1(_op1), imm(_imm)
2667331Sgblack@eecs.umich.edu    {}
2677331Sgblack@eecs.umich.edu
26812616Sgabeblack@google.com    std::string generateDisassembly(
26912616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
2707331Sgblack@eecs.umich.edu};
2717331Sgblack@eecs.umich.edu
27210418Sandreas.hansson@arm.comclass MiscRegRegImmOp : public PredOp
27310418Sandreas.hansson@arm.com{
27410418Sandreas.hansson@arm.com  protected:
27510418Sandreas.hansson@arm.com    MiscRegIndex dest;
27610418Sandreas.hansson@arm.com    IntRegIndex op1;
27710418Sandreas.hansson@arm.com    uint64_t imm;
27810418Sandreas.hansson@arm.com
27910418Sandreas.hansson@arm.com    MiscRegRegImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
28010418Sandreas.hansson@arm.com                    MiscRegIndex _dest, IntRegIndex _op1,
28110418Sandreas.hansson@arm.com                    uint64_t _imm) :
28210418Sandreas.hansson@arm.com        PredOp(mnem, _machInst, __opClass),
28310418Sandreas.hansson@arm.com        dest(_dest), op1(_op1), imm(_imm)
28410418Sandreas.hansson@arm.com    {}
28510418Sandreas.hansson@arm.com
28612616Sgabeblack@google.com    std::string generateDisassembly(
28712616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
28810418Sandreas.hansson@arm.com};
28910418Sandreas.hansson@arm.com
29010418Sandreas.hansson@arm.comclass RegMiscRegImmOp : public PredOp
29110418Sandreas.hansson@arm.com{
29210418Sandreas.hansson@arm.com  protected:
29310418Sandreas.hansson@arm.com    IntRegIndex dest;
29410418Sandreas.hansson@arm.com    MiscRegIndex op1;
29510418Sandreas.hansson@arm.com    uint64_t imm;
29610418Sandreas.hansson@arm.com
29710418Sandreas.hansson@arm.com    RegMiscRegImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
29810418Sandreas.hansson@arm.com                    IntRegIndex _dest, MiscRegIndex _op1,
29910418Sandreas.hansson@arm.com                    uint64_t _imm) :
30010418Sandreas.hansson@arm.com        PredOp(mnem, _machInst, __opClass),
30110418Sandreas.hansson@arm.com        dest(_dest), op1(_op1), imm(_imm)
30210418Sandreas.hansson@arm.com    {}
30310418Sandreas.hansson@arm.com
30412616Sgabeblack@google.com    std::string generateDisassembly(
30512616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
30610418Sandreas.hansson@arm.com};
30710418Sandreas.hansson@arm.com
30810037SARM gem5 Developersclass RegImmImmOp : public PredOp
30910037SARM gem5 Developers{
31010037SARM gem5 Developers  protected:
31110037SARM gem5 Developers    IntRegIndex dest;
31210037SARM gem5 Developers    uint64_t imm1;
31310037SARM gem5 Developers    uint64_t imm2;
31410037SARM gem5 Developers
31510037SARM gem5 Developers    RegImmImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
31610037SARM gem5 Developers                IntRegIndex _dest, uint64_t _imm1, uint64_t _imm2) :
31710037SARM gem5 Developers        PredOp(mnem, _machInst, __opClass),
31810037SARM gem5 Developers        dest(_dest), imm1(_imm1), imm2(_imm2)
31910037SARM gem5 Developers    {}
32010037SARM gem5 Developers
32112616Sgabeblack@google.com    std::string generateDisassembly(
32212616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
32310037SARM gem5 Developers};
32410037SARM gem5 Developers
3257253Sgblack@eecs.umich.educlass RegRegImmImmOp : public PredOp
3267253Sgblack@eecs.umich.edu{
3277253Sgblack@eecs.umich.edu  protected:
3287253Sgblack@eecs.umich.edu    IntRegIndex dest;
3297253Sgblack@eecs.umich.edu    IntRegIndex op1;
3307330Sgblack@eecs.umich.edu    uint64_t imm1;
3317330Sgblack@eecs.umich.edu    uint64_t imm2;
3327253Sgblack@eecs.umich.edu
3337253Sgblack@eecs.umich.edu    RegRegImmImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
3347253Sgblack@eecs.umich.edu                   IntRegIndex _dest, IntRegIndex _op1,
3357330Sgblack@eecs.umich.edu                   uint64_t _imm1, uint64_t _imm2) :
3367253Sgblack@eecs.umich.edu        PredOp(mnem, _machInst, __opClass),
3377253Sgblack@eecs.umich.edu        dest(_dest), op1(_op1), imm1(_imm1), imm2(_imm2)
3387253Sgblack@eecs.umich.edu    {}
3397253Sgblack@eecs.umich.edu
34012616Sgabeblack@google.com    std::string generateDisassembly(
34112616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
3427253Sgblack@eecs.umich.edu};
3437253Sgblack@eecs.umich.edu
3447232Sgblack@eecs.umich.educlass RegImmRegShiftOp : public PredOp
3457225Sgblack@eecs.umich.edu{
3467225Sgblack@eecs.umich.edu  protected:
3477225Sgblack@eecs.umich.edu    IntRegIndex dest;
3487330Sgblack@eecs.umich.edu    uint64_t imm;
3497225Sgblack@eecs.umich.edu    IntRegIndex op1;
3507225Sgblack@eecs.umich.edu    int32_t shiftAmt;
3517225Sgblack@eecs.umich.edu    ArmShiftType shiftType;
3527225Sgblack@eecs.umich.edu
3537232Sgblack@eecs.umich.edu    RegImmRegShiftOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
3547330Sgblack@eecs.umich.edu                     IntRegIndex _dest, uint64_t _imm, IntRegIndex _op1,
3557232Sgblack@eecs.umich.edu                     int32_t _shiftAmt, ArmShiftType _shiftType) :
3567225Sgblack@eecs.umich.edu        PredOp(mnem, _machInst, __opClass),
3577232Sgblack@eecs.umich.edu        dest(_dest), imm(_imm), op1(_op1),
3587225Sgblack@eecs.umich.edu        shiftAmt(_shiftAmt), shiftType(_shiftType)
3597225Sgblack@eecs.umich.edu    {}
3607225Sgblack@eecs.umich.edu
36112616Sgabeblack@google.com    std::string generateDisassembly(
36212616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
3637225Sgblack@eecs.umich.edu};
3647225Sgblack@eecs.umich.edu
3657409Sgblack@eecs.umich.educlass UnknownOp : public PredOp
3667409Sgblack@eecs.umich.edu{
3677409Sgblack@eecs.umich.edu  protected:
3687409Sgblack@eecs.umich.edu
3697409Sgblack@eecs.umich.edu    UnknownOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass) :
3707409Sgblack@eecs.umich.edu        PredOp(mnem, _machInst, __opClass)
3717409Sgblack@eecs.umich.edu    {}
3727409Sgblack@eecs.umich.edu
37312616Sgabeblack@google.com    std::string generateDisassembly(
37412616Sgabeblack@google.com            Addr pc, const SymbolTable *symtab) const override;
3757409Sgblack@eecs.umich.edu};
3767409Sgblack@eecs.umich.edu
37713574Sgiacomo.travaglini@arm.com/**
37813574Sgiacomo.travaglini@arm.com * Certain mrc/mcr instructions act as nops or flush the pipe based on what
37913574Sgiacomo.travaglini@arm.com * register the instruction is trying to access. This inst/class exists so that
38013574Sgiacomo.travaglini@arm.com * we can still check for hyp traps, as the normal nop instruction
38113574Sgiacomo.travaglini@arm.com * does not.
38213574Sgiacomo.travaglini@arm.com */
38313574Sgiacomo.travaglini@arm.comclass McrMrcMiscInst : public ArmStaticInst
38413574Sgiacomo.travaglini@arm.com{
38513574Sgiacomo.travaglini@arm.com  protected:
38613574Sgiacomo.travaglini@arm.com    uint64_t iss;
38713574Sgiacomo.travaglini@arm.com    MiscRegIndex miscReg;
38813574Sgiacomo.travaglini@arm.com
38913574Sgiacomo.travaglini@arm.com  public:
39013574Sgiacomo.travaglini@arm.com    McrMrcMiscInst(const char *_mnemonic, ExtMachInst _machInst,
39113574Sgiacomo.travaglini@arm.com                   uint64_t _iss, MiscRegIndex _miscReg);
39213574Sgiacomo.travaglini@arm.com
39313574Sgiacomo.travaglini@arm.com    Fault execute(ExecContext *xc,
39413574Sgiacomo.travaglini@arm.com                  Trace::InstRecord *traceData) const override;
39513574Sgiacomo.travaglini@arm.com
39613574Sgiacomo.travaglini@arm.com    std::string generateDisassembly(
39713574Sgiacomo.travaglini@arm.com            Addr pc, const SymbolTable *symtab) const override;
39813574Sgiacomo.travaglini@arm.com
39913574Sgiacomo.travaglini@arm.com};
40013574Sgiacomo.travaglini@arm.com
40113574Sgiacomo.travaglini@arm.com/**
40213574Sgiacomo.travaglini@arm.com * This class is also used for IMPLEMENTATION DEFINED registers, whose mcr/mrc
40313574Sgiacomo.travaglini@arm.com * behaviour is trappable even for unimplemented registers.
40413574Sgiacomo.travaglini@arm.com */
40513574Sgiacomo.travaglini@arm.comclass McrMrcImplDefined : public McrMrcMiscInst
40613574Sgiacomo.travaglini@arm.com{
40713574Sgiacomo.travaglini@arm.com  public:
40813574Sgiacomo.travaglini@arm.com    McrMrcImplDefined(const char *_mnemonic, ExtMachInst _machInst,
40913574Sgiacomo.travaglini@arm.com                      uint64_t _iss, MiscRegIndex _miscReg);
41013574Sgiacomo.travaglini@arm.com
41113574Sgiacomo.travaglini@arm.com    Fault execute(ExecContext *xc,
41213574Sgiacomo.travaglini@arm.com                  Trace::InstRecord *traceData) const override;
41313574Sgiacomo.travaglini@arm.com
41413574Sgiacomo.travaglini@arm.com    std::string generateDisassembly(
41513574Sgiacomo.travaglini@arm.com            Addr pc, const SymbolTable *symtab) const override;
41613574Sgiacomo.travaglini@arm.com
41713574Sgiacomo.travaglini@arm.com};
41813574Sgiacomo.travaglini@arm.com
4197202Sgblack@eecs.umich.edu#endif
420