mem.hh revision 12616
12068SN/A/*
22068SN/A * Copyright (c) 2010 ARM Limited
32068SN/A * All rights reserved
42068SN/A *
52068SN/A * The license below extends only to copyright in the software and shall
62068SN/A * not be construed as granting a license to any other intellectual
72068SN/A * property including but not limited to intellectual property relating
82068SN/A * to a hardware implementation of the functionality of the software
92068SN/A * licensed hereunder.  You may use the software subject to the license
102068SN/A * terms below provided that you ensure that this notice is replicated
112068SN/A * unmodified and in its entirety in all distributions of the software,
122068SN/A * modified or unmodified, in source code or in binary form.
132068SN/A *
142068SN/A * Copyright (c) 2007-2008 The Florida State University
152068SN/A * All rights reserved.
162068SN/A *
172068SN/A * Redistribution and use in source and binary forms, with or without
182068SN/A * modification, are permitted provided that the following conditions are
192068SN/A * met: redistributions of source code must retain the above copyright
202068SN/A * notice, this list of conditions and the following disclaimer;
212068SN/A * redistributions in binary form must reproduce the above copyright
222068SN/A * notice, this list of conditions and the following disclaimer in the
232068SN/A * documentation and/or other materials provided with the distribution;
242068SN/A * neither the name of the copyright holders nor the names of its
252068SN/A * contributors may be used to endorse or promote products derived from
262068SN/A * this software without specific prior written permission.
272068SN/A *
282665Ssaidi@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
292665Ssaidi@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
302665Ssaidi@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
312068SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
322649Ssaidi@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
332649Ssaidi@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
342649Ssaidi@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
352649Ssaidi@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
362649Ssaidi@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
372068SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
382068SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
392068SN/A *
402068SN/A * Authors: Stephen Hines
412068SN/A */
422068SN/A#ifndef __ARCH_ARM_MEM_HH__
432068SN/A#define __ARCH_ARM_MEM_HH__
442068SN/A
452068SN/A#include "arch/arm/insts/pred_inst.hh"
462068SN/A
472068SN/Anamespace ArmISA
482107SN/A{
492068SN/A
502107SN/Aclass Swap : public PredOp
512068SN/A{
522068SN/A  protected:
532227SN/A    IntRegIndex dest;
542107SN/A    IntRegIndex op1;
552107SN/A    IntRegIndex base;
562068SN/A
572068SN/A    Swap(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
582068SN/A         IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _base)
592068SN/A        : PredOp(mnem, _machInst, __opClass),
602068SN/A          dest(_dest), op1(_op1), base(_base)
612068SN/A    {}
622068SN/A
632068SN/A    std::string generateDisassembly(
642068SN/A            Addr pc, const SymbolTable *symtab) const override;
652068SN/A};
662107SN/A
672107SN/Aclass MightBeMicro : public PredOp
682068SN/A{
692068SN/A  protected:
702068SN/A    MightBeMicro(const char *mnem, ExtMachInst _machInst, OpClass __opClass)
712068SN/A        : PredOp(mnem, _machInst, __opClass)
722068SN/A    {}
732068SN/A
742068SN/A    void
752068SN/A    advancePC(PCState &pcState) const
762068SN/A    {
772068SN/A        if (flags[IsLastMicroop]) {
782068SN/A            pcState.uEnd();
792068SN/A        } else if (flags[IsMicroop]) {
802068SN/A            pcState.uAdvance();
812227SN/A        } else {
822107SN/A            pcState.advance();
832107SN/A        }
842068SN/A    }
852068SN/A};
862068SN/A
872068SN/A// The address is a base register plus an immediate.
882068SN/Aclass RfeOp : public MightBeMicro
892068SN/A{
902068SN/A  public:
912068SN/A    enum AddrMode {
922068SN/A        DecrementAfter,
932068SN/A        DecrementBefore,
942068SN/A        IncrementAfter,
952068SN/A        IncrementBefore
962068SN/A    };
972068SN/A  protected:
982068SN/A    IntRegIndex base;
992068SN/A    AddrMode mode;
1002227SN/A    bool wb;
1012107SN/A    IntRegIndex ura, urb, urc;
1022107SN/A    static const unsigned numMicroops = 3;
1032068SN/A
1042068SN/A    StaticInstPtr *uops;
1052068SN/A
1062068SN/A    RfeOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
1072068SN/A          IntRegIndex _base, AddrMode _mode, bool _wb)
1082068SN/A        : MightBeMicro(mnem, _machInst, __opClass),
1092068SN/A          base(_base), mode(_mode), wb(_wb),
1102068SN/A          ura(INTREG_UREG0), urb(INTREG_UREG1),
1112068SN/A          urc(INTREG_UREG2),
1122068SN/A          uops(NULL)
1132068SN/A    {}
1142068SN/A
1152068SN/A    virtual
1162068SN/A    ~RfeOp()
1172068SN/A    {
1182068SN/A        delete [] uops;
1192068SN/A    }
1202068SN/A
1212068SN/A    StaticInstPtr
1222068SN/A    fetchMicroop(MicroPC microPC) const override
1232068SN/A    {
1242068SN/A        assert(uops != NULL && microPC < numMicroops);
1252068SN/A        return uops[microPC];
1262068SN/A    }
1272068SN/A
1282068SN/A    std::string generateDisassembly(
1293953Sstever@eecs.umich.edu            Addr pc, const SymbolTable *symtab) const override;
1302068SN/A};
1312068SN/A
1322068SN/A// The address is a base register plus an immediate.
1332068SN/Aclass SrsOp : public MightBeMicro
1342068SN/A{
1352068SN/A  public:
1362068SN/A    enum AddrMode {
1372068SN/A        DecrementAfter,
1382068SN/A        DecrementBefore,
1392068SN/A        IncrementAfter,
1402068SN/A        IncrementBefore
1412068SN/A    };
1422068SN/A  protected:
1432068SN/A    uint32_t regMode;
1442068SN/A    AddrMode mode;
1452068SN/A    bool wb;
1462068SN/A    static const unsigned numMicroops = 2;
1472068SN/A
1482068SN/A    StaticInstPtr *uops;
1492068SN/A
1502068SN/A    SrsOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
1512068SN/A          uint32_t _regMode, AddrMode _mode, bool _wb)
1522227SN/A        : MightBeMicro(mnem, _machInst, __opClass),
1532068SN/A          regMode(_regMode), mode(_mode), wb(_wb), uops(NULL)
1542068SN/A    {}
1552068SN/A
1562068SN/A    virtual
1572068SN/A    ~SrsOp()
1582068SN/A    {
1592068SN/A        delete [] uops;
1602068SN/A    }
1612068SN/A
1622068SN/A    StaticInstPtr
1632068SN/A    fetchMicroop(MicroPC microPC) const override
1642227SN/A    {
1652068SN/A        assert(uops != NULL && microPC < numMicroops);
1662068SN/A        return uops[microPC];
1672068SN/A    }
1682068SN/A
1692068SN/A    std::string generateDisassembly(
1702068SN/A            Addr pc, const SymbolTable *symtab) const override;
1712068SN/A};
1722227SN/A
1732068SN/Aclass Memory : public MightBeMicro
1742068SN/A{
1752095SN/A  public:
1762095SN/A    enum AddrMode {
1772095SN/A        AddrMd_Offset,
1782095SN/A        AddrMd_PreIndex,
1792068SN/A        AddrMd_PostIndex
1802068SN/A    };
1812068SN/A
1822095SN/A  protected:
1832095SN/A
1842132SN/A    IntRegIndex dest;
1852095SN/A    IntRegIndex base;
1862095SN/A    bool add;
1872095SN/A    static const unsigned numMicroops = 3;
1882095SN/A
1893349Sbinkertn@umich.edu    StaticInstPtr *uops;
1902623SN/A
1912095SN/A    Memory(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
1922095SN/A           IntRegIndex _dest, IntRegIndex _base, bool _add)
1932095SN/A        : MightBeMicro(mnem, _machInst, __opClass),
1943953Sstever@eecs.umich.edu          dest(_dest), base(_base), add(_add), uops(NULL)
1952068SN/A    {}
1962068SN/A
1972068SN/A    virtual
1982227SN/A    ~Memory()
1992068SN/A    {
2002068SN/A        delete [] uops;
2013953Sstever@eecs.umich.edu    }
2022068SN/A
2033953Sstever@eecs.umich.edu    StaticInstPtr
2042068SN/A    fetchMicroop(MicroPC microPC) const override
2053953Sstever@eecs.umich.edu    {
2063953Sstever@eecs.umich.edu        assert(uops != NULL && microPC < numMicroops);
2072227SN/A        return uops[microPC];
2082068SN/A    }
2092068SN/A
2103953Sstever@eecs.umich.edu    virtual void
2112068SN/A    printOffset(std::ostream &os) const
2123953Sstever@eecs.umich.edu    {}
2132068SN/A
2143953Sstever@eecs.umich.edu    virtual void
2153953Sstever@eecs.umich.edu    printDest(std::ostream &os) const
2162227SN/A    {
2172068SN/A        printIntReg(os, dest);
2182068SN/A    }
2192068SN/A
2202068SN/A    void printInst(std::ostream &os, AddrMode addrMode) const;
2212068SN/A};
2222068SN/A
2232068SN/A// The address is a base register plus an immediate.
2242068SN/Aclass MemoryImm : public Memory
2252068SN/A{
2262132SN/A  protected:
2272068SN/A    int32_t imm;
2282068SN/A
2292068SN/A    MemoryImm(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
2302068SN/A              IntRegIndex _dest, IntRegIndex _base, bool _add, int32_t _imm)
2312132SN/A        : Memory(mnem, _machInst, __opClass, _dest, _base, _add), imm(_imm)
2322068SN/A    {}
2332068SN/A
2342068SN/A    void
2352068SN/A    printOffset(std::ostream &os) const
2363953Sstever@eecs.umich.edu    {
2372068SN/A        int32_t pImm = imm;
2382090SN/A        if (!add)
2392068SN/A            pImm = -pImm;
2402068SN/A        ccprintf(os, "#%d", pImm);
2412068SN/A    }
2422068SN/A};
2432068SN/A
2442068SN/Aclass MemoryExImm : public MemoryImm
2452068SN/A{
2462068SN/A  protected:
2472069SN/A    IntRegIndex result;
2482132SN/A
2492068SN/A    MemoryExImm(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
2502068SN/A                IntRegIndex _result, IntRegIndex _dest, IntRegIndex _base,
2512068SN/A                bool _add, int32_t _imm)
2522068SN/A        : MemoryImm(mnem, _machInst, __opClass, _dest, _base, _add, _imm),
2532132SN/A                    result(_result)
2542068SN/A    {}
2552068SN/A
2562068SN/A    void
2572069SN/A    printDest(std::ostream &os) const
2582068SN/A    {
2592068SN/A        printIntReg(os, result);
2602090SN/A        os << ", ";
2612069SN/A        MemoryImm::printDest(os);
2623953Sstever@eecs.umich.edu    }
2632068SN/A};
2642068SN/A
2652090SN/A// The address is a base register plus an immediate.
2662069SN/Aclass MemoryDImm : public MemoryImm
2672068SN/A{
2682068SN/A  protected:
2692068SN/A    IntRegIndex dest2;
2702068SN/A
2712068SN/A    MemoryDImm(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
2722068SN/A              IntRegIndex _dest, IntRegIndex _dest2,
2732068SN/A              IntRegIndex _base, bool _add, int32_t _imm)
2742069SN/A        : MemoryImm(mnem, _machInst, __opClass, _dest, _base, _add, _imm),
2752132SN/A          dest2(_dest2)
2762068SN/A    {}
2772068SN/A
2782068SN/A    void
2792132SN/A    printDest(std::ostream &os) const
2802068SN/A    {
2812068SN/A        MemoryImm::printDest(os);
2822068SN/A        os << ", ";
2832069SN/A        printIntReg(os, dest2);
2842068SN/A    }
2852068SN/A};
2862090SN/A
2872069SN/Aclass MemoryExDImm : public MemoryDImm
2882068SN/A{
2892068SN/A  protected:
2902068SN/A    IntRegIndex result;
2912090SN/A
2922069SN/A    MemoryExDImm(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
2932069SN/A                 IntRegIndex _result, IntRegIndex _dest, IntRegIndex _dest2,
2942069SN/A                 IntRegIndex _base, bool _add, int32_t _imm)
2952069SN/A        : MemoryDImm(mnem, _machInst, __opClass, _dest, _dest2,
2962069SN/A                     _base, _add, _imm), result(_result)
2972069SN/A    {}
2982069SN/A
2992069SN/A    void
3002095SN/A    printDest(std::ostream &os) const
3012132SN/A    {
3022095SN/A        printIntReg(os, result);
3032095SN/A        os << ", ";
3042095SN/A        MemoryDImm::printDest(os);
3052132SN/A    }
3062095SN/A};
3072095SN/A
3082095SN/A// The address is a shifted register plus an immediate
3092095SN/Aclass MemoryReg : public Memory
3102095SN/A{
3112095SN/A  protected:
3122098SN/A    int32_t shiftAmt;
3132095SN/A    ArmShiftType shiftType;
3142095SN/A    IntRegIndex index;
3152095SN/A
3162095SN/A    MemoryReg(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
3172095SN/A              IntRegIndex _dest, IntRegIndex _base, bool _add,
3182095SN/A              int32_t _shiftAmt, ArmShiftType _shiftType,
3192095SN/A              IntRegIndex _index)
3202095SN/A        : Memory(mnem, _machInst, __opClass, _dest, _base, _add),
3212095SN/A          shiftAmt(_shiftAmt), shiftType(_shiftType), index(_index)
3223349Sbinkertn@umich.edu    {}
3232095SN/A
3242095SN/A    void printOffset(std::ostream &os) const;
3252095SN/A};
3262132SN/A
3272095SN/Aclass MemoryDReg : public MemoryReg
3282095SN/A{
3292506SN/A  protected:
3302095SN/A    IntRegIndex dest2;
3312623SN/A
3322095SN/A    MemoryDReg(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
3332098SN/A               IntRegIndex _dest, IntRegIndex _dest2,
3342095SN/A               IntRegIndex _base, bool _add,
3352095SN/A               int32_t _shiftAmt, ArmShiftType _shiftType,
3362095SN/A               IntRegIndex _index)
3372098SN/A        : MemoryReg(mnem, _machInst, __opClass, _dest, _base, _add,
3382095SN/A                    _shiftAmt, _shiftType, _index),
3392095SN/A          dest2(_dest2)
3402095SN/A    {}
3412095SN/A
3422095SN/A    void
3432095SN/A    printDest(std::ostream &os) const
3442095SN/A    {
3452095SN/A        MemoryReg::printDest(os);
3462069SN/A        os << ", ";
3472132SN/A        printIntReg(os, dest2);
3482069SN/A    }
3492069SN/A};
3502069SN/A
3512069SN/Atemplate<class Base>
3522132SN/Aclass MemoryOffset : public Base
3534027Sstever@eecs.umich.edu{
3544027Sstever@eecs.umich.edu  protected:
3554027Sstever@eecs.umich.edu    MemoryOffset(const char *mnem, ExtMachInst _machInst,
3564027Sstever@eecs.umich.edu                 OpClass __opClass, IntRegIndex _dest, IntRegIndex _base,
3574027Sstever@eecs.umich.edu                 bool _add, int32_t _imm)
3584027Sstever@eecs.umich.edu        : Base(mnem, _machInst, __opClass, _dest, _base, _add, _imm)
3594027Sstever@eecs.umich.edu    {}
3604027Sstever@eecs.umich.edu
3614027Sstever@eecs.umich.edu    MemoryOffset(const char *mnem, ExtMachInst _machInst,
3624027Sstever@eecs.umich.edu                 OpClass __opClass, IntRegIndex _dest, IntRegIndex _base,
3634027Sstever@eecs.umich.edu                 bool _add, int32_t _shiftAmt, ArmShiftType _shiftType,
3644027Sstever@eecs.umich.edu                 IntRegIndex _index)
3654027Sstever@eecs.umich.edu        : Base(mnem, _machInst, __opClass, _dest, _base, _add,
3664027Sstever@eecs.umich.edu                _shiftAmt, _shiftType, _index)
3674027Sstever@eecs.umich.edu    {}
3684027Sstever@eecs.umich.edu
3694027Sstever@eecs.umich.edu    MemoryOffset(const char *mnem, ExtMachInst _machInst,
3704027Sstever@eecs.umich.edu                 OpClass __opClass, IntRegIndex _dest, IntRegIndex _dest2,
3714027Sstever@eecs.umich.edu                 IntRegIndex _base, bool _add, int32_t _imm)
3724027Sstever@eecs.umich.edu        : Base(mnem, _machInst, __opClass, _dest, _dest2, _base, _add, _imm)
3734027Sstever@eecs.umich.edu    {}
3744027Sstever@eecs.umich.edu
3754027Sstever@eecs.umich.edu    MemoryOffset(const char *mnem, ExtMachInst _machInst,
3764027Sstever@eecs.umich.edu                 OpClass __opClass, IntRegIndex _result,
3774027Sstever@eecs.umich.edu                 IntRegIndex _dest, IntRegIndex _dest2,
3784027Sstever@eecs.umich.edu                 IntRegIndex _base, bool _add, int32_t _imm)
3794027Sstever@eecs.umich.edu        : Base(mnem, _machInst, __opClass, _result,
3804027Sstever@eecs.umich.edu                _dest, _dest2, _base, _add, _imm)
3814027Sstever@eecs.umich.edu    {}
3824027Sstever@eecs.umich.edu
3834027Sstever@eecs.umich.edu    MemoryOffset(const char *mnem, ExtMachInst _machInst,
3844027Sstever@eecs.umich.edu                 OpClass __opClass, IntRegIndex _dest, IntRegIndex _dest2,
3854027Sstever@eecs.umich.edu                 IntRegIndex _base, bool _add,
3864027Sstever@eecs.umich.edu                 int32_t _shiftAmt, ArmShiftType _shiftType,
3874027Sstever@eecs.umich.edu                 IntRegIndex _index)
3882069SN/A        : Base(mnem, _machInst, __opClass, _dest, _dest2, _base, _add,
3892069SN/A                _shiftAmt, _shiftType, _index)
3902069SN/A    {}
3912069SN/A
3922069SN/A    std::string
3932069SN/A    generateDisassembly(Addr pc, const SymbolTable *symtab) const
3942069SN/A    {
3952090SN/A        std::stringstream ss;
3963953Sstever@eecs.umich.edu        this->printInst(ss, Memory::AddrMd_Offset);
3972069SN/A        return ss.str();
3982069SN/A    }
3992090SN/A};
4002069SN/A
4012069SN/Atemplate<class Base>
4022069SN/Aclass MemoryPreIndex : public Base
4032068SN/A{
4042068SN/A  protected:
4052090SN/A    MemoryPreIndex(const char *mnem, ExtMachInst _machInst,
4062068SN/A                   OpClass __opClass, IntRegIndex _dest, IntRegIndex _base,
4072068SN/A                   bool _add, int32_t _imm)
4082068SN/A        : Base(mnem, _machInst, __opClass, _dest, _base, _add, _imm)
4092090SN/A    {}
4102069SN/A
4112068SN/A    MemoryPreIndex(const char *mnem, ExtMachInst _machInst,
4122068SN/A                   OpClass __opClass, IntRegIndex _dest, IntRegIndex _base,
4132068SN/A                   bool _add, int32_t _shiftAmt, ArmShiftType _shiftType,
4142068SN/A                   IntRegIndex _index)
4152068SN/A        : Base(mnem, _machInst, __opClass, _dest, _base, _add,
4162068SN/A                _shiftAmt, _shiftType, _index)
4172068SN/A    {}
4182069SN/A
4192132SN/A    MemoryPreIndex(const char *mnem, ExtMachInst _machInst,
4202069SN/A                   OpClass __opClass, IntRegIndex _dest, IntRegIndex _dest2,
4212069SN/A                   IntRegIndex _base, bool _add, int32_t _imm)
4222069SN/A        : Base(mnem, _machInst, __opClass, _dest, _dest2, _base, _add, _imm)
4232132SN/A    {}
4244027Sstever@eecs.umich.edu
4254027Sstever@eecs.umich.edu    MemoryPreIndex(const char *mnem, ExtMachInst _machInst,
4264027Sstever@eecs.umich.edu                   OpClass __opClass, IntRegIndex _result,
4274027Sstever@eecs.umich.edu                   IntRegIndex _dest, IntRegIndex _dest2,
4284027Sstever@eecs.umich.edu                   IntRegIndex _base, bool _add, int32_t _imm)
4294027Sstever@eecs.umich.edu        : Base(mnem, _machInst, __opClass, _result,
4304027Sstever@eecs.umich.edu                _dest, _dest2, _base, _add, _imm)
4314027Sstever@eecs.umich.edu    {}
4324027Sstever@eecs.umich.edu
4334027Sstever@eecs.umich.edu    MemoryPreIndex(const char *mnem, ExtMachInst _machInst,
4344027Sstever@eecs.umich.edu                   OpClass __opClass, IntRegIndex _dest, IntRegIndex _dest2,
4354027Sstever@eecs.umich.edu                   IntRegIndex _base, bool _add,
4364027Sstever@eecs.umich.edu                   int32_t _shiftAmt, ArmShiftType _shiftType,
4374027Sstever@eecs.umich.edu                   IntRegIndex _index)
4384027Sstever@eecs.umich.edu        : Base(mnem, _machInst, __opClass, _dest, _dest2, _base, _add,
4394027Sstever@eecs.umich.edu                _shiftAmt, _shiftType, _index)
4404027Sstever@eecs.umich.edu    {}
4414027Sstever@eecs.umich.edu
4424027Sstever@eecs.umich.edu    std::string
4434027Sstever@eecs.umich.edu    generateDisassembly(Addr pc, const SymbolTable *symtab) const
4444027Sstever@eecs.umich.edu    {
4454027Sstever@eecs.umich.edu        std::stringstream ss;
4464027Sstever@eecs.umich.edu        this->printInst(ss, Memory::AddrMd_PreIndex);
4474027Sstever@eecs.umich.edu        return ss.str();
4484027Sstever@eecs.umich.edu    }
4494027Sstever@eecs.umich.edu};
4504027Sstever@eecs.umich.edu
4514027Sstever@eecs.umich.edutemplate<class Base>
4524027Sstever@eecs.umich.educlass MemoryPostIndex : public Base
4534027Sstever@eecs.umich.edu{
4544027Sstever@eecs.umich.edu  protected:
4554027Sstever@eecs.umich.edu    MemoryPostIndex(const char *mnem, ExtMachInst _machInst,
4564027Sstever@eecs.umich.edu                    OpClass __opClass, IntRegIndex _dest, IntRegIndex _base,
4574027Sstever@eecs.umich.edu                    bool _add, int32_t _imm)
4582069SN/A        : Base(mnem, _machInst, __opClass, _dest, _base, _add, _imm)
4592069SN/A    {}
4602069SN/A
4612069SN/A    MemoryPostIndex(const char *mnem, ExtMachInst _machInst,
4622069SN/A                    OpClass __opClass, IntRegIndex _dest, IntRegIndex _base,
4632069SN/A                    bool _add, int32_t _shiftAmt, ArmShiftType _shiftType,
4642069SN/A                    IntRegIndex _index)
4652090SN/A        : Base(mnem, _machInst, __opClass, _dest, _base, _add,
4662069SN/A                _shiftAmt, _shiftType, _index)
4672069SN/A    {}
4682069SN/A
4692090SN/A    MemoryPostIndex(const char *mnem, ExtMachInst _machInst,
4702069SN/A                    OpClass __opClass, IntRegIndex _dest, IntRegIndex _dest2,
4712069SN/A                    IntRegIndex _base, bool _add, int32_t _imm)
4722069SN/A        : Base(mnem, _machInst, __opClass, _dest, _dest2, _base, _add, _imm)
4732069SN/A    {}
4742069SN/A
4752090SN/A    MemoryPostIndex(const char *mnem, ExtMachInst _machInst,
4762069SN/A                    OpClass __opClass, IntRegIndex _result,
4772069SN/A                    IntRegIndex _dest, IntRegIndex _dest2,
4782069SN/A                    IntRegIndex _base, bool _add, int32_t _imm)
4792090SN/A        : Base(mnem, _machInst, __opClass, _result,
4802069SN/A                _dest, _dest2, _base, _add, _imm)
4812069SN/A    {}
4822069SN/A
4832069SN/A    MemoryPostIndex(const char *mnem, ExtMachInst _machInst,
4842069SN/A                    OpClass __opClass, IntRegIndex _dest, IntRegIndex _dest2,
4852069SN/A                    IntRegIndex _base, bool _add,
4862069SN/A                    int32_t _shiftAmt, ArmShiftType _shiftType,
4872095SN/A                    IntRegIndex _index)
4882132SN/A        : Base(mnem, _machInst, __opClass, _dest, _dest2, _base, _add,
4892095SN/A                _shiftAmt, _shiftType, _index)
4902095SN/A    {}
4912095SN/A
4922132SN/A    std::string
4932095SN/A    generateDisassembly(Addr pc, const SymbolTable *symtab) const
4942095SN/A    {
4952506SN/A        std::stringstream ss;
4962095SN/A        this->printInst(ss, Memory::AddrMd_PostIndex);
4972095SN/A        return ss.str();
4982095SN/A    }
4992098SN/A};
5002095SN/A}
5012095SN/A
5022095SN/A#endif //__ARCH_ARM_INSTS_MEM_HH__
5032098SN/A