misc.cc revision 7331
17202Sgblack@eecs.umich.edu/* 27202Sgblack@eecs.umich.edu * Copyright (c) 2010 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#include "arch/arm/insts/misc.hh" 417202Sgblack@eecs.umich.edu 427202Sgblack@eecs.umich.edustd::string 437202Sgblack@eecs.umich.eduMrsOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 447202Sgblack@eecs.umich.edu{ 457202Sgblack@eecs.umich.edu std::stringstream ss; 467202Sgblack@eecs.umich.edu printMnemonic(ss); 477202Sgblack@eecs.umich.edu printReg(ss, dest); 487202Sgblack@eecs.umich.edu ss << ", "; 497202Sgblack@eecs.umich.edu bool foundPsr = false; 507202Sgblack@eecs.umich.edu for (unsigned i = 0; i < numSrcRegs(); i++) { 517202Sgblack@eecs.umich.edu int idx = srcRegIdx(i); 527202Sgblack@eecs.umich.edu if (idx < Ctrl_Base_DepTag) { 537202Sgblack@eecs.umich.edu continue; 547202Sgblack@eecs.umich.edu } 557202Sgblack@eecs.umich.edu idx -= Ctrl_Base_DepTag; 567202Sgblack@eecs.umich.edu if (idx == MISCREG_CPSR) { 577202Sgblack@eecs.umich.edu ss << "cpsr"; 587202Sgblack@eecs.umich.edu foundPsr = true; 597202Sgblack@eecs.umich.edu break; 607202Sgblack@eecs.umich.edu } 617202Sgblack@eecs.umich.edu if (idx == MISCREG_SPSR) { 627202Sgblack@eecs.umich.edu ss << "spsr"; 637202Sgblack@eecs.umich.edu foundPsr = true; 647202Sgblack@eecs.umich.edu break; 657202Sgblack@eecs.umich.edu } 667202Sgblack@eecs.umich.edu } 677202Sgblack@eecs.umich.edu if (!foundPsr) { 687202Sgblack@eecs.umich.edu ss << "????"; 697202Sgblack@eecs.umich.edu } 707202Sgblack@eecs.umich.edu return ss.str(); 717202Sgblack@eecs.umich.edu} 727202Sgblack@eecs.umich.edu 737202Sgblack@eecs.umich.eduvoid 747202Sgblack@eecs.umich.eduMsrBase::printMsrBase(std::ostream &os) const 757202Sgblack@eecs.umich.edu{ 767202Sgblack@eecs.umich.edu printMnemonic(os); 777202Sgblack@eecs.umich.edu bool apsr = false; 787202Sgblack@eecs.umich.edu bool foundPsr = false; 797202Sgblack@eecs.umich.edu for (unsigned i = 0; i < numDestRegs(); i++) { 807202Sgblack@eecs.umich.edu int idx = destRegIdx(i); 817202Sgblack@eecs.umich.edu if (idx < Ctrl_Base_DepTag) { 827202Sgblack@eecs.umich.edu continue; 837202Sgblack@eecs.umich.edu } 847202Sgblack@eecs.umich.edu idx -= Ctrl_Base_DepTag; 857202Sgblack@eecs.umich.edu if (idx == MISCREG_CPSR) { 867202Sgblack@eecs.umich.edu os << "cpsr_"; 877202Sgblack@eecs.umich.edu foundPsr = true; 887202Sgblack@eecs.umich.edu break; 897202Sgblack@eecs.umich.edu } 907202Sgblack@eecs.umich.edu if (idx == MISCREG_SPSR) { 917202Sgblack@eecs.umich.edu if (bits(byteMask, 1, 0)) { 927202Sgblack@eecs.umich.edu os << "spsr_"; 937202Sgblack@eecs.umich.edu } else { 947202Sgblack@eecs.umich.edu os << "apsr_"; 957202Sgblack@eecs.umich.edu apsr = true; 967202Sgblack@eecs.umich.edu } 977202Sgblack@eecs.umich.edu foundPsr = true; 987202Sgblack@eecs.umich.edu break; 997202Sgblack@eecs.umich.edu } 1007202Sgblack@eecs.umich.edu } 1017202Sgblack@eecs.umich.edu if (!foundPsr) { 1027202Sgblack@eecs.umich.edu os << "????"; 1037202Sgblack@eecs.umich.edu return; 1047202Sgblack@eecs.umich.edu } 1057202Sgblack@eecs.umich.edu if (bits(byteMask, 3)) { 1067202Sgblack@eecs.umich.edu if (apsr) { 1077202Sgblack@eecs.umich.edu os << "nzcvq"; 1087202Sgblack@eecs.umich.edu } else { 1097202Sgblack@eecs.umich.edu os << "f"; 1107202Sgblack@eecs.umich.edu } 1117202Sgblack@eecs.umich.edu } 1127202Sgblack@eecs.umich.edu if (bits(byteMask, 2)) { 1137202Sgblack@eecs.umich.edu if (apsr) { 1147202Sgblack@eecs.umich.edu os << "g"; 1157202Sgblack@eecs.umich.edu } else { 1167202Sgblack@eecs.umich.edu os << "s"; 1177202Sgblack@eecs.umich.edu } 1187202Sgblack@eecs.umich.edu } 1197202Sgblack@eecs.umich.edu if (bits(byteMask, 1)) { 1207202Sgblack@eecs.umich.edu os << "x"; 1217202Sgblack@eecs.umich.edu } 1227202Sgblack@eecs.umich.edu if (bits(byteMask, 0)) { 1237202Sgblack@eecs.umich.edu os << "c"; 1247202Sgblack@eecs.umich.edu } 1257202Sgblack@eecs.umich.edu} 1267202Sgblack@eecs.umich.edu 1277202Sgblack@eecs.umich.edustd::string 1287202Sgblack@eecs.umich.eduMsrImmOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 1297202Sgblack@eecs.umich.edu{ 1307202Sgblack@eecs.umich.edu std::stringstream ss; 1317202Sgblack@eecs.umich.edu printMsrBase(ss); 1327202Sgblack@eecs.umich.edu ccprintf(ss, ", #%#x", imm); 1337202Sgblack@eecs.umich.edu return ss.str(); 1347202Sgblack@eecs.umich.edu} 1357202Sgblack@eecs.umich.edu 1367202Sgblack@eecs.umich.edustd::string 1377202Sgblack@eecs.umich.eduMsrRegOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 1387202Sgblack@eecs.umich.edu{ 1397202Sgblack@eecs.umich.edu std::stringstream ss; 1407202Sgblack@eecs.umich.edu printMsrBase(ss); 1417202Sgblack@eecs.umich.edu ss << ", "; 1427202Sgblack@eecs.umich.edu printReg(ss, op1); 1437202Sgblack@eecs.umich.edu return ss.str(); 1447202Sgblack@eecs.umich.edu} 1457208Sgblack@eecs.umich.edu 1467208Sgblack@eecs.umich.edustd::string 1477306Sgblack@eecs.umich.eduImmOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 1487306Sgblack@eecs.umich.edu{ 1497306Sgblack@eecs.umich.edu std::stringstream ss; 1507306Sgblack@eecs.umich.edu printMnemonic(ss); 1517306Sgblack@eecs.umich.edu ccprintf(ss, "#%d", imm); 1527306Sgblack@eecs.umich.edu return ss.str(); 1537306Sgblack@eecs.umich.edu} 1547306Sgblack@eecs.umich.edu 1557306Sgblack@eecs.umich.edustd::string 1567261Sgblack@eecs.umich.eduRegRegOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 1577208Sgblack@eecs.umich.edu{ 1587208Sgblack@eecs.umich.edu std::stringstream ss; 1597208Sgblack@eecs.umich.edu printMnemonic(ss); 1607208Sgblack@eecs.umich.edu printReg(ss, dest); 1617208Sgblack@eecs.umich.edu ss << ", "; 1627208Sgblack@eecs.umich.edu printReg(ss, op1); 1637208Sgblack@eecs.umich.edu return ss.str(); 1647208Sgblack@eecs.umich.edu} 1657225Sgblack@eecs.umich.edu 1667225Sgblack@eecs.umich.edustd::string 1677233Sgblack@eecs.umich.eduRegRegRegImmOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 1687233Sgblack@eecs.umich.edu{ 1697233Sgblack@eecs.umich.edu std::stringstream ss; 1707233Sgblack@eecs.umich.edu printMnemonic(ss); 1717233Sgblack@eecs.umich.edu printReg(ss, dest); 1727233Sgblack@eecs.umich.edu ss << ", "; 1737233Sgblack@eecs.umich.edu printReg(ss, op1); 1747233Sgblack@eecs.umich.edu ss << ", "; 1757233Sgblack@eecs.umich.edu printReg(ss, op2); 1767233Sgblack@eecs.umich.edu ccprintf(ss, ", #%d", imm); 1777233Sgblack@eecs.umich.edu return ss.str(); 1787233Sgblack@eecs.umich.edu} 1797233Sgblack@eecs.umich.edu 1807233Sgblack@eecs.umich.edustd::string 1817241Sgblack@eecs.umich.eduRegRegRegRegOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 1827241Sgblack@eecs.umich.edu{ 1837241Sgblack@eecs.umich.edu std::stringstream ss; 1847241Sgblack@eecs.umich.edu printMnemonic(ss); 1857241Sgblack@eecs.umich.edu printReg(ss, dest); 1867241Sgblack@eecs.umich.edu ss << ", "; 1877241Sgblack@eecs.umich.edu printReg(ss, op1); 1887241Sgblack@eecs.umich.edu ss << ", "; 1897241Sgblack@eecs.umich.edu printReg(ss, op2); 1907241Sgblack@eecs.umich.edu ss << ", "; 1917241Sgblack@eecs.umich.edu printReg(ss, op3); 1927241Sgblack@eecs.umich.edu return ss.str(); 1937241Sgblack@eecs.umich.edu} 1947241Sgblack@eecs.umich.edu 1957241Sgblack@eecs.umich.edustd::string 1967238Sgblack@eecs.umich.eduRegRegRegOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 1977238Sgblack@eecs.umich.edu{ 1987238Sgblack@eecs.umich.edu std::stringstream ss; 1997238Sgblack@eecs.umich.edu printMnemonic(ss); 2007238Sgblack@eecs.umich.edu printReg(ss, dest); 2017238Sgblack@eecs.umich.edu ss << ", "; 2027238Sgblack@eecs.umich.edu printReg(ss, op1); 2037238Sgblack@eecs.umich.edu ss << ", "; 2047238Sgblack@eecs.umich.edu printReg(ss, op2); 2057238Sgblack@eecs.umich.edu return ss.str(); 2067238Sgblack@eecs.umich.edu} 2077238Sgblack@eecs.umich.edu 2087238Sgblack@eecs.umich.edustd::string 2097331Sgblack@eecs.umich.eduRegRegImmOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 2107331Sgblack@eecs.umich.edu{ 2117331Sgblack@eecs.umich.edu std::stringstream ss; 2127331Sgblack@eecs.umich.edu printMnemonic(ss); 2137331Sgblack@eecs.umich.edu printReg(ss, dest); 2147331Sgblack@eecs.umich.edu ss << ", "; 2157331Sgblack@eecs.umich.edu printReg(ss, op1); 2167331Sgblack@eecs.umich.edu ccprintf(ss, ", #%d", imm); 2177331Sgblack@eecs.umich.edu return ss.str(); 2187331Sgblack@eecs.umich.edu} 2197331Sgblack@eecs.umich.edu 2207331Sgblack@eecs.umich.edustd::string 2217253Sgblack@eecs.umich.eduRegRegImmImmOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 2227253Sgblack@eecs.umich.edu{ 2237253Sgblack@eecs.umich.edu std::stringstream ss; 2247253Sgblack@eecs.umich.edu printMnemonic(ss); 2257253Sgblack@eecs.umich.edu printReg(ss, dest); 2267253Sgblack@eecs.umich.edu ss << ", "; 2277253Sgblack@eecs.umich.edu printReg(ss, op1); 2287253Sgblack@eecs.umich.edu ccprintf(ss, ", #%d, #%d", imm1, imm2); 2297253Sgblack@eecs.umich.edu return ss.str(); 2307253Sgblack@eecs.umich.edu} 2317253Sgblack@eecs.umich.edu 2327253Sgblack@eecs.umich.edustd::string 2337232Sgblack@eecs.umich.eduRegImmRegOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 2347225Sgblack@eecs.umich.edu{ 2357225Sgblack@eecs.umich.edu std::stringstream ss; 2367225Sgblack@eecs.umich.edu printMnemonic(ss); 2377225Sgblack@eecs.umich.edu printReg(ss, dest); 2387232Sgblack@eecs.umich.edu ccprintf(ss, ", #%d, ", imm); 2397225Sgblack@eecs.umich.edu printReg(ss, op1); 2407225Sgblack@eecs.umich.edu return ss.str(); 2417225Sgblack@eecs.umich.edu} 2427225Sgblack@eecs.umich.edu 2437225Sgblack@eecs.umich.edustd::string 2447232Sgblack@eecs.umich.eduRegImmRegShiftOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 2457225Sgblack@eecs.umich.edu{ 2467225Sgblack@eecs.umich.edu std::stringstream ss; 2477225Sgblack@eecs.umich.edu printMnemonic(ss); 2487225Sgblack@eecs.umich.edu printReg(ss, dest); 2497232Sgblack@eecs.umich.edu ccprintf(ss, ", #%d, ", imm); 2507225Sgblack@eecs.umich.edu printShiftOperand(ss, op1, true, shiftAmt, INTREG_ZERO, shiftType); 2517225Sgblack@eecs.umich.edu printReg(ss, op1); 2527225Sgblack@eecs.umich.edu return ss.str(); 2537225Sgblack@eecs.umich.edu} 254