misc.cc revision 7202:b99579129992
16313Sgblack@eecs.umich.edu/* 27093Sgblack@eecs.umich.edu * Copyright (c) 2010 ARM Limited 37093Sgblack@eecs.umich.edu * All rights reserved 47093Sgblack@eecs.umich.edu * 57093Sgblack@eecs.umich.edu * The license below extends only to copyright in the software and shall 67093Sgblack@eecs.umich.edu * not be construed as granting a license to any other intellectual 77093Sgblack@eecs.umich.edu * property including but not limited to intellectual property relating 87093Sgblack@eecs.umich.edu * to a hardware implementation of the functionality of the software 97093Sgblack@eecs.umich.edu * licensed hereunder. You may use the software subject to the license 107093Sgblack@eecs.umich.edu * terms below provided that you ensure that this notice is replicated 117093Sgblack@eecs.umich.edu * unmodified and in its entirety in all distributions of the software, 127093Sgblack@eecs.umich.edu * modified or unmodified, in source code or in binary form. 137093Sgblack@eecs.umich.edu * 146313Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 156313Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 166313Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 176313Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 186313Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 196313Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 206313Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 216313Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 226313Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 236313Sgblack@eecs.umich.edu * this software without specific prior written permission. 246313Sgblack@eecs.umich.edu * 256313Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 266313Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 276313Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 286313Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 296313Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 306313Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 316313Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 326313Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 336313Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 346313Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 356313Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 366313Sgblack@eecs.umich.edu * 376313Sgblack@eecs.umich.edu * Authors: Gabe Black 386313Sgblack@eecs.umich.edu */ 396313Sgblack@eecs.umich.edu 406313Sgblack@eecs.umich.edu#include "arch/arm/insts/misc.hh" 416313Sgblack@eecs.umich.edu 426313Sgblack@eecs.umich.edustd::string 436313Sgblack@eecs.umich.eduMrsOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 446313Sgblack@eecs.umich.edu{ 456313Sgblack@eecs.umich.edu std::stringstream ss; 466333Sgblack@eecs.umich.edu printMnemonic(ss); 476313Sgblack@eecs.umich.edu printReg(ss, dest); 486313Sgblack@eecs.umich.edu ss << ", "; 496333Sgblack@eecs.umich.edu bool foundPsr = false; 506313Sgblack@eecs.umich.edu for (unsigned i = 0; i < numSrcRegs(); i++) { 516313Sgblack@eecs.umich.edu int idx = srcRegIdx(i); 526313Sgblack@eecs.umich.edu if (idx < Ctrl_Base_DepTag) { 536313Sgblack@eecs.umich.edu continue; 546313Sgblack@eecs.umich.edu } 556313Sgblack@eecs.umich.edu idx -= Ctrl_Base_DepTag; 566313Sgblack@eecs.umich.edu if (idx == MISCREG_CPSR) { 576313Sgblack@eecs.umich.edu ss << "cpsr"; 586333Sgblack@eecs.umich.edu foundPsr = true; 596718Sgblack@eecs.umich.edu break; 606718Sgblack@eecs.umich.edu } 616718Sgblack@eecs.umich.edu if (idx == MISCREG_SPSR) { 626718Sgblack@eecs.umich.edu ss << "spsr"; 636718Sgblack@eecs.umich.edu foundPsr = true; 646718Sgblack@eecs.umich.edu break; 656718Sgblack@eecs.umich.edu } 666718Sgblack@eecs.umich.edu } 676718Sgblack@eecs.umich.edu if (!foundPsr) { 686718Sgblack@eecs.umich.edu ss << "????"; 696718Sgblack@eecs.umich.edu } 706718Sgblack@eecs.umich.edu return ss.str(); 716718Sgblack@eecs.umich.edu} 726718Sgblack@eecs.umich.edu 736718Sgblack@eecs.umich.eduvoid 746718Sgblack@eecs.umich.eduMsrBase::printMsrBase(std::ostream &os) const 756718Sgblack@eecs.umich.edu{ 766718Sgblack@eecs.umich.edu printMnemonic(os); 776718Sgblack@eecs.umich.edu bool apsr = false; 786723Sgblack@eecs.umich.edu bool foundPsr = false; 796723Sgblack@eecs.umich.edu for (unsigned i = 0; i < numDestRegs(); i++) { 806723Sgblack@eecs.umich.edu int idx = destRegIdx(i); 816718Sgblack@eecs.umich.edu if (idx < Ctrl_Base_DepTag) { 826718Sgblack@eecs.umich.edu continue; 836718Sgblack@eecs.umich.edu } 846718Sgblack@eecs.umich.edu idx -= Ctrl_Base_DepTag; 856718Sgblack@eecs.umich.edu if (idx == MISCREG_CPSR) { 866718Sgblack@eecs.umich.edu os << "cpsr_"; 876718Sgblack@eecs.umich.edu foundPsr = true; 886718Sgblack@eecs.umich.edu break; 896718Sgblack@eecs.umich.edu } 906718Sgblack@eecs.umich.edu if (idx == MISCREG_SPSR) { 916313Sgblack@eecs.umich.edu if (bits(byteMask, 1, 0)) { 926313Sgblack@eecs.umich.edu os << "spsr_"; 936333Sgblack@eecs.umich.edu } else { 946333Sgblack@eecs.umich.edu os << "apsr_"; 956401Sgblack@eecs.umich.edu apsr = true; 966401Sgblack@eecs.umich.edu } 976719Sgblack@eecs.umich.edu foundPsr = true; 986401Sgblack@eecs.umich.edu break; 996718Sgblack@eecs.umich.edu } 1006735Sgblack@eecs.umich.edu } 1016735Sgblack@eecs.umich.edu if (!foundPsr) { 1026735Sgblack@eecs.umich.edu os << "????"; 1036735Sgblack@eecs.umich.edu return; 1046735Sgblack@eecs.umich.edu } 1056735Sgblack@eecs.umich.edu if (bits(byteMask, 3)) { 1066735Sgblack@eecs.umich.edu if (apsr) { 1077270Sgblack@eecs.umich.edu os << "nzcvq"; 1086735Sgblack@eecs.umich.edu } else { 1097271Sgblack@eecs.umich.edu os << "f"; 1107271Sgblack@eecs.umich.edu } 1117271Sgblack@eecs.umich.edu } 1127271Sgblack@eecs.umich.edu if (bits(byteMask, 2)) { 1137320Sgblack@eecs.umich.edu if (apsr) { 1147320Sgblack@eecs.umich.edu os << "g"; 1157320Sgblack@eecs.umich.edu } else { 1167320Sgblack@eecs.umich.edu os << "s"; 1177320Sgblack@eecs.umich.edu } 1187271Sgblack@eecs.umich.edu } 1197350SAli.Saidi@ARM.com if (bits(byteMask, 1)) { 1207350SAli.Saidi@ARM.com os << "x"; 1217350SAli.Saidi@ARM.com } 1227298Sgblack@eecs.umich.edu if (bits(byteMask, 0)) { 1237298Sgblack@eecs.umich.edu os << "c"; 1247298Sgblack@eecs.umich.edu } 1257298Sgblack@eecs.umich.edu} 1267298Sgblack@eecs.umich.edu 1277298Sgblack@eecs.umich.edustd::string 1287298Sgblack@eecs.umich.eduMsrImmOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 1297298Sgblack@eecs.umich.edu{ 1307298Sgblack@eecs.umich.edu std::stringstream ss; 1317298Sgblack@eecs.umich.edu printMsrBase(ss); 1327298Sgblack@eecs.umich.edu ccprintf(ss, ", #%#x", imm); 1337298Sgblack@eecs.umich.edu return ss.str(); 1347354Sgblack@eecs.umich.edu} 1357354Sgblack@eecs.umich.edu 1367354Sgblack@eecs.umich.edustd::string 1377383Sgblack@eecs.umich.eduMsrRegOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 1387383Sgblack@eecs.umich.edu{ 1397383Sgblack@eecs.umich.edu std::stringstream ss; 1407383Sgblack@eecs.umich.edu printMsrBase(ss); 1417383Sgblack@eecs.umich.edu ss << ", "; 1427383Sgblack@eecs.umich.edu printReg(ss, op1); 1437383Sgblack@eecs.umich.edu return ss.str(); 1447383Sgblack@eecs.umich.edu} 1457383Sgblack@eecs.umich.edu