static_inst.cc revision 9920:028e4da64b42
16691Stjones1@inf.ed.ac.uk/* 26691Stjones1@inf.ed.ac.uk * Copyright (c) 2010 ARM Limited 36691Stjones1@inf.ed.ac.uk * Copyright (c) 2013 Advanced Micro Devices, Inc. 46691Stjones1@inf.ed.ac.uk * All rights reserved 56691Stjones1@inf.ed.ac.uk * 66691Stjones1@inf.ed.ac.uk * The license below extends only to copyright in the software and shall 76691Stjones1@inf.ed.ac.uk * not be construed as granting a license to any other intellectual 86691Stjones1@inf.ed.ac.uk * property including but not limited to intellectual property relating 96691Stjones1@inf.ed.ac.uk * to a hardware implementation of the functionality of the software 106691Stjones1@inf.ed.ac.uk * licensed hereunder. You may use the software subject to the license 116691Stjones1@inf.ed.ac.uk * terms below provided that you ensure that this notice is replicated 126691Stjones1@inf.ed.ac.uk * unmodified and in its entirety in all distributions of the software, 136691Stjones1@inf.ed.ac.uk * modified or unmodified, in source code or in binary form. 146691Stjones1@inf.ed.ac.uk * 156691Stjones1@inf.ed.ac.uk * Copyright (c) 2007-2008 The Florida State University 166691Stjones1@inf.ed.ac.uk * All rights reserved. 176691Stjones1@inf.ed.ac.uk * 186691Stjones1@inf.ed.ac.uk * Redistribution and use in source and binary forms, with or without 196691Stjones1@inf.ed.ac.uk * modification, are permitted provided that the following conditions are 206691Stjones1@inf.ed.ac.uk * met: redistributions of source code must retain the above copyright 216691Stjones1@inf.ed.ac.uk * notice, this list of conditions and the following disclaimer; 226691Stjones1@inf.ed.ac.uk * redistributions in binary form must reproduce the above copyright 236691Stjones1@inf.ed.ac.uk * notice, this list of conditions and the following disclaimer in the 246691Stjones1@inf.ed.ac.uk * documentation and/or other materials provided with the distribution; 256691Stjones1@inf.ed.ac.uk * neither the name of the copyright holders nor the names of its 266691Stjones1@inf.ed.ac.uk * contributors may be used to endorse or promote products derived from 276691Stjones1@inf.ed.ac.uk * this software without specific prior written permission. 286691Stjones1@inf.ed.ac.uk * 296691Stjones1@inf.ed.ac.uk * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 306691Stjones1@inf.ed.ac.uk * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 316691Stjones1@inf.ed.ac.uk * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 326691Stjones1@inf.ed.ac.uk * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 336691Stjones1@inf.ed.ac.uk * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 346691Stjones1@inf.ed.ac.uk * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 356691Stjones1@inf.ed.ac.uk * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 366691Stjones1@inf.ed.ac.uk * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 376691Stjones1@inf.ed.ac.uk * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 386691Stjones1@inf.ed.ac.uk * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 396691Stjones1@inf.ed.ac.uk * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 406691Stjones1@inf.ed.ac.uk * 416691Stjones1@inf.ed.ac.uk * Authors: Stephen Hines 426691Stjones1@inf.ed.ac.uk */ 436691Stjones1@inf.ed.ac.uk 446691Stjones1@inf.ed.ac.uk#include "arch/arm/insts/static_inst.hh" 456691Stjones1@inf.ed.ac.uk#include "arch/arm/faults.hh" 466691Stjones1@inf.ed.ac.uk#include "base/loader/symtab.hh" 476691Stjones1@inf.ed.ac.uk#include "base/condcodes.hh" 486691Stjones1@inf.ed.ac.uk#include "base/cprintf.hh" 496691Stjones1@inf.ed.ac.uk#include "cpu/reg_class.hh" 506691Stjones1@inf.ed.ac.uk 516691Stjones1@inf.ed.ac.uknamespace ArmISA 526691Stjones1@inf.ed.ac.uk{ 536691Stjones1@inf.ed.ac.uk// Shift Rm by an immediate value 546691Stjones1@inf.ed.ac.ukint32_t 556691Stjones1@inf.ed.ac.ukArmStaticInst::shift_rm_imm(uint32_t base, uint32_t shamt, 566691Stjones1@inf.ed.ac.uk uint32_t type, uint32_t cfval) const 576691Stjones1@inf.ed.ac.uk{ 586691Stjones1@inf.ed.ac.uk assert(shamt < 32); 596691Stjones1@inf.ed.ac.uk ArmShiftType shiftType; 606691Stjones1@inf.ed.ac.uk shiftType = (ArmShiftType)type; 616691Stjones1@inf.ed.ac.uk 626691Stjones1@inf.ed.ac.uk switch (shiftType) 636691Stjones1@inf.ed.ac.uk { 646691Stjones1@inf.ed.ac.uk case LSL: 656691Stjones1@inf.ed.ac.uk return base << shamt; 666691Stjones1@inf.ed.ac.uk case LSR: 676691Stjones1@inf.ed.ac.uk if (shamt == 0) 686691Stjones1@inf.ed.ac.uk return 0; 696691Stjones1@inf.ed.ac.uk else 706691Stjones1@inf.ed.ac.uk return base >> shamt; 716691Stjones1@inf.ed.ac.uk case ASR: 726691Stjones1@inf.ed.ac.uk if (shamt == 0) 736691Stjones1@inf.ed.ac.uk return (base >> 31) | -((base & (1 << 31)) >> 31); 746691Stjones1@inf.ed.ac.uk else 756691Stjones1@inf.ed.ac.uk return (base >> shamt) | -((base & (1 << 31)) >> shamt); 766691Stjones1@inf.ed.ac.uk case ROR: 776691Stjones1@inf.ed.ac.uk if (shamt == 0) 786691Stjones1@inf.ed.ac.uk return (cfval << 31) | (base >> 1); // RRX 796691Stjones1@inf.ed.ac.uk else 806691Stjones1@inf.ed.ac.uk return (base << (32 - shamt)) | (base >> shamt); 816691Stjones1@inf.ed.ac.uk default: 826691Stjones1@inf.ed.ac.uk ccprintf(std::cerr, "Unhandled shift type\n"); 836691Stjones1@inf.ed.ac.uk exit(1); 846691Stjones1@inf.ed.ac.uk break; 856691Stjones1@inf.ed.ac.uk } 866691Stjones1@inf.ed.ac.uk return 0; 876691Stjones1@inf.ed.ac.uk} 886691Stjones1@inf.ed.ac.uk 896691Stjones1@inf.ed.ac.uk// Shift Rm by Rs 906691Stjones1@inf.ed.ac.ukint32_t 916691Stjones1@inf.ed.ac.ukArmStaticInst::shift_rm_rs(uint32_t base, uint32_t shamt, 926691Stjones1@inf.ed.ac.uk uint32_t type, uint32_t cfval) const 936691Stjones1@inf.ed.ac.uk{ 946691Stjones1@inf.ed.ac.uk enum ArmShiftType shiftType; 956691Stjones1@inf.ed.ac.uk shiftType = (enum ArmShiftType) type; 966691Stjones1@inf.ed.ac.uk 976691Stjones1@inf.ed.ac.uk switch (shiftType) 986691Stjones1@inf.ed.ac.uk { 996691Stjones1@inf.ed.ac.uk case LSL: 1006691Stjones1@inf.ed.ac.uk if (shamt >= 32) 1016691Stjones1@inf.ed.ac.uk return 0; 1026691Stjones1@inf.ed.ac.uk else 1036691Stjones1@inf.ed.ac.uk return base << shamt; 1046691Stjones1@inf.ed.ac.uk case LSR: 1056691Stjones1@inf.ed.ac.uk if (shamt >= 32) 1066691Stjones1@inf.ed.ac.uk return 0; 1076691Stjones1@inf.ed.ac.uk else 1086691Stjones1@inf.ed.ac.uk return base >> shamt; 1096691Stjones1@inf.ed.ac.uk case ASR: 1106691Stjones1@inf.ed.ac.uk if (shamt >= 32) 1116691Stjones1@inf.ed.ac.uk return (base >> 31) | -((base & (1 << 31)) >> 31); 1126691Stjones1@inf.ed.ac.uk else 1136691Stjones1@inf.ed.ac.uk return (base >> shamt) | -((base & (1 << 31)) >> shamt); 1146691Stjones1@inf.ed.ac.uk case ROR: 1156691Stjones1@inf.ed.ac.uk shamt = shamt & 0x1f; 1166691Stjones1@inf.ed.ac.uk if (shamt == 0) 1176691Stjones1@inf.ed.ac.uk return base; 1186691Stjones1@inf.ed.ac.uk else 1196691Stjones1@inf.ed.ac.uk return (base << (32 - shamt)) | (base >> shamt); 1206691Stjones1@inf.ed.ac.uk default: 1216691Stjones1@inf.ed.ac.uk ccprintf(std::cerr, "Unhandled shift type\n"); 1226691Stjones1@inf.ed.ac.uk exit(1); 1236691Stjones1@inf.ed.ac.uk break; 1246691Stjones1@inf.ed.ac.uk } 1256691Stjones1@inf.ed.ac.uk return 0; 1266691Stjones1@inf.ed.ac.uk} 1276691Stjones1@inf.ed.ac.uk 1286691Stjones1@inf.ed.ac.uk 1296691Stjones1@inf.ed.ac.uk// Generate C for a shift by immediate 1306691Stjones1@inf.ed.ac.ukbool 1316691Stjones1@inf.ed.ac.ukArmStaticInst::shift_carry_imm(uint32_t base, uint32_t shamt, 1326691Stjones1@inf.ed.ac.uk uint32_t type, uint32_t cfval) const 1336691Stjones1@inf.ed.ac.uk{ 1346691Stjones1@inf.ed.ac.uk enum ArmShiftType shiftType; 1356691Stjones1@inf.ed.ac.uk shiftType = (enum ArmShiftType) type; 1366691Stjones1@inf.ed.ac.uk 1376691Stjones1@inf.ed.ac.uk switch (shiftType) 1386691Stjones1@inf.ed.ac.uk { 1396691Stjones1@inf.ed.ac.uk case LSL: 1406691Stjones1@inf.ed.ac.uk if (shamt == 0) 1416691Stjones1@inf.ed.ac.uk return cfval; 1426691Stjones1@inf.ed.ac.uk else 1436691Stjones1@inf.ed.ac.uk return (base >> (32 - shamt)) & 1; 1446691Stjones1@inf.ed.ac.uk case LSR: 1456691Stjones1@inf.ed.ac.uk if (shamt == 0) 1466691Stjones1@inf.ed.ac.uk return (base >> 31); 1476691Stjones1@inf.ed.ac.uk else 1486691Stjones1@inf.ed.ac.uk return (base >> (shamt - 1)) & 1; 1496691Stjones1@inf.ed.ac.uk case ASR: 1506691Stjones1@inf.ed.ac.uk if (shamt == 0) 1516691Stjones1@inf.ed.ac.uk return (base >> 31); 1526691Stjones1@inf.ed.ac.uk else 1536691Stjones1@inf.ed.ac.uk return (base >> (shamt - 1)) & 1; 1546691Stjones1@inf.ed.ac.uk case ROR: 1556691Stjones1@inf.ed.ac.uk shamt = shamt & 0x1f; 1566691Stjones1@inf.ed.ac.uk if (shamt == 0) 1576691Stjones1@inf.ed.ac.uk return (base & 1); // RRX 1586691Stjones1@inf.ed.ac.uk else 1596691Stjones1@inf.ed.ac.uk return (base >> (shamt - 1)) & 1; 1606691Stjones1@inf.ed.ac.uk default: 1616691Stjones1@inf.ed.ac.uk ccprintf(std::cerr, "Unhandled shift type\n"); 1626691Stjones1@inf.ed.ac.uk exit(1); 1636691Stjones1@inf.ed.ac.uk break; 1646691Stjones1@inf.ed.ac.uk } 1656691Stjones1@inf.ed.ac.uk return 0; 1666691Stjones1@inf.ed.ac.uk} 1676691Stjones1@inf.ed.ac.uk 1686691Stjones1@inf.ed.ac.uk 1696691Stjones1@inf.ed.ac.uk// Generate C for a shift by Rs 1706691Stjones1@inf.ed.ac.ukbool 1716691Stjones1@inf.ed.ac.ukArmStaticInst::shift_carry_rs(uint32_t base, uint32_t shamt, 1726691Stjones1@inf.ed.ac.uk uint32_t type, uint32_t cfval) const 1736691Stjones1@inf.ed.ac.uk{ 1746691Stjones1@inf.ed.ac.uk enum ArmShiftType shiftType; 1756691Stjones1@inf.ed.ac.uk shiftType = (enum ArmShiftType) type; 1766691Stjones1@inf.ed.ac.uk 1776691Stjones1@inf.ed.ac.uk if (shamt == 0) 1786691Stjones1@inf.ed.ac.uk return cfval; 1796691Stjones1@inf.ed.ac.uk 1806691Stjones1@inf.ed.ac.uk switch (shiftType) 1816691Stjones1@inf.ed.ac.uk { 1826691Stjones1@inf.ed.ac.uk case LSL: 1836691Stjones1@inf.ed.ac.uk if (shamt > 32) 1846691Stjones1@inf.ed.ac.uk return 0; 1856691Stjones1@inf.ed.ac.uk else 1866691Stjones1@inf.ed.ac.uk return (base >> (32 - shamt)) & 1; 1876691Stjones1@inf.ed.ac.uk case LSR: 1886691Stjones1@inf.ed.ac.uk if (shamt > 32) 1896691Stjones1@inf.ed.ac.uk return 0; 1906691Stjones1@inf.ed.ac.uk else 1916691Stjones1@inf.ed.ac.uk return (base >> (shamt - 1)) & 1; 1926691Stjones1@inf.ed.ac.uk case ASR: 1936691Stjones1@inf.ed.ac.uk if (shamt > 32) 1946691Stjones1@inf.ed.ac.uk shamt = 32; 1956691Stjones1@inf.ed.ac.uk return (base >> (shamt - 1)) & 1; 1966691Stjones1@inf.ed.ac.uk case ROR: 1976691Stjones1@inf.ed.ac.uk shamt = shamt & 0x1f; 1986691Stjones1@inf.ed.ac.uk if (shamt == 0) 1996691Stjones1@inf.ed.ac.uk shamt = 32; 2006691Stjones1@inf.ed.ac.uk return (base >> (shamt - 1)) & 1; 2016691Stjones1@inf.ed.ac.uk default: 2026691Stjones1@inf.ed.ac.uk ccprintf(std::cerr, "Unhandled shift type\n"); 2036691Stjones1@inf.ed.ac.uk exit(1); 2046691Stjones1@inf.ed.ac.uk break; 2056691Stjones1@inf.ed.ac.uk } 2066691Stjones1@inf.ed.ac.uk return 0; 2076691Stjones1@inf.ed.ac.uk} 2086691Stjones1@inf.ed.ac.uk 2096691Stjones1@inf.ed.ac.uk 2106691Stjones1@inf.ed.ac.ukvoid 2116691Stjones1@inf.ed.ac.ukArmStaticInst::printReg(std::ostream &os, int reg) const 2126691Stjones1@inf.ed.ac.uk{ 2136691Stjones1@inf.ed.ac.uk RegIndex rel_reg; 2146691Stjones1@inf.ed.ac.uk 2156691Stjones1@inf.ed.ac.uk switch (regIdxToClass(reg, &rel_reg)) { 2166691Stjones1@inf.ed.ac.uk case IntRegClass: 2176691Stjones1@inf.ed.ac.uk switch (rel_reg) { 2186691Stjones1@inf.ed.ac.uk case PCReg: 2196691Stjones1@inf.ed.ac.uk ccprintf(os, "pc"); 2206691Stjones1@inf.ed.ac.uk break; 2216691Stjones1@inf.ed.ac.uk case StackPointerReg: 2226691Stjones1@inf.ed.ac.uk ccprintf(os, "sp"); 2236691Stjones1@inf.ed.ac.uk break; 2246691Stjones1@inf.ed.ac.uk case FramePointerReg: 2256691Stjones1@inf.ed.ac.uk ccprintf(os, "fp"); 2266691Stjones1@inf.ed.ac.uk break; 2276691Stjones1@inf.ed.ac.uk case ReturnAddressReg: 2286691Stjones1@inf.ed.ac.uk ccprintf(os, "lr"); 2296691Stjones1@inf.ed.ac.uk break; 2306691Stjones1@inf.ed.ac.uk default: 2316691Stjones1@inf.ed.ac.uk ccprintf(os, "r%d", reg); 2326691Stjones1@inf.ed.ac.uk break; 2336691Stjones1@inf.ed.ac.uk } 2346691Stjones1@inf.ed.ac.uk break; 2356691Stjones1@inf.ed.ac.uk case FloatRegClass: 2366691Stjones1@inf.ed.ac.uk ccprintf(os, "f%d", rel_reg); 2376691Stjones1@inf.ed.ac.uk break; 2386691Stjones1@inf.ed.ac.uk case MiscRegClass: 2396691Stjones1@inf.ed.ac.uk assert(rel_reg < NUM_MISCREGS); 2406691Stjones1@inf.ed.ac.uk ccprintf(os, "%s", ArmISA::miscRegName[rel_reg]); 2416691Stjones1@inf.ed.ac.uk break; 2426691Stjones1@inf.ed.ac.uk case CCRegClass: 2436691Stjones1@inf.ed.ac.uk panic("printReg: CCRegClass but ARM has no CC regs\n"); 2446691Stjones1@inf.ed.ac.uk } 2456691Stjones1@inf.ed.ac.uk} 2466691Stjones1@inf.ed.ac.uk 2476691Stjones1@inf.ed.ac.ukvoid 2486691Stjones1@inf.ed.ac.ukArmStaticInst::printMnemonic(std::ostream &os, 2496691Stjones1@inf.ed.ac.uk const std::string &suffix, 2506691Stjones1@inf.ed.ac.uk bool withPred) const 2516691Stjones1@inf.ed.ac.uk{ 2526691Stjones1@inf.ed.ac.uk os << " " << mnemonic; 2536691Stjones1@inf.ed.ac.uk if (withPred) { 2546691Stjones1@inf.ed.ac.uk unsigned condCode = machInst.condCode; 2556691Stjones1@inf.ed.ac.uk switch (condCode) { 2566691Stjones1@inf.ed.ac.uk case COND_EQ: 2576691Stjones1@inf.ed.ac.uk os << "eq"; 2586691Stjones1@inf.ed.ac.uk break; 2596691Stjones1@inf.ed.ac.uk case COND_NE: 2606691Stjones1@inf.ed.ac.uk os << "ne"; 2616691Stjones1@inf.ed.ac.uk break; 2626691Stjones1@inf.ed.ac.uk case COND_CS: 2636691Stjones1@inf.ed.ac.uk os << "cs"; 2646691Stjones1@inf.ed.ac.uk break; 2656691Stjones1@inf.ed.ac.uk case COND_CC: 2666691Stjones1@inf.ed.ac.uk os << "cc"; 2676691Stjones1@inf.ed.ac.uk break; 2686691Stjones1@inf.ed.ac.uk case COND_MI: 2696701Sgblack@eecs.umich.edu os << "mi"; 2706691Stjones1@inf.ed.ac.uk break; 2716691Stjones1@inf.ed.ac.uk case COND_PL: 2726701Sgblack@eecs.umich.edu os << "pl"; 2736691Stjones1@inf.ed.ac.uk break; 2746691Stjones1@inf.ed.ac.uk case COND_VS: 2756691Stjones1@inf.ed.ac.uk os << "vs"; 2766691Stjones1@inf.ed.ac.uk break; 2776691Stjones1@inf.ed.ac.uk case COND_VC: 2786691Stjones1@inf.ed.ac.uk os << "vc"; 2796691Stjones1@inf.ed.ac.uk break; 2806691Stjones1@inf.ed.ac.uk case COND_HI: 2816691Stjones1@inf.ed.ac.uk os << "hi"; 2826691Stjones1@inf.ed.ac.uk break; 2836691Stjones1@inf.ed.ac.uk case COND_LS: 2846691Stjones1@inf.ed.ac.uk os << "ls"; 2856691Stjones1@inf.ed.ac.uk break; 2866691Stjones1@inf.ed.ac.uk case COND_GE: 2877512Stjones1@inf.ed.ac.uk os << "ge"; 2887512Stjones1@inf.ed.ac.uk break; 2897512Stjones1@inf.ed.ac.uk case COND_LT: 2907512Stjones1@inf.ed.ac.uk os << "lt"; 2917512Stjones1@inf.ed.ac.uk break; 2927512Stjones1@inf.ed.ac.uk case COND_GT: 2937512Stjones1@inf.ed.ac.uk os << "gt"; 2946691Stjones1@inf.ed.ac.uk break; 2956691Stjones1@inf.ed.ac.uk case COND_LE: 296 os << "le"; 297 break; 298 case COND_AL: 299 // This one is implicit. 300 break; 301 case COND_UC: 302 // Unconditional. 303 break; 304 default: 305 panic("Unrecognized condition code %d.\n", condCode); 306 } 307 os << suffix; 308 if (machInst.bigThumb) 309 os << ".w"; 310 os << " "; 311 } 312} 313 314void 315ArmStaticInst::printMemSymbol(std::ostream &os, 316 const SymbolTable *symtab, 317 const std::string &prefix, 318 const Addr addr, 319 const std::string &suffix) const 320{ 321 Addr symbolAddr; 322 std::string symbol; 323 if (symtab && symtab->findNearestSymbol(addr, symbol, symbolAddr)) { 324 ccprintf(os, "%s%s", prefix, symbol); 325 if (symbolAddr != addr) 326 ccprintf(os, "+%d", addr - symbolAddr); 327 ccprintf(os, suffix); 328 } 329} 330 331void 332ArmStaticInst::printShiftOperand(std::ostream &os, 333 IntRegIndex rm, 334 bool immShift, 335 uint32_t shiftAmt, 336 IntRegIndex rs, 337 ArmShiftType type) const 338{ 339 bool firstOp = false; 340 341 if (rm != INTREG_ZERO) { 342 printReg(os, rm); 343 } 344 345 bool done = false; 346 347 if ((type == LSR || type == ASR) && immShift && shiftAmt == 0) 348 shiftAmt = 32; 349 350 switch (type) { 351 case LSL: 352 if (immShift && shiftAmt == 0) { 353 done = true; 354 break; 355 } 356 if (!firstOp) 357 os << ", "; 358 os << "LSL"; 359 break; 360 case LSR: 361 if (!firstOp) 362 os << ", "; 363 os << "LSR"; 364 break; 365 case ASR: 366 if (!firstOp) 367 os << ", "; 368 os << "ASR"; 369 break; 370 case ROR: 371 if (immShift && shiftAmt == 0) { 372 if (!firstOp) 373 os << ", "; 374 os << "RRX"; 375 done = true; 376 break; 377 } 378 if (!firstOp) 379 os << ", "; 380 os << "ROR"; 381 break; 382 default: 383 panic("Tried to disassemble unrecognized shift type.\n"); 384 } 385 if (!done) { 386 if (!firstOp) 387 os << " "; 388 if (immShift) 389 os << "#" << shiftAmt; 390 else 391 printReg(os, rs); 392 } 393} 394 395void 396ArmStaticInst::printDataInst(std::ostream &os, bool withImm, 397 bool immShift, bool s, IntRegIndex rd, IntRegIndex rn, 398 IntRegIndex rm, IntRegIndex rs, uint32_t shiftAmt, 399 ArmShiftType type, uint32_t imm) const 400{ 401 printMnemonic(os, s ? "s" : ""); 402 bool firstOp = true; 403 404 // Destination 405 if (rd != INTREG_ZERO) { 406 firstOp = false; 407 printReg(os, rd); 408 } 409 410 // Source 1. 411 if (rn != INTREG_ZERO) { 412 if (!firstOp) 413 os << ", "; 414 firstOp = false; 415 printReg(os, rn); 416 } 417 418 if (!firstOp) 419 os << ", "; 420 if (withImm) { 421 ccprintf(os, "#%d", imm); 422 } else { 423 printShiftOperand(os, rm, immShift, shiftAmt, rs, type); 424 } 425} 426 427std::string 428ArmStaticInst::generateDisassembly(Addr pc, 429 const SymbolTable *symtab) const 430{ 431 std::stringstream ss; 432 printMnemonic(ss); 433 return ss.str(); 434} 435} 436