static_inst.cc revision 7629
14679Sgblack@eecs.umich.edu/* 24679Sgblack@eecs.umich.edu * Copyright (c) 2007 The Hewlett-Packard Development Company 34679Sgblack@eecs.umich.edu * All rights reserved. 44679Sgblack@eecs.umich.edu * 57087Snate@binkert.org * The license below extends only to copyright in the software and shall 67087Snate@binkert.org * not be construed as granting a license to any other intellectual 77087Snate@binkert.org * property including but not limited to intellectual property relating 87087Snate@binkert.org * to a hardware implementation of the functionality of the software 97087Snate@binkert.org * licensed hereunder. You may use the software subject to the license 107087Snate@binkert.org * terms below provided that you ensure that this notice is replicated 117087Snate@binkert.org * unmodified and in its entirety in all distributions of the software, 127087Snate@binkert.org * modified or unmodified, in source code or in binary form. 134679Sgblack@eecs.umich.edu * 147087Snate@binkert.org * Redistribution and use in source and binary forms, with or without 157087Snate@binkert.org * modification, are permitted provided that the following conditions are 167087Snate@binkert.org * met: redistributions of source code must retain the above copyright 177087Snate@binkert.org * notice, this list of conditions and the following disclaimer; 187087Snate@binkert.org * redistributions in binary form must reproduce the above copyright 197087Snate@binkert.org * notice, this list of conditions and the following disclaimer in the 207087Snate@binkert.org * documentation and/or other materials provided with the distribution; 217087Snate@binkert.org * neither the name of the copyright holders nor the names of its 224679Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 237087Snate@binkert.org * this software without specific prior written permission. 244679Sgblack@eecs.umich.edu * 254679Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 264679Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 274679Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 284679Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 294679Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 304679Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 314679Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 324679Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 334679Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 344679Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 354679Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 364679Sgblack@eecs.umich.edu * 374679Sgblack@eecs.umich.edu * Authors: Gabe Black 384679Sgblack@eecs.umich.edu */ 394679Sgblack@eecs.umich.edu 404679Sgblack@eecs.umich.edu#include "arch/x86/insts/static_inst.hh" 417629Sgblack@eecs.umich.edu#include "arch/x86/regs/segment.hh" 424679Sgblack@eecs.umich.edu 434679Sgblack@eecs.umich.edunamespace X86ISA 444679Sgblack@eecs.umich.edu{ 454679Sgblack@eecs.umich.edu void X86StaticInst::printMnemonic(std::ostream &os, 464679Sgblack@eecs.umich.edu const char * mnemonic) const 474679Sgblack@eecs.umich.edu { 485785Sgblack@eecs.umich.edu ccprintf(os, " %s ", mnemonic); 494679Sgblack@eecs.umich.edu } 504679Sgblack@eecs.umich.edu 514679Sgblack@eecs.umich.edu void X86StaticInst::printMnemonic(std::ostream &os, 524679Sgblack@eecs.umich.edu const char * instMnemonic, const char * mnemonic) const 534679Sgblack@eecs.umich.edu { 545785Sgblack@eecs.umich.edu ccprintf(os, " %s : %s ", instMnemonic, mnemonic); 554679Sgblack@eecs.umich.edu } 564679Sgblack@eecs.umich.edu 574679Sgblack@eecs.umich.edu void X86StaticInst::printSegment(std::ostream &os, int segment) const 584679Sgblack@eecs.umich.edu { 594679Sgblack@eecs.umich.edu switch (segment) 604679Sgblack@eecs.umich.edu { 615232Sgblack@eecs.umich.edu case SEGMENT_REG_ES: 624679Sgblack@eecs.umich.edu ccprintf(os, "ES"); 634679Sgblack@eecs.umich.edu break; 645232Sgblack@eecs.umich.edu case SEGMENT_REG_CS: 654679Sgblack@eecs.umich.edu ccprintf(os, "CS"); 664679Sgblack@eecs.umich.edu break; 675232Sgblack@eecs.umich.edu case SEGMENT_REG_SS: 684679Sgblack@eecs.umich.edu ccprintf(os, "SS"); 694679Sgblack@eecs.umich.edu break; 705232Sgblack@eecs.umich.edu case SEGMENT_REG_DS: 714679Sgblack@eecs.umich.edu ccprintf(os, "DS"); 724679Sgblack@eecs.umich.edu break; 735232Sgblack@eecs.umich.edu case SEGMENT_REG_FS: 744679Sgblack@eecs.umich.edu ccprintf(os, "FS"); 754679Sgblack@eecs.umich.edu break; 765232Sgblack@eecs.umich.edu case SEGMENT_REG_GS: 774679Sgblack@eecs.umich.edu ccprintf(os, "GS"); 784679Sgblack@eecs.umich.edu break; 795294Sgblack@eecs.umich.edu case SEGMENT_REG_HS: 805294Sgblack@eecs.umich.edu ccprintf(os, "HS"); 815294Sgblack@eecs.umich.edu break; 825294Sgblack@eecs.umich.edu case SEGMENT_REG_TSL: 835294Sgblack@eecs.umich.edu ccprintf(os, "TSL"); 845294Sgblack@eecs.umich.edu break; 855294Sgblack@eecs.umich.edu case SEGMENT_REG_TSG: 865294Sgblack@eecs.umich.edu ccprintf(os, "TSG"); 875294Sgblack@eecs.umich.edu break; 885294Sgblack@eecs.umich.edu case SEGMENT_REG_LS: 895294Sgblack@eecs.umich.edu ccprintf(os, "LS"); 905294Sgblack@eecs.umich.edu break; 915294Sgblack@eecs.umich.edu case SEGMENT_REG_MS: 925294Sgblack@eecs.umich.edu ccprintf(os, "MS"); 935294Sgblack@eecs.umich.edu break; 945294Sgblack@eecs.umich.edu case SYS_SEGMENT_REG_TR: 955294Sgblack@eecs.umich.edu ccprintf(os, "TR"); 965294Sgblack@eecs.umich.edu break; 975294Sgblack@eecs.umich.edu case SYS_SEGMENT_REG_IDTR: 985294Sgblack@eecs.umich.edu ccprintf(os, "IDTR"); 995232Sgblack@eecs.umich.edu break; 1004679Sgblack@eecs.umich.edu default: 1014679Sgblack@eecs.umich.edu panic("Unrecognized segment %d\n", segment); 1024679Sgblack@eecs.umich.edu } 1034679Sgblack@eecs.umich.edu } 1044679Sgblack@eecs.umich.edu 1054679Sgblack@eecs.umich.edu void 1064693Sgblack@eecs.umich.edu X86StaticInst::printSrcReg(std::ostream &os, int reg, int size) const 1074679Sgblack@eecs.umich.edu { 1084679Sgblack@eecs.umich.edu if(_numSrcRegs > reg) 1094693Sgblack@eecs.umich.edu printReg(os, _srcRegIdx[reg], size); 1104679Sgblack@eecs.umich.edu } 1114679Sgblack@eecs.umich.edu 1124679Sgblack@eecs.umich.edu void 1134693Sgblack@eecs.umich.edu X86StaticInst::printDestReg(std::ostream &os, int reg, int size) const 1144679Sgblack@eecs.umich.edu { 1154679Sgblack@eecs.umich.edu if(_numDestRegs > reg) 1164693Sgblack@eecs.umich.edu printReg(os, _destRegIdx[reg], size); 1174679Sgblack@eecs.umich.edu } 1184679Sgblack@eecs.umich.edu 1194679Sgblack@eecs.umich.edu void 1204693Sgblack@eecs.umich.edu X86StaticInst::printReg(std::ostream &os, int reg, int size) const 1214679Sgblack@eecs.umich.edu { 1224693Sgblack@eecs.umich.edu assert(size == 1 || size == 2 || size == 4 || size == 8); 1234693Sgblack@eecs.umich.edu static const char * abcdFormats[9] = 1244807Sgblack@eecs.umich.edu {"", "%s", "%sx", "", "e%sx", "", "", "", "r%sx"}; 1254693Sgblack@eecs.umich.edu static const char * piFormats[9] = 1264807Sgblack@eecs.umich.edu {"", "%s", "%s", "", "e%s", "", "", "", "r%s"}; 1274693Sgblack@eecs.umich.edu static const char * longFormats[9] = 1284693Sgblack@eecs.umich.edu {"", "r%sb", "r%sw", "", "r%sd", "", "", "", "r%s"}; 1294693Sgblack@eecs.umich.edu static const char * microFormats[9] = 1304693Sgblack@eecs.umich.edu {"", "t%db", "t%dw", "", "t%dd", "", "", "", "t%d"}; 1314693Sgblack@eecs.umich.edu 1324679Sgblack@eecs.umich.edu if (reg < FP_Base_DepTag) { 1335202Sstever@gmail.com const char * suffix = ""; 1346361Sgblack@eecs.umich.edu bool fold = reg & IntFoldBit; 1356361Sgblack@eecs.umich.edu reg &= ~IntFoldBit; 1364807Sgblack@eecs.umich.edu 1374807Sgblack@eecs.umich.edu if(fold) 1384807Sgblack@eecs.umich.edu suffix = "h"; 1394807Sgblack@eecs.umich.edu else if(reg < 8 && size == 1) 1404807Sgblack@eecs.umich.edu suffix = "l"; 1414807Sgblack@eecs.umich.edu 1424679Sgblack@eecs.umich.edu switch (reg) { 1434679Sgblack@eecs.umich.edu case INTREG_RAX: 1444693Sgblack@eecs.umich.edu ccprintf(os, abcdFormats[size], "a"); 1454679Sgblack@eecs.umich.edu break; 1464679Sgblack@eecs.umich.edu case INTREG_RBX: 1474693Sgblack@eecs.umich.edu ccprintf(os, abcdFormats[size], "b"); 1484679Sgblack@eecs.umich.edu break; 1494679Sgblack@eecs.umich.edu case INTREG_RCX: 1504693Sgblack@eecs.umich.edu ccprintf(os, abcdFormats[size], "c"); 1514679Sgblack@eecs.umich.edu break; 1524679Sgblack@eecs.umich.edu case INTREG_RDX: 1534693Sgblack@eecs.umich.edu ccprintf(os, abcdFormats[size], "d"); 1544679Sgblack@eecs.umich.edu break; 1554679Sgblack@eecs.umich.edu case INTREG_RSP: 1564693Sgblack@eecs.umich.edu ccprintf(os, piFormats[size], "sp"); 1574679Sgblack@eecs.umich.edu break; 1584679Sgblack@eecs.umich.edu case INTREG_RBP: 1594693Sgblack@eecs.umich.edu ccprintf(os, piFormats[size], "bp"); 1604679Sgblack@eecs.umich.edu break; 1614679Sgblack@eecs.umich.edu case INTREG_RSI: 1624693Sgblack@eecs.umich.edu ccprintf(os, piFormats[size], "si"); 1634679Sgblack@eecs.umich.edu break; 1644679Sgblack@eecs.umich.edu case INTREG_RDI: 1654693Sgblack@eecs.umich.edu ccprintf(os, piFormats[size], "di"); 1664679Sgblack@eecs.umich.edu break; 1674679Sgblack@eecs.umich.edu case INTREG_R8W: 1684693Sgblack@eecs.umich.edu ccprintf(os, longFormats[size], "8"); 1694679Sgblack@eecs.umich.edu break; 1704679Sgblack@eecs.umich.edu case INTREG_R9W: 1714693Sgblack@eecs.umich.edu ccprintf(os, longFormats[size], "9"); 1724679Sgblack@eecs.umich.edu break; 1734679Sgblack@eecs.umich.edu case INTREG_R10W: 1744693Sgblack@eecs.umich.edu ccprintf(os, longFormats[size], "10"); 1754679Sgblack@eecs.umich.edu break; 1764679Sgblack@eecs.umich.edu case INTREG_R11W: 1774693Sgblack@eecs.umich.edu ccprintf(os, longFormats[size], "11"); 1784679Sgblack@eecs.umich.edu break; 1794679Sgblack@eecs.umich.edu case INTREG_R12W: 1804693Sgblack@eecs.umich.edu ccprintf(os, longFormats[size], "12"); 1814679Sgblack@eecs.umich.edu break; 1824679Sgblack@eecs.umich.edu case INTREG_R13W: 1834693Sgblack@eecs.umich.edu ccprintf(os, longFormats[size], "13"); 1844679Sgblack@eecs.umich.edu break; 1854679Sgblack@eecs.umich.edu case INTREG_R14W: 1864693Sgblack@eecs.umich.edu ccprintf(os, longFormats[size], "14"); 1874679Sgblack@eecs.umich.edu break; 1884679Sgblack@eecs.umich.edu case INTREG_R15W: 1894693Sgblack@eecs.umich.edu ccprintf(os, longFormats[size], "15"); 1904679Sgblack@eecs.umich.edu break; 1914679Sgblack@eecs.umich.edu default: 1924693Sgblack@eecs.umich.edu ccprintf(os, microFormats[size], reg - NUM_INTREGS); 1934679Sgblack@eecs.umich.edu } 1944807Sgblack@eecs.umich.edu ccprintf(os, suffix); 1954679Sgblack@eecs.umich.edu } else if (reg < Ctrl_Base_DepTag) { 1965045Sgblack@eecs.umich.edu int fpindex = reg - FP_Base_DepTag; 1975045Sgblack@eecs.umich.edu if(fpindex < NumMMXRegs) { 1985045Sgblack@eecs.umich.edu ccprintf(os, "%%mmx%d", reg - FP_Base_DepTag); 1995045Sgblack@eecs.umich.edu return; 2005045Sgblack@eecs.umich.edu } 2015045Sgblack@eecs.umich.edu fpindex -= NumMMXRegs; 2025121Sgblack@eecs.umich.edu if(fpindex < NumXMMRegs * 2) { 2035045Sgblack@eecs.umich.edu ccprintf(os, "%%xmm%d_%s", fpindex / 2, 2045045Sgblack@eecs.umich.edu (fpindex % 2) ? "high": "low"); 2055045Sgblack@eecs.umich.edu return; 2065045Sgblack@eecs.umich.edu } 2075121Sgblack@eecs.umich.edu fpindex -= NumXMMRegs * 2; 2085121Sgblack@eecs.umich.edu if(fpindex < NumMicroFpRegs) { 2095121Sgblack@eecs.umich.edu ccprintf(os, "%%ufp%d", fpindex); 2105121Sgblack@eecs.umich.edu return; 2115121Sgblack@eecs.umich.edu } 2125121Sgblack@eecs.umich.edu fpindex -= NumMicroFpRegs; 2135121Sgblack@eecs.umich.edu ccprintf(os, "%%st(%d)", fpindex); 2144679Sgblack@eecs.umich.edu } else { 2154679Sgblack@eecs.umich.edu switch (reg - Ctrl_Base_DepTag) { 2164679Sgblack@eecs.umich.edu default: 2174679Sgblack@eecs.umich.edu ccprintf(os, "%%ctrl%d", reg - Ctrl_Base_DepTag); 2184679Sgblack@eecs.umich.edu } 2194679Sgblack@eecs.umich.edu } 2204679Sgblack@eecs.umich.edu } 2214679Sgblack@eecs.umich.edu 2225787Sgblack@eecs.umich.edu void X86StaticInst::printMem(std::ostream &os, uint8_t segment, 2235787Sgblack@eecs.umich.edu uint8_t scale, RegIndex index, RegIndex base, 2245787Sgblack@eecs.umich.edu uint64_t disp, uint8_t addressSize, bool rip) const 2255787Sgblack@eecs.umich.edu { 2265787Sgblack@eecs.umich.edu bool someAddr = false; 2275787Sgblack@eecs.umich.edu printSegment(os, segment); 2285787Sgblack@eecs.umich.edu os << ":["; 2295787Sgblack@eecs.umich.edu if (rip) { 2305787Sgblack@eecs.umich.edu os << "rip"; 2315787Sgblack@eecs.umich.edu someAddr = true; 2325787Sgblack@eecs.umich.edu } else { 2335787Sgblack@eecs.umich.edu if (scale != 0 && index != ZeroReg) 2345787Sgblack@eecs.umich.edu { 2355787Sgblack@eecs.umich.edu if(scale != 1) 2365787Sgblack@eecs.umich.edu ccprintf(os, "%d*", scale); 2375787Sgblack@eecs.umich.edu printReg(os, index, addressSize); 2385787Sgblack@eecs.umich.edu someAddr = true; 2395787Sgblack@eecs.umich.edu } 2405787Sgblack@eecs.umich.edu if (base != ZeroReg) 2415787Sgblack@eecs.umich.edu { 2425787Sgblack@eecs.umich.edu if(someAddr) 2435787Sgblack@eecs.umich.edu os << " + "; 2445787Sgblack@eecs.umich.edu printReg(os, base, addressSize); 2455787Sgblack@eecs.umich.edu someAddr = true; 2465787Sgblack@eecs.umich.edu } 2475787Sgblack@eecs.umich.edu } 2485787Sgblack@eecs.umich.edu if (disp != 0) 2495787Sgblack@eecs.umich.edu { 2505787Sgblack@eecs.umich.edu if(someAddr) 2515787Sgblack@eecs.umich.edu os << " + "; 2525787Sgblack@eecs.umich.edu ccprintf(os, "%#x", disp); 2535787Sgblack@eecs.umich.edu someAddr = true; 2545787Sgblack@eecs.umich.edu } 2555787Sgblack@eecs.umich.edu if (!someAddr) 2565787Sgblack@eecs.umich.edu os << "0"; 2575787Sgblack@eecs.umich.edu os << "]"; 2585787Sgblack@eecs.umich.edu } 2595787Sgblack@eecs.umich.edu 2604679Sgblack@eecs.umich.edu std::string X86StaticInst::generateDisassembly(Addr pc, 2614679Sgblack@eecs.umich.edu const SymbolTable *symtab) const 2624679Sgblack@eecs.umich.edu { 2634679Sgblack@eecs.umich.edu std::stringstream ss; 2644679Sgblack@eecs.umich.edu 2654679Sgblack@eecs.umich.edu printMnemonic(ss, mnemonic); 2664679Sgblack@eecs.umich.edu 2674679Sgblack@eecs.umich.edu return ss.str(); 2684679Sgblack@eecs.umich.edu } 2694679Sgblack@eecs.umich.edu} 270