misc.cc revision 7202:b99579129992
112855Sgabeblack@google.com/* 212855Sgabeblack@google.com * Copyright (c) 2010 ARM Limited 312855Sgabeblack@google.com * All rights reserved 412855Sgabeblack@google.com * 512855Sgabeblack@google.com * The license below extends only to copyright in the software and shall 612855Sgabeblack@google.com * not be construed as granting a license to any other intellectual 712855Sgabeblack@google.com * property including but not limited to intellectual property relating 812855Sgabeblack@google.com * to a hardware implementation of the functionality of the software 912855Sgabeblack@google.com * licensed hereunder. You may use the software subject to the license 1012855Sgabeblack@google.com * terms below provided that you ensure that this notice is replicated 1112855Sgabeblack@google.com * unmodified and in its entirety in all distributions of the software, 1212855Sgabeblack@google.com * modified or unmodified, in source code or in binary form. 1312855Sgabeblack@google.com * 1412855Sgabeblack@google.com * Redistribution and use in source and binary forms, with or without 1512855Sgabeblack@google.com * modification, are permitted provided that the following conditions are 1612855Sgabeblack@google.com * met: redistributions of source code must retain the above copyright 1712855Sgabeblack@google.com * notice, this list of conditions and the following disclaimer; 1812855Sgabeblack@google.com * redistributions in binary form must reproduce the above copyright 1912855Sgabeblack@google.com * notice, this list of conditions and the following disclaimer in the 2012855Sgabeblack@google.com * documentation and/or other materials provided with the distribution; 2112855Sgabeblack@google.com * neither the name of the copyright holders nor the names of its 2212855Sgabeblack@google.com * contributors may be used to endorse or promote products derived from 2312855Sgabeblack@google.com * this software without specific prior written permission. 2412855Sgabeblack@google.com * 2512855Sgabeblack@google.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2612855Sgabeblack@google.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2712855Sgabeblack@google.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2812855Sgabeblack@google.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2912855Sgabeblack@google.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3012855Sgabeblack@google.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3112855Sgabeblack@google.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3212855Sgabeblack@google.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3312855Sgabeblack@google.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3412855Sgabeblack@google.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3512855Sgabeblack@google.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3612855Sgabeblack@google.com * 3712855Sgabeblack@google.com * Authors: Gabe Black 3812855Sgabeblack@google.com */ 3912855Sgabeblack@google.com 4012855Sgabeblack@google.com#include "arch/arm/insts/misc.hh" 4112855Sgabeblack@google.com 4212855Sgabeblack@google.comstd::string 4312855Sgabeblack@google.comMrsOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 4412855Sgabeblack@google.com{ 4512855Sgabeblack@google.com std::stringstream ss; 4612855Sgabeblack@google.com printMnemonic(ss); 4712855Sgabeblack@google.com printReg(ss, dest); 4812855Sgabeblack@google.com ss << ", "; 4912855Sgabeblack@google.com bool foundPsr = false; 5012855Sgabeblack@google.com for (unsigned i = 0; i < numSrcRegs(); i++) { 5112855Sgabeblack@google.com int idx = srcRegIdx(i); 5212855Sgabeblack@google.com if (idx < Ctrl_Base_DepTag) { 5312855Sgabeblack@google.com continue; 5412855Sgabeblack@google.com } 5512855Sgabeblack@google.com idx -= Ctrl_Base_DepTag; 5612855Sgabeblack@google.com if (idx == MISCREG_CPSR) { 5712855Sgabeblack@google.com ss << "cpsr"; 5812855Sgabeblack@google.com foundPsr = true; 5912855Sgabeblack@google.com break; 6012855Sgabeblack@google.com } 6112855Sgabeblack@google.com if (idx == MISCREG_SPSR) { 6212855Sgabeblack@google.com ss << "spsr"; 6312855Sgabeblack@google.com foundPsr = true; 6412855Sgabeblack@google.com break; 6512855Sgabeblack@google.com } 6612855Sgabeblack@google.com } 6712855Sgabeblack@google.com if (!foundPsr) { 6812855Sgabeblack@google.com ss << "????"; 6912855Sgabeblack@google.com } 7012855Sgabeblack@google.com return ss.str(); 7112855Sgabeblack@google.com} 7212855Sgabeblack@google.com 7312855Sgabeblack@google.comvoid 7412855Sgabeblack@google.comMsrBase::printMsrBase(std::ostream &os) const 7512855Sgabeblack@google.com{ 7612855Sgabeblack@google.com printMnemonic(os); 7712855Sgabeblack@google.com bool apsr = false; 7812855Sgabeblack@google.com bool foundPsr = false; 7912855Sgabeblack@google.com for (unsigned i = 0; i < numDestRegs(); i++) { 8012855Sgabeblack@google.com int idx = destRegIdx(i); 8112855Sgabeblack@google.com if (idx < Ctrl_Base_DepTag) { 8212855Sgabeblack@google.com continue; 8312855Sgabeblack@google.com } 8412855Sgabeblack@google.com idx -= Ctrl_Base_DepTag; 8512855Sgabeblack@google.com if (idx == MISCREG_CPSR) { 8612855Sgabeblack@google.com os << "cpsr_"; 8712855Sgabeblack@google.com foundPsr = true; 8812855Sgabeblack@google.com break; 8912855Sgabeblack@google.com } 9012855Sgabeblack@google.com if (idx == MISCREG_SPSR) { 9112855Sgabeblack@google.com if (bits(byteMask, 1, 0)) { 9212855Sgabeblack@google.com os << "spsr_"; 9312855Sgabeblack@google.com } else { 9412855Sgabeblack@google.com os << "apsr_"; 9512855Sgabeblack@google.com apsr = true; 9612855Sgabeblack@google.com } 9712855Sgabeblack@google.com foundPsr = true; 9812855Sgabeblack@google.com break; 9912855Sgabeblack@google.com } 10012855Sgabeblack@google.com } 10112855Sgabeblack@google.com if (!foundPsr) { 102 os << "????"; 103 return; 104 } 105 if (bits(byteMask, 3)) { 106 if (apsr) { 107 os << "nzcvq"; 108 } else { 109 os << "f"; 110 } 111 } 112 if (bits(byteMask, 2)) { 113 if (apsr) { 114 os << "g"; 115 } else { 116 os << "s"; 117 } 118 } 119 if (bits(byteMask, 1)) { 120 os << "x"; 121 } 122 if (bits(byteMask, 0)) { 123 os << "c"; 124 } 125} 126 127std::string 128MsrImmOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 129{ 130 std::stringstream ss; 131 printMsrBase(ss); 132 ccprintf(ss, ", #%#x", imm); 133 return ss.str(); 134} 135 136std::string 137MsrRegOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 138{ 139 std::stringstream ss; 140 printMsrBase(ss); 141 ss << ", "; 142 printReg(ss, op1); 143 return ss.str(); 144} 145