static_inst.cc revision 6268
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" 326263Sgblack@eecs.umich.edu#include "base/loader/symtab.hh" 336253Sgblack@eecs.umich.edu 346253Sgblack@eecs.umich.edunamespace ArmISA 356253Sgblack@eecs.umich.edu{ 366254Sgblack@eecs.umich.edu// Shift Rm by an immediate value 376254Sgblack@eecs.umich.eduint32_t 386254Sgblack@eecs.umich.eduArmStaticInst::shift_rm_imm(uint32_t base, uint32_t shamt, 396254Sgblack@eecs.umich.edu uint32_t type, uint32_t cfval) const 406254Sgblack@eecs.umich.edu{ 416255Sgblack@eecs.umich.edu assert(shamt < 32); 426255Sgblack@eecs.umich.edu ArmShiftType shiftType; 436255Sgblack@eecs.umich.edu shiftType = (ArmShiftType)type; 446254Sgblack@eecs.umich.edu 456254Sgblack@eecs.umich.edu switch (shiftType) 466254Sgblack@eecs.umich.edu { 476255Sgblack@eecs.umich.edu case LSL: 486255Sgblack@eecs.umich.edu return base << shamt; 496255Sgblack@eecs.umich.edu case LSR: 506255Sgblack@eecs.umich.edu if (shamt == 0) 516255Sgblack@eecs.umich.edu return 0; 526255Sgblack@eecs.umich.edu else 536255Sgblack@eecs.umich.edu return base >> shamt; 546255Sgblack@eecs.umich.edu case ASR: 556255Sgblack@eecs.umich.edu if (shamt == 0) 566255Sgblack@eecs.umich.edu return (int32_t)base >> 31; 576255Sgblack@eecs.umich.edu else 586255Sgblack@eecs.umich.edu return (int32_t)base >> shamt; 596255Sgblack@eecs.umich.edu case ROR: 606255Sgblack@eecs.umich.edu if (shamt == 0) 616255Sgblack@eecs.umich.edu return (cfval << 31) | (base >> 1); // RRX 626255Sgblack@eecs.umich.edu else 636255Sgblack@eecs.umich.edu return (base << (32 - shamt)) | (base >> shamt); 646255Sgblack@eecs.umich.edu default: 656255Sgblack@eecs.umich.edu fprintf(stderr, "Unhandled shift type\n"); 666255Sgblack@eecs.umich.edu exit(1); 676255Sgblack@eecs.umich.edu break; 686254Sgblack@eecs.umich.edu } 696254Sgblack@eecs.umich.edu return 0; 706254Sgblack@eecs.umich.edu} 716254Sgblack@eecs.umich.edu 726254Sgblack@eecs.umich.edu// Shift Rm by Rs 736254Sgblack@eecs.umich.eduint32_t 746254Sgblack@eecs.umich.eduArmStaticInst::shift_rm_rs(uint32_t base, uint32_t shamt, 756254Sgblack@eecs.umich.edu uint32_t type, uint32_t cfval) const 766254Sgblack@eecs.umich.edu{ 776254Sgblack@eecs.umich.edu enum ArmShiftType shiftType; 786254Sgblack@eecs.umich.edu shiftType = (enum ArmShiftType) type; 796254Sgblack@eecs.umich.edu 806254Sgblack@eecs.umich.edu switch (shiftType) 816254Sgblack@eecs.umich.edu { 826255Sgblack@eecs.umich.edu case LSL: 836255Sgblack@eecs.umich.edu if (shamt >= 32) 846255Sgblack@eecs.umich.edu return 0; 856255Sgblack@eecs.umich.edu else 866255Sgblack@eecs.umich.edu return base << shamt; 876255Sgblack@eecs.umich.edu case LSR: 886255Sgblack@eecs.umich.edu if (shamt >= 32) 896255Sgblack@eecs.umich.edu return 0; 906255Sgblack@eecs.umich.edu else 916255Sgblack@eecs.umich.edu return base >> shamt; 926255Sgblack@eecs.umich.edu case ASR: 936255Sgblack@eecs.umich.edu if (shamt >= 32) 946255Sgblack@eecs.umich.edu return (int32_t)base >> 31; 956255Sgblack@eecs.umich.edu else 966255Sgblack@eecs.umich.edu return (int32_t)base >> shamt; 976255Sgblack@eecs.umich.edu case ROR: 986255Sgblack@eecs.umich.edu shamt = shamt & 0x1f; 996255Sgblack@eecs.umich.edu if (shamt == 0) 1006255Sgblack@eecs.umich.edu return base; 1016255Sgblack@eecs.umich.edu else 1026255Sgblack@eecs.umich.edu return (base << (32 - shamt)) | (base >> shamt); 1036255Sgblack@eecs.umich.edu default: 1046255Sgblack@eecs.umich.edu fprintf(stderr, "Unhandled shift type\n"); 1056255Sgblack@eecs.umich.edu exit(1); 1066255Sgblack@eecs.umich.edu break; 1076254Sgblack@eecs.umich.edu } 1086254Sgblack@eecs.umich.edu return 0; 1096254Sgblack@eecs.umich.edu} 1106254Sgblack@eecs.umich.edu 1116254Sgblack@eecs.umich.edu 1126254Sgblack@eecs.umich.edu// Generate C for a shift by immediate 1136255Sgblack@eecs.umich.edubool 1146254Sgblack@eecs.umich.eduArmStaticInst::shift_carry_imm(uint32_t base, uint32_t shamt, 1156254Sgblack@eecs.umich.edu uint32_t type, uint32_t cfval) const 1166254Sgblack@eecs.umich.edu{ 1176254Sgblack@eecs.umich.edu enum ArmShiftType shiftType; 1186254Sgblack@eecs.umich.edu shiftType = (enum ArmShiftType) type; 1196254Sgblack@eecs.umich.edu 1206254Sgblack@eecs.umich.edu switch (shiftType) 1216254Sgblack@eecs.umich.edu { 1226255Sgblack@eecs.umich.edu case LSL: 1236255Sgblack@eecs.umich.edu if (shamt == 0) 1246255Sgblack@eecs.umich.edu return cfval; 1256255Sgblack@eecs.umich.edu else 1266254Sgblack@eecs.umich.edu return (base >> (32 - shamt)) & 1; 1276255Sgblack@eecs.umich.edu case LSR: 1286255Sgblack@eecs.umich.edu if (shamt == 0) 1296255Sgblack@eecs.umich.edu return (base >> 31); 1306255Sgblack@eecs.umich.edu else 1316255Sgblack@eecs.umich.edu return (base >> (shamt - 1)) & 1; 1326255Sgblack@eecs.umich.edu case ASR: 1336255Sgblack@eecs.umich.edu if (shamt == 0) 1346255Sgblack@eecs.umich.edu return (base >> 31); 1356255Sgblack@eecs.umich.edu else 1366255Sgblack@eecs.umich.edu return (base >> (shamt - 1)) & 1; 1376255Sgblack@eecs.umich.edu case ROR: 1386255Sgblack@eecs.umich.edu shamt = shamt & 0x1f; 1396255Sgblack@eecs.umich.edu if (shamt == 0) 1406255Sgblack@eecs.umich.edu return (base & 1); // RRX 1416255Sgblack@eecs.umich.edu else 1426255Sgblack@eecs.umich.edu return (base >> (shamt - 1)) & 1; 1436255Sgblack@eecs.umich.edu default: 1446255Sgblack@eecs.umich.edu fprintf(stderr, "Unhandled shift type\n"); 1456255Sgblack@eecs.umich.edu exit(1); 1466255Sgblack@eecs.umich.edu break; 1476254Sgblack@eecs.umich.edu } 1486254Sgblack@eecs.umich.edu return 0; 1496254Sgblack@eecs.umich.edu} 1506254Sgblack@eecs.umich.edu 1516254Sgblack@eecs.umich.edu 1526254Sgblack@eecs.umich.edu// Generate C for a shift by Rs 1536255Sgblack@eecs.umich.edubool 1546254Sgblack@eecs.umich.eduArmStaticInst::shift_carry_rs(uint32_t base, uint32_t shamt, 1556254Sgblack@eecs.umich.edu uint32_t type, uint32_t cfval) const 1566254Sgblack@eecs.umich.edu{ 1576254Sgblack@eecs.umich.edu enum ArmShiftType shiftType; 1586254Sgblack@eecs.umich.edu shiftType = (enum ArmShiftType) type; 1596254Sgblack@eecs.umich.edu 1606255Sgblack@eecs.umich.edu if (shamt == 0) 1616255Sgblack@eecs.umich.edu return cfval; 1626255Sgblack@eecs.umich.edu 1636254Sgblack@eecs.umich.edu switch (shiftType) 1646254Sgblack@eecs.umich.edu { 1656255Sgblack@eecs.umich.edu case LSL: 1666255Sgblack@eecs.umich.edu if (shamt > 32) 1676255Sgblack@eecs.umich.edu return 0; 1686255Sgblack@eecs.umich.edu else 1696255Sgblack@eecs.umich.edu return (base >> (32 - shamt)) & 1; 1706255Sgblack@eecs.umich.edu case LSR: 1716255Sgblack@eecs.umich.edu if (shamt > 32) 1726255Sgblack@eecs.umich.edu return 0; 1736255Sgblack@eecs.umich.edu else 1746255Sgblack@eecs.umich.edu return (base >> (shamt - 1)) & 1; 1756255Sgblack@eecs.umich.edu case ASR: 1766255Sgblack@eecs.umich.edu if (shamt > 32) 1776255Sgblack@eecs.umich.edu shamt = 32; 1786255Sgblack@eecs.umich.edu return (base >> (shamt - 1)) & 1; 1796255Sgblack@eecs.umich.edu case ROR: 1806255Sgblack@eecs.umich.edu shamt = shamt & 0x1f; 1816255Sgblack@eecs.umich.edu if (shamt == 0) 1826255Sgblack@eecs.umich.edu shamt = 32; 1836255Sgblack@eecs.umich.edu return (base >> (shamt - 1)) & 1; 1846255Sgblack@eecs.umich.edu default: 1856255Sgblack@eecs.umich.edu fprintf(stderr, "Unhandled shift type\n"); 1866255Sgblack@eecs.umich.edu exit(1); 1876255Sgblack@eecs.umich.edu break; 1886254Sgblack@eecs.umich.edu } 1896254Sgblack@eecs.umich.edu return 0; 1906254Sgblack@eecs.umich.edu} 1916254Sgblack@eecs.umich.edu 1926254Sgblack@eecs.umich.edu 1936254Sgblack@eecs.umich.edu// Generate the appropriate carry bit for an addition operation 1946255Sgblack@eecs.umich.edubool 1956254Sgblack@eecs.umich.eduArmStaticInst::arm_add_carry(int32_t result, int32_t lhs, int32_t rhs) const 1966254Sgblack@eecs.umich.edu{ 1976255Sgblack@eecs.umich.edu return findCarry(32, result, lhs, rhs); 1986254Sgblack@eecs.umich.edu} 1996254Sgblack@eecs.umich.edu 2006254Sgblack@eecs.umich.edu// Generate the appropriate carry bit for a subtraction operation 2016255Sgblack@eecs.umich.edubool 2026254Sgblack@eecs.umich.eduArmStaticInst::arm_sub_carry(int32_t result, int32_t lhs, int32_t rhs) const 2036254Sgblack@eecs.umich.edu{ 2046255Sgblack@eecs.umich.edu return findCarry(32, result, lhs, ~rhs); 2056254Sgblack@eecs.umich.edu} 2066254Sgblack@eecs.umich.edu 2076255Sgblack@eecs.umich.edubool 2086254Sgblack@eecs.umich.eduArmStaticInst::arm_add_overflow(int32_t result, int32_t lhs, int32_t rhs) const 2096254Sgblack@eecs.umich.edu{ 2106255Sgblack@eecs.umich.edu return findOverflow(32, result, lhs, rhs); 2116254Sgblack@eecs.umich.edu} 2126254Sgblack@eecs.umich.edu 2136255Sgblack@eecs.umich.edubool 2146254Sgblack@eecs.umich.eduArmStaticInst::arm_sub_overflow(int32_t result, int32_t lhs, int32_t rhs) const 2156254Sgblack@eecs.umich.edu{ 2166255Sgblack@eecs.umich.edu return findOverflow(32, result, lhs, ~rhs); 2176254Sgblack@eecs.umich.edu} 2186254Sgblack@eecs.umich.edu 2196254Sgblack@eecs.umich.eduvoid 2206254Sgblack@eecs.umich.eduArmStaticInst::printReg(std::ostream &os, int reg) const 2216253Sgblack@eecs.umich.edu{ 2226253Sgblack@eecs.umich.edu if (reg < FP_Base_DepTag) { 2236261Sgblack@eecs.umich.edu switch (reg) { 2246261Sgblack@eecs.umich.edu case PCReg: 2256261Sgblack@eecs.umich.edu ccprintf(os, "pc"); 2266261Sgblack@eecs.umich.edu break; 2276261Sgblack@eecs.umich.edu case StackPointerReg: 2286261Sgblack@eecs.umich.edu ccprintf(os, "sp"); 2296261Sgblack@eecs.umich.edu break; 2306261Sgblack@eecs.umich.edu case FramePointerReg: 2316261Sgblack@eecs.umich.edu ccprintf(os, "fp"); 2326261Sgblack@eecs.umich.edu break; 2336261Sgblack@eecs.umich.edu case ReturnAddressReg: 2346261Sgblack@eecs.umich.edu ccprintf(os, "lr"); 2356261Sgblack@eecs.umich.edu break; 2366261Sgblack@eecs.umich.edu default: 2376261Sgblack@eecs.umich.edu ccprintf(os, "r%d", reg); 2386261Sgblack@eecs.umich.edu break; 2396261Sgblack@eecs.umich.edu } 2406261Sgblack@eecs.umich.edu } else if (reg < Ctrl_Base_DepTag) { 2416253Sgblack@eecs.umich.edu ccprintf(os, "f%d", reg - FP_Base_DepTag); 2426261Sgblack@eecs.umich.edu } else { 2436261Sgblack@eecs.umich.edu reg -= Ctrl_Base_DepTag; 2446261Sgblack@eecs.umich.edu assert(reg < NUM_MISCREGS); 2456261Sgblack@eecs.umich.edu ccprintf(os, "%s", ArmISA::miscRegName[reg]); 2466253Sgblack@eecs.umich.edu } 2476253Sgblack@eecs.umich.edu} 2486253Sgblack@eecs.umich.edu 2496262Sgblack@eecs.umich.eduvoid 2506262Sgblack@eecs.umich.eduArmStaticInst::printMnemonic(std::ostream &os, 2516262Sgblack@eecs.umich.edu const std::string &suffix, 2526262Sgblack@eecs.umich.edu bool withPred) const 2536262Sgblack@eecs.umich.edu{ 2546262Sgblack@eecs.umich.edu os << " " << mnemonic; 2556262Sgblack@eecs.umich.edu if (withPred) { 2566262Sgblack@eecs.umich.edu unsigned condCode = machInst.condCode; 2576262Sgblack@eecs.umich.edu switch (condCode) { 2586262Sgblack@eecs.umich.edu case COND_EQ: 2596262Sgblack@eecs.umich.edu os << "eq"; 2606262Sgblack@eecs.umich.edu break; 2616262Sgblack@eecs.umich.edu case COND_NE: 2626262Sgblack@eecs.umich.edu os << "ne"; 2636262Sgblack@eecs.umich.edu break; 2646262Sgblack@eecs.umich.edu case COND_CS: 2656262Sgblack@eecs.umich.edu os << "cs"; 2666262Sgblack@eecs.umich.edu break; 2676262Sgblack@eecs.umich.edu case COND_CC: 2686262Sgblack@eecs.umich.edu os << "cc"; 2696262Sgblack@eecs.umich.edu break; 2706262Sgblack@eecs.umich.edu case COND_MI: 2716262Sgblack@eecs.umich.edu os << "mi"; 2726262Sgblack@eecs.umich.edu break; 2736262Sgblack@eecs.umich.edu case COND_PL: 2746262Sgblack@eecs.umich.edu os << "pl"; 2756262Sgblack@eecs.umich.edu break; 2766262Sgblack@eecs.umich.edu case COND_VS: 2776262Sgblack@eecs.umich.edu os << "vs"; 2786262Sgblack@eecs.umich.edu break; 2796262Sgblack@eecs.umich.edu case COND_VC: 2806262Sgblack@eecs.umich.edu os << "vc"; 2816262Sgblack@eecs.umich.edu break; 2826262Sgblack@eecs.umich.edu case COND_HI: 2836262Sgblack@eecs.umich.edu os << "hi"; 2846262Sgblack@eecs.umich.edu break; 2856262Sgblack@eecs.umich.edu case COND_LS: 2866262Sgblack@eecs.umich.edu os << "ls"; 2876262Sgblack@eecs.umich.edu break; 2886262Sgblack@eecs.umich.edu case COND_GE: 2896262Sgblack@eecs.umich.edu os << "ge"; 2906262Sgblack@eecs.umich.edu break; 2916262Sgblack@eecs.umich.edu case COND_LT: 2926262Sgblack@eecs.umich.edu os << "lt"; 2936262Sgblack@eecs.umich.edu break; 2946262Sgblack@eecs.umich.edu case COND_GT: 2956262Sgblack@eecs.umich.edu os << "gt"; 2966262Sgblack@eecs.umich.edu break; 2976262Sgblack@eecs.umich.edu case COND_LE: 2986262Sgblack@eecs.umich.edu os << "le"; 2996262Sgblack@eecs.umich.edu break; 3006262Sgblack@eecs.umich.edu case COND_AL: 3016262Sgblack@eecs.umich.edu // This one is implicit. 3026262Sgblack@eecs.umich.edu break; 3036262Sgblack@eecs.umich.edu case COND_NV: 3046262Sgblack@eecs.umich.edu os << "nv"; 3056262Sgblack@eecs.umich.edu break; 3066262Sgblack@eecs.umich.edu default: 3076262Sgblack@eecs.umich.edu panic("Unrecognized condition code %d.\n", condCode); 3086262Sgblack@eecs.umich.edu } 3096262Sgblack@eecs.umich.edu os << suffix << " "; 3106262Sgblack@eecs.umich.edu } 3116262Sgblack@eecs.umich.edu} 3126262Sgblack@eecs.umich.edu 3136263Sgblack@eecs.umich.eduvoid 3146263Sgblack@eecs.umich.eduArmStaticInst::printMemSymbol(std::ostream &os, 3156263Sgblack@eecs.umich.edu const SymbolTable *symtab, 3166263Sgblack@eecs.umich.edu const std::string &prefix, 3176263Sgblack@eecs.umich.edu const Addr addr, 3186263Sgblack@eecs.umich.edu const std::string &suffix) const 3196263Sgblack@eecs.umich.edu{ 3206263Sgblack@eecs.umich.edu Addr symbolAddr; 3216263Sgblack@eecs.umich.edu std::string symbol; 3226263Sgblack@eecs.umich.edu if (symtab && symtab->findNearestSymbol(addr, symbol, symbolAddr)) { 3236263Sgblack@eecs.umich.edu ccprintf(os, "%s%s", prefix, symbol); 3246263Sgblack@eecs.umich.edu if (symbolAddr != addr) 3256263Sgblack@eecs.umich.edu ccprintf(os, "+%d", addr - symbolAddr); 3266263Sgblack@eecs.umich.edu ccprintf(os, suffix); 3276263Sgblack@eecs.umich.edu } 3286263Sgblack@eecs.umich.edu} 3296263Sgblack@eecs.umich.edu 3306264Sgblack@eecs.umich.eduvoid 3316264Sgblack@eecs.umich.eduArmStaticInst::printShiftOperand(std::ostream &os) const 3326264Sgblack@eecs.umich.edu{ 3336264Sgblack@eecs.umich.edu // Shifter operand 3346264Sgblack@eecs.umich.edu if (bits((uint32_t)machInst, 25)) { 3356264Sgblack@eecs.umich.edu // Immediate form 3366264Sgblack@eecs.umich.edu unsigned rotate = machInst.rotate * 2; 3376264Sgblack@eecs.umich.edu uint32_t imm = machInst.imm; 3386264Sgblack@eecs.umich.edu ccprintf(os, "#%#x", (imm << (32 - rotate)) | (imm >> rotate)); 3396264Sgblack@eecs.umich.edu } else { 3406264Sgblack@eecs.umich.edu // Register form 3416264Sgblack@eecs.umich.edu printReg(os, machInst.rm); 3426264Sgblack@eecs.umich.edu 3436264Sgblack@eecs.umich.edu bool immShift = (machInst.opcode4 == 0); 3446264Sgblack@eecs.umich.edu bool done = false; 3456264Sgblack@eecs.umich.edu unsigned shiftAmt = (machInst.shiftSize); 3466264Sgblack@eecs.umich.edu ArmShiftType type = (ArmShiftType)(uint32_t)machInst.shift; 3476264Sgblack@eecs.umich.edu 3486264Sgblack@eecs.umich.edu if ((type == LSR || type == ASR) && immShift && shiftAmt == 0) 3496264Sgblack@eecs.umich.edu shiftAmt = 32; 3506264Sgblack@eecs.umich.edu 3516264Sgblack@eecs.umich.edu switch (type) { 3526264Sgblack@eecs.umich.edu case LSL: 3536264Sgblack@eecs.umich.edu if (immShift && shiftAmt == 0) { 3546264Sgblack@eecs.umich.edu done = true; 3556264Sgblack@eecs.umich.edu break; 3566264Sgblack@eecs.umich.edu } 3576264Sgblack@eecs.umich.edu os << ", LSL"; 3586264Sgblack@eecs.umich.edu break; 3596264Sgblack@eecs.umich.edu case LSR: 3606264Sgblack@eecs.umich.edu os << ", LSR"; 3616264Sgblack@eecs.umich.edu break; 3626264Sgblack@eecs.umich.edu case ASR: 3636264Sgblack@eecs.umich.edu os << ", ASR"; 3646264Sgblack@eecs.umich.edu break; 3656264Sgblack@eecs.umich.edu case ROR: 3666264Sgblack@eecs.umich.edu if (immShift && shiftAmt == 0) { 3676264Sgblack@eecs.umich.edu os << ", RRX"; 3686264Sgblack@eecs.umich.edu done = true; 3696264Sgblack@eecs.umich.edu break; 3706264Sgblack@eecs.umich.edu } 3716264Sgblack@eecs.umich.edu os << ", ROR"; 3726264Sgblack@eecs.umich.edu break; 3736264Sgblack@eecs.umich.edu default: 3746264Sgblack@eecs.umich.edu panic("Tried to disassemble unrecognized shift type.\n"); 3756264Sgblack@eecs.umich.edu } 3766264Sgblack@eecs.umich.edu if (!done) { 3776264Sgblack@eecs.umich.edu os << " "; 3786264Sgblack@eecs.umich.edu if (immShift) 3796264Sgblack@eecs.umich.edu os << "#" << shiftAmt; 3806264Sgblack@eecs.umich.edu else 3816264Sgblack@eecs.umich.edu printReg(os, machInst.rs); 3826264Sgblack@eecs.umich.edu } 3836264Sgblack@eecs.umich.edu } 3846264Sgblack@eecs.umich.edu} 3856264Sgblack@eecs.umich.edu 3866264Sgblack@eecs.umich.eduvoid 3876264Sgblack@eecs.umich.eduArmStaticInst::printDataInst(std::ostream &os) const 3886264Sgblack@eecs.umich.edu{ 3896264Sgblack@eecs.umich.edu printMnemonic(os, machInst.sField ? "s" : ""); 3906264Sgblack@eecs.umich.edu //XXX It would be nice if the decoder figured this all out for us. 3916268Sgblack@eecs.umich.edu unsigned opcode = machInst.opcode; 3926264Sgblack@eecs.umich.edu bool firstOp = true; 3936264Sgblack@eecs.umich.edu 3946264Sgblack@eecs.umich.edu // Destination 3956264Sgblack@eecs.umich.edu // Cmp, cmn, teq, and tst don't have one. 3966264Sgblack@eecs.umich.edu if (opcode < 8 || opcode > 0xb) { 3976264Sgblack@eecs.umich.edu firstOp = false; 3986264Sgblack@eecs.umich.edu printReg(os, machInst.rd); 3996264Sgblack@eecs.umich.edu } 4006264Sgblack@eecs.umich.edu 4016264Sgblack@eecs.umich.edu // Source 1. 4026264Sgblack@eecs.umich.edu // Mov and Movn don't have one of these. 4036264Sgblack@eecs.umich.edu if (opcode != 0xd && opcode != 0xf) { 4046264Sgblack@eecs.umich.edu if (!firstOp) 4056264Sgblack@eecs.umich.edu os << ", "; 4066264Sgblack@eecs.umich.edu firstOp = false; 4076264Sgblack@eecs.umich.edu printReg(os, machInst.rn); 4086264Sgblack@eecs.umich.edu } 4096264Sgblack@eecs.umich.edu 4106264Sgblack@eecs.umich.edu if (!firstOp) 4116264Sgblack@eecs.umich.edu os << ", "; 4126264Sgblack@eecs.umich.edu printShiftOperand(os); 4136264Sgblack@eecs.umich.edu} 4146264Sgblack@eecs.umich.edu 4156254Sgblack@eecs.umich.edustd::string 4166254Sgblack@eecs.umich.eduArmStaticInst::generateDisassembly(Addr pc, 4176254Sgblack@eecs.umich.edu const SymbolTable *symtab) const 4186253Sgblack@eecs.umich.edu{ 4196253Sgblack@eecs.umich.edu std::stringstream ss; 4206262Sgblack@eecs.umich.edu printMnemonic(ss); 4216253Sgblack@eecs.umich.edu return ss.str(); 4226253Sgblack@eecs.umich.edu} 4236253Sgblack@eecs.umich.edu} 424