misc.cc revision 9913
17202Sgblack@eecs.umich.edu/* 27202Sgblack@eecs.umich.edu * Copyright (c) 2010 ARM Limited 39913Ssteve.reinhardt@amd.com * Copyright (c) 2013 Advanced Micro Devices, Inc. 47202Sgblack@eecs.umich.edu * All rights reserved 57202Sgblack@eecs.umich.edu * 67202Sgblack@eecs.umich.edu * The license below extends only to copyright in the software and shall 77202Sgblack@eecs.umich.edu * not be construed as granting a license to any other intellectual 87202Sgblack@eecs.umich.edu * property including but not limited to intellectual property relating 97202Sgblack@eecs.umich.edu * to a hardware implementation of the functionality of the software 107202Sgblack@eecs.umich.edu * licensed hereunder. You may use the software subject to the license 117202Sgblack@eecs.umich.edu * terms below provided that you ensure that this notice is replicated 127202Sgblack@eecs.umich.edu * unmodified and in its entirety in all distributions of the software, 137202Sgblack@eecs.umich.edu * modified or unmodified, in source code or in binary form. 147202Sgblack@eecs.umich.edu * 157202Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 167202Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 177202Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 187202Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 197202Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 207202Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 217202Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 227202Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 237202Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 247202Sgblack@eecs.umich.edu * this software without specific prior written permission. 257202Sgblack@eecs.umich.edu * 267202Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 277202Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 287202Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 297202Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 307202Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 317202Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 327202Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 337202Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 347202Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 357202Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 367202Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 377202Sgblack@eecs.umich.edu * 387202Sgblack@eecs.umich.edu * Authors: Gabe Black 397202Sgblack@eecs.umich.edu */ 407202Sgblack@eecs.umich.edu 417202Sgblack@eecs.umich.edu#include "arch/arm/insts/misc.hh" 429913Ssteve.reinhardt@amd.com#include "cpu/reg_class.hh" 437202Sgblack@eecs.umich.edu 447202Sgblack@eecs.umich.edustd::string 457202Sgblack@eecs.umich.eduMrsOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 467202Sgblack@eecs.umich.edu{ 477202Sgblack@eecs.umich.edu std::stringstream ss; 487202Sgblack@eecs.umich.edu printMnemonic(ss); 497202Sgblack@eecs.umich.edu printReg(ss, dest); 507202Sgblack@eecs.umich.edu ss << ", "; 517202Sgblack@eecs.umich.edu bool foundPsr = false; 527202Sgblack@eecs.umich.edu for (unsigned i = 0; i < numSrcRegs(); i++) { 539913Ssteve.reinhardt@amd.com RegIndex idx = srcRegIdx(i); 549913Ssteve.reinhardt@amd.com RegIndex rel_idx; 559913Ssteve.reinhardt@amd.com if (regIdxToClass(idx, &rel_idx) != MiscRegClass) { 567202Sgblack@eecs.umich.edu continue; 577202Sgblack@eecs.umich.edu } 589913Ssteve.reinhardt@amd.com if (rel_idx == MISCREG_CPSR) { 597202Sgblack@eecs.umich.edu ss << "cpsr"; 607202Sgblack@eecs.umich.edu foundPsr = true; 617202Sgblack@eecs.umich.edu break; 627202Sgblack@eecs.umich.edu } 639913Ssteve.reinhardt@amd.com if (rel_idx == MISCREG_SPSR) { 647202Sgblack@eecs.umich.edu ss << "spsr"; 657202Sgblack@eecs.umich.edu foundPsr = true; 667202Sgblack@eecs.umich.edu break; 677202Sgblack@eecs.umich.edu } 687202Sgblack@eecs.umich.edu } 697202Sgblack@eecs.umich.edu if (!foundPsr) { 707202Sgblack@eecs.umich.edu ss << "????"; 717202Sgblack@eecs.umich.edu } 727202Sgblack@eecs.umich.edu return ss.str(); 737202Sgblack@eecs.umich.edu} 747202Sgblack@eecs.umich.edu 757202Sgblack@eecs.umich.eduvoid 767202Sgblack@eecs.umich.eduMsrBase::printMsrBase(std::ostream &os) const 777202Sgblack@eecs.umich.edu{ 787202Sgblack@eecs.umich.edu printMnemonic(os); 797202Sgblack@eecs.umich.edu bool apsr = false; 807202Sgblack@eecs.umich.edu bool foundPsr = false; 817202Sgblack@eecs.umich.edu for (unsigned i = 0; i < numDestRegs(); i++) { 827202Sgblack@eecs.umich.edu int idx = destRegIdx(i); 837202Sgblack@eecs.umich.edu if (idx < Ctrl_Base_DepTag) { 847202Sgblack@eecs.umich.edu continue; 857202Sgblack@eecs.umich.edu } 867202Sgblack@eecs.umich.edu idx -= Ctrl_Base_DepTag; 877202Sgblack@eecs.umich.edu if (idx == MISCREG_CPSR) { 887202Sgblack@eecs.umich.edu os << "cpsr_"; 897202Sgblack@eecs.umich.edu foundPsr = true; 907202Sgblack@eecs.umich.edu break; 917202Sgblack@eecs.umich.edu } 927202Sgblack@eecs.umich.edu if (idx == MISCREG_SPSR) { 937202Sgblack@eecs.umich.edu if (bits(byteMask, 1, 0)) { 947202Sgblack@eecs.umich.edu os << "spsr_"; 957202Sgblack@eecs.umich.edu } else { 967202Sgblack@eecs.umich.edu os << "apsr_"; 977202Sgblack@eecs.umich.edu apsr = true; 987202Sgblack@eecs.umich.edu } 997202Sgblack@eecs.umich.edu foundPsr = true; 1007202Sgblack@eecs.umich.edu break; 1017202Sgblack@eecs.umich.edu } 1027202Sgblack@eecs.umich.edu } 1037202Sgblack@eecs.umich.edu if (!foundPsr) { 1047202Sgblack@eecs.umich.edu os << "????"; 1057202Sgblack@eecs.umich.edu return; 1067202Sgblack@eecs.umich.edu } 1077202Sgblack@eecs.umich.edu if (bits(byteMask, 3)) { 1087202Sgblack@eecs.umich.edu if (apsr) { 1097202Sgblack@eecs.umich.edu os << "nzcvq"; 1107202Sgblack@eecs.umich.edu } else { 1117202Sgblack@eecs.umich.edu os << "f"; 1127202Sgblack@eecs.umich.edu } 1137202Sgblack@eecs.umich.edu } 1147202Sgblack@eecs.umich.edu if (bits(byteMask, 2)) { 1157202Sgblack@eecs.umich.edu if (apsr) { 1167202Sgblack@eecs.umich.edu os << "g"; 1177202Sgblack@eecs.umich.edu } else { 1187202Sgblack@eecs.umich.edu os << "s"; 1197202Sgblack@eecs.umich.edu } 1207202Sgblack@eecs.umich.edu } 1217202Sgblack@eecs.umich.edu if (bits(byteMask, 1)) { 1227202Sgblack@eecs.umich.edu os << "x"; 1237202Sgblack@eecs.umich.edu } 1247202Sgblack@eecs.umich.edu if (bits(byteMask, 0)) { 1257202Sgblack@eecs.umich.edu os << "c"; 1267202Sgblack@eecs.umich.edu } 1277202Sgblack@eecs.umich.edu} 1287202Sgblack@eecs.umich.edu 1297202Sgblack@eecs.umich.edustd::string 1307202Sgblack@eecs.umich.eduMsrImmOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 1317202Sgblack@eecs.umich.edu{ 1327202Sgblack@eecs.umich.edu std::stringstream ss; 1337202Sgblack@eecs.umich.edu printMsrBase(ss); 1347202Sgblack@eecs.umich.edu ccprintf(ss, ", #%#x", imm); 1357202Sgblack@eecs.umich.edu return ss.str(); 1367202Sgblack@eecs.umich.edu} 1377202Sgblack@eecs.umich.edu 1387202Sgblack@eecs.umich.edustd::string 1397202Sgblack@eecs.umich.eduMsrRegOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 1407202Sgblack@eecs.umich.edu{ 1417202Sgblack@eecs.umich.edu std::stringstream ss; 1427202Sgblack@eecs.umich.edu printMsrBase(ss); 1437202Sgblack@eecs.umich.edu ss << ", "; 1447202Sgblack@eecs.umich.edu printReg(ss, op1); 1457202Sgblack@eecs.umich.edu return ss.str(); 1467202Sgblack@eecs.umich.edu} 1477208Sgblack@eecs.umich.edu 1487208Sgblack@eecs.umich.edustd::string 1497306Sgblack@eecs.umich.eduImmOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 1507306Sgblack@eecs.umich.edu{ 1517306Sgblack@eecs.umich.edu std::stringstream ss; 1527306Sgblack@eecs.umich.edu printMnemonic(ss); 1537306Sgblack@eecs.umich.edu ccprintf(ss, "#%d", imm); 1547306Sgblack@eecs.umich.edu return ss.str(); 1557306Sgblack@eecs.umich.edu} 1567306Sgblack@eecs.umich.edu 1577306Sgblack@eecs.umich.edustd::string 1587332Sgblack@eecs.umich.eduRegImmOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 1597332Sgblack@eecs.umich.edu{ 1607332Sgblack@eecs.umich.edu std::stringstream ss; 1617332Sgblack@eecs.umich.edu printMnemonic(ss); 1627332Sgblack@eecs.umich.edu printReg(ss, dest); 1637332Sgblack@eecs.umich.edu ccprintf(ss, ", #%d", imm); 1647332Sgblack@eecs.umich.edu return ss.str(); 1657332Sgblack@eecs.umich.edu} 1667332Sgblack@eecs.umich.edu 1677332Sgblack@eecs.umich.edustd::string 1687261Sgblack@eecs.umich.eduRegRegOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 1697208Sgblack@eecs.umich.edu{ 1707208Sgblack@eecs.umich.edu std::stringstream ss; 1717208Sgblack@eecs.umich.edu printMnemonic(ss); 1727208Sgblack@eecs.umich.edu printReg(ss, dest); 1737208Sgblack@eecs.umich.edu ss << ", "; 1747208Sgblack@eecs.umich.edu printReg(ss, op1); 1757208Sgblack@eecs.umich.edu return ss.str(); 1767208Sgblack@eecs.umich.edu} 1777225Sgblack@eecs.umich.edu 1787225Sgblack@eecs.umich.edustd::string 1797233Sgblack@eecs.umich.eduRegRegRegImmOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 1807233Sgblack@eecs.umich.edu{ 1817233Sgblack@eecs.umich.edu std::stringstream ss; 1827233Sgblack@eecs.umich.edu printMnemonic(ss); 1837233Sgblack@eecs.umich.edu printReg(ss, dest); 1847233Sgblack@eecs.umich.edu ss << ", "; 1857233Sgblack@eecs.umich.edu printReg(ss, op1); 1867233Sgblack@eecs.umich.edu ss << ", "; 1877233Sgblack@eecs.umich.edu printReg(ss, op2); 1887233Sgblack@eecs.umich.edu ccprintf(ss, ", #%d", imm); 1897233Sgblack@eecs.umich.edu return ss.str(); 1907233Sgblack@eecs.umich.edu} 1917233Sgblack@eecs.umich.edu 1927233Sgblack@eecs.umich.edustd::string 1937241Sgblack@eecs.umich.eduRegRegRegRegOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 1947241Sgblack@eecs.umich.edu{ 1957241Sgblack@eecs.umich.edu std::stringstream ss; 1967241Sgblack@eecs.umich.edu printMnemonic(ss); 1977241Sgblack@eecs.umich.edu printReg(ss, dest); 1987241Sgblack@eecs.umich.edu ss << ", "; 1997241Sgblack@eecs.umich.edu printReg(ss, op1); 2007241Sgblack@eecs.umich.edu ss << ", "; 2017241Sgblack@eecs.umich.edu printReg(ss, op2); 2027241Sgblack@eecs.umich.edu ss << ", "; 2037241Sgblack@eecs.umich.edu printReg(ss, op3); 2047241Sgblack@eecs.umich.edu return ss.str(); 2057241Sgblack@eecs.umich.edu} 2067241Sgblack@eecs.umich.edu 2077241Sgblack@eecs.umich.edustd::string 2087238Sgblack@eecs.umich.eduRegRegRegOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 2097238Sgblack@eecs.umich.edu{ 2107238Sgblack@eecs.umich.edu std::stringstream ss; 2117238Sgblack@eecs.umich.edu printMnemonic(ss); 2127238Sgblack@eecs.umich.edu printReg(ss, dest); 2137238Sgblack@eecs.umich.edu ss << ", "; 2147238Sgblack@eecs.umich.edu printReg(ss, op1); 2157238Sgblack@eecs.umich.edu ss << ", "; 2167238Sgblack@eecs.umich.edu printReg(ss, op2); 2177238Sgblack@eecs.umich.edu return ss.str(); 2187238Sgblack@eecs.umich.edu} 2197238Sgblack@eecs.umich.edu 2207238Sgblack@eecs.umich.edustd::string 2217331Sgblack@eecs.umich.eduRegRegImmOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 2227331Sgblack@eecs.umich.edu{ 2237331Sgblack@eecs.umich.edu std::stringstream ss; 2247331Sgblack@eecs.umich.edu printMnemonic(ss); 2257331Sgblack@eecs.umich.edu printReg(ss, dest); 2267331Sgblack@eecs.umich.edu ss << ", "; 2277331Sgblack@eecs.umich.edu printReg(ss, op1); 2287331Sgblack@eecs.umich.edu ccprintf(ss, ", #%d", imm); 2297331Sgblack@eecs.umich.edu return ss.str(); 2307331Sgblack@eecs.umich.edu} 2317331Sgblack@eecs.umich.edu 2327331Sgblack@eecs.umich.edustd::string 2337253Sgblack@eecs.umich.eduRegRegImmImmOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 2347253Sgblack@eecs.umich.edu{ 2357253Sgblack@eecs.umich.edu std::stringstream ss; 2367253Sgblack@eecs.umich.edu printMnemonic(ss); 2377253Sgblack@eecs.umich.edu printReg(ss, dest); 2387253Sgblack@eecs.umich.edu ss << ", "; 2397253Sgblack@eecs.umich.edu printReg(ss, op1); 2407253Sgblack@eecs.umich.edu ccprintf(ss, ", #%d, #%d", imm1, imm2); 2417253Sgblack@eecs.umich.edu return ss.str(); 2427253Sgblack@eecs.umich.edu} 2437253Sgblack@eecs.umich.edu 2447253Sgblack@eecs.umich.edustd::string 2457232Sgblack@eecs.umich.eduRegImmRegOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 2467225Sgblack@eecs.umich.edu{ 2477225Sgblack@eecs.umich.edu std::stringstream ss; 2487225Sgblack@eecs.umich.edu printMnemonic(ss); 2497225Sgblack@eecs.umich.edu printReg(ss, dest); 2507232Sgblack@eecs.umich.edu ccprintf(ss, ", #%d, ", imm); 2517225Sgblack@eecs.umich.edu printReg(ss, op1); 2527225Sgblack@eecs.umich.edu return ss.str(); 2537225Sgblack@eecs.umich.edu} 2547225Sgblack@eecs.umich.edu 2557225Sgblack@eecs.umich.edustd::string 2567232Sgblack@eecs.umich.eduRegImmRegShiftOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 2577225Sgblack@eecs.umich.edu{ 2587225Sgblack@eecs.umich.edu std::stringstream ss; 2597225Sgblack@eecs.umich.edu printMnemonic(ss); 2607225Sgblack@eecs.umich.edu printReg(ss, dest); 2617232Sgblack@eecs.umich.edu ccprintf(ss, ", #%d, ", imm); 2627225Sgblack@eecs.umich.edu printShiftOperand(ss, op1, true, shiftAmt, INTREG_ZERO, shiftType); 2637225Sgblack@eecs.umich.edu printReg(ss, op1); 2647225Sgblack@eecs.umich.edu return ss.str(); 2657225Sgblack@eecs.umich.edu} 2667409Sgblack@eecs.umich.edu 2677409Sgblack@eecs.umich.edustd::string 2687409Sgblack@eecs.umich.eduUnknownOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 2697409Sgblack@eecs.umich.edu{ 2707426Sgblack@eecs.umich.edu return csprintf("%-10s (inst %#08x)", "unknown", machInst); 2717409Sgblack@eecs.umich.edu} 272