mem.hh revision 7303
17118Sgblack@eecs.umich.edu/*
27118Sgblack@eecs.umich.edu * Copyright (c) 2010 ARM Limited
37118Sgblack@eecs.umich.edu * All rights reserved
47118Sgblack@eecs.umich.edu *
57118Sgblack@eecs.umich.edu * The license below extends only to copyright in the software and shall
67118Sgblack@eecs.umich.edu * not be construed as granting a license to any other intellectual
77118Sgblack@eecs.umich.edu * property including but not limited to intellectual property relating
87118Sgblack@eecs.umich.edu * to a hardware implementation of the functionality of the software
97118Sgblack@eecs.umich.edu * licensed hereunder.  You may use the software subject to the license
107118Sgblack@eecs.umich.edu * terms below provided that you ensure that this notice is replicated
117118Sgblack@eecs.umich.edu * unmodified and in its entirety in all distributions of the software,
127118Sgblack@eecs.umich.edu * modified or unmodified, in source code or in binary form.
137118Sgblack@eecs.umich.edu *
147118Sgblack@eecs.umich.edu * Copyright (c) 2007-2008 The Florida State University
156253Sgblack@eecs.umich.edu * All rights reserved.
166253Sgblack@eecs.umich.edu *
176253Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
186253Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
196253Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
206253Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
216253Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
226253Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
236253Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
246253Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
256253Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
266253Sgblack@eecs.umich.edu * this software without specific prior written permission.
276253Sgblack@eecs.umich.edu *
286253Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
296253Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
306253Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
316253Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
326253Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
336253Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
346253Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
356253Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
366253Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
376253Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
386253Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
396253Sgblack@eecs.umich.edu *
406253Sgblack@eecs.umich.edu * Authors: Stephen Hines
416253Sgblack@eecs.umich.edu */
426253Sgblack@eecs.umich.edu#ifndef __ARCH_ARM_MEM_HH__
436253Sgblack@eecs.umich.edu#define __ARCH_ARM_MEM_HH__
446253Sgblack@eecs.umich.edu
456253Sgblack@eecs.umich.edu#include "arch/arm/insts/pred_inst.hh"
466253Sgblack@eecs.umich.edu
476253Sgblack@eecs.umich.edunamespace ArmISA
486253Sgblack@eecs.umich.edu{
497118Sgblack@eecs.umich.edu
507205Sgblack@eecs.umich.educlass Swap : public PredOp
517205Sgblack@eecs.umich.edu{
527205Sgblack@eecs.umich.edu  protected:
537205Sgblack@eecs.umich.edu    IntRegIndex dest;
547205Sgblack@eecs.umich.edu    IntRegIndex op1;
557205Sgblack@eecs.umich.edu    IntRegIndex base;
567205Sgblack@eecs.umich.edu
577205Sgblack@eecs.umich.edu    Swap(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
587205Sgblack@eecs.umich.edu         IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _base)
597205Sgblack@eecs.umich.edu        : PredOp(mnem, _machInst, __opClass),
607205Sgblack@eecs.umich.edu          dest(_dest), op1(_op1), base(_base)
617205Sgblack@eecs.umich.edu    {}
627205Sgblack@eecs.umich.edu
637205Sgblack@eecs.umich.edu    std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
647205Sgblack@eecs.umich.edu};
657205Sgblack@eecs.umich.edu
667291Sgblack@eecs.umich.edu// The address is a base register plus an immediate.
677291Sgblack@eecs.umich.educlass RfeOp : public PredOp
687291Sgblack@eecs.umich.edu{
697291Sgblack@eecs.umich.edu  public:
707291Sgblack@eecs.umich.edu    enum AddrMode {
717291Sgblack@eecs.umich.edu        DecrementAfter,
727291Sgblack@eecs.umich.edu        DecrementBefore,
737291Sgblack@eecs.umich.edu        IncrementAfter,
747291Sgblack@eecs.umich.edu        IncrementBefore
757291Sgblack@eecs.umich.edu    };
767291Sgblack@eecs.umich.edu  protected:
777291Sgblack@eecs.umich.edu    IntRegIndex base;
787291Sgblack@eecs.umich.edu    AddrMode mode;
797291Sgblack@eecs.umich.edu    bool wb;
807291Sgblack@eecs.umich.edu
817291Sgblack@eecs.umich.edu    RfeOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
827291Sgblack@eecs.umich.edu          IntRegIndex _base, AddrMode _mode, bool _wb)
837291Sgblack@eecs.umich.edu        : PredOp(mnem, _machInst, __opClass),
847291Sgblack@eecs.umich.edu          base(_base), mode(_mode), wb(_wb)
857291Sgblack@eecs.umich.edu    {}
867291Sgblack@eecs.umich.edu
877291Sgblack@eecs.umich.edu    std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
887291Sgblack@eecs.umich.edu};
897291Sgblack@eecs.umich.edu
907132Sgblack@eecs.umich.educlass Memory : public PredOp
917118Sgblack@eecs.umich.edu{
927118Sgblack@eecs.umich.edu  public:
937118Sgblack@eecs.umich.edu    enum AddrMode {
947118Sgblack@eecs.umich.edu        AddrMd_Offset,
957118Sgblack@eecs.umich.edu        AddrMd_PreIndex,
967118Sgblack@eecs.umich.edu        AddrMd_PostIndex
977118Sgblack@eecs.umich.edu    };
987118Sgblack@eecs.umich.edu
997118Sgblack@eecs.umich.edu  protected:
1007118Sgblack@eecs.umich.edu
1017118Sgblack@eecs.umich.edu    IntRegIndex dest;
1027118Sgblack@eecs.umich.edu    IntRegIndex base;
1037118Sgblack@eecs.umich.edu    bool add;
1047118Sgblack@eecs.umich.edu
1057132Sgblack@eecs.umich.edu    Memory(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
1067132Sgblack@eecs.umich.edu           IntRegIndex _dest, IntRegIndex _base, bool _add)
1077118Sgblack@eecs.umich.edu        : PredOp(mnem, _machInst, __opClass),
1087118Sgblack@eecs.umich.edu          dest(_dest), base(_base), add(_add)
1097118Sgblack@eecs.umich.edu    {}
1107118Sgblack@eecs.umich.edu
1117118Sgblack@eecs.umich.edu    virtual void
1127118Sgblack@eecs.umich.edu    printOffset(std::ostream &os) const
1137118Sgblack@eecs.umich.edu    {}
1147118Sgblack@eecs.umich.edu
1157279Sgblack@eecs.umich.edu    virtual void
1167279Sgblack@eecs.umich.edu    printDest(std::ostream &os) const
1177279Sgblack@eecs.umich.edu    {
1187279Sgblack@eecs.umich.edu        printReg(os, dest);
1197279Sgblack@eecs.umich.edu    }
1207279Sgblack@eecs.umich.edu
1217118Sgblack@eecs.umich.edu    void printInst(std::ostream &os, AddrMode addrMode) const;
1227118Sgblack@eecs.umich.edu};
1237118Sgblack@eecs.umich.edu
1247118Sgblack@eecs.umich.edu// The address is a base register plus an immediate.
1257132Sgblack@eecs.umich.educlass MemoryImm : public Memory
1267118Sgblack@eecs.umich.edu{
1277118Sgblack@eecs.umich.edu  protected:
1287118Sgblack@eecs.umich.edu    int32_t imm;
1297118Sgblack@eecs.umich.edu
1307132Sgblack@eecs.umich.edu    MemoryImm(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
1317132Sgblack@eecs.umich.edu              IntRegIndex _dest, IntRegIndex _base, bool _add, int32_t _imm)
1327132Sgblack@eecs.umich.edu        : Memory(mnem, _machInst, __opClass, _dest, _base, _add), imm(_imm)
1337118Sgblack@eecs.umich.edu    {}
1347118Sgblack@eecs.umich.edu
1357118Sgblack@eecs.umich.edu    void
1367118Sgblack@eecs.umich.edu    printOffset(std::ostream &os) const
1377118Sgblack@eecs.umich.edu    {
1387118Sgblack@eecs.umich.edu        int32_t pImm = imm;
1397118Sgblack@eecs.umich.edu        if (!add)
1407118Sgblack@eecs.umich.edu            pImm = -pImm;
1417118Sgblack@eecs.umich.edu        ccprintf(os, "#%d", pImm);
1427118Sgblack@eecs.umich.edu    }
1437118Sgblack@eecs.umich.edu};
1447118Sgblack@eecs.umich.edu
1457303Sgblack@eecs.umich.educlass MemoryExImm : public MemoryImm
1467303Sgblack@eecs.umich.edu{
1477303Sgblack@eecs.umich.edu  protected:
1487303Sgblack@eecs.umich.edu    IntRegIndex result;
1497303Sgblack@eecs.umich.edu
1507303Sgblack@eecs.umich.edu    MemoryExImm(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
1517303Sgblack@eecs.umich.edu                IntRegIndex _result, IntRegIndex _dest, IntRegIndex _base,
1527303Sgblack@eecs.umich.edu                bool _add, int32_t _imm)
1537303Sgblack@eecs.umich.edu        : MemoryImm(mnem, _machInst, __opClass, _dest, _base, _add, _imm),
1547303Sgblack@eecs.umich.edu                    result(_result)
1557303Sgblack@eecs.umich.edu    {}
1567303Sgblack@eecs.umich.edu
1577303Sgblack@eecs.umich.edu    void
1587303Sgblack@eecs.umich.edu    printDest(std::ostream &os) const
1597303Sgblack@eecs.umich.edu    {
1607303Sgblack@eecs.umich.edu        printReg(os, result);
1617303Sgblack@eecs.umich.edu        os << ", ";
1627303Sgblack@eecs.umich.edu        MemoryImm::printDest(os);
1637303Sgblack@eecs.umich.edu    }
1647303Sgblack@eecs.umich.edu};
1657303Sgblack@eecs.umich.edu
1667279Sgblack@eecs.umich.edu// The address is a base register plus an immediate.
1677279Sgblack@eecs.umich.educlass MemoryDImm : public MemoryImm
1687279Sgblack@eecs.umich.edu{
1697279Sgblack@eecs.umich.edu  protected:
1707279Sgblack@eecs.umich.edu    IntRegIndex dest2;
1717279Sgblack@eecs.umich.edu
1727279Sgblack@eecs.umich.edu    MemoryDImm(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
1737279Sgblack@eecs.umich.edu              IntRegIndex _dest, IntRegIndex _dest2,
1747279Sgblack@eecs.umich.edu              IntRegIndex _base, bool _add, int32_t _imm)
1757279Sgblack@eecs.umich.edu        : MemoryImm(mnem, _machInst, __opClass, _dest, _base, _add, _imm),
1767279Sgblack@eecs.umich.edu          dest2(_dest2)
1777279Sgblack@eecs.umich.edu    {}
1787279Sgblack@eecs.umich.edu
1797279Sgblack@eecs.umich.edu    void
1807279Sgblack@eecs.umich.edu    printDest(std::ostream &os) const
1817279Sgblack@eecs.umich.edu    {
1827279Sgblack@eecs.umich.edu        MemoryImm::printDest(os);
1837279Sgblack@eecs.umich.edu        os << ", ";
1847279Sgblack@eecs.umich.edu        printReg(os, dest2);
1857279Sgblack@eecs.umich.edu    }
1867279Sgblack@eecs.umich.edu};
1877279Sgblack@eecs.umich.edu
1887303Sgblack@eecs.umich.educlass MemoryExDImm : public MemoryDImm
1897303Sgblack@eecs.umich.edu{
1907303Sgblack@eecs.umich.edu  protected:
1917303Sgblack@eecs.umich.edu    IntRegIndex result;
1927303Sgblack@eecs.umich.edu
1937303Sgblack@eecs.umich.edu    MemoryExDImm(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
1947303Sgblack@eecs.umich.edu                 IntRegIndex _result, IntRegIndex _dest, IntRegIndex _dest2,
1957303Sgblack@eecs.umich.edu                 IntRegIndex _base, bool _add, int32_t _imm)
1967303Sgblack@eecs.umich.edu        : MemoryDImm(mnem, _machInst, __opClass, _dest, _dest2,
1977303Sgblack@eecs.umich.edu                     _base, _add, _imm), result(_result)
1987303Sgblack@eecs.umich.edu    {}
1997303Sgblack@eecs.umich.edu
2007303Sgblack@eecs.umich.edu    void
2017303Sgblack@eecs.umich.edu    printDest(std::ostream &os) const
2027303Sgblack@eecs.umich.edu    {
2037303Sgblack@eecs.umich.edu        printReg(os, result);
2047303Sgblack@eecs.umich.edu        os << ", ";
2057303Sgblack@eecs.umich.edu        MemoryDImm::printDest(os);
2067303Sgblack@eecs.umich.edu    }
2077303Sgblack@eecs.umich.edu};
2087303Sgblack@eecs.umich.edu
2097118Sgblack@eecs.umich.edu// The address is a shifted register plus an immediate
2107132Sgblack@eecs.umich.educlass MemoryReg : public Memory
2117118Sgblack@eecs.umich.edu{
2127118Sgblack@eecs.umich.edu  protected:
2137118Sgblack@eecs.umich.edu    int32_t shiftAmt;
2147118Sgblack@eecs.umich.edu    ArmShiftType shiftType;
2157118Sgblack@eecs.umich.edu    IntRegIndex index;
2167118Sgblack@eecs.umich.edu
2177132Sgblack@eecs.umich.edu    MemoryReg(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
2187132Sgblack@eecs.umich.edu              IntRegIndex _dest, IntRegIndex _base, bool _add,
2197132Sgblack@eecs.umich.edu              int32_t _shiftAmt, ArmShiftType _shiftType,
2207132Sgblack@eecs.umich.edu              IntRegIndex _index)
2217132Sgblack@eecs.umich.edu        : Memory(mnem, _machInst, __opClass, _dest, _base, _add),
2227118Sgblack@eecs.umich.edu          shiftAmt(_shiftAmt), shiftType(_shiftType), index(_index)
2237118Sgblack@eecs.umich.edu    {}
2247118Sgblack@eecs.umich.edu
2257118Sgblack@eecs.umich.edu    void
2267118Sgblack@eecs.umich.edu    printOffset(std::ostream &os) const
2277118Sgblack@eecs.umich.edu    {
2287118Sgblack@eecs.umich.edu        if (!add)
2297118Sgblack@eecs.umich.edu            os << "-";
2307118Sgblack@eecs.umich.edu        printReg(os, index);
2317118Sgblack@eecs.umich.edu        if (shiftType != LSL || shiftAmt != 0) {
2327118Sgblack@eecs.umich.edu            switch (shiftType) {
2337118Sgblack@eecs.umich.edu              case LSL:
2347118Sgblack@eecs.umich.edu                ccprintf(os, " LSL #%d", shiftAmt);
2357118Sgblack@eecs.umich.edu                break;
2367118Sgblack@eecs.umich.edu              case LSR:
2377118Sgblack@eecs.umich.edu                if (shiftAmt == 0) {
2387118Sgblack@eecs.umich.edu                    ccprintf(os, " LSR #%d", 32);
2397118Sgblack@eecs.umich.edu                } else {
2407118Sgblack@eecs.umich.edu                    ccprintf(os, " LSR #%d", shiftAmt);
2417118Sgblack@eecs.umich.edu                }
2427118Sgblack@eecs.umich.edu                break;
2437118Sgblack@eecs.umich.edu              case ASR:
2447118Sgblack@eecs.umich.edu                if (shiftAmt == 0) {
2457118Sgblack@eecs.umich.edu                    ccprintf(os, " ASR #%d", 32);
2467118Sgblack@eecs.umich.edu                } else {
2477118Sgblack@eecs.umich.edu                    ccprintf(os, " ASR #%d", shiftAmt);
2487118Sgblack@eecs.umich.edu                }
2497118Sgblack@eecs.umich.edu                break;
2507118Sgblack@eecs.umich.edu              case ROR:
2517118Sgblack@eecs.umich.edu                if (shiftAmt == 0) {
2527118Sgblack@eecs.umich.edu                    ccprintf(os, " RRX");
2537118Sgblack@eecs.umich.edu                } else {
2547118Sgblack@eecs.umich.edu                    ccprintf(os, " ROR #%d", shiftAmt);
2557118Sgblack@eecs.umich.edu                }
2567118Sgblack@eecs.umich.edu                break;
2577118Sgblack@eecs.umich.edu            }
2587118Sgblack@eecs.umich.edu        }
2597118Sgblack@eecs.umich.edu    }
2607118Sgblack@eecs.umich.edu};
2617118Sgblack@eecs.umich.edu
2627279Sgblack@eecs.umich.educlass MemoryDReg : public MemoryReg
2637279Sgblack@eecs.umich.edu{
2647279Sgblack@eecs.umich.edu  protected:
2657279Sgblack@eecs.umich.edu    IntRegIndex dest2;
2667279Sgblack@eecs.umich.edu
2677279Sgblack@eecs.umich.edu    MemoryDReg(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
2687279Sgblack@eecs.umich.edu               IntRegIndex _dest, IntRegIndex _dest2,
2697279Sgblack@eecs.umich.edu               IntRegIndex _base, bool _add,
2707279Sgblack@eecs.umich.edu               int32_t _shiftAmt, ArmShiftType _shiftType,
2717279Sgblack@eecs.umich.edu               IntRegIndex _index)
2727279Sgblack@eecs.umich.edu        : MemoryReg(mnem, _machInst, __opClass, _dest, _base, _add,
2737279Sgblack@eecs.umich.edu                    _shiftAmt, _shiftType, _index),
2747279Sgblack@eecs.umich.edu          dest2(_dest2)
2757279Sgblack@eecs.umich.edu    {}
2767279Sgblack@eecs.umich.edu
2777279Sgblack@eecs.umich.edu    void
2787279Sgblack@eecs.umich.edu    printDest(std::ostream &os) const
2797279Sgblack@eecs.umich.edu    {
2807279Sgblack@eecs.umich.edu        MemoryReg::printDest(os);
2817279Sgblack@eecs.umich.edu        os << ", ";
2827279Sgblack@eecs.umich.edu        printReg(os, dest2);
2837279Sgblack@eecs.umich.edu    }
2847279Sgblack@eecs.umich.edu};
2857279Sgblack@eecs.umich.edu
2867118Sgblack@eecs.umich.edutemplate<class Base>
2877132Sgblack@eecs.umich.educlass MemoryOffset : public Base
2887118Sgblack@eecs.umich.edu{
2897118Sgblack@eecs.umich.edu  protected:
2907132Sgblack@eecs.umich.edu    MemoryOffset(const char *mnem, ExtMachInst _machInst,
2917132Sgblack@eecs.umich.edu                 OpClass __opClass, IntRegIndex _dest, IntRegIndex _base,
2927132Sgblack@eecs.umich.edu                 bool _add, int32_t _imm)
2937132Sgblack@eecs.umich.edu        : Base(mnem, _machInst, __opClass, _dest, _base, _add, _imm)
2947132Sgblack@eecs.umich.edu    {}
2957132Sgblack@eecs.umich.edu
2967132Sgblack@eecs.umich.edu    MemoryOffset(const char *mnem, ExtMachInst _machInst,
2977132Sgblack@eecs.umich.edu                 OpClass __opClass, IntRegIndex _dest, IntRegIndex _base,
2987132Sgblack@eecs.umich.edu                 bool _add, int32_t _shiftAmt, ArmShiftType _shiftType,
2997132Sgblack@eecs.umich.edu                 IntRegIndex _index)
3007132Sgblack@eecs.umich.edu        : Base(mnem, _machInst, __opClass, _dest, _base, _add,
3017132Sgblack@eecs.umich.edu                _shiftAmt, _shiftType, _index)
3027132Sgblack@eecs.umich.edu    {}
3037132Sgblack@eecs.umich.edu
3047279Sgblack@eecs.umich.edu    MemoryOffset(const char *mnem, ExtMachInst _machInst,
3057279Sgblack@eecs.umich.edu                 OpClass __opClass, IntRegIndex _dest, IntRegIndex _dest2,
3067279Sgblack@eecs.umich.edu                 IntRegIndex _base, bool _add, int32_t _imm)
3077279Sgblack@eecs.umich.edu        : Base(mnem, _machInst, __opClass, _dest, _dest2, _base, _add, _imm)
3087279Sgblack@eecs.umich.edu    {}
3097279Sgblack@eecs.umich.edu
3107279Sgblack@eecs.umich.edu    MemoryOffset(const char *mnem, ExtMachInst _machInst,
3117303Sgblack@eecs.umich.edu                 OpClass __opClass, IntRegIndex _result,
3127303Sgblack@eecs.umich.edu                 IntRegIndex _dest, IntRegIndex _dest2,
3137303Sgblack@eecs.umich.edu                 IntRegIndex _base, bool _add, int32_t _imm)
3147303Sgblack@eecs.umich.edu        : Base(mnem, _machInst, __opClass, _result,
3157303Sgblack@eecs.umich.edu                _dest, _dest2, _base, _add, _imm)
3167303Sgblack@eecs.umich.edu    {}
3177303Sgblack@eecs.umich.edu
3187303Sgblack@eecs.umich.edu    MemoryOffset(const char *mnem, ExtMachInst _machInst,
3197279Sgblack@eecs.umich.edu                 OpClass __opClass, IntRegIndex _dest, IntRegIndex _dest2,
3207279Sgblack@eecs.umich.edu                 IntRegIndex _base, bool _add,
3217279Sgblack@eecs.umich.edu                 int32_t _shiftAmt, ArmShiftType _shiftType,
3227279Sgblack@eecs.umich.edu                 IntRegIndex _index)
3237279Sgblack@eecs.umich.edu        : Base(mnem, _machInst, __opClass, _dest, _dest2, _base, _add,
3247279Sgblack@eecs.umich.edu                _shiftAmt, _shiftType, _index)
3257279Sgblack@eecs.umich.edu    {}
3267279Sgblack@eecs.umich.edu
3277132Sgblack@eecs.umich.edu    std::string
3287132Sgblack@eecs.umich.edu    generateDisassembly(Addr pc, const SymbolTable *symtab) const
3297132Sgblack@eecs.umich.edu    {
3307132Sgblack@eecs.umich.edu        std::stringstream ss;
3317132Sgblack@eecs.umich.edu        this->printInst(ss, Memory::AddrMd_Offset);
3327132Sgblack@eecs.umich.edu        return ss.str();
3337132Sgblack@eecs.umich.edu    }
3347132Sgblack@eecs.umich.edu};
3357132Sgblack@eecs.umich.edu
3367132Sgblack@eecs.umich.edutemplate<class Base>
3377132Sgblack@eecs.umich.educlass MemoryPreIndex : public Base
3387132Sgblack@eecs.umich.edu{
3397132Sgblack@eecs.umich.edu  protected:
3407132Sgblack@eecs.umich.edu    MemoryPreIndex(const char *mnem, ExtMachInst _machInst,
3417132Sgblack@eecs.umich.edu                   OpClass __opClass, IntRegIndex _dest, IntRegIndex _base,
3427132Sgblack@eecs.umich.edu                   bool _add, int32_t _imm)
3437132Sgblack@eecs.umich.edu        : Base(mnem, _machInst, __opClass, _dest, _base, _add, _imm)
3447132Sgblack@eecs.umich.edu    {}
3457132Sgblack@eecs.umich.edu
3467132Sgblack@eecs.umich.edu    MemoryPreIndex(const char *mnem, ExtMachInst _machInst,
3477132Sgblack@eecs.umich.edu                   OpClass __opClass, IntRegIndex _dest, IntRegIndex _base,
3487132Sgblack@eecs.umich.edu                   bool _add, int32_t _shiftAmt, ArmShiftType _shiftType,
3497132Sgblack@eecs.umich.edu                   IntRegIndex _index)
3507132Sgblack@eecs.umich.edu        : Base(mnem, _machInst, __opClass, _dest, _base, _add,
3517132Sgblack@eecs.umich.edu                _shiftAmt, _shiftType, _index)
3527132Sgblack@eecs.umich.edu    {}
3537132Sgblack@eecs.umich.edu
3547279Sgblack@eecs.umich.edu    MemoryPreIndex(const char *mnem, ExtMachInst _machInst,
3557279Sgblack@eecs.umich.edu                   OpClass __opClass, IntRegIndex _dest, IntRegIndex _dest2,
3567279Sgblack@eecs.umich.edu                   IntRegIndex _base, bool _add, int32_t _imm)
3577279Sgblack@eecs.umich.edu        : Base(mnem, _machInst, __opClass, _dest, _dest2, _base, _add, _imm)
3587279Sgblack@eecs.umich.edu    {}
3597279Sgblack@eecs.umich.edu
3607279Sgblack@eecs.umich.edu    MemoryPreIndex(const char *mnem, ExtMachInst _machInst,
3617303Sgblack@eecs.umich.edu                   OpClass __opClass, IntRegIndex _result,
3627303Sgblack@eecs.umich.edu                   IntRegIndex _dest, IntRegIndex _dest2,
3637303Sgblack@eecs.umich.edu                   IntRegIndex _base, bool _add, int32_t _imm)
3647303Sgblack@eecs.umich.edu        : Base(mnem, _machInst, __opClass, _result,
3657303Sgblack@eecs.umich.edu                _dest, _dest2, _base, _add, _imm)
3667303Sgblack@eecs.umich.edu    {}
3677303Sgblack@eecs.umich.edu
3687303Sgblack@eecs.umich.edu    MemoryPreIndex(const char *mnem, ExtMachInst _machInst,
3697279Sgblack@eecs.umich.edu                   OpClass __opClass, IntRegIndex _dest, IntRegIndex _dest2,
3707279Sgblack@eecs.umich.edu                   IntRegIndex _base, bool _add,
3717279Sgblack@eecs.umich.edu                   int32_t _shiftAmt, ArmShiftType _shiftType,
3727279Sgblack@eecs.umich.edu                   IntRegIndex _index)
3737279Sgblack@eecs.umich.edu        : Base(mnem, _machInst, __opClass, _dest, _dest2, _base, _add,
3747279Sgblack@eecs.umich.edu                _shiftAmt, _shiftType, _index)
3757279Sgblack@eecs.umich.edu    {}
3767279Sgblack@eecs.umich.edu
3777132Sgblack@eecs.umich.edu    std::string
3787132Sgblack@eecs.umich.edu    generateDisassembly(Addr pc, const SymbolTable *symtab) const
3797132Sgblack@eecs.umich.edu    {
3807132Sgblack@eecs.umich.edu        std::stringstream ss;
3817132Sgblack@eecs.umich.edu        this->printInst(ss, Memory::AddrMd_PreIndex);
3827132Sgblack@eecs.umich.edu        return ss.str();
3837132Sgblack@eecs.umich.edu    }
3847132Sgblack@eecs.umich.edu};
3857132Sgblack@eecs.umich.edu
3867132Sgblack@eecs.umich.edutemplate<class Base>
3877132Sgblack@eecs.umich.educlass MemoryPostIndex : public Base
3887132Sgblack@eecs.umich.edu{
3897132Sgblack@eecs.umich.edu  protected:
3907132Sgblack@eecs.umich.edu    MemoryPostIndex(const char *mnem, ExtMachInst _machInst,
3917118Sgblack@eecs.umich.edu                    OpClass __opClass, IntRegIndex _dest, IntRegIndex _base,
3927118Sgblack@eecs.umich.edu                    bool _add, int32_t _imm)
3937118Sgblack@eecs.umich.edu        : Base(mnem, _machInst, __opClass, _dest, _base, _add, _imm)
3947118Sgblack@eecs.umich.edu    {}
3957118Sgblack@eecs.umich.edu
3967132Sgblack@eecs.umich.edu    MemoryPostIndex(const char *mnem, ExtMachInst _machInst,
3977118Sgblack@eecs.umich.edu                    OpClass __opClass, IntRegIndex _dest, IntRegIndex _base,
3987118Sgblack@eecs.umich.edu                    bool _add, int32_t _shiftAmt, ArmShiftType _shiftType,
3997118Sgblack@eecs.umich.edu                    IntRegIndex _index)
4007118Sgblack@eecs.umich.edu        : Base(mnem, _machInst, __opClass, _dest, _base, _add,
4017118Sgblack@eecs.umich.edu                _shiftAmt, _shiftType, _index)
4027118Sgblack@eecs.umich.edu    {}
4037118Sgblack@eecs.umich.edu
4047279Sgblack@eecs.umich.edu    MemoryPostIndex(const char *mnem, ExtMachInst _machInst,
4057279Sgblack@eecs.umich.edu                    OpClass __opClass, IntRegIndex _dest, IntRegIndex _dest2,
4067279Sgblack@eecs.umich.edu                    IntRegIndex _base, bool _add, int32_t _imm)
4077279Sgblack@eecs.umich.edu        : Base(mnem, _machInst, __opClass, _dest, _dest2, _base, _add, _imm)
4087279Sgblack@eecs.umich.edu    {}
4097279Sgblack@eecs.umich.edu
4107279Sgblack@eecs.umich.edu    MemoryPostIndex(const char *mnem, ExtMachInst _machInst,
4117303Sgblack@eecs.umich.edu                    OpClass __opClass, IntRegIndex _result,
4127303Sgblack@eecs.umich.edu                    IntRegIndex _dest, IntRegIndex _dest2,
4137303Sgblack@eecs.umich.edu                    IntRegIndex _base, bool _add, int32_t _imm)
4147303Sgblack@eecs.umich.edu        : Base(mnem, _machInst, __opClass, _result,
4157303Sgblack@eecs.umich.edu                _dest, _dest2, _base, _add, _imm)
4167303Sgblack@eecs.umich.edu    {}
4177303Sgblack@eecs.umich.edu
4187303Sgblack@eecs.umich.edu    MemoryPostIndex(const char *mnem, ExtMachInst _machInst,
4197279Sgblack@eecs.umich.edu                    OpClass __opClass, IntRegIndex _dest, IntRegIndex _dest2,
4207279Sgblack@eecs.umich.edu                    IntRegIndex _base, bool _add,
4217279Sgblack@eecs.umich.edu                    int32_t _shiftAmt, ArmShiftType _shiftType,
4227279Sgblack@eecs.umich.edu                    IntRegIndex _index)
4237279Sgblack@eecs.umich.edu        : Base(mnem, _machInst, __opClass, _dest, _dest2, _base, _add,
4247279Sgblack@eecs.umich.edu                _shiftAmt, _shiftType, _index)
4257279Sgblack@eecs.umich.edu    {}
4267279Sgblack@eecs.umich.edu
4277118Sgblack@eecs.umich.edu    std::string
4287118Sgblack@eecs.umich.edu    generateDisassembly(Addr pc, const SymbolTable *symtab) const
4297118Sgblack@eecs.umich.edu    {
4307118Sgblack@eecs.umich.edu        std::stringstream ss;
4317132Sgblack@eecs.umich.edu        this->printInst(ss, Memory::AddrMd_PostIndex);
4327118Sgblack@eecs.umich.edu        return ss.str();
4337118Sgblack@eecs.umich.edu    }
4347118Sgblack@eecs.umich.edu};
4356253Sgblack@eecs.umich.edu}
4366253Sgblack@eecs.umich.edu
4376253Sgblack@eecs.umich.edu#endif //__ARCH_ARM_INSTS_MEM_HH__
438