decoder.hh revision 12621
19020Sgblack@eecs.umich.edu/* 29020Sgblack@eecs.umich.edu * Copyright (c) 2012 Google 39020Sgblack@eecs.umich.edu * All rights reserved. 49020Sgblack@eecs.umich.edu * 59020Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 69020Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 79020Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 89020Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 99020Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 109020Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 119020Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 129020Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 139020Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 149020Sgblack@eecs.umich.edu * this software without specific prior written permission. 159020Sgblack@eecs.umich.edu * 169020Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 179020Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 189020Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 199020Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 209020Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 219020Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 229020Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 239020Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 249020Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 259020Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 269020Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 279020Sgblack@eecs.umich.edu * 289020Sgblack@eecs.umich.edu * Authors: Gabe Black 299020Sgblack@eecs.umich.edu */ 309020Sgblack@eecs.umich.edu 319020Sgblack@eecs.umich.edu#ifndef __ARCH_X86_DECODER_HH__ 329020Sgblack@eecs.umich.edu#define __ARCH_X86_DECODER_HH__ 339020Sgblack@eecs.umich.edu 349023Sgblack@eecs.umich.edu#include <cassert> 3511168Sandreas.hansson@arm.com#include <unordered_map> 369376Sgblack@eecs.umich.edu#include <vector> 379023Sgblack@eecs.umich.edu 389023Sgblack@eecs.umich.edu#include "arch/x86/regs/misc.hh" 399023Sgblack@eecs.umich.edu#include "arch/x86/types.hh" 409023Sgblack@eecs.umich.edu#include "base/bitfield.hh" 4112334Sgabeblack@google.com#include "base/logging.hh" 429023Sgblack@eecs.umich.edu#include "base/trace.hh" 439023Sgblack@eecs.umich.edu#include "base/types.hh" 449022Sgblack@eecs.umich.edu#include "cpu/decode_cache.hh" 459024Sgblack@eecs.umich.edu#include "cpu/static_inst.hh" 469023Sgblack@eecs.umich.edu#include "debug/Decoder.hh" 479023Sgblack@eecs.umich.edu 489020Sgblack@eecs.umich.edunamespace X86ISA 499020Sgblack@eecs.umich.edu{ 509020Sgblack@eecs.umich.edu 5111165SRekai.GonzalezAlberquilla@arm.comclass ISA; 529022Sgblack@eecs.umich.educlass Decoder 539022Sgblack@eecs.umich.edu{ 549023Sgblack@eecs.umich.edu private: 559023Sgblack@eecs.umich.edu //These are defined and documented in decoder_tables.cc 569023Sgblack@eecs.umich.edu static const uint8_t SizeTypeToSize[3][10]; 5710593Sgabeblack@google.com typedef const uint8_t ByteTable[256]; 5810593Sgabeblack@google.com static ByteTable Prefixes; 5910593Sgabeblack@google.com 6010593Sgabeblack@google.com static ByteTable UsesModRMOneByte; 6110593Sgabeblack@google.com static ByteTable UsesModRMTwoByte; 6210593Sgabeblack@google.com static ByteTable UsesModRMThreeByte0F38; 6310593Sgabeblack@google.com static ByteTable UsesModRMThreeByte0F3A; 6410593Sgabeblack@google.com 6510593Sgabeblack@google.com static ByteTable ImmediateTypeOneByte; 6610593Sgabeblack@google.com static ByteTable ImmediateTypeTwoByte; 6710593Sgabeblack@google.com static ByteTable ImmediateTypeThreeByte0F38; 6810593Sgabeblack@google.com static ByteTable ImmediateTypeThreeByte0F3A; 6910924Snilay@cs.wisc.edu static ByteTable ImmediateTypeVex[10]; 709023Sgblack@eecs.umich.edu 719023Sgblack@eecs.umich.edu protected: 729376Sgblack@eecs.umich.edu struct InstBytes 739376Sgblack@eecs.umich.edu { 749376Sgblack@eecs.umich.edu StaticInstPtr si; 759376Sgblack@eecs.umich.edu std::vector<MachInst> chunks; 769376Sgblack@eecs.umich.edu std::vector<MachInst> masks; 779376Sgblack@eecs.umich.edu int lastOffset; 789376Sgblack@eecs.umich.edu 799376Sgblack@eecs.umich.edu InstBytes() : lastOffset(0) 809376Sgblack@eecs.umich.edu {} 819376Sgblack@eecs.umich.edu }; 829376Sgblack@eecs.umich.edu 839376Sgblack@eecs.umich.edu static InstBytes dummy; 849376Sgblack@eecs.umich.edu 859023Sgblack@eecs.umich.edu //The bytes to be predecoded 869023Sgblack@eecs.umich.edu MachInst fetchChunk; 879376Sgblack@eecs.umich.edu InstBytes *instBytes; 889376Sgblack@eecs.umich.edu int chunkIdx; 899023Sgblack@eecs.umich.edu //The pc of the start of fetchChunk 909023Sgblack@eecs.umich.edu Addr basePC; 919023Sgblack@eecs.umich.edu //The pc the current instruction started at 929023Sgblack@eecs.umich.edu Addr origPC; 939023Sgblack@eecs.umich.edu //The offset into fetchChunk of current processing 949023Sgblack@eecs.umich.edu int offset; 959023Sgblack@eecs.umich.edu //The extended machine instruction being generated 969023Sgblack@eecs.umich.edu ExtMachInst emi; 979376Sgblack@eecs.umich.edu //Predecoding state 989376Sgblack@eecs.umich.edu X86Mode mode; 999376Sgblack@eecs.umich.edu X86SubMode submode; 1009376Sgblack@eecs.umich.edu uint8_t altOp; 1019376Sgblack@eecs.umich.edu uint8_t defOp; 1029376Sgblack@eecs.umich.edu uint8_t altAddr; 1039376Sgblack@eecs.umich.edu uint8_t defAddr; 1049376Sgblack@eecs.umich.edu uint8_t stack; 1059023Sgblack@eecs.umich.edu 1069376Sgblack@eecs.umich.edu uint8_t getNextByte() 1079023Sgblack@eecs.umich.edu { 1089023Sgblack@eecs.umich.edu return ((uint8_t *)&fetchChunk)[offset]; 1099023Sgblack@eecs.umich.edu } 1109023Sgblack@eecs.umich.edu 1119023Sgblack@eecs.umich.edu void getImmediate(int &collected, uint64_t ¤t, int size) 1129023Sgblack@eecs.umich.edu { 1139023Sgblack@eecs.umich.edu //Figure out how many bytes we still need to get for the 1149023Sgblack@eecs.umich.edu //immediate. 1159023Sgblack@eecs.umich.edu int toGet = size - collected; 1169023Sgblack@eecs.umich.edu //Figure out how many bytes are left in our "buffer" 1179023Sgblack@eecs.umich.edu int remaining = sizeof(MachInst) - offset; 1189023Sgblack@eecs.umich.edu //Get as much as we need, up to the amount available. 1199023Sgblack@eecs.umich.edu toGet = toGet > remaining ? remaining : toGet; 1209023Sgblack@eecs.umich.edu 1219023Sgblack@eecs.umich.edu //Shift the bytes we want to be all the way to the right 1229023Sgblack@eecs.umich.edu uint64_t partialImm = fetchChunk >> (offset * 8); 1239023Sgblack@eecs.umich.edu //Mask off what we don't want 1249023Sgblack@eecs.umich.edu partialImm &= mask(toGet * 8); 1259023Sgblack@eecs.umich.edu //Shift it over to overlay with our displacement. 1269023Sgblack@eecs.umich.edu partialImm <<= (immediateCollected * 8); 1279023Sgblack@eecs.umich.edu //Put it into our displacement 1289023Sgblack@eecs.umich.edu current |= partialImm; 1299023Sgblack@eecs.umich.edu //Update how many bytes we've collected. 1309023Sgblack@eecs.umich.edu collected += toGet; 1319023Sgblack@eecs.umich.edu consumeBytes(toGet); 1329023Sgblack@eecs.umich.edu } 1339023Sgblack@eecs.umich.edu 1349376Sgblack@eecs.umich.edu void updateOffsetState() 1359376Sgblack@eecs.umich.edu { 1369376Sgblack@eecs.umich.edu assert(offset <= sizeof(MachInst)); 1379376Sgblack@eecs.umich.edu if (offset == sizeof(MachInst)) { 1389376Sgblack@eecs.umich.edu DPRINTF(Decoder, "At the end of a chunk, idx = %d, chunks = %d.\n", 1399376Sgblack@eecs.umich.edu chunkIdx, instBytes->chunks.size()); 1409376Sgblack@eecs.umich.edu chunkIdx++; 1419376Sgblack@eecs.umich.edu if (chunkIdx == instBytes->chunks.size()) { 1429376Sgblack@eecs.umich.edu outOfBytes = true; 1439376Sgblack@eecs.umich.edu } else { 1449376Sgblack@eecs.umich.edu offset = 0; 1459376Sgblack@eecs.umich.edu fetchChunk = instBytes->chunks[chunkIdx]; 1469376Sgblack@eecs.umich.edu basePC += sizeof(MachInst); 1479376Sgblack@eecs.umich.edu } 1489376Sgblack@eecs.umich.edu } 1499376Sgblack@eecs.umich.edu } 1509376Sgblack@eecs.umich.edu 1519376Sgblack@eecs.umich.edu void consumeByte() 1529023Sgblack@eecs.umich.edu { 1539023Sgblack@eecs.umich.edu offset++; 1549376Sgblack@eecs.umich.edu updateOffsetState(); 1559023Sgblack@eecs.umich.edu } 1569023Sgblack@eecs.umich.edu 1579376Sgblack@eecs.umich.edu void consumeBytes(int numBytes) 1589023Sgblack@eecs.umich.edu { 1599023Sgblack@eecs.umich.edu offset += numBytes; 1609376Sgblack@eecs.umich.edu updateOffsetState(); 1619023Sgblack@eecs.umich.edu } 1629023Sgblack@eecs.umich.edu 1639023Sgblack@eecs.umich.edu //State machine state 1649023Sgblack@eecs.umich.edu protected: 1659023Sgblack@eecs.umich.edu //Whether or not we're out of bytes 1669023Sgblack@eecs.umich.edu bool outOfBytes; 1679023Sgblack@eecs.umich.edu //Whether we've completed generating an ExtMachInst 1689023Sgblack@eecs.umich.edu bool instDone; 1699023Sgblack@eecs.umich.edu //The size of the displacement value 1709023Sgblack@eecs.umich.edu int displacementSize; 1719023Sgblack@eecs.umich.edu //The size of the immediate value 1729023Sgblack@eecs.umich.edu int immediateSize; 1739023Sgblack@eecs.umich.edu //This is how much of any immediate value we've gotten. This is used 1749023Sgblack@eecs.umich.edu //for both the actual immediate and the displacement. 1759023Sgblack@eecs.umich.edu int immediateCollected; 1769023Sgblack@eecs.umich.edu 1779023Sgblack@eecs.umich.edu enum State { 1789023Sgblack@eecs.umich.edu ResetState, 1799376Sgblack@eecs.umich.edu FromCacheState, 1809023Sgblack@eecs.umich.edu PrefixState, 18112045Sgabeblack@google.com Vex2Of2State, 18212045Sgabeblack@google.com Vex2Of3State, 18312045Sgabeblack@google.com Vex3Of3State, 18412045Sgabeblack@google.com VexOpcodeState, 18510593Sgabeblack@google.com OneByteOpcodeState, 18610593Sgabeblack@google.com TwoByteOpcodeState, 18710593Sgabeblack@google.com ThreeByte0F38OpcodeState, 18810593Sgabeblack@google.com ThreeByte0F3AOpcodeState, 1899023Sgblack@eecs.umich.edu ModRMState, 1909023Sgblack@eecs.umich.edu SIBState, 1919023Sgblack@eecs.umich.edu DisplacementState, 1929023Sgblack@eecs.umich.edu ImmediateState, 1939023Sgblack@eecs.umich.edu //We should never get to this state. Getting here is an error. 1949023Sgblack@eecs.umich.edu ErrorState 1959023Sgblack@eecs.umich.edu }; 1969023Sgblack@eecs.umich.edu 1979023Sgblack@eecs.umich.edu State state; 1989023Sgblack@eecs.umich.edu 1999023Sgblack@eecs.umich.edu //Functions to handle each of the states 2009376Sgblack@eecs.umich.edu State doResetState(); 2019376Sgblack@eecs.umich.edu State doFromCacheState(); 2029023Sgblack@eecs.umich.edu State doPrefixState(uint8_t); 20312045Sgabeblack@google.com State doVex2Of2State(uint8_t); 20412045Sgabeblack@google.com State doVex2Of3State(uint8_t); 20512045Sgabeblack@google.com State doVex3Of3State(uint8_t); 20612045Sgabeblack@google.com State doVexOpcodeState(uint8_t); 20710593Sgabeblack@google.com State doOneByteOpcodeState(uint8_t); 20810593Sgabeblack@google.com State doTwoByteOpcodeState(uint8_t); 20910593Sgabeblack@google.com State doThreeByte0F38OpcodeState(uint8_t); 21010593Sgabeblack@google.com State doThreeByte0F3AOpcodeState(uint8_t); 2119023Sgblack@eecs.umich.edu State doModRMState(uint8_t); 2129023Sgblack@eecs.umich.edu State doSIBState(uint8_t); 2139023Sgblack@eecs.umich.edu State doDisplacementState(); 2149023Sgblack@eecs.umich.edu State doImmediateState(); 2159023Sgblack@eecs.umich.edu 21610593Sgabeblack@google.com //Process the actual opcode found earlier, using the supplied tables. 21710593Sgabeblack@google.com State processOpcode(ByteTable &immTable, ByteTable &modrmTable, 21810593Sgabeblack@google.com bool addrSizedImm = false); 21910924Snilay@cs.wisc.edu // Process the opcode found with VEX / XOP prefix. 22010924Snilay@cs.wisc.edu State processExtendedOpcode(ByteTable &immTable); 22110593Sgabeblack@google.com 2229376Sgblack@eecs.umich.edu protected: 2239376Sgblack@eecs.umich.edu /// Caching for decoded instruction objects. 2249376Sgblack@eecs.umich.edu 2259376Sgblack@eecs.umich.edu typedef MiscReg CacheKey; 2269376Sgblack@eecs.umich.edu 2279376Sgblack@eecs.umich.edu typedef DecodeCache::AddrMap<Decoder::InstBytes> DecodePages; 2289376Sgblack@eecs.umich.edu DecodePages *decodePages; 22911168Sandreas.hansson@arm.com typedef std::unordered_map<CacheKey, DecodePages *> AddrCacheMap; 2309376Sgblack@eecs.umich.edu AddrCacheMap addrCacheMap; 2319376Sgblack@eecs.umich.edu 23212621Sgabeblack@google.com DecodeCache::InstMap<ExtMachInst> *instMap; 23312621Sgabeblack@google.com typedef std::unordered_map< 23412621Sgabeblack@google.com CacheKey, DecodeCache::InstMap<ExtMachInst> *> InstCacheMap; 2359376Sgblack@eecs.umich.edu static InstCacheMap instCacheMap; 2369376Sgblack@eecs.umich.edu 2379023Sgblack@eecs.umich.edu public: 23811165SRekai.GonzalezAlberquilla@arm.com Decoder(ISA* isa = nullptr) : basePC(0), origPC(0), offset(0), 2399023Sgblack@eecs.umich.edu outOfBytes(true), instDone(false), 2409023Sgblack@eecs.umich.edu state(ResetState) 2419023Sgblack@eecs.umich.edu { 2429037Sgblack@eecs.umich.edu memset(&emi, 0, sizeof(emi)); 2439376Sgblack@eecs.umich.edu mode = LongMode; 2449376Sgblack@eecs.umich.edu submode = SixtyFourBitMode; 2459376Sgblack@eecs.umich.edu emi.mode.mode = mode; 2469376Sgblack@eecs.umich.edu emi.mode.submode = submode; 2479376Sgblack@eecs.umich.edu altOp = 0; 2489376Sgblack@eecs.umich.edu defOp = 0; 2499376Sgblack@eecs.umich.edu altAddr = 0; 2509376Sgblack@eecs.umich.edu defAddr = 0; 2519376Sgblack@eecs.umich.edu stack = 0; 2529376Sgblack@eecs.umich.edu instBytes = &dummy; 2539376Sgblack@eecs.umich.edu decodePages = NULL; 2549376Sgblack@eecs.umich.edu instMap = NULL; 2559376Sgblack@eecs.umich.edu } 2569376Sgblack@eecs.umich.edu 2579376Sgblack@eecs.umich.edu void setM5Reg(HandyM5Reg m5Reg) 2589376Sgblack@eecs.umich.edu { 2599376Sgblack@eecs.umich.edu mode = (X86Mode)(uint64_t)m5Reg.mode; 2609376Sgblack@eecs.umich.edu submode = (X86SubMode)(uint64_t)m5Reg.submode; 2619376Sgblack@eecs.umich.edu emi.mode.mode = mode; 2629376Sgblack@eecs.umich.edu emi.mode.submode = submode; 2639376Sgblack@eecs.umich.edu altOp = m5Reg.altOp; 2649376Sgblack@eecs.umich.edu defOp = m5Reg.defOp; 2659376Sgblack@eecs.umich.edu altAddr = m5Reg.altAddr; 2669376Sgblack@eecs.umich.edu defAddr = m5Reg.defAddr; 2679376Sgblack@eecs.umich.edu stack = m5Reg.stack; 2689376Sgblack@eecs.umich.edu 2699376Sgblack@eecs.umich.edu AddrCacheMap::iterator amIter = addrCacheMap.find(m5Reg); 2709376Sgblack@eecs.umich.edu if (amIter != addrCacheMap.end()) { 2719376Sgblack@eecs.umich.edu decodePages = amIter->second; 2729376Sgblack@eecs.umich.edu } else { 2739376Sgblack@eecs.umich.edu decodePages = new DecodePages; 2749376Sgblack@eecs.umich.edu addrCacheMap[m5Reg] = decodePages; 2759376Sgblack@eecs.umich.edu } 2769376Sgblack@eecs.umich.edu 2779376Sgblack@eecs.umich.edu InstCacheMap::iterator imIter = instCacheMap.find(m5Reg); 2789376Sgblack@eecs.umich.edu if (imIter != instCacheMap.end()) { 2799376Sgblack@eecs.umich.edu instMap = imIter->second; 2809376Sgblack@eecs.umich.edu } else { 28112621Sgabeblack@google.com instMap = new DecodeCache::InstMap<ExtMachInst>; 2829376Sgblack@eecs.umich.edu instCacheMap[m5Reg] = instMap; 2839376Sgblack@eecs.umich.edu } 2849023Sgblack@eecs.umich.edu } 2859023Sgblack@eecs.umich.edu 2869478Snilay@cs.wisc.edu void takeOverFrom(Decoder *old) 2879478Snilay@cs.wisc.edu { 2889478Snilay@cs.wisc.edu mode = old->mode; 2899478Snilay@cs.wisc.edu submode = old->submode; 2909478Snilay@cs.wisc.edu emi.mode.mode = mode; 2919478Snilay@cs.wisc.edu emi.mode.submode = submode; 2929478Snilay@cs.wisc.edu altOp = old->altOp; 2939478Snilay@cs.wisc.edu defOp = old->defOp; 2949478Snilay@cs.wisc.edu altAddr = old->altAddr; 2959478Snilay@cs.wisc.edu defAddr = old->defAddr; 2969478Snilay@cs.wisc.edu stack = old->stack; 2979478Snilay@cs.wisc.edu } 2989478Snilay@cs.wisc.edu 2999023Sgblack@eecs.umich.edu void reset() 3009023Sgblack@eecs.umich.edu { 3019023Sgblack@eecs.umich.edu state = ResetState; 3029023Sgblack@eecs.umich.edu } 3039023Sgblack@eecs.umich.edu 3049023Sgblack@eecs.umich.edu void process(); 3059023Sgblack@eecs.umich.edu 3069023Sgblack@eecs.umich.edu //Use this to give data to the decoder. This should be used 3079023Sgblack@eecs.umich.edu //when there is control flow. 3089023Sgblack@eecs.umich.edu void moreBytes(const PCState &pc, Addr fetchPC, MachInst data) 3099023Sgblack@eecs.umich.edu { 3109023Sgblack@eecs.umich.edu DPRINTF(Decoder, "Getting more bytes.\n"); 3119023Sgblack@eecs.umich.edu basePC = fetchPC; 3129023Sgblack@eecs.umich.edu offset = (fetchPC >= pc.instAddr()) ? 0 : pc.instAddr() - fetchPC; 3139023Sgblack@eecs.umich.edu fetchChunk = data; 3149023Sgblack@eecs.umich.edu outOfBytes = false; 3159023Sgblack@eecs.umich.edu process(); 3169023Sgblack@eecs.umich.edu } 3179023Sgblack@eecs.umich.edu 3189023Sgblack@eecs.umich.edu bool needMoreBytes() 3199023Sgblack@eecs.umich.edu { 3209023Sgblack@eecs.umich.edu return outOfBytes; 3219023Sgblack@eecs.umich.edu } 3229023Sgblack@eecs.umich.edu 3239023Sgblack@eecs.umich.edu bool instReady() 3249023Sgblack@eecs.umich.edu { 3259023Sgblack@eecs.umich.edu return instDone; 3269023Sgblack@eecs.umich.edu } 3279023Sgblack@eecs.umich.edu 3289023Sgblack@eecs.umich.edu void 3299023Sgblack@eecs.umich.edu updateNPC(X86ISA::PCState &nextPC) 3309023Sgblack@eecs.umich.edu { 3319023Sgblack@eecs.umich.edu if (!nextPC.size()) { 3329023Sgblack@eecs.umich.edu int size = basePC + offset - origPC; 3339023Sgblack@eecs.umich.edu DPRINTF(Decoder, 3349023Sgblack@eecs.umich.edu "Calculating the instruction size: " 3359023Sgblack@eecs.umich.edu "basePC: %#x offset: %#x origPC: %#x size: %d\n", 3369023Sgblack@eecs.umich.edu basePC, offset, origPC, size); 3379023Sgblack@eecs.umich.edu nextPC.size(size); 3389023Sgblack@eecs.umich.edu nextPC.npc(nextPC.pc() + size); 3399023Sgblack@eecs.umich.edu } 3409023Sgblack@eecs.umich.edu } 3419023Sgblack@eecs.umich.edu 3429022Sgblack@eecs.umich.edu public: 3439022Sgblack@eecs.umich.edu StaticInstPtr decodeInst(ExtMachInst mach_inst); 3449022Sgblack@eecs.umich.edu 3459022Sgblack@eecs.umich.edu /// Decode a machine instruction. 3469022Sgblack@eecs.umich.edu /// @param mach_inst The binary instruction to decode. 3479022Sgblack@eecs.umich.edu /// @retval A pointer to the corresponding StaticInst object. 3489024Sgblack@eecs.umich.edu StaticInstPtr decode(ExtMachInst mach_inst, Addr addr); 3499376Sgblack@eecs.umich.edu StaticInstPtr decode(X86ISA::PCState &nextPC); 3509022Sgblack@eecs.umich.edu}; 3519020Sgblack@eecs.umich.edu 3529020Sgblack@eecs.umich.edu} // namespace X86ISA 3539020Sgblack@eecs.umich.edu 3549020Sgblack@eecs.umich.edu#endif // __ARCH_X86_DECODER_HH__ 355