static_inst.cc revision 11793
14679Sgblack@eecs.umich.edu/* 24679Sgblack@eecs.umich.edu * Copyright (c) 2007 The Hewlett-Packard Development Company 39913Ssteve.reinhardt@amd.com * Copyright (c) 2013 Advanced Micro Devices, Inc. 44679Sgblack@eecs.umich.edu * All rights reserved. 54679Sgblack@eecs.umich.edu * 67087Snate@binkert.org * The license below extends only to copyright in the software and shall 77087Snate@binkert.org * not be construed as granting a license to any other intellectual 87087Snate@binkert.org * property including but not limited to intellectual property relating 97087Snate@binkert.org * to a hardware implementation of the functionality of the software 107087Snate@binkert.org * licensed hereunder. You may use the software subject to the license 117087Snate@binkert.org * terms below provided that you ensure that this notice is replicated 127087Snate@binkert.org * unmodified and in its entirety in all distributions of the software, 137087Snate@binkert.org * modified or unmodified, in source code or in binary form. 144679Sgblack@eecs.umich.edu * 157087Snate@binkert.org * Redistribution and use in source and binary forms, with or without 167087Snate@binkert.org * modification, are permitted provided that the following conditions are 177087Snate@binkert.org * met: redistributions of source code must retain the above copyright 187087Snate@binkert.org * notice, this list of conditions and the following disclaimer; 197087Snate@binkert.org * redistributions in binary form must reproduce the above copyright 207087Snate@binkert.org * notice, this list of conditions and the following disclaimer in the 217087Snate@binkert.org * documentation and/or other materials provided with the distribution; 227087Snate@binkert.org * neither the name of the copyright holders nor the names of its 234679Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 247087Snate@binkert.org * this software without specific prior written permission. 254679Sgblack@eecs.umich.edu * 264679Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 274679Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 284679Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 294679Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 304679Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 314679Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 324679Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 334679Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 344679Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 354679Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 364679Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 374679Sgblack@eecs.umich.edu * 384679Sgblack@eecs.umich.edu * Authors: Gabe Black 394679Sgblack@eecs.umich.edu */ 404679Sgblack@eecs.umich.edu 414679Sgblack@eecs.umich.edu#include "arch/x86/insts/static_inst.hh" 4211793Sbrandon.potter@amd.com 437629Sgblack@eecs.umich.edu#include "arch/x86/regs/segment.hh" 449913Ssteve.reinhardt@amd.com#include "cpu/reg_class.hh" 454679Sgblack@eecs.umich.edu 464679Sgblack@eecs.umich.edunamespace X86ISA 474679Sgblack@eecs.umich.edu{ 484679Sgblack@eecs.umich.edu void X86StaticInst::printMnemonic(std::ostream &os, 494679Sgblack@eecs.umich.edu const char * mnemonic) const 504679Sgblack@eecs.umich.edu { 515785Sgblack@eecs.umich.edu ccprintf(os, " %s ", mnemonic); 524679Sgblack@eecs.umich.edu } 534679Sgblack@eecs.umich.edu 544679Sgblack@eecs.umich.edu void X86StaticInst::printMnemonic(std::ostream &os, 554679Sgblack@eecs.umich.edu const char * instMnemonic, const char * mnemonic) const 564679Sgblack@eecs.umich.edu { 575785Sgblack@eecs.umich.edu ccprintf(os, " %s : %s ", instMnemonic, mnemonic); 584679Sgblack@eecs.umich.edu } 594679Sgblack@eecs.umich.edu 604679Sgblack@eecs.umich.edu void X86StaticInst::printSegment(std::ostream &os, int segment) const 614679Sgblack@eecs.umich.edu { 624679Sgblack@eecs.umich.edu switch (segment) 634679Sgblack@eecs.umich.edu { 645232Sgblack@eecs.umich.edu case SEGMENT_REG_ES: 654679Sgblack@eecs.umich.edu ccprintf(os, "ES"); 664679Sgblack@eecs.umich.edu break; 675232Sgblack@eecs.umich.edu case SEGMENT_REG_CS: 684679Sgblack@eecs.umich.edu ccprintf(os, "CS"); 694679Sgblack@eecs.umich.edu break; 705232Sgblack@eecs.umich.edu case SEGMENT_REG_SS: 714679Sgblack@eecs.umich.edu ccprintf(os, "SS"); 724679Sgblack@eecs.umich.edu break; 735232Sgblack@eecs.umich.edu case SEGMENT_REG_DS: 744679Sgblack@eecs.umich.edu ccprintf(os, "DS"); 754679Sgblack@eecs.umich.edu break; 765232Sgblack@eecs.umich.edu case SEGMENT_REG_FS: 774679Sgblack@eecs.umich.edu ccprintf(os, "FS"); 784679Sgblack@eecs.umich.edu break; 795232Sgblack@eecs.umich.edu case SEGMENT_REG_GS: 804679Sgblack@eecs.umich.edu ccprintf(os, "GS"); 814679Sgblack@eecs.umich.edu break; 825294Sgblack@eecs.umich.edu case SEGMENT_REG_HS: 835294Sgblack@eecs.umich.edu ccprintf(os, "HS"); 845294Sgblack@eecs.umich.edu break; 855294Sgblack@eecs.umich.edu case SEGMENT_REG_TSL: 865294Sgblack@eecs.umich.edu ccprintf(os, "TSL"); 875294Sgblack@eecs.umich.edu break; 885294Sgblack@eecs.umich.edu case SEGMENT_REG_TSG: 895294Sgblack@eecs.umich.edu ccprintf(os, "TSG"); 905294Sgblack@eecs.umich.edu break; 915294Sgblack@eecs.umich.edu case SEGMENT_REG_LS: 925294Sgblack@eecs.umich.edu ccprintf(os, "LS"); 935294Sgblack@eecs.umich.edu break; 945294Sgblack@eecs.umich.edu case SEGMENT_REG_MS: 955294Sgblack@eecs.umich.edu ccprintf(os, "MS"); 965294Sgblack@eecs.umich.edu break; 975294Sgblack@eecs.umich.edu case SYS_SEGMENT_REG_TR: 985294Sgblack@eecs.umich.edu ccprintf(os, "TR"); 995294Sgblack@eecs.umich.edu break; 1005294Sgblack@eecs.umich.edu case SYS_SEGMENT_REG_IDTR: 1015294Sgblack@eecs.umich.edu ccprintf(os, "IDTR"); 1025232Sgblack@eecs.umich.edu break; 1034679Sgblack@eecs.umich.edu default: 1044679Sgblack@eecs.umich.edu panic("Unrecognized segment %d\n", segment); 1054679Sgblack@eecs.umich.edu } 1064679Sgblack@eecs.umich.edu } 1074679Sgblack@eecs.umich.edu 1084679Sgblack@eecs.umich.edu void 1094693Sgblack@eecs.umich.edu X86StaticInst::printSrcReg(std::ostream &os, int reg, int size) const 1104679Sgblack@eecs.umich.edu { 11111321Ssteve.reinhardt@amd.com if (_numSrcRegs > reg) 1124693Sgblack@eecs.umich.edu printReg(os, _srcRegIdx[reg], size); 1134679Sgblack@eecs.umich.edu } 1144679Sgblack@eecs.umich.edu 1154679Sgblack@eecs.umich.edu void 1164693Sgblack@eecs.umich.edu X86StaticInst::printDestReg(std::ostream &os, int reg, int size) const 1174679Sgblack@eecs.umich.edu { 11811321Ssteve.reinhardt@amd.com if (_numDestRegs > reg) 1194693Sgblack@eecs.umich.edu printReg(os, _destRegIdx[reg], size); 1204679Sgblack@eecs.umich.edu } 1214679Sgblack@eecs.umich.edu 1224679Sgblack@eecs.umich.edu void 1234693Sgblack@eecs.umich.edu X86StaticInst::printReg(std::ostream &os, int reg, int size) const 1244679Sgblack@eecs.umich.edu { 1254693Sgblack@eecs.umich.edu assert(size == 1 || size == 2 || size == 4 || size == 8); 1264693Sgblack@eecs.umich.edu static const char * abcdFormats[9] = 1274807Sgblack@eecs.umich.edu {"", "%s", "%sx", "", "e%sx", "", "", "", "r%sx"}; 1284693Sgblack@eecs.umich.edu static const char * piFormats[9] = 1294807Sgblack@eecs.umich.edu {"", "%s", "%s", "", "e%s", "", "", "", "r%s"}; 1304693Sgblack@eecs.umich.edu static const char * longFormats[9] = 1314693Sgblack@eecs.umich.edu {"", "r%sb", "r%sw", "", "r%sd", "", "", "", "r%s"}; 1324693Sgblack@eecs.umich.edu static const char * microFormats[9] = 1334693Sgblack@eecs.umich.edu {"", "t%db", "t%dw", "", "t%dd", "", "", "", "t%d"}; 1344693Sgblack@eecs.umich.edu 1359913Ssteve.reinhardt@amd.com RegIndex rel_reg; 1369913Ssteve.reinhardt@amd.com 1379913Ssteve.reinhardt@amd.com switch (regIdxToClass(reg, &rel_reg)) { 1389913Ssteve.reinhardt@amd.com case IntRegClass: { 1395202Sstever@gmail.com const char * suffix = ""; 1409913Ssteve.reinhardt@amd.com bool fold = rel_reg & IntFoldBit; 1419913Ssteve.reinhardt@amd.com rel_reg &= ~IntFoldBit; 1424807Sgblack@eecs.umich.edu 14311321Ssteve.reinhardt@amd.com if (fold) 1444807Sgblack@eecs.umich.edu suffix = "h"; 14511321Ssteve.reinhardt@amd.com else if (rel_reg < 8 && size == 1) 1464807Sgblack@eecs.umich.edu suffix = "l"; 1474807Sgblack@eecs.umich.edu 1489913Ssteve.reinhardt@amd.com switch (rel_reg) { 1494679Sgblack@eecs.umich.edu case INTREG_RAX: 1504693Sgblack@eecs.umich.edu ccprintf(os, abcdFormats[size], "a"); 1514679Sgblack@eecs.umich.edu break; 1524679Sgblack@eecs.umich.edu case INTREG_RBX: 1534693Sgblack@eecs.umich.edu ccprintf(os, abcdFormats[size], "b"); 1544679Sgblack@eecs.umich.edu break; 1554679Sgblack@eecs.umich.edu case INTREG_RCX: 1564693Sgblack@eecs.umich.edu ccprintf(os, abcdFormats[size], "c"); 1574679Sgblack@eecs.umich.edu break; 1584679Sgblack@eecs.umich.edu case INTREG_RDX: 1594693Sgblack@eecs.umich.edu ccprintf(os, abcdFormats[size], "d"); 1604679Sgblack@eecs.umich.edu break; 1614679Sgblack@eecs.umich.edu case INTREG_RSP: 1624693Sgblack@eecs.umich.edu ccprintf(os, piFormats[size], "sp"); 1634679Sgblack@eecs.umich.edu break; 1644679Sgblack@eecs.umich.edu case INTREG_RBP: 1654693Sgblack@eecs.umich.edu ccprintf(os, piFormats[size], "bp"); 1664679Sgblack@eecs.umich.edu break; 1674679Sgblack@eecs.umich.edu case INTREG_RSI: 1684693Sgblack@eecs.umich.edu ccprintf(os, piFormats[size], "si"); 1694679Sgblack@eecs.umich.edu break; 1704679Sgblack@eecs.umich.edu case INTREG_RDI: 1714693Sgblack@eecs.umich.edu ccprintf(os, piFormats[size], "di"); 1724679Sgblack@eecs.umich.edu break; 1734679Sgblack@eecs.umich.edu case INTREG_R8W: 1744693Sgblack@eecs.umich.edu ccprintf(os, longFormats[size], "8"); 1754679Sgblack@eecs.umich.edu break; 1764679Sgblack@eecs.umich.edu case INTREG_R9W: 1774693Sgblack@eecs.umich.edu ccprintf(os, longFormats[size], "9"); 1784679Sgblack@eecs.umich.edu break; 1794679Sgblack@eecs.umich.edu case INTREG_R10W: 1804693Sgblack@eecs.umich.edu ccprintf(os, longFormats[size], "10"); 1814679Sgblack@eecs.umich.edu break; 1824679Sgblack@eecs.umich.edu case INTREG_R11W: 1834693Sgblack@eecs.umich.edu ccprintf(os, longFormats[size], "11"); 1844679Sgblack@eecs.umich.edu break; 1854679Sgblack@eecs.umich.edu case INTREG_R12W: 1864693Sgblack@eecs.umich.edu ccprintf(os, longFormats[size], "12"); 1874679Sgblack@eecs.umich.edu break; 1884679Sgblack@eecs.umich.edu case INTREG_R13W: 1894693Sgblack@eecs.umich.edu ccprintf(os, longFormats[size], "13"); 1904679Sgblack@eecs.umich.edu break; 1914679Sgblack@eecs.umich.edu case INTREG_R14W: 1924693Sgblack@eecs.umich.edu ccprintf(os, longFormats[size], "14"); 1934679Sgblack@eecs.umich.edu break; 1944679Sgblack@eecs.umich.edu case INTREG_R15W: 1954693Sgblack@eecs.umich.edu ccprintf(os, longFormats[size], "15"); 1964679Sgblack@eecs.umich.edu break; 1974679Sgblack@eecs.umich.edu default: 1989913Ssteve.reinhardt@amd.com ccprintf(os, microFormats[size], rel_reg - NUM_INTREGS); 1994679Sgblack@eecs.umich.edu } 2004807Sgblack@eecs.umich.edu ccprintf(os, suffix); 2019913Ssteve.reinhardt@amd.com break; 2029913Ssteve.reinhardt@amd.com } 2039913Ssteve.reinhardt@amd.com 2049913Ssteve.reinhardt@amd.com case FloatRegClass: { 2059913Ssteve.reinhardt@amd.com if (rel_reg < NumMMXRegs) { 2069913Ssteve.reinhardt@amd.com ccprintf(os, "%%mmx%d", rel_reg); 2075045Sgblack@eecs.umich.edu return; 2085045Sgblack@eecs.umich.edu } 2099913Ssteve.reinhardt@amd.com rel_reg -= NumMMXRegs; 2109913Ssteve.reinhardt@amd.com if (rel_reg < NumXMMRegs * 2) { 2119913Ssteve.reinhardt@amd.com ccprintf(os, "%%xmm%d_%s", rel_reg / 2, 2129913Ssteve.reinhardt@amd.com (rel_reg % 2) ? "high": "low"); 2135045Sgblack@eecs.umich.edu return; 2145045Sgblack@eecs.umich.edu } 2159913Ssteve.reinhardt@amd.com rel_reg -= NumXMMRegs * 2; 2169913Ssteve.reinhardt@amd.com if (rel_reg < NumMicroFpRegs) { 2179913Ssteve.reinhardt@amd.com ccprintf(os, "%%ufp%d", rel_reg); 2185121Sgblack@eecs.umich.edu return; 2195121Sgblack@eecs.umich.edu } 2209913Ssteve.reinhardt@amd.com rel_reg -= NumMicroFpRegs; 2219913Ssteve.reinhardt@amd.com ccprintf(os, "%%st(%d)", rel_reg); 2229913Ssteve.reinhardt@amd.com break; 2239913Ssteve.reinhardt@amd.com } 2249913Ssteve.reinhardt@amd.com 2259920Syasuko.eckert@amd.com case CCRegClass: 2269920Syasuko.eckert@amd.com ccprintf(os, "%%cc%d", rel_reg); 2279920Syasuko.eckert@amd.com break; 2289920Syasuko.eckert@amd.com 2299913Ssteve.reinhardt@amd.com case MiscRegClass: 2309913Ssteve.reinhardt@amd.com switch (rel_reg) { 2314679Sgblack@eecs.umich.edu default: 2329913Ssteve.reinhardt@amd.com ccprintf(os, "%%ctrl%d", rel_reg); 2334679Sgblack@eecs.umich.edu } 2349913Ssteve.reinhardt@amd.com break; 2354679Sgblack@eecs.umich.edu } 2364679Sgblack@eecs.umich.edu } 2374679Sgblack@eecs.umich.edu 2385787Sgblack@eecs.umich.edu void X86StaticInst::printMem(std::ostream &os, uint8_t segment, 2395787Sgblack@eecs.umich.edu uint8_t scale, RegIndex index, RegIndex base, 2405787Sgblack@eecs.umich.edu uint64_t disp, uint8_t addressSize, bool rip) const 2415787Sgblack@eecs.umich.edu { 2425787Sgblack@eecs.umich.edu bool someAddr = false; 2435787Sgblack@eecs.umich.edu printSegment(os, segment); 2445787Sgblack@eecs.umich.edu os << ":["; 2455787Sgblack@eecs.umich.edu if (rip) { 2465787Sgblack@eecs.umich.edu os << "rip"; 2475787Sgblack@eecs.umich.edu someAddr = true; 2485787Sgblack@eecs.umich.edu } else { 2495787Sgblack@eecs.umich.edu if (scale != 0 && index != ZeroReg) 2505787Sgblack@eecs.umich.edu { 25111321Ssteve.reinhardt@amd.com if (scale != 1) 2525787Sgblack@eecs.umich.edu ccprintf(os, "%d*", scale); 2535787Sgblack@eecs.umich.edu printReg(os, index, addressSize); 2545787Sgblack@eecs.umich.edu someAddr = true; 2555787Sgblack@eecs.umich.edu } 2565787Sgblack@eecs.umich.edu if (base != ZeroReg) 2575787Sgblack@eecs.umich.edu { 25811321Ssteve.reinhardt@amd.com if (someAddr) 2595787Sgblack@eecs.umich.edu os << " + "; 2605787Sgblack@eecs.umich.edu printReg(os, base, addressSize); 2615787Sgblack@eecs.umich.edu someAddr = true; 2625787Sgblack@eecs.umich.edu } 2635787Sgblack@eecs.umich.edu } 2645787Sgblack@eecs.umich.edu if (disp != 0) 2655787Sgblack@eecs.umich.edu { 26611321Ssteve.reinhardt@amd.com if (someAddr) 2675787Sgblack@eecs.umich.edu os << " + "; 2685787Sgblack@eecs.umich.edu ccprintf(os, "%#x", disp); 2695787Sgblack@eecs.umich.edu someAddr = true; 2705787Sgblack@eecs.umich.edu } 2715787Sgblack@eecs.umich.edu if (!someAddr) 2725787Sgblack@eecs.umich.edu os << "0"; 2735787Sgblack@eecs.umich.edu os << "]"; 2745787Sgblack@eecs.umich.edu } 2755787Sgblack@eecs.umich.edu 2764679Sgblack@eecs.umich.edu std::string X86StaticInst::generateDisassembly(Addr pc, 2774679Sgblack@eecs.umich.edu const SymbolTable *symtab) const 2784679Sgblack@eecs.umich.edu { 2794679Sgblack@eecs.umich.edu std::stringstream ss; 2804679Sgblack@eecs.umich.edu 2814679Sgblack@eecs.umich.edu printMnemonic(ss, mnemonic); 2824679Sgblack@eecs.umich.edu 2834679Sgblack@eecs.umich.edu return ss.str(); 2844679Sgblack@eecs.umich.edu } 2854679Sgblack@eecs.umich.edu} 286