decoder.hh revision 10924
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>
359376Sgblack@eecs.umich.edu#include <vector>
369023Sgblack@eecs.umich.edu
379023Sgblack@eecs.umich.edu#include "arch/x86/regs/misc.hh"
389023Sgblack@eecs.umich.edu#include "arch/x86/types.hh"
399023Sgblack@eecs.umich.edu#include "base/bitfield.hh"
409023Sgblack@eecs.umich.edu#include "base/misc.hh"
419023Sgblack@eecs.umich.edu#include "base/trace.hh"
429023Sgblack@eecs.umich.edu#include "base/types.hh"
439022Sgblack@eecs.umich.edu#include "cpu/decode_cache.hh"
449024Sgblack@eecs.umich.edu#include "cpu/static_inst.hh"
459023Sgblack@eecs.umich.edu#include "debug/Decoder.hh"
469023Sgblack@eecs.umich.edu
479020Sgblack@eecs.umich.edunamespace X86ISA
489020Sgblack@eecs.umich.edu{
499020Sgblack@eecs.umich.edu
509022Sgblack@eecs.umich.educlass Decoder
519022Sgblack@eecs.umich.edu{
529023Sgblack@eecs.umich.edu  private:
539023Sgblack@eecs.umich.edu    //These are defined and documented in decoder_tables.cc
549023Sgblack@eecs.umich.edu    static const uint8_t SizeTypeToSize[3][10];
5510593Sgabeblack@google.com    typedef const uint8_t ByteTable[256];
5610593Sgabeblack@google.com    static ByteTable Prefixes;
5710593Sgabeblack@google.com
5810593Sgabeblack@google.com    static ByteTable UsesModRMOneByte;
5910593Sgabeblack@google.com    static ByteTable UsesModRMTwoByte;
6010593Sgabeblack@google.com    static ByteTable UsesModRMThreeByte0F38;
6110593Sgabeblack@google.com    static ByteTable UsesModRMThreeByte0F3A;
6210593Sgabeblack@google.com
6310593Sgabeblack@google.com    static ByteTable ImmediateTypeOneByte;
6410593Sgabeblack@google.com    static ByteTable ImmediateTypeTwoByte;
6510593Sgabeblack@google.com    static ByteTable ImmediateTypeThreeByte0F38;
6610593Sgabeblack@google.com    static ByteTable ImmediateTypeThreeByte0F3A;
6710924Snilay@cs.wisc.edu    static ByteTable ImmediateTypeVex[10];
689023Sgblack@eecs.umich.edu
699023Sgblack@eecs.umich.edu  protected:
709376Sgblack@eecs.umich.edu    struct InstBytes
719376Sgblack@eecs.umich.edu    {
729376Sgblack@eecs.umich.edu        StaticInstPtr si;
739376Sgblack@eecs.umich.edu        std::vector<MachInst> chunks;
749376Sgblack@eecs.umich.edu        std::vector<MachInst> masks;
759376Sgblack@eecs.umich.edu        int lastOffset;
769376Sgblack@eecs.umich.edu
779376Sgblack@eecs.umich.edu        InstBytes() : lastOffset(0)
789376Sgblack@eecs.umich.edu        {}
799376Sgblack@eecs.umich.edu    };
809376Sgblack@eecs.umich.edu
819376Sgblack@eecs.umich.edu    static InstBytes dummy;
829376Sgblack@eecs.umich.edu
839023Sgblack@eecs.umich.edu    //The bytes to be predecoded
849023Sgblack@eecs.umich.edu    MachInst fetchChunk;
859376Sgblack@eecs.umich.edu    InstBytes *instBytes;
869376Sgblack@eecs.umich.edu    int chunkIdx;
879023Sgblack@eecs.umich.edu    //The pc of the start of fetchChunk
889023Sgblack@eecs.umich.edu    Addr basePC;
899023Sgblack@eecs.umich.edu    //The pc the current instruction started at
909023Sgblack@eecs.umich.edu    Addr origPC;
919023Sgblack@eecs.umich.edu    //The offset into fetchChunk of current processing
929023Sgblack@eecs.umich.edu    int offset;
939023Sgblack@eecs.umich.edu    //The extended machine instruction being generated
949023Sgblack@eecs.umich.edu    ExtMachInst emi;
959376Sgblack@eecs.umich.edu    //Predecoding state
969376Sgblack@eecs.umich.edu    X86Mode mode;
979376Sgblack@eecs.umich.edu    X86SubMode submode;
989376Sgblack@eecs.umich.edu    uint8_t altOp;
999376Sgblack@eecs.umich.edu    uint8_t defOp;
1009376Sgblack@eecs.umich.edu    uint8_t altAddr;
1019376Sgblack@eecs.umich.edu    uint8_t defAddr;
1029376Sgblack@eecs.umich.edu    uint8_t stack;
1039023Sgblack@eecs.umich.edu
1049376Sgblack@eecs.umich.edu    uint8_t getNextByte()
1059023Sgblack@eecs.umich.edu    {
1069023Sgblack@eecs.umich.edu        return ((uint8_t *)&fetchChunk)[offset];
1079023Sgblack@eecs.umich.edu    }
1089023Sgblack@eecs.umich.edu
1099023Sgblack@eecs.umich.edu    void getImmediate(int &collected, uint64_t &current, int size)
1109023Sgblack@eecs.umich.edu    {
1119023Sgblack@eecs.umich.edu        //Figure out how many bytes we still need to get for the
1129023Sgblack@eecs.umich.edu        //immediate.
1139023Sgblack@eecs.umich.edu        int toGet = size - collected;
1149023Sgblack@eecs.umich.edu        //Figure out how many bytes are left in our "buffer"
1159023Sgblack@eecs.umich.edu        int remaining = sizeof(MachInst) - offset;
1169023Sgblack@eecs.umich.edu        //Get as much as we need, up to the amount available.
1179023Sgblack@eecs.umich.edu        toGet = toGet > remaining ? remaining : toGet;
1189023Sgblack@eecs.umich.edu
1199023Sgblack@eecs.umich.edu        //Shift the bytes we want to be all the way to the right
1209023Sgblack@eecs.umich.edu        uint64_t partialImm = fetchChunk >> (offset * 8);
1219023Sgblack@eecs.umich.edu        //Mask off what we don't want
1229023Sgblack@eecs.umich.edu        partialImm &= mask(toGet * 8);
1239023Sgblack@eecs.umich.edu        //Shift it over to overlay with our displacement.
1249023Sgblack@eecs.umich.edu        partialImm <<= (immediateCollected * 8);
1259023Sgblack@eecs.umich.edu        //Put it into our displacement
1269023Sgblack@eecs.umich.edu        current |= partialImm;
1279023Sgblack@eecs.umich.edu        //Update how many bytes we've collected.
1289023Sgblack@eecs.umich.edu        collected += toGet;
1299023Sgblack@eecs.umich.edu        consumeBytes(toGet);
1309023Sgblack@eecs.umich.edu    }
1319023Sgblack@eecs.umich.edu
1329376Sgblack@eecs.umich.edu    void updateOffsetState()
1339376Sgblack@eecs.umich.edu    {
1349376Sgblack@eecs.umich.edu        assert(offset <= sizeof(MachInst));
1359376Sgblack@eecs.umich.edu        if (offset == sizeof(MachInst)) {
1369376Sgblack@eecs.umich.edu            DPRINTF(Decoder, "At the end of a chunk, idx = %d, chunks = %d.\n",
1379376Sgblack@eecs.umich.edu                    chunkIdx, instBytes->chunks.size());
1389376Sgblack@eecs.umich.edu            chunkIdx++;
1399376Sgblack@eecs.umich.edu            if (chunkIdx == instBytes->chunks.size()) {
1409376Sgblack@eecs.umich.edu                outOfBytes = true;
1419376Sgblack@eecs.umich.edu            } else {
1429376Sgblack@eecs.umich.edu                offset = 0;
1439376Sgblack@eecs.umich.edu                fetchChunk = instBytes->chunks[chunkIdx];
1449376Sgblack@eecs.umich.edu                basePC += sizeof(MachInst);
1459376Sgblack@eecs.umich.edu            }
1469376Sgblack@eecs.umich.edu        }
1479376Sgblack@eecs.umich.edu    }
1489376Sgblack@eecs.umich.edu
1499376Sgblack@eecs.umich.edu    void consumeByte()
1509023Sgblack@eecs.umich.edu    {
1519023Sgblack@eecs.umich.edu        offset++;
1529376Sgblack@eecs.umich.edu        updateOffsetState();
1539023Sgblack@eecs.umich.edu    }
1549023Sgblack@eecs.umich.edu
1559376Sgblack@eecs.umich.edu    void consumeBytes(int numBytes)
1569023Sgblack@eecs.umich.edu    {
1579023Sgblack@eecs.umich.edu        offset += numBytes;
1589376Sgblack@eecs.umich.edu        updateOffsetState();
1599023Sgblack@eecs.umich.edu    }
1609023Sgblack@eecs.umich.edu
1619023Sgblack@eecs.umich.edu    //State machine state
1629023Sgblack@eecs.umich.edu  protected:
1639023Sgblack@eecs.umich.edu    //Whether or not we're out of bytes
1649023Sgblack@eecs.umich.edu    bool outOfBytes;
1659023Sgblack@eecs.umich.edu    //Whether we've completed generating an ExtMachInst
1669023Sgblack@eecs.umich.edu    bool instDone;
1679023Sgblack@eecs.umich.edu    //The size of the displacement value
1689023Sgblack@eecs.umich.edu    int displacementSize;
1699023Sgblack@eecs.umich.edu    //The size of the immediate value
1709023Sgblack@eecs.umich.edu    int immediateSize;
1719023Sgblack@eecs.umich.edu    //This is how much of any immediate value we've gotten. This is used
1729023Sgblack@eecs.umich.edu    //for both the actual immediate and the displacement.
1739023Sgblack@eecs.umich.edu    int immediateCollected;
1749023Sgblack@eecs.umich.edu
1759023Sgblack@eecs.umich.edu    enum State {
1769023Sgblack@eecs.umich.edu        ResetState,
1779376Sgblack@eecs.umich.edu        FromCacheState,
1789023Sgblack@eecs.umich.edu        PrefixState,
17910924Snilay@cs.wisc.edu        TwoByteVexState,
18010924Snilay@cs.wisc.edu        ThreeByteVexFirstState,
18110924Snilay@cs.wisc.edu        ThreeByteVexSecondState,
18210593Sgabeblack@google.com        OneByteOpcodeState,
18310593Sgabeblack@google.com        TwoByteOpcodeState,
18410593Sgabeblack@google.com        ThreeByte0F38OpcodeState,
18510593Sgabeblack@google.com        ThreeByte0F3AOpcodeState,
1869023Sgblack@eecs.umich.edu        ModRMState,
1879023Sgblack@eecs.umich.edu        SIBState,
1889023Sgblack@eecs.umich.edu        DisplacementState,
1899023Sgblack@eecs.umich.edu        ImmediateState,
1909023Sgblack@eecs.umich.edu        //We should never get to this state. Getting here is an error.
1919023Sgblack@eecs.umich.edu        ErrorState
1929023Sgblack@eecs.umich.edu    };
1939023Sgblack@eecs.umich.edu
1949023Sgblack@eecs.umich.edu    State state;
1959023Sgblack@eecs.umich.edu
1969023Sgblack@eecs.umich.edu    //Functions to handle each of the states
1979376Sgblack@eecs.umich.edu    State doResetState();
1989376Sgblack@eecs.umich.edu    State doFromCacheState();
1999023Sgblack@eecs.umich.edu    State doPrefixState(uint8_t);
20010924Snilay@cs.wisc.edu    State doTwoByteVexState(uint8_t);
20110924Snilay@cs.wisc.edu    State doThreeByteVexFirstState(uint8_t);
20210924Snilay@cs.wisc.edu    State doThreeByteVexSecondState(uint8_t);
20310593Sgabeblack@google.com    State doOneByteOpcodeState(uint8_t);
20410593Sgabeblack@google.com    State doTwoByteOpcodeState(uint8_t);
20510593Sgabeblack@google.com    State doThreeByte0F38OpcodeState(uint8_t);
20610593Sgabeblack@google.com    State doThreeByte0F3AOpcodeState(uint8_t);
2079023Sgblack@eecs.umich.edu    State doModRMState(uint8_t);
2089023Sgblack@eecs.umich.edu    State doSIBState(uint8_t);
2099023Sgblack@eecs.umich.edu    State doDisplacementState();
2109023Sgblack@eecs.umich.edu    State doImmediateState();
2119023Sgblack@eecs.umich.edu
21210593Sgabeblack@google.com    //Process the actual opcode found earlier, using the supplied tables.
21310593Sgabeblack@google.com    State processOpcode(ByteTable &immTable, ByteTable &modrmTable,
21410593Sgabeblack@google.com                        bool addrSizedImm = false);
21510924Snilay@cs.wisc.edu    // Process the opcode found with VEX / XOP prefix.
21610924Snilay@cs.wisc.edu    State processExtendedOpcode(ByteTable &immTable);
21710593Sgabeblack@google.com
2189376Sgblack@eecs.umich.edu  protected:
2199376Sgblack@eecs.umich.edu    /// Caching for decoded instruction objects.
2209376Sgblack@eecs.umich.edu
2219376Sgblack@eecs.umich.edu    typedef MiscReg CacheKey;
2229376Sgblack@eecs.umich.edu
2239376Sgblack@eecs.umich.edu    typedef DecodeCache::AddrMap<Decoder::InstBytes> DecodePages;
2249376Sgblack@eecs.umich.edu    DecodePages *decodePages;
2259376Sgblack@eecs.umich.edu    typedef m5::hash_map<CacheKey, DecodePages *> AddrCacheMap;
2269376Sgblack@eecs.umich.edu    AddrCacheMap addrCacheMap;
2279376Sgblack@eecs.umich.edu
2289376Sgblack@eecs.umich.edu    DecodeCache::InstMap *instMap;
2299376Sgblack@eecs.umich.edu    typedef m5::hash_map<CacheKey, DecodeCache::InstMap *> InstCacheMap;
2309376Sgblack@eecs.umich.edu    static InstCacheMap instCacheMap;
2319376Sgblack@eecs.umich.edu
2329023Sgblack@eecs.umich.edu  public:
2339377Sgblack@eecs.umich.edu    Decoder() : basePC(0), origPC(0), offset(0),
2349023Sgblack@eecs.umich.edu        outOfBytes(true), instDone(false),
2359023Sgblack@eecs.umich.edu        state(ResetState)
2369023Sgblack@eecs.umich.edu    {
2379037Sgblack@eecs.umich.edu        memset(&emi, 0, sizeof(emi));
2389376Sgblack@eecs.umich.edu        mode = LongMode;
2399376Sgblack@eecs.umich.edu        submode = SixtyFourBitMode;
2409376Sgblack@eecs.umich.edu        emi.mode.mode = mode;
2419376Sgblack@eecs.umich.edu        emi.mode.submode = submode;
2429376Sgblack@eecs.umich.edu        altOp = 0;
2439376Sgblack@eecs.umich.edu        defOp = 0;
2449376Sgblack@eecs.umich.edu        altAddr = 0;
2459376Sgblack@eecs.umich.edu        defAddr = 0;
2469376Sgblack@eecs.umich.edu        stack = 0;
2479376Sgblack@eecs.umich.edu        instBytes = &dummy;
2489376Sgblack@eecs.umich.edu        decodePages = NULL;
2499376Sgblack@eecs.umich.edu        instMap = NULL;
2509376Sgblack@eecs.umich.edu    }
2519376Sgblack@eecs.umich.edu
2529376Sgblack@eecs.umich.edu    void setM5Reg(HandyM5Reg m5Reg)
2539376Sgblack@eecs.umich.edu    {
2549376Sgblack@eecs.umich.edu        mode = (X86Mode)(uint64_t)m5Reg.mode;
2559376Sgblack@eecs.umich.edu        submode = (X86SubMode)(uint64_t)m5Reg.submode;
2569376Sgblack@eecs.umich.edu        emi.mode.mode = mode;
2579376Sgblack@eecs.umich.edu        emi.mode.submode = submode;
2589376Sgblack@eecs.umich.edu        altOp = m5Reg.altOp;
2599376Sgblack@eecs.umich.edu        defOp = m5Reg.defOp;
2609376Sgblack@eecs.umich.edu        altAddr = m5Reg.altAddr;
2619376Sgblack@eecs.umich.edu        defAddr = m5Reg.defAddr;
2629376Sgblack@eecs.umich.edu        stack = m5Reg.stack;
2639376Sgblack@eecs.umich.edu
2649376Sgblack@eecs.umich.edu        AddrCacheMap::iterator amIter = addrCacheMap.find(m5Reg);
2659376Sgblack@eecs.umich.edu        if (amIter != addrCacheMap.end()) {
2669376Sgblack@eecs.umich.edu            decodePages = amIter->second;
2679376Sgblack@eecs.umich.edu        } else {
2689376Sgblack@eecs.umich.edu            decodePages = new DecodePages;
2699376Sgblack@eecs.umich.edu            addrCacheMap[m5Reg] = decodePages;
2709376Sgblack@eecs.umich.edu        }
2719376Sgblack@eecs.umich.edu
2729376Sgblack@eecs.umich.edu        InstCacheMap::iterator imIter = instCacheMap.find(m5Reg);
2739376Sgblack@eecs.umich.edu        if (imIter != instCacheMap.end()) {
2749376Sgblack@eecs.umich.edu            instMap = imIter->second;
2759376Sgblack@eecs.umich.edu        } else {
2769376Sgblack@eecs.umich.edu            instMap = new DecodeCache::InstMap;
2779376Sgblack@eecs.umich.edu            instCacheMap[m5Reg] = instMap;
2789376Sgblack@eecs.umich.edu        }
2799023Sgblack@eecs.umich.edu    }
2809023Sgblack@eecs.umich.edu
2819478Snilay@cs.wisc.edu    void takeOverFrom(Decoder *old)
2829478Snilay@cs.wisc.edu    {
2839478Snilay@cs.wisc.edu        mode = old->mode;
2849478Snilay@cs.wisc.edu        submode = old->submode;
2859478Snilay@cs.wisc.edu        emi.mode.mode = mode;
2869478Snilay@cs.wisc.edu        emi.mode.submode = submode;
2879478Snilay@cs.wisc.edu        altOp = old->altOp;
2889478Snilay@cs.wisc.edu        defOp = old->defOp;
2899478Snilay@cs.wisc.edu        altAddr = old->altAddr;
2909478Snilay@cs.wisc.edu        defAddr = old->defAddr;
2919478Snilay@cs.wisc.edu        stack = old->stack;
2929478Snilay@cs.wisc.edu    }
2939478Snilay@cs.wisc.edu
2949023Sgblack@eecs.umich.edu    void reset()
2959023Sgblack@eecs.umich.edu    {
2969023Sgblack@eecs.umich.edu        state = ResetState;
2979023Sgblack@eecs.umich.edu    }
2989023Sgblack@eecs.umich.edu
2999023Sgblack@eecs.umich.edu    void process();
3009023Sgblack@eecs.umich.edu
3019023Sgblack@eecs.umich.edu    //Use this to give data to the decoder. This should be used
3029023Sgblack@eecs.umich.edu    //when there is control flow.
3039023Sgblack@eecs.umich.edu    void moreBytes(const PCState &pc, Addr fetchPC, MachInst data)
3049023Sgblack@eecs.umich.edu    {
3059023Sgblack@eecs.umich.edu        DPRINTF(Decoder, "Getting more bytes.\n");
3069023Sgblack@eecs.umich.edu        basePC = fetchPC;
3079023Sgblack@eecs.umich.edu        offset = (fetchPC >= pc.instAddr()) ? 0 : pc.instAddr() - fetchPC;
3089023Sgblack@eecs.umich.edu        fetchChunk = data;
3099023Sgblack@eecs.umich.edu        outOfBytes = false;
3109023Sgblack@eecs.umich.edu        process();
3119023Sgblack@eecs.umich.edu    }
3129023Sgblack@eecs.umich.edu
3139023Sgblack@eecs.umich.edu    bool needMoreBytes()
3149023Sgblack@eecs.umich.edu    {
3159023Sgblack@eecs.umich.edu        return outOfBytes;
3169023Sgblack@eecs.umich.edu    }
3179023Sgblack@eecs.umich.edu
3189023Sgblack@eecs.umich.edu    bool instReady()
3199023Sgblack@eecs.umich.edu    {
3209023Sgblack@eecs.umich.edu        return instDone;
3219023Sgblack@eecs.umich.edu    }
3229023Sgblack@eecs.umich.edu
3239023Sgblack@eecs.umich.edu    void
3249023Sgblack@eecs.umich.edu    updateNPC(X86ISA::PCState &nextPC)
3259023Sgblack@eecs.umich.edu    {
3269023Sgblack@eecs.umich.edu        if (!nextPC.size()) {
3279023Sgblack@eecs.umich.edu            int size = basePC + offset - origPC;
3289023Sgblack@eecs.umich.edu            DPRINTF(Decoder,
3299023Sgblack@eecs.umich.edu                    "Calculating the instruction size: "
3309023Sgblack@eecs.umich.edu                    "basePC: %#x offset: %#x origPC: %#x size: %d\n",
3319023Sgblack@eecs.umich.edu                    basePC, offset, origPC, size);
3329023Sgblack@eecs.umich.edu            nextPC.size(size);
3339023Sgblack@eecs.umich.edu            nextPC.npc(nextPC.pc() + size);
3349023Sgblack@eecs.umich.edu        }
3359023Sgblack@eecs.umich.edu    }
3369023Sgblack@eecs.umich.edu
3379022Sgblack@eecs.umich.edu  public:
3389022Sgblack@eecs.umich.edu    StaticInstPtr decodeInst(ExtMachInst mach_inst);
3399022Sgblack@eecs.umich.edu
3409022Sgblack@eecs.umich.edu    /// Decode a machine instruction.
3419022Sgblack@eecs.umich.edu    /// @param mach_inst The binary instruction to decode.
3429022Sgblack@eecs.umich.edu    /// @retval A pointer to the corresponding StaticInst object.
3439024Sgblack@eecs.umich.edu    StaticInstPtr decode(ExtMachInst mach_inst, Addr addr);
3449376Sgblack@eecs.umich.edu    StaticInstPtr decode(X86ISA::PCState &nextPC);
3459022Sgblack@eecs.umich.edu};
3469020Sgblack@eecs.umich.edu
3479020Sgblack@eecs.umich.edu} // namespace X86ISA
3489020Sgblack@eecs.umich.edu
3499020Sgblack@eecs.umich.edu#endif // __ARCH_X86_DECODER_HH__
350