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