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 12312104Snathanael.premillieu@arm.com X86StaticInst::printReg(std::ostream &os, RegId 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 13512106SRekai.GonzalezAlberquilla@arm.com RegIndex reg_idx = reg.index(); 1369913Ssteve.reinhardt@amd.com 13712106SRekai.GonzalezAlberquilla@arm.com if (reg.isIntReg()) { 1385202Sstever@gmail.com const char * suffix = ""; 13912104Snathanael.premillieu@arm.com bool fold = reg_idx & IntFoldBit; 14012104Snathanael.premillieu@arm.com reg_idx &= ~IntFoldBit; 1414807Sgblack@eecs.umich.edu 14211321Ssteve.reinhardt@amd.com if (fold) 1434807Sgblack@eecs.umich.edu suffix = "h"; 14412104Snathanael.premillieu@arm.com else if (reg_idx < 8 && size == 1) 1454807Sgblack@eecs.umich.edu suffix = "l"; 1464807Sgblack@eecs.umich.edu 14712104Snathanael.premillieu@arm.com switch (reg_idx) { 1484679Sgblack@eecs.umich.edu case INTREG_RAX: 1494693Sgblack@eecs.umich.edu ccprintf(os, abcdFormats[size], "a"); 1504679Sgblack@eecs.umich.edu break; 1514679Sgblack@eecs.umich.edu case INTREG_RBX: 1524693Sgblack@eecs.umich.edu ccprintf(os, abcdFormats[size], "b"); 1534679Sgblack@eecs.umich.edu break; 1544679Sgblack@eecs.umich.edu case INTREG_RCX: 1554693Sgblack@eecs.umich.edu ccprintf(os, abcdFormats[size], "c"); 1564679Sgblack@eecs.umich.edu break; 1574679Sgblack@eecs.umich.edu case INTREG_RDX: 1584693Sgblack@eecs.umich.edu ccprintf(os, abcdFormats[size], "d"); 1594679Sgblack@eecs.umich.edu break; 1604679Sgblack@eecs.umich.edu case INTREG_RSP: 1614693Sgblack@eecs.umich.edu ccprintf(os, piFormats[size], "sp"); 1624679Sgblack@eecs.umich.edu break; 1634679Sgblack@eecs.umich.edu case INTREG_RBP: 1644693Sgblack@eecs.umich.edu ccprintf(os, piFormats[size], "bp"); 1654679Sgblack@eecs.umich.edu break; 1664679Sgblack@eecs.umich.edu case INTREG_RSI: 1674693Sgblack@eecs.umich.edu ccprintf(os, piFormats[size], "si"); 1684679Sgblack@eecs.umich.edu break; 1694679Sgblack@eecs.umich.edu case INTREG_RDI: 1704693Sgblack@eecs.umich.edu ccprintf(os, piFormats[size], "di"); 1714679Sgblack@eecs.umich.edu break; 1724679Sgblack@eecs.umich.edu case INTREG_R8W: 1734693Sgblack@eecs.umich.edu ccprintf(os, longFormats[size], "8"); 1744679Sgblack@eecs.umich.edu break; 1754679Sgblack@eecs.umich.edu case INTREG_R9W: 1764693Sgblack@eecs.umich.edu ccprintf(os, longFormats[size], "9"); 1774679Sgblack@eecs.umich.edu break; 1784679Sgblack@eecs.umich.edu case INTREG_R10W: 1794693Sgblack@eecs.umich.edu ccprintf(os, longFormats[size], "10"); 1804679Sgblack@eecs.umich.edu break; 1814679Sgblack@eecs.umich.edu case INTREG_R11W: 1824693Sgblack@eecs.umich.edu ccprintf(os, longFormats[size], "11"); 1834679Sgblack@eecs.umich.edu break; 1844679Sgblack@eecs.umich.edu case INTREG_R12W: 1854693Sgblack@eecs.umich.edu ccprintf(os, longFormats[size], "12"); 1864679Sgblack@eecs.umich.edu break; 1874679Sgblack@eecs.umich.edu case INTREG_R13W: 1884693Sgblack@eecs.umich.edu ccprintf(os, longFormats[size], "13"); 1894679Sgblack@eecs.umich.edu break; 1904679Sgblack@eecs.umich.edu case INTREG_R14W: 1914693Sgblack@eecs.umich.edu ccprintf(os, longFormats[size], "14"); 1924679Sgblack@eecs.umich.edu break; 1934679Sgblack@eecs.umich.edu case INTREG_R15W: 1944693Sgblack@eecs.umich.edu ccprintf(os, longFormats[size], "15"); 1954679Sgblack@eecs.umich.edu break; 1964679Sgblack@eecs.umich.edu default: 19712104Snathanael.premillieu@arm.com ccprintf(os, microFormats[size], reg_idx - NUM_INTREGS); 1984679Sgblack@eecs.umich.edu } 1994807Sgblack@eecs.umich.edu ccprintf(os, suffix); 2009913Ssteve.reinhardt@amd.com 20112106SRekai.GonzalezAlberquilla@arm.com } else if (reg.isFloatReg()) { 20212104Snathanael.premillieu@arm.com if (reg_idx < NumMMXRegs) { 20312104Snathanael.premillieu@arm.com ccprintf(os, "%%mmx%d", reg_idx); 2045045Sgblack@eecs.umich.edu return; 2055045Sgblack@eecs.umich.edu } 20612104Snathanael.premillieu@arm.com reg_idx -= NumMMXRegs; 20712104Snathanael.premillieu@arm.com if (reg_idx < NumXMMRegs * 2) { 20812104Snathanael.premillieu@arm.com ccprintf(os, "%%xmm%d_%s", reg_idx / 2, 20912104Snathanael.premillieu@arm.com (reg_idx % 2) ? "high": "low"); 2105045Sgblack@eecs.umich.edu return; 2115045Sgblack@eecs.umich.edu } 21212104Snathanael.premillieu@arm.com reg_idx -= NumXMMRegs * 2; 21312104Snathanael.premillieu@arm.com if (reg_idx < NumMicroFpRegs) { 21412104Snathanael.premillieu@arm.com ccprintf(os, "%%ufp%d", reg_idx); 2155121Sgblack@eecs.umich.edu return; 2165121Sgblack@eecs.umich.edu } 21712104Snathanael.premillieu@arm.com reg_idx -= NumMicroFpRegs; 21812104Snathanael.premillieu@arm.com ccprintf(os, "%%st(%d)", reg_idx); 2199913Ssteve.reinhardt@amd.com 22012106SRekai.GonzalezAlberquilla@arm.com } else if (reg.isCCReg()) { 22112104Snathanael.premillieu@arm.com ccprintf(os, "%%cc%d", reg_idx); 2229920Syasuko.eckert@amd.com 22312106SRekai.GonzalezAlberquilla@arm.com } else if (reg.isMiscReg()) { 22412104Snathanael.premillieu@arm.com switch (reg_idx) { 2254679Sgblack@eecs.umich.edu default: 22612104Snathanael.premillieu@arm.com ccprintf(os, "%%ctrl%d", reg_idx); 2274679Sgblack@eecs.umich.edu } 2284679Sgblack@eecs.umich.edu } 2294679Sgblack@eecs.umich.edu } 2304679Sgblack@eecs.umich.edu 2315787Sgblack@eecs.umich.edu void X86StaticInst::printMem(std::ostream &os, uint8_t segment, 2325787Sgblack@eecs.umich.edu uint8_t scale, RegIndex index, RegIndex base, 2335787Sgblack@eecs.umich.edu uint64_t disp, uint8_t addressSize, bool rip) const 2345787Sgblack@eecs.umich.edu { 2355787Sgblack@eecs.umich.edu bool someAddr = false; 2365787Sgblack@eecs.umich.edu printSegment(os, segment); 2375787Sgblack@eecs.umich.edu os << ":["; 2385787Sgblack@eecs.umich.edu if (rip) { 2395787Sgblack@eecs.umich.edu os << "rip"; 2405787Sgblack@eecs.umich.edu someAddr = true; 2415787Sgblack@eecs.umich.edu } else { 2425787Sgblack@eecs.umich.edu if (scale != 0 && index != ZeroReg) 2435787Sgblack@eecs.umich.edu { 24411321Ssteve.reinhardt@amd.com if (scale != 1) 2455787Sgblack@eecs.umich.edu ccprintf(os, "%d*", scale); 24612104Snathanael.premillieu@arm.com printReg(os, InstRegIndex(index), addressSize); 2475787Sgblack@eecs.umich.edu someAddr = true; 2485787Sgblack@eecs.umich.edu } 2495787Sgblack@eecs.umich.edu if (base != ZeroReg) 2505787Sgblack@eecs.umich.edu { 25111321Ssteve.reinhardt@amd.com if (someAddr) 2525787Sgblack@eecs.umich.edu os << " + "; 25312104Snathanael.premillieu@arm.com printReg(os, InstRegIndex(base), addressSize); 2545787Sgblack@eecs.umich.edu someAddr = true; 2555787Sgblack@eecs.umich.edu } 2565787Sgblack@eecs.umich.edu } 2575787Sgblack@eecs.umich.edu if (disp != 0) 2585787Sgblack@eecs.umich.edu { 25911321Ssteve.reinhardt@amd.com if (someAddr) 2605787Sgblack@eecs.umich.edu os << " + "; 2615787Sgblack@eecs.umich.edu ccprintf(os, "%#x", disp); 2625787Sgblack@eecs.umich.edu someAddr = true; 2635787Sgblack@eecs.umich.edu } 2645787Sgblack@eecs.umich.edu if (!someAddr) 2655787Sgblack@eecs.umich.edu os << "0"; 2665787Sgblack@eecs.umich.edu os << "]"; 2675787Sgblack@eecs.umich.edu } 2685787Sgblack@eecs.umich.edu 2694679Sgblack@eecs.umich.edu std::string X86StaticInst::generateDisassembly(Addr pc, 2704679Sgblack@eecs.umich.edu const SymbolTable *symtab) const 2714679Sgblack@eecs.umich.edu { 2724679Sgblack@eecs.umich.edu std::stringstream ss; 2734679Sgblack@eecs.umich.edu 2744679Sgblack@eecs.umich.edu printMnemonic(ss, mnemonic); 2754679Sgblack@eecs.umich.edu 2764679Sgblack@eecs.umich.edu return ss.str(); 2774679Sgblack@eecs.umich.edu } 2784679Sgblack@eecs.umich.edu} 279