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 &current, 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
22513613Sgabeblack@google.com    typedef RegVal 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    {
24212895Sjason@lowepower.com        emi.reset();
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