static_inst.cc revision 7182
17094Sgblack@eecs.umich.edu/* 27094Sgblack@eecs.umich.edu * Copyright (c) 2010 ARM Limited 37094Sgblack@eecs.umich.edu * All rights reserved 47094Sgblack@eecs.umich.edu * 57094Sgblack@eecs.umich.edu * The license below extends only to copyright in the software and shall 67094Sgblack@eecs.umich.edu * not be construed as granting a license to any other intellectual 77094Sgblack@eecs.umich.edu * property including but not limited to intellectual property relating 87094Sgblack@eecs.umich.edu * to a hardware implementation of the functionality of the software 97094Sgblack@eecs.umich.edu * licensed hereunder. You may use the software subject to the license 107094Sgblack@eecs.umich.edu * terms below provided that you ensure that this notice is replicated 117094Sgblack@eecs.umich.edu * unmodified and in its entirety in all distributions of the software, 127094Sgblack@eecs.umich.edu * modified or unmodified, in source code or in binary form. 137094Sgblack@eecs.umich.edu * 147094Sgblack@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 436759SAli.Saidi@ARM.com#include "arch/arm/faults.hh" 446253Sgblack@eecs.umich.edu#include "arch/arm/insts/static_inst.hh" 456255Sgblack@eecs.umich.edu#include "base/condcodes.hh" 466712Snate@binkert.org#include "base/cprintf.hh" 476263Sgblack@eecs.umich.edu#include "base/loader/symtab.hh" 486253Sgblack@eecs.umich.edu 496253Sgblack@eecs.umich.edunamespace ArmISA 506253Sgblack@eecs.umich.edu{ 516254Sgblack@eecs.umich.edu// Shift Rm by an immediate value 526254Sgblack@eecs.umich.eduint32_t 537148Sgblack@eecs.umich.eduArmStaticInst::shift_rm_imm(uint32_t base, uint32_t shamt, 547094Sgblack@eecs.umich.edu uint32_t type, uint32_t cfval) const 556254Sgblack@eecs.umich.edu{ 566255Sgblack@eecs.umich.edu assert(shamt < 32); 576255Sgblack@eecs.umich.edu ArmShiftType shiftType; 586255Sgblack@eecs.umich.edu shiftType = (ArmShiftType)type; 596254Sgblack@eecs.umich.edu 606254Sgblack@eecs.umich.edu switch (shiftType) 616254Sgblack@eecs.umich.edu { 626255Sgblack@eecs.umich.edu case LSL: 636255Sgblack@eecs.umich.edu return base << shamt; 646255Sgblack@eecs.umich.edu case LSR: 656255Sgblack@eecs.umich.edu if (shamt == 0) 666255Sgblack@eecs.umich.edu return 0; 676255Sgblack@eecs.umich.edu else 686255Sgblack@eecs.umich.edu return base >> shamt; 696255Sgblack@eecs.umich.edu case ASR: 706255Sgblack@eecs.umich.edu if (shamt == 0) 717182Sgblack@eecs.umich.edu return (base >> 31) | -((base & (1 << 31)) >> 31); 726255Sgblack@eecs.umich.edu else 737182Sgblack@eecs.umich.edu return (base >> shamt) | -((base & (1 << 31)) >> shamt); 746255Sgblack@eecs.umich.edu case ROR: 756255Sgblack@eecs.umich.edu if (shamt == 0) 766255Sgblack@eecs.umich.edu return (cfval << 31) | (base >> 1); // RRX 776255Sgblack@eecs.umich.edu else 786255Sgblack@eecs.umich.edu return (base << (32 - shamt)) | (base >> shamt); 796255Sgblack@eecs.umich.edu default: 806712Snate@binkert.org ccprintf(std::cerr, "Unhandled shift type\n"); 816255Sgblack@eecs.umich.edu exit(1); 826255Sgblack@eecs.umich.edu break; 836254Sgblack@eecs.umich.edu } 846254Sgblack@eecs.umich.edu return 0; 856254Sgblack@eecs.umich.edu} 866254Sgblack@eecs.umich.edu 876254Sgblack@eecs.umich.edu// Shift Rm by Rs 886254Sgblack@eecs.umich.eduint32_t 897148Sgblack@eecs.umich.eduArmStaticInst::shift_rm_rs(uint32_t base, uint32_t shamt, 907094Sgblack@eecs.umich.edu uint32_t type, uint32_t cfval) const 916254Sgblack@eecs.umich.edu{ 926254Sgblack@eecs.umich.edu enum ArmShiftType shiftType; 936254Sgblack@eecs.umich.edu shiftType = (enum ArmShiftType) type; 946254Sgblack@eecs.umich.edu 956254Sgblack@eecs.umich.edu switch (shiftType) 966254Sgblack@eecs.umich.edu { 976255Sgblack@eecs.umich.edu case LSL: 986255Sgblack@eecs.umich.edu if (shamt >= 32) 996255Sgblack@eecs.umich.edu return 0; 1006255Sgblack@eecs.umich.edu else 1016255Sgblack@eecs.umich.edu return base << shamt; 1026255Sgblack@eecs.umich.edu case LSR: 1036255Sgblack@eecs.umich.edu if (shamt >= 32) 1046255Sgblack@eecs.umich.edu return 0; 1056255Sgblack@eecs.umich.edu else 1066255Sgblack@eecs.umich.edu return base >> shamt; 1076255Sgblack@eecs.umich.edu case ASR: 1086255Sgblack@eecs.umich.edu if (shamt >= 32) 1097182Sgblack@eecs.umich.edu return (base >> 31) | -((base & (1 << 31)) >> 31); 1106255Sgblack@eecs.umich.edu else 1117182Sgblack@eecs.umich.edu return (base >> shamt) | -((base & (1 << 31)) >> shamt); 1126255Sgblack@eecs.umich.edu case ROR: 1136255Sgblack@eecs.umich.edu shamt = shamt & 0x1f; 1146255Sgblack@eecs.umich.edu if (shamt == 0) 1156255Sgblack@eecs.umich.edu return base; 1166255Sgblack@eecs.umich.edu else 1176255Sgblack@eecs.umich.edu return (base << (32 - shamt)) | (base >> shamt); 1186255Sgblack@eecs.umich.edu default: 1196712Snate@binkert.org ccprintf(std::cerr, "Unhandled shift type\n"); 1206255Sgblack@eecs.umich.edu exit(1); 1216255Sgblack@eecs.umich.edu break; 1226254Sgblack@eecs.umich.edu } 1236254Sgblack@eecs.umich.edu return 0; 1246254Sgblack@eecs.umich.edu} 1256254Sgblack@eecs.umich.edu 1266254Sgblack@eecs.umich.edu 1276254Sgblack@eecs.umich.edu// Generate C for a shift by immediate 1286255Sgblack@eecs.umich.edubool 1297148Sgblack@eecs.umich.eduArmStaticInst::shift_carry_imm(uint32_t base, uint32_t shamt, 1307094Sgblack@eecs.umich.edu uint32_t type, uint32_t cfval) const 1316254Sgblack@eecs.umich.edu{ 1326254Sgblack@eecs.umich.edu enum ArmShiftType shiftType; 1336254Sgblack@eecs.umich.edu shiftType = (enum ArmShiftType) type; 1346254Sgblack@eecs.umich.edu 1356254Sgblack@eecs.umich.edu switch (shiftType) 1366254Sgblack@eecs.umich.edu { 1376255Sgblack@eecs.umich.edu case LSL: 1386255Sgblack@eecs.umich.edu if (shamt == 0) 1396255Sgblack@eecs.umich.edu return cfval; 1406255Sgblack@eecs.umich.edu else 1416254Sgblack@eecs.umich.edu return (base >> (32 - shamt)) & 1; 1426255Sgblack@eecs.umich.edu case LSR: 1436255Sgblack@eecs.umich.edu if (shamt == 0) 1446255Sgblack@eecs.umich.edu return (base >> 31); 1456255Sgblack@eecs.umich.edu else 1466255Sgblack@eecs.umich.edu return (base >> (shamt - 1)) & 1; 1476255Sgblack@eecs.umich.edu case ASR: 1486255Sgblack@eecs.umich.edu if (shamt == 0) 1496255Sgblack@eecs.umich.edu return (base >> 31); 1506255Sgblack@eecs.umich.edu else 1516255Sgblack@eecs.umich.edu return (base >> (shamt - 1)) & 1; 1526255Sgblack@eecs.umich.edu case ROR: 1536255Sgblack@eecs.umich.edu shamt = shamt & 0x1f; 1546255Sgblack@eecs.umich.edu if (shamt == 0) 1556255Sgblack@eecs.umich.edu return (base & 1); // RRX 1566255Sgblack@eecs.umich.edu else 1576255Sgblack@eecs.umich.edu return (base >> (shamt - 1)) & 1; 1586255Sgblack@eecs.umich.edu default: 1596712Snate@binkert.org ccprintf(std::cerr, "Unhandled shift type\n"); 1606255Sgblack@eecs.umich.edu exit(1); 1616255Sgblack@eecs.umich.edu break; 1626254Sgblack@eecs.umich.edu } 1636254Sgblack@eecs.umich.edu return 0; 1646254Sgblack@eecs.umich.edu} 1656254Sgblack@eecs.umich.edu 1666254Sgblack@eecs.umich.edu 1676254Sgblack@eecs.umich.edu// Generate C for a shift by Rs 1686255Sgblack@eecs.umich.edubool 1697148Sgblack@eecs.umich.eduArmStaticInst::shift_carry_rs(uint32_t base, uint32_t shamt, 1707094Sgblack@eecs.umich.edu uint32_t type, uint32_t cfval) const 1716254Sgblack@eecs.umich.edu{ 1726254Sgblack@eecs.umich.edu enum ArmShiftType shiftType; 1736254Sgblack@eecs.umich.edu shiftType = (enum ArmShiftType) type; 1746254Sgblack@eecs.umich.edu 1756255Sgblack@eecs.umich.edu if (shamt == 0) 1766255Sgblack@eecs.umich.edu return cfval; 1776255Sgblack@eecs.umich.edu 1786254Sgblack@eecs.umich.edu switch (shiftType) 1796254Sgblack@eecs.umich.edu { 1806255Sgblack@eecs.umich.edu case LSL: 1816255Sgblack@eecs.umich.edu if (shamt > 32) 1826255Sgblack@eecs.umich.edu return 0; 1836255Sgblack@eecs.umich.edu else 1846255Sgblack@eecs.umich.edu return (base >> (32 - shamt)) & 1; 1856255Sgblack@eecs.umich.edu case LSR: 1866255Sgblack@eecs.umich.edu if (shamt > 32) 1876255Sgblack@eecs.umich.edu return 0; 1886255Sgblack@eecs.umich.edu else 1896255Sgblack@eecs.umich.edu return (base >> (shamt - 1)) & 1; 1906255Sgblack@eecs.umich.edu case ASR: 1916255Sgblack@eecs.umich.edu if (shamt > 32) 1926255Sgblack@eecs.umich.edu shamt = 32; 1936255Sgblack@eecs.umich.edu return (base >> (shamt - 1)) & 1; 1946255Sgblack@eecs.umich.edu case ROR: 1956255Sgblack@eecs.umich.edu shamt = shamt & 0x1f; 1966255Sgblack@eecs.umich.edu if (shamt == 0) 1976255Sgblack@eecs.umich.edu shamt = 32; 1986255Sgblack@eecs.umich.edu return (base >> (shamt - 1)) & 1; 1996255Sgblack@eecs.umich.edu default: 2006712Snate@binkert.org ccprintf(std::cerr, "Unhandled shift type\n"); 2016255Sgblack@eecs.umich.edu exit(1); 2026255Sgblack@eecs.umich.edu break; 2036254Sgblack@eecs.umich.edu } 2046254Sgblack@eecs.umich.edu return 0; 2056254Sgblack@eecs.umich.edu} 2066254Sgblack@eecs.umich.edu 2076254Sgblack@eecs.umich.edu 2086254Sgblack@eecs.umich.eduvoid 2097148Sgblack@eecs.umich.eduArmStaticInst::printReg(std::ostream &os, int reg) const 2106253Sgblack@eecs.umich.edu{ 2116253Sgblack@eecs.umich.edu if (reg < FP_Base_DepTag) { 2126261Sgblack@eecs.umich.edu switch (reg) { 2136261Sgblack@eecs.umich.edu case PCReg: 2146261Sgblack@eecs.umich.edu ccprintf(os, "pc"); 2156261Sgblack@eecs.umich.edu break; 2166261Sgblack@eecs.umich.edu case StackPointerReg: 2176261Sgblack@eecs.umich.edu ccprintf(os, "sp"); 2186261Sgblack@eecs.umich.edu break; 2196261Sgblack@eecs.umich.edu case FramePointerReg: 2206261Sgblack@eecs.umich.edu ccprintf(os, "fp"); 2216261Sgblack@eecs.umich.edu break; 2226261Sgblack@eecs.umich.edu case ReturnAddressReg: 2236261Sgblack@eecs.umich.edu ccprintf(os, "lr"); 2246261Sgblack@eecs.umich.edu break; 2256261Sgblack@eecs.umich.edu default: 2266261Sgblack@eecs.umich.edu ccprintf(os, "r%d", reg); 2276261Sgblack@eecs.umich.edu break; 2286261Sgblack@eecs.umich.edu } 2296261Sgblack@eecs.umich.edu } else if (reg < Ctrl_Base_DepTag) { 2306253Sgblack@eecs.umich.edu ccprintf(os, "f%d", reg - FP_Base_DepTag); 2316261Sgblack@eecs.umich.edu } else { 2326261Sgblack@eecs.umich.edu reg -= Ctrl_Base_DepTag; 2336261Sgblack@eecs.umich.edu assert(reg < NUM_MISCREGS); 2346261Sgblack@eecs.umich.edu ccprintf(os, "%s", ArmISA::miscRegName[reg]); 2356253Sgblack@eecs.umich.edu } 2366253Sgblack@eecs.umich.edu} 2376253Sgblack@eecs.umich.edu 2386262Sgblack@eecs.umich.eduvoid 2397148Sgblack@eecs.umich.eduArmStaticInst::printMnemonic(std::ostream &os, 2406262Sgblack@eecs.umich.edu const std::string &suffix, 2416262Sgblack@eecs.umich.edu bool withPred) const 2426262Sgblack@eecs.umich.edu{ 2436262Sgblack@eecs.umich.edu os << " " << mnemonic; 2446262Sgblack@eecs.umich.edu if (withPred) { 2456262Sgblack@eecs.umich.edu unsigned condCode = machInst.condCode; 2466262Sgblack@eecs.umich.edu switch (condCode) { 2476262Sgblack@eecs.umich.edu case COND_EQ: 2486262Sgblack@eecs.umich.edu os << "eq"; 2496262Sgblack@eecs.umich.edu break; 2506262Sgblack@eecs.umich.edu case COND_NE: 2516262Sgblack@eecs.umich.edu os << "ne"; 2526262Sgblack@eecs.umich.edu break; 2536262Sgblack@eecs.umich.edu case COND_CS: 2546262Sgblack@eecs.umich.edu os << "cs"; 2556262Sgblack@eecs.umich.edu break; 2566262Sgblack@eecs.umich.edu case COND_CC: 2576262Sgblack@eecs.umich.edu os << "cc"; 2586262Sgblack@eecs.umich.edu break; 2596262Sgblack@eecs.umich.edu case COND_MI: 2606262Sgblack@eecs.umich.edu os << "mi"; 2616262Sgblack@eecs.umich.edu break; 2626262Sgblack@eecs.umich.edu case COND_PL: 2636262Sgblack@eecs.umich.edu os << "pl"; 2646262Sgblack@eecs.umich.edu break; 2656262Sgblack@eecs.umich.edu case COND_VS: 2666262Sgblack@eecs.umich.edu os << "vs"; 2676262Sgblack@eecs.umich.edu break; 2686262Sgblack@eecs.umich.edu case COND_VC: 2696262Sgblack@eecs.umich.edu os << "vc"; 2706262Sgblack@eecs.umich.edu break; 2716262Sgblack@eecs.umich.edu case COND_HI: 2726262Sgblack@eecs.umich.edu os << "hi"; 2736262Sgblack@eecs.umich.edu break; 2746262Sgblack@eecs.umich.edu case COND_LS: 2756262Sgblack@eecs.umich.edu os << "ls"; 2766262Sgblack@eecs.umich.edu break; 2776262Sgblack@eecs.umich.edu case COND_GE: 2786262Sgblack@eecs.umich.edu os << "ge"; 2796262Sgblack@eecs.umich.edu break; 2806262Sgblack@eecs.umich.edu case COND_LT: 2816262Sgblack@eecs.umich.edu os << "lt"; 2826262Sgblack@eecs.umich.edu break; 2836262Sgblack@eecs.umich.edu case COND_GT: 2846262Sgblack@eecs.umich.edu os << "gt"; 2856262Sgblack@eecs.umich.edu break; 2866262Sgblack@eecs.umich.edu case COND_LE: 2876262Sgblack@eecs.umich.edu os << "le"; 2886262Sgblack@eecs.umich.edu break; 2896262Sgblack@eecs.umich.edu case COND_AL: 2906262Sgblack@eecs.umich.edu // This one is implicit. 2916262Sgblack@eecs.umich.edu break; 2927111Sgblack@eecs.umich.edu case COND_UC: 2937111Sgblack@eecs.umich.edu // Unconditional. 2946262Sgblack@eecs.umich.edu break; 2956262Sgblack@eecs.umich.edu default: 2966262Sgblack@eecs.umich.edu panic("Unrecognized condition code %d.\n", condCode); 2976262Sgblack@eecs.umich.edu } 2987122Sgblack@eecs.umich.edu os << suffix; 2997122Sgblack@eecs.umich.edu if (machInst.bigThumb) 3007122Sgblack@eecs.umich.edu os << ".w"; 3017122Sgblack@eecs.umich.edu os << " "; 3026262Sgblack@eecs.umich.edu } 3036262Sgblack@eecs.umich.edu} 3046262Sgblack@eecs.umich.edu 3056263Sgblack@eecs.umich.eduvoid 3067148Sgblack@eecs.umich.eduArmStaticInst::printMemSymbol(std::ostream &os, 3076263Sgblack@eecs.umich.edu const SymbolTable *symtab, 3086263Sgblack@eecs.umich.edu const std::string &prefix, 3096263Sgblack@eecs.umich.edu const Addr addr, 3106263Sgblack@eecs.umich.edu const std::string &suffix) const 3116263Sgblack@eecs.umich.edu{ 3126263Sgblack@eecs.umich.edu Addr symbolAddr; 3136263Sgblack@eecs.umich.edu std::string symbol; 3146263Sgblack@eecs.umich.edu if (symtab && symtab->findNearestSymbol(addr, symbol, symbolAddr)) { 3156263Sgblack@eecs.umich.edu ccprintf(os, "%s%s", prefix, symbol); 3166263Sgblack@eecs.umich.edu if (symbolAddr != addr) 3176263Sgblack@eecs.umich.edu ccprintf(os, "+%d", addr - symbolAddr); 3186263Sgblack@eecs.umich.edu ccprintf(os, suffix); 3196263Sgblack@eecs.umich.edu } 3206263Sgblack@eecs.umich.edu} 3216263Sgblack@eecs.umich.edu 3226264Sgblack@eecs.umich.eduvoid 3237148Sgblack@eecs.umich.eduArmStaticInst::printShiftOperand(std::ostream &os, 3247142Sgblack@eecs.umich.edu IntRegIndex rm, 3257142Sgblack@eecs.umich.edu bool immShift, 3267142Sgblack@eecs.umich.edu uint32_t shiftAmt, 3277142Sgblack@eecs.umich.edu IntRegIndex rs, 3287142Sgblack@eecs.umich.edu ArmShiftType type) const 3296264Sgblack@eecs.umich.edu{ 3307142Sgblack@eecs.umich.edu bool firstOp = false; 3316264Sgblack@eecs.umich.edu 3327142Sgblack@eecs.umich.edu if (rm != INTREG_ZERO) { 3337142Sgblack@eecs.umich.edu printReg(os, rm); 3347142Sgblack@eecs.umich.edu } 3357142Sgblack@eecs.umich.edu 3366306Sgblack@eecs.umich.edu bool done = false; 3376264Sgblack@eecs.umich.edu 3386306Sgblack@eecs.umich.edu if ((type == LSR || type == ASR) && immShift && shiftAmt == 0) 3396306Sgblack@eecs.umich.edu shiftAmt = 32; 3406264Sgblack@eecs.umich.edu 3416306Sgblack@eecs.umich.edu switch (type) { 3426306Sgblack@eecs.umich.edu case LSL: 3436306Sgblack@eecs.umich.edu if (immShift && shiftAmt == 0) { 3446306Sgblack@eecs.umich.edu done = true; 3456264Sgblack@eecs.umich.edu break; 3466306Sgblack@eecs.umich.edu } 3477142Sgblack@eecs.umich.edu if (!firstOp) 3487142Sgblack@eecs.umich.edu os << ", "; 3497142Sgblack@eecs.umich.edu os << "LSL"; 3506306Sgblack@eecs.umich.edu break; 3516306Sgblack@eecs.umich.edu case LSR: 3527142Sgblack@eecs.umich.edu if (!firstOp) 3537142Sgblack@eecs.umich.edu os << ", "; 3547142Sgblack@eecs.umich.edu os << "LSR"; 3556306Sgblack@eecs.umich.edu break; 3566306Sgblack@eecs.umich.edu case ASR: 3577142Sgblack@eecs.umich.edu if (!firstOp) 3587142Sgblack@eecs.umich.edu os << ", "; 3597142Sgblack@eecs.umich.edu os << "ASR"; 3606306Sgblack@eecs.umich.edu break; 3616306Sgblack@eecs.umich.edu case ROR: 3626306Sgblack@eecs.umich.edu if (immShift && shiftAmt == 0) { 3637142Sgblack@eecs.umich.edu if (!firstOp) 3647142Sgblack@eecs.umich.edu os << ", "; 3657142Sgblack@eecs.umich.edu os << "RRX"; 3666306Sgblack@eecs.umich.edu done = true; 3676264Sgblack@eecs.umich.edu break; 3686264Sgblack@eecs.umich.edu } 3697142Sgblack@eecs.umich.edu if (!firstOp) 3707142Sgblack@eecs.umich.edu os << ", "; 3717142Sgblack@eecs.umich.edu os << "ROR"; 3726306Sgblack@eecs.umich.edu break; 3736306Sgblack@eecs.umich.edu default: 3746306Sgblack@eecs.umich.edu panic("Tried to disassemble unrecognized shift type.\n"); 3756306Sgblack@eecs.umich.edu } 3766306Sgblack@eecs.umich.edu if (!done) { 3777142Sgblack@eecs.umich.edu if (!firstOp) 3787142Sgblack@eecs.umich.edu os << " "; 3796306Sgblack@eecs.umich.edu if (immShift) 3806306Sgblack@eecs.umich.edu os << "#" << shiftAmt; 3816306Sgblack@eecs.umich.edu else 3827142Sgblack@eecs.umich.edu printReg(os, rs); 3836264Sgblack@eecs.umich.edu } 3846264Sgblack@eecs.umich.edu} 3856264Sgblack@eecs.umich.edu 3866264Sgblack@eecs.umich.eduvoid 3877148Sgblack@eecs.umich.eduArmStaticInst::printDataInst(std::ostream &os, bool withImm, 3887142Sgblack@eecs.umich.edu bool immShift, bool s, IntRegIndex rd, IntRegIndex rn, 3897142Sgblack@eecs.umich.edu IntRegIndex rm, IntRegIndex rs, uint32_t shiftAmt, 3907142Sgblack@eecs.umich.edu ArmShiftType type, uint32_t imm) const 3916264Sgblack@eecs.umich.edu{ 3927142Sgblack@eecs.umich.edu printMnemonic(os, s ? "s" : ""); 3936264Sgblack@eecs.umich.edu bool firstOp = true; 3946264Sgblack@eecs.umich.edu 3956264Sgblack@eecs.umich.edu // Destination 3967142Sgblack@eecs.umich.edu if (rd != INTREG_ZERO) { 3976264Sgblack@eecs.umich.edu firstOp = false; 3987142Sgblack@eecs.umich.edu printReg(os, rd); 3996264Sgblack@eecs.umich.edu } 4006264Sgblack@eecs.umich.edu 4016264Sgblack@eecs.umich.edu // Source 1. 4027142Sgblack@eecs.umich.edu if (rn != INTREG_ZERO) { 4036264Sgblack@eecs.umich.edu if (!firstOp) 4046264Sgblack@eecs.umich.edu os << ", "; 4056264Sgblack@eecs.umich.edu firstOp = false; 4067142Sgblack@eecs.umich.edu printReg(os, rn); 4076264Sgblack@eecs.umich.edu } 4086264Sgblack@eecs.umich.edu 4096264Sgblack@eecs.umich.edu if (!firstOp) 4106264Sgblack@eecs.umich.edu os << ", "; 4116306Sgblack@eecs.umich.edu if (withImm) { 4127142Sgblack@eecs.umich.edu ccprintf(os, "#%d", imm); 4136306Sgblack@eecs.umich.edu } else { 4147142Sgblack@eecs.umich.edu printShiftOperand(os, rm, immShift, shiftAmt, rs, type); 4156306Sgblack@eecs.umich.edu } 4166264Sgblack@eecs.umich.edu} 4176264Sgblack@eecs.umich.edu 4186254Sgblack@eecs.umich.edustd::string 4197148Sgblack@eecs.umich.eduArmStaticInst::generateDisassembly(Addr pc, 4206254Sgblack@eecs.umich.edu const SymbolTable *symtab) const 4216253Sgblack@eecs.umich.edu{ 4226253Sgblack@eecs.umich.edu std::stringstream ss; 4236262Sgblack@eecs.umich.edu printMnemonic(ss); 4246253Sgblack@eecs.umich.edu return ss.str(); 4256253Sgblack@eecs.umich.edu} 4266253Sgblack@eecs.umich.edu} 427