mem.hh revision 7205
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 667132Sgblack@eecs.umich.educlass Memory : public PredOp 677118Sgblack@eecs.umich.edu{ 687118Sgblack@eecs.umich.edu public: 697118Sgblack@eecs.umich.edu enum AddrMode { 707118Sgblack@eecs.umich.edu AddrMd_Offset, 717118Sgblack@eecs.umich.edu AddrMd_PreIndex, 727118Sgblack@eecs.umich.edu AddrMd_PostIndex 737118Sgblack@eecs.umich.edu }; 747118Sgblack@eecs.umich.edu 757118Sgblack@eecs.umich.edu protected: 767118Sgblack@eecs.umich.edu 777118Sgblack@eecs.umich.edu IntRegIndex dest; 787118Sgblack@eecs.umich.edu IntRegIndex base; 797118Sgblack@eecs.umich.edu bool add; 807118Sgblack@eecs.umich.edu 817132Sgblack@eecs.umich.edu Memory(const char *mnem, ExtMachInst _machInst, OpClass __opClass, 827132Sgblack@eecs.umich.edu IntRegIndex _dest, IntRegIndex _base, bool _add) 837118Sgblack@eecs.umich.edu : PredOp(mnem, _machInst, __opClass), 847118Sgblack@eecs.umich.edu dest(_dest), base(_base), add(_add) 857118Sgblack@eecs.umich.edu {} 867118Sgblack@eecs.umich.edu 877118Sgblack@eecs.umich.edu virtual void 887118Sgblack@eecs.umich.edu printOffset(std::ostream &os) const 897118Sgblack@eecs.umich.edu {} 907118Sgblack@eecs.umich.edu 917118Sgblack@eecs.umich.edu void printInst(std::ostream &os, AddrMode addrMode) const; 927118Sgblack@eecs.umich.edu}; 937118Sgblack@eecs.umich.edu 947118Sgblack@eecs.umich.edu// The address is a base register plus an immediate. 957132Sgblack@eecs.umich.educlass MemoryImm : public Memory 967118Sgblack@eecs.umich.edu{ 977118Sgblack@eecs.umich.edu protected: 987118Sgblack@eecs.umich.edu int32_t imm; 997118Sgblack@eecs.umich.edu 1007132Sgblack@eecs.umich.edu MemoryImm(const char *mnem, ExtMachInst _machInst, OpClass __opClass, 1017132Sgblack@eecs.umich.edu IntRegIndex _dest, IntRegIndex _base, bool _add, int32_t _imm) 1027132Sgblack@eecs.umich.edu : Memory(mnem, _machInst, __opClass, _dest, _base, _add), imm(_imm) 1037118Sgblack@eecs.umich.edu {} 1047118Sgblack@eecs.umich.edu 1057118Sgblack@eecs.umich.edu void 1067118Sgblack@eecs.umich.edu printOffset(std::ostream &os) const 1077118Sgblack@eecs.umich.edu { 1087118Sgblack@eecs.umich.edu int32_t pImm = imm; 1097118Sgblack@eecs.umich.edu if (!add) 1107118Sgblack@eecs.umich.edu pImm = -pImm; 1117118Sgblack@eecs.umich.edu ccprintf(os, "#%d", pImm); 1127118Sgblack@eecs.umich.edu } 1137118Sgblack@eecs.umich.edu}; 1147118Sgblack@eecs.umich.edu 1157118Sgblack@eecs.umich.edu// The address is a shifted register plus an immediate 1167132Sgblack@eecs.umich.educlass MemoryReg : public Memory 1177118Sgblack@eecs.umich.edu{ 1187118Sgblack@eecs.umich.edu protected: 1197118Sgblack@eecs.umich.edu int32_t shiftAmt; 1207118Sgblack@eecs.umich.edu ArmShiftType shiftType; 1217118Sgblack@eecs.umich.edu IntRegIndex index; 1227118Sgblack@eecs.umich.edu 1237132Sgblack@eecs.umich.edu MemoryReg(const char *mnem, ExtMachInst _machInst, OpClass __opClass, 1247132Sgblack@eecs.umich.edu IntRegIndex _dest, IntRegIndex _base, bool _add, 1257132Sgblack@eecs.umich.edu int32_t _shiftAmt, ArmShiftType _shiftType, 1267132Sgblack@eecs.umich.edu IntRegIndex _index) 1277132Sgblack@eecs.umich.edu : Memory(mnem, _machInst, __opClass, _dest, _base, _add), 1287118Sgblack@eecs.umich.edu shiftAmt(_shiftAmt), shiftType(_shiftType), index(_index) 1297118Sgblack@eecs.umich.edu {} 1307118Sgblack@eecs.umich.edu 1317118Sgblack@eecs.umich.edu void 1327118Sgblack@eecs.umich.edu printOffset(std::ostream &os) const 1337118Sgblack@eecs.umich.edu { 1347118Sgblack@eecs.umich.edu if (!add) 1357118Sgblack@eecs.umich.edu os << "-"; 1367118Sgblack@eecs.umich.edu printReg(os, index); 1377118Sgblack@eecs.umich.edu if (shiftType != LSL || shiftAmt != 0) { 1387118Sgblack@eecs.umich.edu switch (shiftType) { 1397118Sgblack@eecs.umich.edu case LSL: 1407118Sgblack@eecs.umich.edu ccprintf(os, " LSL #%d", shiftAmt); 1417118Sgblack@eecs.umich.edu break; 1427118Sgblack@eecs.umich.edu case LSR: 1437118Sgblack@eecs.umich.edu if (shiftAmt == 0) { 1447118Sgblack@eecs.umich.edu ccprintf(os, " LSR #%d", 32); 1457118Sgblack@eecs.umich.edu } else { 1467118Sgblack@eecs.umich.edu ccprintf(os, " LSR #%d", shiftAmt); 1477118Sgblack@eecs.umich.edu } 1487118Sgblack@eecs.umich.edu break; 1497118Sgblack@eecs.umich.edu case ASR: 1507118Sgblack@eecs.umich.edu if (shiftAmt == 0) { 1517118Sgblack@eecs.umich.edu ccprintf(os, " ASR #%d", 32); 1527118Sgblack@eecs.umich.edu } else { 1537118Sgblack@eecs.umich.edu ccprintf(os, " ASR #%d", shiftAmt); 1547118Sgblack@eecs.umich.edu } 1557118Sgblack@eecs.umich.edu break; 1567118Sgblack@eecs.umich.edu case ROR: 1577118Sgblack@eecs.umich.edu if (shiftAmt == 0) { 1587118Sgblack@eecs.umich.edu ccprintf(os, " RRX"); 1597118Sgblack@eecs.umich.edu } else { 1607118Sgblack@eecs.umich.edu ccprintf(os, " ROR #%d", shiftAmt); 1617118Sgblack@eecs.umich.edu } 1627118Sgblack@eecs.umich.edu break; 1637118Sgblack@eecs.umich.edu } 1647118Sgblack@eecs.umich.edu } 1657118Sgblack@eecs.umich.edu } 1667118Sgblack@eecs.umich.edu}; 1677118Sgblack@eecs.umich.edu 1687118Sgblack@eecs.umich.edutemplate<class Base> 1697132Sgblack@eecs.umich.educlass MemoryOffset : public Base 1707118Sgblack@eecs.umich.edu{ 1717118Sgblack@eecs.umich.edu protected: 1727132Sgblack@eecs.umich.edu MemoryOffset(const char *mnem, ExtMachInst _machInst, 1737132Sgblack@eecs.umich.edu OpClass __opClass, IntRegIndex _dest, IntRegIndex _base, 1747132Sgblack@eecs.umich.edu bool _add, int32_t _imm) 1757132Sgblack@eecs.umich.edu : Base(mnem, _machInst, __opClass, _dest, _base, _add, _imm) 1767132Sgblack@eecs.umich.edu {} 1777132Sgblack@eecs.umich.edu 1787132Sgblack@eecs.umich.edu MemoryOffset(const char *mnem, ExtMachInst _machInst, 1797132Sgblack@eecs.umich.edu OpClass __opClass, IntRegIndex _dest, IntRegIndex _base, 1807132Sgblack@eecs.umich.edu bool _add, int32_t _shiftAmt, ArmShiftType _shiftType, 1817132Sgblack@eecs.umich.edu IntRegIndex _index) 1827132Sgblack@eecs.umich.edu : Base(mnem, _machInst, __opClass, _dest, _base, _add, 1837132Sgblack@eecs.umich.edu _shiftAmt, _shiftType, _index) 1847132Sgblack@eecs.umich.edu {} 1857132Sgblack@eecs.umich.edu 1867132Sgblack@eecs.umich.edu std::string 1877132Sgblack@eecs.umich.edu generateDisassembly(Addr pc, const SymbolTable *symtab) const 1887132Sgblack@eecs.umich.edu { 1897132Sgblack@eecs.umich.edu std::stringstream ss; 1907132Sgblack@eecs.umich.edu this->printInst(ss, Memory::AddrMd_Offset); 1917132Sgblack@eecs.umich.edu return ss.str(); 1927132Sgblack@eecs.umich.edu } 1937132Sgblack@eecs.umich.edu}; 1947132Sgblack@eecs.umich.edu 1957132Sgblack@eecs.umich.edutemplate<class Base> 1967132Sgblack@eecs.umich.educlass MemoryPreIndex : public Base 1977132Sgblack@eecs.umich.edu{ 1987132Sgblack@eecs.umich.edu protected: 1997132Sgblack@eecs.umich.edu MemoryPreIndex(const char *mnem, ExtMachInst _machInst, 2007132Sgblack@eecs.umich.edu OpClass __opClass, IntRegIndex _dest, IntRegIndex _base, 2017132Sgblack@eecs.umich.edu bool _add, int32_t _imm) 2027132Sgblack@eecs.umich.edu : Base(mnem, _machInst, __opClass, _dest, _base, _add, _imm) 2037132Sgblack@eecs.umich.edu {} 2047132Sgblack@eecs.umich.edu 2057132Sgblack@eecs.umich.edu MemoryPreIndex(const char *mnem, ExtMachInst _machInst, 2067132Sgblack@eecs.umich.edu OpClass __opClass, IntRegIndex _dest, IntRegIndex _base, 2077132Sgblack@eecs.umich.edu bool _add, int32_t _shiftAmt, ArmShiftType _shiftType, 2087132Sgblack@eecs.umich.edu IntRegIndex _index) 2097132Sgblack@eecs.umich.edu : Base(mnem, _machInst, __opClass, _dest, _base, _add, 2107132Sgblack@eecs.umich.edu _shiftAmt, _shiftType, _index) 2117132Sgblack@eecs.umich.edu {} 2127132Sgblack@eecs.umich.edu 2137132Sgblack@eecs.umich.edu std::string 2147132Sgblack@eecs.umich.edu generateDisassembly(Addr pc, const SymbolTable *symtab) const 2157132Sgblack@eecs.umich.edu { 2167132Sgblack@eecs.umich.edu std::stringstream ss; 2177132Sgblack@eecs.umich.edu this->printInst(ss, Memory::AddrMd_PreIndex); 2187132Sgblack@eecs.umich.edu return ss.str(); 2197132Sgblack@eecs.umich.edu } 2207132Sgblack@eecs.umich.edu}; 2217132Sgblack@eecs.umich.edu 2227132Sgblack@eecs.umich.edutemplate<class Base> 2237132Sgblack@eecs.umich.educlass MemoryPostIndex : public Base 2247132Sgblack@eecs.umich.edu{ 2257132Sgblack@eecs.umich.edu protected: 2267132Sgblack@eecs.umich.edu MemoryPostIndex(const char *mnem, ExtMachInst _machInst, 2277118Sgblack@eecs.umich.edu OpClass __opClass, IntRegIndex _dest, IntRegIndex _base, 2287118Sgblack@eecs.umich.edu bool _add, int32_t _imm) 2297118Sgblack@eecs.umich.edu : Base(mnem, _machInst, __opClass, _dest, _base, _add, _imm) 2307118Sgblack@eecs.umich.edu {} 2317118Sgblack@eecs.umich.edu 2327132Sgblack@eecs.umich.edu MemoryPostIndex(const char *mnem, ExtMachInst _machInst, 2337118Sgblack@eecs.umich.edu OpClass __opClass, IntRegIndex _dest, IntRegIndex _base, 2347118Sgblack@eecs.umich.edu bool _add, int32_t _shiftAmt, ArmShiftType _shiftType, 2357118Sgblack@eecs.umich.edu IntRegIndex _index) 2367118Sgblack@eecs.umich.edu : Base(mnem, _machInst, __opClass, _dest, _base, _add, 2377118Sgblack@eecs.umich.edu _shiftAmt, _shiftType, _index) 2387118Sgblack@eecs.umich.edu {} 2397118Sgblack@eecs.umich.edu 2407118Sgblack@eecs.umich.edu std::string 2417118Sgblack@eecs.umich.edu generateDisassembly(Addr pc, const SymbolTable *symtab) const 2427118Sgblack@eecs.umich.edu { 2437118Sgblack@eecs.umich.edu std::stringstream ss; 2447132Sgblack@eecs.umich.edu this->printInst(ss, Memory::AddrMd_PostIndex); 2457118Sgblack@eecs.umich.edu return ss.str(); 2467118Sgblack@eecs.umich.edu } 2477118Sgblack@eecs.umich.edu}; 2486253Sgblack@eecs.umich.edu} 2496253Sgblack@eecs.umich.edu 2506253Sgblack@eecs.umich.edu#endif //__ARCH_ARM_INSTS_MEM_HH__ 251