static_inst.cc revision 6712
16253Sgblack@eecs.umich.edu/* Copyright (c) 2007-2008 The Florida State University 26253Sgblack@eecs.umich.edu * All rights reserved. 36253Sgblack@eecs.umich.edu * 46253Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 56253Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 66253Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 76253Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 86253Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 96253Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 106253Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 116253Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 126253Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 136253Sgblack@eecs.umich.edu * this software without specific prior written permission. 146253Sgblack@eecs.umich.edu * 156253Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 166253Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 176253Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 186253Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 196253Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 206253Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 216253Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 226253Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 236253Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 246253Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 256253Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 266253Sgblack@eecs.umich.edu * 276253Sgblack@eecs.umich.edu * Authors: Stephen Hines 286253Sgblack@eecs.umich.edu */ 296253Sgblack@eecs.umich.edu 306253Sgblack@eecs.umich.edu#include "arch/arm/insts/static_inst.hh" 316255Sgblack@eecs.umich.edu#include "base/condcodes.hh" 326712Snate@binkert.org#include "base/cprintf.hh" 336263Sgblack@eecs.umich.edu#include "base/loader/symtab.hh" 346253Sgblack@eecs.umich.edu 356253Sgblack@eecs.umich.edunamespace ArmISA 366253Sgblack@eecs.umich.edu{ 376254Sgblack@eecs.umich.edu// Shift Rm by an immediate value 386254Sgblack@eecs.umich.eduint32_t 396254Sgblack@eecs.umich.eduArmStaticInst::shift_rm_imm(uint32_t base, uint32_t shamt, 406254Sgblack@eecs.umich.edu uint32_t type, uint32_t cfval) const 416254Sgblack@eecs.umich.edu{ 426255Sgblack@eecs.umich.edu assert(shamt < 32); 436255Sgblack@eecs.umich.edu ArmShiftType shiftType; 446255Sgblack@eecs.umich.edu shiftType = (ArmShiftType)type; 456254Sgblack@eecs.umich.edu 466254Sgblack@eecs.umich.edu switch (shiftType) 476254Sgblack@eecs.umich.edu { 486255Sgblack@eecs.umich.edu case LSL: 496255Sgblack@eecs.umich.edu return base << shamt; 506255Sgblack@eecs.umich.edu case LSR: 516255Sgblack@eecs.umich.edu if (shamt == 0) 526255Sgblack@eecs.umich.edu return 0; 536255Sgblack@eecs.umich.edu else 546255Sgblack@eecs.umich.edu return base >> shamt; 556255Sgblack@eecs.umich.edu case ASR: 566255Sgblack@eecs.umich.edu if (shamt == 0) 576255Sgblack@eecs.umich.edu return (int32_t)base >> 31; 586255Sgblack@eecs.umich.edu else 596255Sgblack@eecs.umich.edu return (int32_t)base >> shamt; 606255Sgblack@eecs.umich.edu case ROR: 616255Sgblack@eecs.umich.edu if (shamt == 0) 626255Sgblack@eecs.umich.edu return (cfval << 31) | (base >> 1); // RRX 636255Sgblack@eecs.umich.edu else 646255Sgblack@eecs.umich.edu return (base << (32 - shamt)) | (base >> shamt); 656255Sgblack@eecs.umich.edu default: 666712Snate@binkert.org ccprintf(std::cerr, "Unhandled shift type\n"); 676255Sgblack@eecs.umich.edu exit(1); 686255Sgblack@eecs.umich.edu break; 696254Sgblack@eecs.umich.edu } 706254Sgblack@eecs.umich.edu return 0; 716254Sgblack@eecs.umich.edu} 726254Sgblack@eecs.umich.edu 736254Sgblack@eecs.umich.edu// Shift Rm by Rs 746254Sgblack@eecs.umich.eduint32_t 756254Sgblack@eecs.umich.eduArmStaticInst::shift_rm_rs(uint32_t base, uint32_t shamt, 766254Sgblack@eecs.umich.edu uint32_t type, uint32_t cfval) const 776254Sgblack@eecs.umich.edu{ 786254Sgblack@eecs.umich.edu enum ArmShiftType shiftType; 796254Sgblack@eecs.umich.edu shiftType = (enum ArmShiftType) type; 806254Sgblack@eecs.umich.edu 816254Sgblack@eecs.umich.edu switch (shiftType) 826254Sgblack@eecs.umich.edu { 836255Sgblack@eecs.umich.edu case LSL: 846255Sgblack@eecs.umich.edu if (shamt >= 32) 856255Sgblack@eecs.umich.edu return 0; 866255Sgblack@eecs.umich.edu else 876255Sgblack@eecs.umich.edu return base << shamt; 886255Sgblack@eecs.umich.edu case LSR: 896255Sgblack@eecs.umich.edu if (shamt >= 32) 906255Sgblack@eecs.umich.edu return 0; 916255Sgblack@eecs.umich.edu else 926255Sgblack@eecs.umich.edu return base >> shamt; 936255Sgblack@eecs.umich.edu case ASR: 946255Sgblack@eecs.umich.edu if (shamt >= 32) 956255Sgblack@eecs.umich.edu return (int32_t)base >> 31; 966255Sgblack@eecs.umich.edu else 976255Sgblack@eecs.umich.edu return (int32_t)base >> shamt; 986255Sgblack@eecs.umich.edu case ROR: 996255Sgblack@eecs.umich.edu shamt = shamt & 0x1f; 1006255Sgblack@eecs.umich.edu if (shamt == 0) 1016255Sgblack@eecs.umich.edu return base; 1026255Sgblack@eecs.umich.edu else 1036255Sgblack@eecs.umich.edu return (base << (32 - shamt)) | (base >> shamt); 1046255Sgblack@eecs.umich.edu default: 1056712Snate@binkert.org ccprintf(std::cerr, "Unhandled shift type\n"); 1066255Sgblack@eecs.umich.edu exit(1); 1076255Sgblack@eecs.umich.edu break; 1086254Sgblack@eecs.umich.edu } 1096254Sgblack@eecs.umich.edu return 0; 1106254Sgblack@eecs.umich.edu} 1116254Sgblack@eecs.umich.edu 1126254Sgblack@eecs.umich.edu 1136254Sgblack@eecs.umich.edu// Generate C for a shift by immediate 1146255Sgblack@eecs.umich.edubool 1156254Sgblack@eecs.umich.eduArmStaticInst::shift_carry_imm(uint32_t base, uint32_t shamt, 1166254Sgblack@eecs.umich.edu uint32_t type, uint32_t cfval) const 1176254Sgblack@eecs.umich.edu{ 1186254Sgblack@eecs.umich.edu enum ArmShiftType shiftType; 1196254Sgblack@eecs.umich.edu shiftType = (enum ArmShiftType) type; 1206254Sgblack@eecs.umich.edu 1216254Sgblack@eecs.umich.edu switch (shiftType) 1226254Sgblack@eecs.umich.edu { 1236255Sgblack@eecs.umich.edu case LSL: 1246255Sgblack@eecs.umich.edu if (shamt == 0) 1256255Sgblack@eecs.umich.edu return cfval; 1266255Sgblack@eecs.umich.edu else 1276254Sgblack@eecs.umich.edu return (base >> (32 - shamt)) & 1; 1286255Sgblack@eecs.umich.edu case LSR: 1296255Sgblack@eecs.umich.edu if (shamt == 0) 1306255Sgblack@eecs.umich.edu return (base >> 31); 1316255Sgblack@eecs.umich.edu else 1326255Sgblack@eecs.umich.edu return (base >> (shamt - 1)) & 1; 1336255Sgblack@eecs.umich.edu case ASR: 1346255Sgblack@eecs.umich.edu if (shamt == 0) 1356255Sgblack@eecs.umich.edu return (base >> 31); 1366255Sgblack@eecs.umich.edu else 1376255Sgblack@eecs.umich.edu return (base >> (shamt - 1)) & 1; 1386255Sgblack@eecs.umich.edu case ROR: 1396255Sgblack@eecs.umich.edu shamt = shamt & 0x1f; 1406255Sgblack@eecs.umich.edu if (shamt == 0) 1416255Sgblack@eecs.umich.edu return (base & 1); // RRX 1426255Sgblack@eecs.umich.edu else 1436255Sgblack@eecs.umich.edu return (base >> (shamt - 1)) & 1; 1446255Sgblack@eecs.umich.edu default: 1456712Snate@binkert.org ccprintf(std::cerr, "Unhandled shift type\n"); 1466255Sgblack@eecs.umich.edu exit(1); 1476255Sgblack@eecs.umich.edu break; 1486254Sgblack@eecs.umich.edu } 1496254Sgblack@eecs.umich.edu return 0; 1506254Sgblack@eecs.umich.edu} 1516254Sgblack@eecs.umich.edu 1526254Sgblack@eecs.umich.edu 1536254Sgblack@eecs.umich.edu// Generate C for a shift by Rs 1546255Sgblack@eecs.umich.edubool 1556254Sgblack@eecs.umich.eduArmStaticInst::shift_carry_rs(uint32_t base, uint32_t shamt, 1566254Sgblack@eecs.umich.edu uint32_t type, uint32_t cfval) const 1576254Sgblack@eecs.umich.edu{ 1586254Sgblack@eecs.umich.edu enum ArmShiftType shiftType; 1596254Sgblack@eecs.umich.edu shiftType = (enum ArmShiftType) type; 1606254Sgblack@eecs.umich.edu 1616255Sgblack@eecs.umich.edu if (shamt == 0) 1626255Sgblack@eecs.umich.edu return cfval; 1636255Sgblack@eecs.umich.edu 1646254Sgblack@eecs.umich.edu switch (shiftType) 1656254Sgblack@eecs.umich.edu { 1666255Sgblack@eecs.umich.edu case LSL: 1676255Sgblack@eecs.umich.edu if (shamt > 32) 1686255Sgblack@eecs.umich.edu return 0; 1696255Sgblack@eecs.umich.edu else 1706255Sgblack@eecs.umich.edu return (base >> (32 - shamt)) & 1; 1716255Sgblack@eecs.umich.edu case LSR: 1726255Sgblack@eecs.umich.edu if (shamt > 32) 1736255Sgblack@eecs.umich.edu return 0; 1746255Sgblack@eecs.umich.edu else 1756255Sgblack@eecs.umich.edu return (base >> (shamt - 1)) & 1; 1766255Sgblack@eecs.umich.edu case ASR: 1776255Sgblack@eecs.umich.edu if (shamt > 32) 1786255Sgblack@eecs.umich.edu shamt = 32; 1796255Sgblack@eecs.umich.edu return (base >> (shamt - 1)) & 1; 1806255Sgblack@eecs.umich.edu case ROR: 1816255Sgblack@eecs.umich.edu shamt = shamt & 0x1f; 1826255Sgblack@eecs.umich.edu if (shamt == 0) 1836255Sgblack@eecs.umich.edu shamt = 32; 1846255Sgblack@eecs.umich.edu return (base >> (shamt - 1)) & 1; 1856255Sgblack@eecs.umich.edu default: 1866712Snate@binkert.org ccprintf(std::cerr, "Unhandled shift type\n"); 1876255Sgblack@eecs.umich.edu exit(1); 1886255Sgblack@eecs.umich.edu break; 1896254Sgblack@eecs.umich.edu } 1906254Sgblack@eecs.umich.edu return 0; 1916254Sgblack@eecs.umich.edu} 1926254Sgblack@eecs.umich.edu 1936254Sgblack@eecs.umich.edu 1946254Sgblack@eecs.umich.edu// Generate the appropriate carry bit for an addition operation 1956255Sgblack@eecs.umich.edubool 1966254Sgblack@eecs.umich.eduArmStaticInst::arm_add_carry(int32_t result, int32_t lhs, int32_t rhs) const 1976254Sgblack@eecs.umich.edu{ 1986255Sgblack@eecs.umich.edu return findCarry(32, result, lhs, rhs); 1996254Sgblack@eecs.umich.edu} 2006254Sgblack@eecs.umich.edu 2016254Sgblack@eecs.umich.edu// Generate the appropriate carry bit for a subtraction operation 2026255Sgblack@eecs.umich.edubool 2036254Sgblack@eecs.umich.eduArmStaticInst::arm_sub_carry(int32_t result, int32_t lhs, int32_t rhs) const 2046254Sgblack@eecs.umich.edu{ 2056255Sgblack@eecs.umich.edu return findCarry(32, result, lhs, ~rhs); 2066254Sgblack@eecs.umich.edu} 2076254Sgblack@eecs.umich.edu 2086255Sgblack@eecs.umich.edubool 2096254Sgblack@eecs.umich.eduArmStaticInst::arm_add_overflow(int32_t result, int32_t lhs, int32_t rhs) const 2106254Sgblack@eecs.umich.edu{ 2116255Sgblack@eecs.umich.edu return findOverflow(32, result, lhs, rhs); 2126254Sgblack@eecs.umich.edu} 2136254Sgblack@eecs.umich.edu 2146255Sgblack@eecs.umich.edubool 2156254Sgblack@eecs.umich.eduArmStaticInst::arm_sub_overflow(int32_t result, int32_t lhs, int32_t rhs) const 2166254Sgblack@eecs.umich.edu{ 2176255Sgblack@eecs.umich.edu return findOverflow(32, result, lhs, ~rhs); 2186254Sgblack@eecs.umich.edu} 2196254Sgblack@eecs.umich.edu 2206254Sgblack@eecs.umich.eduvoid 2216254Sgblack@eecs.umich.eduArmStaticInst::printReg(std::ostream &os, int reg) const 2226253Sgblack@eecs.umich.edu{ 2236253Sgblack@eecs.umich.edu if (reg < FP_Base_DepTag) { 2246261Sgblack@eecs.umich.edu switch (reg) { 2256261Sgblack@eecs.umich.edu case PCReg: 2266261Sgblack@eecs.umich.edu ccprintf(os, "pc"); 2276261Sgblack@eecs.umich.edu break; 2286261Sgblack@eecs.umich.edu case StackPointerReg: 2296261Sgblack@eecs.umich.edu ccprintf(os, "sp"); 2306261Sgblack@eecs.umich.edu break; 2316261Sgblack@eecs.umich.edu case FramePointerReg: 2326261Sgblack@eecs.umich.edu ccprintf(os, "fp"); 2336261Sgblack@eecs.umich.edu break; 2346261Sgblack@eecs.umich.edu case ReturnAddressReg: 2356261Sgblack@eecs.umich.edu ccprintf(os, "lr"); 2366261Sgblack@eecs.umich.edu break; 2376261Sgblack@eecs.umich.edu default: 2386261Sgblack@eecs.umich.edu ccprintf(os, "r%d", reg); 2396261Sgblack@eecs.umich.edu break; 2406261Sgblack@eecs.umich.edu } 2416261Sgblack@eecs.umich.edu } else if (reg < Ctrl_Base_DepTag) { 2426253Sgblack@eecs.umich.edu ccprintf(os, "f%d", reg - FP_Base_DepTag); 2436261Sgblack@eecs.umich.edu } else { 2446261Sgblack@eecs.umich.edu reg -= Ctrl_Base_DepTag; 2456261Sgblack@eecs.umich.edu assert(reg < NUM_MISCREGS); 2466261Sgblack@eecs.umich.edu ccprintf(os, "%s", ArmISA::miscRegName[reg]); 2476253Sgblack@eecs.umich.edu } 2486253Sgblack@eecs.umich.edu} 2496253Sgblack@eecs.umich.edu 2506262Sgblack@eecs.umich.eduvoid 2516262Sgblack@eecs.umich.eduArmStaticInst::printMnemonic(std::ostream &os, 2526262Sgblack@eecs.umich.edu const std::string &suffix, 2536262Sgblack@eecs.umich.edu bool withPred) const 2546262Sgblack@eecs.umich.edu{ 2556262Sgblack@eecs.umich.edu os << " " << mnemonic; 2566262Sgblack@eecs.umich.edu if (withPred) { 2576262Sgblack@eecs.umich.edu unsigned condCode = machInst.condCode; 2586262Sgblack@eecs.umich.edu switch (condCode) { 2596262Sgblack@eecs.umich.edu case COND_EQ: 2606262Sgblack@eecs.umich.edu os << "eq"; 2616262Sgblack@eecs.umich.edu break; 2626262Sgblack@eecs.umich.edu case COND_NE: 2636262Sgblack@eecs.umich.edu os << "ne"; 2646262Sgblack@eecs.umich.edu break; 2656262Sgblack@eecs.umich.edu case COND_CS: 2666262Sgblack@eecs.umich.edu os << "cs"; 2676262Sgblack@eecs.umich.edu break; 2686262Sgblack@eecs.umich.edu case COND_CC: 2696262Sgblack@eecs.umich.edu os << "cc"; 2706262Sgblack@eecs.umich.edu break; 2716262Sgblack@eecs.umich.edu case COND_MI: 2726262Sgblack@eecs.umich.edu os << "mi"; 2736262Sgblack@eecs.umich.edu break; 2746262Sgblack@eecs.umich.edu case COND_PL: 2756262Sgblack@eecs.umich.edu os << "pl"; 2766262Sgblack@eecs.umich.edu break; 2776262Sgblack@eecs.umich.edu case COND_VS: 2786262Sgblack@eecs.umich.edu os << "vs"; 2796262Sgblack@eecs.umich.edu break; 2806262Sgblack@eecs.umich.edu case COND_VC: 2816262Sgblack@eecs.umich.edu os << "vc"; 2826262Sgblack@eecs.umich.edu break; 2836262Sgblack@eecs.umich.edu case COND_HI: 2846262Sgblack@eecs.umich.edu os << "hi"; 2856262Sgblack@eecs.umich.edu break; 2866262Sgblack@eecs.umich.edu case COND_LS: 2876262Sgblack@eecs.umich.edu os << "ls"; 2886262Sgblack@eecs.umich.edu break; 2896262Sgblack@eecs.umich.edu case COND_GE: 2906262Sgblack@eecs.umich.edu os << "ge"; 2916262Sgblack@eecs.umich.edu break; 2926262Sgblack@eecs.umich.edu case COND_LT: 2936262Sgblack@eecs.umich.edu os << "lt"; 2946262Sgblack@eecs.umich.edu break; 2956262Sgblack@eecs.umich.edu case COND_GT: 2966262Sgblack@eecs.umich.edu os << "gt"; 2976262Sgblack@eecs.umich.edu break; 2986262Sgblack@eecs.umich.edu case COND_LE: 2996262Sgblack@eecs.umich.edu os << "le"; 3006262Sgblack@eecs.umich.edu break; 3016262Sgblack@eecs.umich.edu case COND_AL: 3026262Sgblack@eecs.umich.edu // This one is implicit. 3036262Sgblack@eecs.umich.edu break; 3046262Sgblack@eecs.umich.edu case COND_NV: 3056262Sgblack@eecs.umich.edu os << "nv"; 3066262Sgblack@eecs.umich.edu break; 3076262Sgblack@eecs.umich.edu default: 3086262Sgblack@eecs.umich.edu panic("Unrecognized condition code %d.\n", condCode); 3096262Sgblack@eecs.umich.edu } 3106262Sgblack@eecs.umich.edu os << suffix << " "; 3116262Sgblack@eecs.umich.edu } 3126262Sgblack@eecs.umich.edu} 3136262Sgblack@eecs.umich.edu 3146263Sgblack@eecs.umich.eduvoid 3156263Sgblack@eecs.umich.eduArmStaticInst::printMemSymbol(std::ostream &os, 3166263Sgblack@eecs.umich.edu const SymbolTable *symtab, 3176263Sgblack@eecs.umich.edu const std::string &prefix, 3186263Sgblack@eecs.umich.edu const Addr addr, 3196263Sgblack@eecs.umich.edu const std::string &suffix) const 3206263Sgblack@eecs.umich.edu{ 3216263Sgblack@eecs.umich.edu Addr symbolAddr; 3226263Sgblack@eecs.umich.edu std::string symbol; 3236263Sgblack@eecs.umich.edu if (symtab && symtab->findNearestSymbol(addr, symbol, symbolAddr)) { 3246263Sgblack@eecs.umich.edu ccprintf(os, "%s%s", prefix, symbol); 3256263Sgblack@eecs.umich.edu if (symbolAddr != addr) 3266263Sgblack@eecs.umich.edu ccprintf(os, "+%d", addr - symbolAddr); 3276263Sgblack@eecs.umich.edu ccprintf(os, suffix); 3286263Sgblack@eecs.umich.edu } 3296263Sgblack@eecs.umich.edu} 3306263Sgblack@eecs.umich.edu 3316264Sgblack@eecs.umich.eduvoid 3326264Sgblack@eecs.umich.eduArmStaticInst::printShiftOperand(std::ostream &os) const 3336264Sgblack@eecs.umich.edu{ 3346306Sgblack@eecs.umich.edu printReg(os, machInst.rm); 3356264Sgblack@eecs.umich.edu 3366306Sgblack@eecs.umich.edu bool immShift = (machInst.opcode4 == 0); 3376306Sgblack@eecs.umich.edu bool done = false; 3386306Sgblack@eecs.umich.edu unsigned shiftAmt = (machInst.shiftSize); 3396306Sgblack@eecs.umich.edu ArmShiftType type = (ArmShiftType)(uint32_t)machInst.shift; 3406264Sgblack@eecs.umich.edu 3416306Sgblack@eecs.umich.edu if ((type == LSR || type == ASR) && immShift && shiftAmt == 0) 3426306Sgblack@eecs.umich.edu shiftAmt = 32; 3436264Sgblack@eecs.umich.edu 3446306Sgblack@eecs.umich.edu switch (type) { 3456306Sgblack@eecs.umich.edu case LSL: 3466306Sgblack@eecs.umich.edu if (immShift && shiftAmt == 0) { 3476306Sgblack@eecs.umich.edu done = true; 3486264Sgblack@eecs.umich.edu break; 3496306Sgblack@eecs.umich.edu } 3506306Sgblack@eecs.umich.edu os << ", LSL"; 3516306Sgblack@eecs.umich.edu break; 3526306Sgblack@eecs.umich.edu case LSR: 3536306Sgblack@eecs.umich.edu os << ", LSR"; 3546306Sgblack@eecs.umich.edu break; 3556306Sgblack@eecs.umich.edu case ASR: 3566306Sgblack@eecs.umich.edu os << ", ASR"; 3576306Sgblack@eecs.umich.edu break; 3586306Sgblack@eecs.umich.edu case ROR: 3596306Sgblack@eecs.umich.edu if (immShift && shiftAmt == 0) { 3606306Sgblack@eecs.umich.edu os << ", RRX"; 3616306Sgblack@eecs.umich.edu done = true; 3626264Sgblack@eecs.umich.edu break; 3636264Sgblack@eecs.umich.edu } 3646306Sgblack@eecs.umich.edu os << ", ROR"; 3656306Sgblack@eecs.umich.edu break; 3666306Sgblack@eecs.umich.edu default: 3676306Sgblack@eecs.umich.edu panic("Tried to disassemble unrecognized shift type.\n"); 3686306Sgblack@eecs.umich.edu } 3696306Sgblack@eecs.umich.edu if (!done) { 3706306Sgblack@eecs.umich.edu os << " "; 3716306Sgblack@eecs.umich.edu if (immShift) 3726306Sgblack@eecs.umich.edu os << "#" << shiftAmt; 3736306Sgblack@eecs.umich.edu else 3746306Sgblack@eecs.umich.edu printReg(os, machInst.rs); 3756264Sgblack@eecs.umich.edu } 3766264Sgblack@eecs.umich.edu} 3776264Sgblack@eecs.umich.edu 3786264Sgblack@eecs.umich.eduvoid 3796306Sgblack@eecs.umich.eduArmStaticInst::printDataInst(std::ostream &os, bool withImm) const 3806264Sgblack@eecs.umich.edu{ 3816264Sgblack@eecs.umich.edu printMnemonic(os, machInst.sField ? "s" : ""); 3826264Sgblack@eecs.umich.edu //XXX It would be nice if the decoder figured this all out for us. 3836268Sgblack@eecs.umich.edu unsigned opcode = machInst.opcode; 3846264Sgblack@eecs.umich.edu bool firstOp = true; 3856264Sgblack@eecs.umich.edu 3866264Sgblack@eecs.umich.edu // Destination 3876264Sgblack@eecs.umich.edu // Cmp, cmn, teq, and tst don't have one. 3886264Sgblack@eecs.umich.edu if (opcode < 8 || opcode > 0xb) { 3896264Sgblack@eecs.umich.edu firstOp = false; 3906264Sgblack@eecs.umich.edu printReg(os, machInst.rd); 3916264Sgblack@eecs.umich.edu } 3926264Sgblack@eecs.umich.edu 3936264Sgblack@eecs.umich.edu // Source 1. 3946264Sgblack@eecs.umich.edu // Mov and Movn don't have one of these. 3956264Sgblack@eecs.umich.edu if (opcode != 0xd && opcode != 0xf) { 3966264Sgblack@eecs.umich.edu if (!firstOp) 3976264Sgblack@eecs.umich.edu os << ", "; 3986264Sgblack@eecs.umich.edu firstOp = false; 3996264Sgblack@eecs.umich.edu printReg(os, machInst.rn); 4006264Sgblack@eecs.umich.edu } 4016264Sgblack@eecs.umich.edu 4026264Sgblack@eecs.umich.edu if (!firstOp) 4036264Sgblack@eecs.umich.edu os << ", "; 4046306Sgblack@eecs.umich.edu if (withImm) { 4056306Sgblack@eecs.umich.edu unsigned rotate = machInst.rotate * 2; 4066306Sgblack@eecs.umich.edu uint32_t imm = machInst.imm; 4076306Sgblack@eecs.umich.edu ccprintf(os, "#%#x", (imm << (32 - rotate)) | (imm >> rotate)); 4086306Sgblack@eecs.umich.edu } else { 4096306Sgblack@eecs.umich.edu printShiftOperand(os); 4106306Sgblack@eecs.umich.edu } 4116264Sgblack@eecs.umich.edu} 4126264Sgblack@eecs.umich.edu 4136254Sgblack@eecs.umich.edustd::string 4146254Sgblack@eecs.umich.eduArmStaticInst::generateDisassembly(Addr pc, 4156254Sgblack@eecs.umich.edu const SymbolTable *symtab) const 4166253Sgblack@eecs.umich.edu{ 4176253Sgblack@eecs.umich.edu std::stringstream ss; 4186262Sgblack@eecs.umich.edu printMnemonic(ss); 4196253Sgblack@eecs.umich.edu return ss.str(); 4206253Sgblack@eecs.umich.edu} 4216253Sgblack@eecs.umich.edu} 422