12SN/A/*
213610Sgiacomo.gabrielli@arm.com * Copyright (c) 2011-2012, 2016-2018 ARM Limited
39920Syasuko.eckert@amd.com * Copyright (c) 2013 Advanced Micro Devices, Inc.
48733Sgeoffrey.blake@arm.com * All rights reserved
58733Sgeoffrey.blake@arm.com *
68733Sgeoffrey.blake@arm.com * The license below extends only to copyright in the software and shall
78733Sgeoffrey.blake@arm.com * not be construed as granting a license to any other intellectual
88733Sgeoffrey.blake@arm.com * property including but not limited to intellectual property relating
98733Sgeoffrey.blake@arm.com * to a hardware implementation of the functionality of the software
108733Sgeoffrey.blake@arm.com * licensed hereunder.  You may use the software subject to the license
118733Sgeoffrey.blake@arm.com * terms below provided that you ensure that this notice is replicated
128733Sgeoffrey.blake@arm.com * unmodified and in its entirety in all distributions of the software,
138733Sgeoffrey.blake@arm.com * modified or unmodified, in source code or in binary form.
148733Sgeoffrey.blake@arm.com *
152188SN/A * Copyright (c) 2001-2006 The Regents of The University of Michigan
162SN/A * All rights reserved.
172SN/A *
182SN/A * Redistribution and use in source and binary forms, with or without
192SN/A * modification, are permitted provided that the following conditions are
202SN/A * met: redistributions of source code must retain the above copyright
212SN/A * notice, this list of conditions and the following disclaimer;
222SN/A * redistributions in binary form must reproduce the above copyright
232SN/A * notice, this list of conditions and the following disclaimer in the
242SN/A * documentation and/or other materials provided with the distribution;
252SN/A * neither the name of the copyright holders nor the names of its
262SN/A * contributors may be used to endorse or promote products derived from
272SN/A * this software without specific prior written permission.
282SN/A *
292SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
302SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
312SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
322SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
332SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
342SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
352SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
362SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
372SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
382SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
392SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
402665SN/A *
412665SN/A * Authors: Steve Reinhardt
422665SN/A *          Nathan Binkert
432SN/A */
442SN/A
452683Sktlim@umich.edu#ifndef __CPU_SIMPLE_THREAD_HH__
462683Sktlim@umich.edu#define __CPU_SIMPLE_THREAD_HH__
472SN/A
489020Sgblack@eecs.umich.edu#include "arch/decoder.hh"
4912406Sgabeblack@google.com#include "arch/generic/tlb.hh"
506313Sgblack@eecs.umich.edu#include "arch/isa.hh"
512190SN/A#include "arch/isa_traits.hh"
526329Sgblack@eecs.umich.edu#include "arch/registers.hh"
536316Sgblack@eecs.umich.edu#include "arch/types.hh"
546216Snate@binkert.org#include "base/types.hh"
556658Snate@binkert.org#include "config/the_isa.hh"
562680SN/A#include "cpu/thread_context.hh"
572683Sktlim@umich.edu#include "cpu/thread_state.hh"
589920Syasuko.eckert@amd.com#include "debug/CCRegs.hh"
598232Snate@binkert.org#include "debug/FloatRegs.hh"
608232Snate@binkert.org#include "debug/IntRegs.hh"
6113610Sgiacomo.gabrielli@arm.com#include "debug/VecPredRegs.hh"
6212109SRekai.GonzalezAlberquilla@arm.com#include "debug/VecRegs.hh"
638777Sgblack@eecs.umich.edu#include "mem/page_table.hh"
642395SN/A#include "mem/request.hh"
652190SN/A#include "sim/byteswap.hh"
662188SN/A#include "sim/eventq.hh"
678777Sgblack@eecs.umich.edu#include "sim/process.hh"
68217SN/A#include "sim/serialize.hh"
698777Sgblack@eecs.umich.edu#include "sim/system.hh"
702SN/A
712SN/Aclass BaseCPU;
728887Sgeoffrey.blake@arm.comclass CheckerCPU;
731070SN/A
741917SN/Aclass FunctionProfile;
751917SN/Aclass ProfileNode;
762521SN/A
7713905Sgabeblack@google.comnamespace Kernel {
7813905Sgabeblack@google.com    class Statistics;
798902Sandreas.hansson@arm.com}
802330SN/A
812683Sktlim@umich.edu/**
822683Sktlim@umich.edu * The SimpleThread object provides a combination of the ThreadState
832683Sktlim@umich.edu * object and the ThreadContext interface. It implements the
8413865Sgabeblack@google.com * ThreadContext interface and adds to the ThreadState object by adding all
852683Sktlim@umich.edu * the objects needed for simple functional execution, including a
862683Sktlim@umich.edu * simple architectural register file, and pointers to the ITB and DTB
872683Sktlim@umich.edu * in full system mode. For CPU models that do not need more advanced
882683Sktlim@umich.edu * ways to hold state (i.e. a separate physical register file, or
892683Sktlim@umich.edu * separate fetch and commit PC's), this SimpleThread class provides
902683Sktlim@umich.edu * all the necessary state for full architecture-level functional
912683Sktlim@umich.edu * simulation.  See the AtomicSimpleCPU or TimingSimpleCPU for
922683Sktlim@umich.edu * examples.
932683Sktlim@umich.edu */
942SN/A
9513865Sgabeblack@google.comclass SimpleThread : public ThreadState, public ThreadContext
962SN/A{
972107SN/A  protected:
982107SN/A    typedef TheISA::MachInst MachInst;
9912109SRekai.GonzalezAlberquilla@arm.com    using VecRegContainer = TheISA::VecRegContainer;
10012109SRekai.GonzalezAlberquilla@arm.com    using VecElem = TheISA::VecElem;
10113610Sgiacomo.gabrielli@arm.com    using VecPredRegContainer = TheISA::VecPredRegContainer;
1022SN/A  public:
1032680SN/A    typedef ThreadContext::Status Status;
1042SN/A
1052190SN/A  protected:
10613557Sgabeblack@google.com    RegVal floatRegs[TheISA::NumFloatRegs];
10713557Sgabeblack@google.com    RegVal intRegs[TheISA::NumIntRegs];
10812109SRekai.GonzalezAlberquilla@arm.com    VecRegContainer vecRegs[TheISA::NumVecRegs];
10913610Sgiacomo.gabrielli@arm.com    VecPredRegContainer vecPredRegs[TheISA::NumVecPredRegs];
1109920Syasuko.eckert@amd.com#ifdef ISA_HAS_CC_REGS
11113622Sgabeblack@google.com    RegVal ccRegs[TheISA::NumCCRegs];
1129920Syasuko.eckert@amd.com#endif
1139384SAndreas.Sandberg@arm.com    TheISA::ISA *const isa;    // one "instance" of the current ISA.
1142SN/A
1157720Sgblack@eecs.umich.edu    TheISA::PCState _pcState;
1166324Sgblack@eecs.umich.edu
1177597Sminkyu.jeong@arm.com    /** Did this instruction execute or is it predicated false */
1187597Sminkyu.jeong@arm.com    bool predicate;
1197597Sminkyu.jeong@arm.com
12013953Sgiacomo.gabrielli@arm.com    /** True if the memory access should be skipped for this instruction */
12113953Sgiacomo.gabrielli@arm.com    bool memAccPredicate;
12213953Sgiacomo.gabrielli@arm.com
1232190SN/A  public:
1248357Sksewell@umich.edu    std::string name() const
1258357Sksewell@umich.edu    {
12613865Sgabeblack@google.com        return csprintf("%s.[tid:%i]", baseCpu->name(), threadId());
1278357Sksewell@umich.edu    }
1288357Sksewell@umich.edu
1292378SN/A    System *system;
1302400SN/A
13112406Sgabeblack@google.com    BaseTLB *itb;
13212406Sgabeblack@google.com    BaseTLB *dtb;
1332SN/A
1349020Sgblack@eecs.umich.edu    TheISA::Decoder decoder;
1358541Sgblack@eecs.umich.edu
1362683Sktlim@umich.edu    // constructor: initialize SimpleThread from given process structure
1378793Sgblack@eecs.umich.edu    // FS
1382683Sktlim@umich.edu    SimpleThread(BaseCPU *_cpu, int _thread_num, System *_system,
13912406Sgabeblack@google.com                 BaseTLB *_itb, BaseTLB *_dtb, TheISA::ISA *_isa,
1402683Sktlim@umich.edu                 bool use_kernel_stats = true);
1418793Sgblack@eecs.umich.edu    // SE
1428820Sgblack@eecs.umich.edu    SimpleThread(BaseCPU *_cpu, int _thread_num, System *_system,
14312406Sgabeblack@google.com                 Process *_process, BaseTLB *_itb, BaseTLB *_dtb,
1449384SAndreas.Sandberg@arm.com                 TheISA::ISA *_isa);
1452862Sktlim@umich.edu
14613865Sgabeblack@google.com    virtual ~SimpleThread() {}
1472SN/A
14813865Sgabeblack@google.com    void takeOverFrom(ThreadContext *oldContext) override;
149180SN/A
15013865Sgabeblack@google.com    void regStats(const std::string &name) override;
1512SN/A
1522862Sktlim@umich.edu    void copyState(ThreadContext *oldContext);
1532862Sktlim@umich.edu
15411168Sandreas.hansson@arm.com    void serialize(CheckpointOut &cp) const override;
15511168Sandreas.hansson@arm.com    void unserialize(CheckpointIn &cp) override;
1569461Snilay@cs.wisc.edu    void startup();
157217SN/A
1582683Sktlim@umich.edu    /***************************************************************
1592683Sktlim@umich.edu     *  SimpleThread functions to provide CPU with access to various
1605891Sgblack@eecs.umich.edu     *  state.
1612683Sktlim@umich.edu     **************************************************************/
1622190SN/A
1632683Sktlim@umich.edu    /** Returns the pointer to this SimpleThread's ThreadContext. Used
1642683Sktlim@umich.edu     *  when a ThreadContext must be passed to objects outside of the
1652683Sktlim@umich.edu     *  CPU.
1662683Sktlim@umich.edu     */
16713865Sgabeblack@google.com    ThreadContext *getTC() { return this; }
1682190SN/A
1695358Sgblack@eecs.umich.edu    void demapPage(Addr vaddr, uint64_t asn)
1705358Sgblack@eecs.umich.edu    {
1715358Sgblack@eecs.umich.edu        itb->demapPage(vaddr, asn);
1725358Sgblack@eecs.umich.edu        dtb->demapPage(vaddr, asn);
1735358Sgblack@eecs.umich.edu    }
1745358Sgblack@eecs.umich.edu
1755358Sgblack@eecs.umich.edu    void demapInstPage(Addr vaddr, uint64_t asn)
1765358Sgblack@eecs.umich.edu    {
1775358Sgblack@eecs.umich.edu        itb->demapPage(vaddr, asn);
1785358Sgblack@eecs.umich.edu    }
1795358Sgblack@eecs.umich.edu
1805358Sgblack@eecs.umich.edu    void demapDataPage(Addr vaddr, uint64_t asn)
1815358Sgblack@eecs.umich.edu    {
1825358Sgblack@eecs.umich.edu        dtb->demapPage(vaddr, asn);
1835358Sgblack@eecs.umich.edu    }
1845358Sgblack@eecs.umich.edu
18513865Sgabeblack@google.com    void dumpFuncProfile() override;
1862521SN/A
1872683Sktlim@umich.edu    /*******************************************
1882683Sktlim@umich.edu     * ThreadContext interface functions.
1892683Sktlim@umich.edu     ******************************************/
1902683Sktlim@umich.edu
19113865Sgabeblack@google.com    BaseCPU *getCpuPtr() override { return baseCpu; }
1922683Sktlim@umich.edu
19313865Sgabeblack@google.com    int cpuId() const override { return ThreadState::cpuId(); }
19413865Sgabeblack@google.com    uint32_t socketId() const override { return ThreadState::socketId(); }
19513865Sgabeblack@google.com    int threadId() const override { return ThreadState::threadId(); }
19613865Sgabeblack@google.com    void setThreadId(int id) override { ThreadState::setThreadId(id); }
19713865Sgabeblack@google.com    ContextID contextId() const override { return ThreadState::contextId(); }
19813865Sgabeblack@google.com    void setContextId(ContextID id) override { ThreadState::setContextId(id); }
1992683Sktlim@umich.edu
20013865Sgabeblack@google.com    BaseTLB *getITBPtr() override { return itb; }
2012683Sktlim@umich.edu
20213865Sgabeblack@google.com    BaseTLB *getDTBPtr() override { return dtb; }
2038733Sgeoffrey.blake@arm.com
20413865Sgabeblack@google.com    CheckerCPU *getCheckerCpuPtr() override { return NULL; }
20513693Sgiacomo.gabrielli@arm.com
20613865Sgabeblack@google.com    TheISA::ISA *getIsaPtr() override { return isa; }
2078541Sgblack@eecs.umich.edu
20813865Sgabeblack@google.com    TheISA::Decoder *getDecoderPtr() override { return &decoder; }
2094997Sgblack@eecs.umich.edu
21013865Sgabeblack@google.com    System *getSystemPtr() override { return system; }
2112683Sktlim@umich.edu
21213905Sgabeblack@google.com    Kernel::Statistics *
21313875SAndrea.Mondelli@ucf.edu    getKernelStats() override
21413865Sgabeblack@google.com    {
21513865Sgabeblack@google.com        return ThreadState::getKernelStats();
21613865Sgabeblack@google.com    }
21713865Sgabeblack@google.com
21813875SAndrea.Mondelli@ucf.edu    PortProxy &getPhysProxy() override { return ThreadState::getPhysProxy(); }
21914022Sgabeblack@google.com    PortProxy &getVirtProxy() override { return ThreadState::getVirtProxy(); }
22013865Sgabeblack@google.com
22113875SAndrea.Mondelli@ucf.edu    void initMemProxies(ThreadContext *tc) override
22213875SAndrea.Mondelli@ucf.edu    {
22313875SAndrea.Mondelli@ucf.edu        ThreadState::initMemProxies(tc);
22413875SAndrea.Mondelli@ucf.edu    }
22513875SAndrea.Mondelli@ucf.edu
22613875SAndrea.Mondelli@ucf.edu    Process *getProcessPtr() override { return ThreadState::getProcessPtr(); }
22713865Sgabeblack@google.com    void setProcessPtr(Process *p) override { ThreadState::setProcessPtr(p); }
22813865Sgabeblack@google.com
22913865Sgabeblack@google.com    Status status() const override { return _status; }
23013865Sgabeblack@google.com
23113865Sgabeblack@google.com    void setStatus(Status newStatus) override { _status = newStatus; }
2322683Sktlim@umich.edu
23310407Smitch.hayenga@arm.com    /// Set the status to Active.
23413865Sgabeblack@google.com    void activate() override;
2352683Sktlim@umich.edu
2362683Sktlim@umich.edu    /// Set the status to Suspended.
23713865Sgabeblack@google.com    void suspend() override;
2382683Sktlim@umich.edu
2392683Sktlim@umich.edu    /// Set the status to Halted.
24013865Sgabeblack@google.com    void halt() override;
2412683Sktlim@umich.edu
24213865Sgabeblack@google.com    EndQuiesceEvent *
24313865Sgabeblack@google.com    getQuiesceEvent() override
24413865Sgabeblack@google.com    {
24513865Sgabeblack@google.com        return ThreadState::getQuiesceEvent();
24613865Sgabeblack@google.com    }
2472190SN/A
24813865Sgabeblack@google.com    Tick
24913865Sgabeblack@google.com    readLastActivate() override
25013865Sgabeblack@google.com    {
25113865Sgabeblack@google.com        return ThreadState::readLastActivate();
25213865Sgabeblack@google.com    }
25313865Sgabeblack@google.com    Tick
25413865Sgabeblack@google.com    readLastSuspend() override
25513865Sgabeblack@google.com    {
25613865Sgabeblack@google.com        return ThreadState::readLastSuspend();
25713865Sgabeblack@google.com    }
25813865Sgabeblack@google.com
25913865Sgabeblack@google.com    void profileClear() override { ThreadState::profileClear(); }
26013865Sgabeblack@google.com    void profileSample() override { ThreadState::profileSample(); }
26113865Sgabeblack@google.com
26213865Sgabeblack@google.com    void copyArchRegs(ThreadContext *tc) override;
26313865Sgabeblack@google.com
26413865Sgabeblack@google.com    void clearArchRegs() override
2656315Sgblack@eecs.umich.edu    {
2667720Sgblack@eecs.umich.edu        _pcState = 0;
2676316Sgblack@eecs.umich.edu        memset(intRegs, 0, sizeof(intRegs));
26813501Sgabeblack@google.com        memset(floatRegs, 0, sizeof(floatRegs));
26912109SRekai.GonzalezAlberquilla@arm.com        for (int i = 0; i < TheISA::NumVecRegs; i++) {
27012109SRekai.GonzalezAlberquilla@arm.com            vecRegs[i].zero();
27112109SRekai.GonzalezAlberquilla@arm.com        }
27213610Sgiacomo.gabrielli@arm.com        for (int i = 0; i < TheISA::NumVecPredRegs; i++) {
27313610Sgiacomo.gabrielli@arm.com            vecPredRegs[i].reset();
27413610Sgiacomo.gabrielli@arm.com        }
2759920Syasuko.eckert@amd.com#ifdef ISA_HAS_CC_REGS
2769920Syasuko.eckert@amd.com        memset(ccRegs, 0, sizeof(ccRegs));
2779920Syasuko.eckert@amd.com#endif
2789384SAndreas.Sandberg@arm.com        isa->clear();
2796315Sgblack@eecs.umich.edu    }
2802190SN/A
2812SN/A    //
2822SN/A    // New accessors for new decoder.
2832SN/A    //
28413557Sgabeblack@google.com    RegVal
28513865Sgabeblack@google.com    readIntReg(RegIndex reg_idx) const override
2862SN/A    {
2879384SAndreas.Sandberg@arm.com        int flatIndex = isa->flattenIntIndex(reg_idx);
2886323Sgblack@eecs.umich.edu        assert(flatIndex < TheISA::NumIntRegs);
2899426SAndreas.Sandberg@ARM.com        uint64_t regVal(readIntRegFlat(flatIndex));
2907601Sminkyu.jeong@arm.com        DPRINTF(IntRegs, "Reading int reg %d (%d) as %#x.\n",
2917601Sminkyu.jeong@arm.com                reg_idx, flatIndex, regVal);
2926418Sgblack@eecs.umich.edu        return regVal;
2932SN/A    }
2942SN/A
29513557Sgabeblack@google.com    RegVal
29613865Sgabeblack@google.com    readFloatReg(RegIndex reg_idx) const override
2972455SN/A    {
2989384SAndreas.Sandberg@arm.com        int flatIndex = isa->flattenFloatIndex(reg_idx);
2996323Sgblack@eecs.umich.edu        assert(flatIndex < TheISA::NumFloatRegs);
30013611Sgabeblack@google.com        RegVal regVal(readFloatRegFlat(flatIndex));
30113501Sgabeblack@google.com        DPRINTF(FloatRegs, "Reading float reg %d (%d) bits as %#x.\n",
30213501Sgabeblack@google.com                reg_idx, flatIndex, regVal);
3037341Sgblack@eecs.umich.edu        return regVal;
3042SN/A    }
3052SN/A
30612109SRekai.GonzalezAlberquilla@arm.com    const VecRegContainer&
30713865Sgabeblack@google.com    readVecReg(const RegId& reg) const override
30812109SRekai.GonzalezAlberquilla@arm.com    {
30912109SRekai.GonzalezAlberquilla@arm.com        int flatIndex = isa->flattenVecIndex(reg.index());
31012109SRekai.GonzalezAlberquilla@arm.com        assert(flatIndex < TheISA::NumVecRegs);
31112109SRekai.GonzalezAlberquilla@arm.com        const VecRegContainer& regVal = readVecRegFlat(flatIndex);
31212109SRekai.GonzalezAlberquilla@arm.com        DPRINTF(VecRegs, "Reading vector reg %d (%d) as %s.\n",
31313610Sgiacomo.gabrielli@arm.com                reg.index(), flatIndex, regVal.print());
31412109SRekai.GonzalezAlberquilla@arm.com        return regVal;
31512109SRekai.GonzalezAlberquilla@arm.com    }
31612109SRekai.GonzalezAlberquilla@arm.com
31712109SRekai.GonzalezAlberquilla@arm.com    VecRegContainer&
31813865Sgabeblack@google.com    getWritableVecReg(const RegId& reg) override
31912109SRekai.GonzalezAlberquilla@arm.com    {
32012109SRekai.GonzalezAlberquilla@arm.com        int flatIndex = isa->flattenVecIndex(reg.index());
32112109SRekai.GonzalezAlberquilla@arm.com        assert(flatIndex < TheISA::NumVecRegs);
32212109SRekai.GonzalezAlberquilla@arm.com        VecRegContainer& regVal = getWritableVecRegFlat(flatIndex);
32312109SRekai.GonzalezAlberquilla@arm.com        DPRINTF(VecRegs, "Reading vector reg %d (%d) as %s for modify.\n",
32413610Sgiacomo.gabrielli@arm.com                reg.index(), flatIndex, regVal.print());
32512109SRekai.GonzalezAlberquilla@arm.com        return regVal;
32612109SRekai.GonzalezAlberquilla@arm.com    }
32712109SRekai.GonzalezAlberquilla@arm.com
32812109SRekai.GonzalezAlberquilla@arm.com    /** Vector Register Lane Interfaces. */
32912109SRekai.GonzalezAlberquilla@arm.com    /** @{ */
33012109SRekai.GonzalezAlberquilla@arm.com    /** Reads source vector <T> operand. */
33112109SRekai.GonzalezAlberquilla@arm.com    template <typename T>
33212109SRekai.GonzalezAlberquilla@arm.com    VecLaneT<T, true>
33312109SRekai.GonzalezAlberquilla@arm.com    readVecLane(const RegId& reg) const
33412109SRekai.GonzalezAlberquilla@arm.com    {
33512109SRekai.GonzalezAlberquilla@arm.com        int flatIndex = isa->flattenVecIndex(reg.index());
33612109SRekai.GonzalezAlberquilla@arm.com        assert(flatIndex < TheISA::NumVecRegs);
33712109SRekai.GonzalezAlberquilla@arm.com        auto regVal = readVecLaneFlat<T>(flatIndex, reg.elemIndex());
33812109SRekai.GonzalezAlberquilla@arm.com        DPRINTF(VecRegs, "Reading vector lane %d (%d)[%d] as %lx.\n",
33912109SRekai.GonzalezAlberquilla@arm.com                reg.index(), flatIndex, reg.elemIndex(), regVal);
34012109SRekai.GonzalezAlberquilla@arm.com        return regVal;
34112109SRekai.GonzalezAlberquilla@arm.com    }
34212109SRekai.GonzalezAlberquilla@arm.com
34312109SRekai.GonzalezAlberquilla@arm.com    /** Reads source vector 8bit operand. */
34412109SRekai.GonzalezAlberquilla@arm.com    virtual ConstVecLane8
34513865Sgabeblack@google.com    readVec8BitLaneReg(const RegId &reg) const override
34613865Sgabeblack@google.com    {
34713865Sgabeblack@google.com        return readVecLane<uint8_t>(reg);
34813865Sgabeblack@google.com    }
34912109SRekai.GonzalezAlberquilla@arm.com
35012109SRekai.GonzalezAlberquilla@arm.com    /** Reads source vector 16bit operand. */
35112109SRekai.GonzalezAlberquilla@arm.com    virtual ConstVecLane16
35213865Sgabeblack@google.com    readVec16BitLaneReg(const RegId &reg) const override
35313865Sgabeblack@google.com    {
35413865Sgabeblack@google.com        return readVecLane<uint16_t>(reg);
35513865Sgabeblack@google.com    }
35612109SRekai.GonzalezAlberquilla@arm.com
35712109SRekai.GonzalezAlberquilla@arm.com    /** Reads source vector 32bit operand. */
35812109SRekai.GonzalezAlberquilla@arm.com    virtual ConstVecLane32
35913865Sgabeblack@google.com    readVec32BitLaneReg(const RegId &reg) const override
36013865Sgabeblack@google.com    {
36113865Sgabeblack@google.com        return readVecLane<uint32_t>(reg);
36213865Sgabeblack@google.com    }
36312109SRekai.GonzalezAlberquilla@arm.com
36412109SRekai.GonzalezAlberquilla@arm.com    /** Reads source vector 64bit operand. */
36512109SRekai.GonzalezAlberquilla@arm.com    virtual ConstVecLane64
36613865Sgabeblack@google.com    readVec64BitLaneReg(const RegId &reg) const override
36713865Sgabeblack@google.com    {
36813865Sgabeblack@google.com        return readVecLane<uint64_t>(reg);
36913865Sgabeblack@google.com    }
37012109SRekai.GonzalezAlberquilla@arm.com
37112109SRekai.GonzalezAlberquilla@arm.com    /** Write a lane of the destination vector register. */
37212109SRekai.GonzalezAlberquilla@arm.com    template <typename LD>
37313865Sgabeblack@google.com    void
37413865Sgabeblack@google.com    setVecLaneT(const RegId &reg, const LD &val)
37512109SRekai.GonzalezAlberquilla@arm.com    {
37612109SRekai.GonzalezAlberquilla@arm.com        int flatIndex = isa->flattenVecIndex(reg.index());
37712109SRekai.GonzalezAlberquilla@arm.com        assert(flatIndex < TheISA::NumVecRegs);
37812109SRekai.GonzalezAlberquilla@arm.com        setVecLaneFlat(flatIndex, reg.elemIndex(), val);
37912109SRekai.GonzalezAlberquilla@arm.com        DPRINTF(VecRegs, "Reading vector lane %d (%d)[%d] to %lx.\n",
38012109SRekai.GonzalezAlberquilla@arm.com                reg.index(), flatIndex, reg.elemIndex(), val);
38112109SRekai.GonzalezAlberquilla@arm.com    }
38213865Sgabeblack@google.com    virtual void
38313865Sgabeblack@google.com    setVecLane(const RegId &reg, const LaneData<LaneSize::Byte> &val) override
38413865Sgabeblack@google.com    {
38513865Sgabeblack@google.com        return setVecLaneT(reg, val);
38613865Sgabeblack@google.com    }
38713865Sgabeblack@google.com    virtual void
38813865Sgabeblack@google.com    setVecLane(const RegId &reg,
38913865Sgabeblack@google.com               const LaneData<LaneSize::TwoByte> &val) override
39013865Sgabeblack@google.com    {
39113865Sgabeblack@google.com        return setVecLaneT(reg, val);
39213865Sgabeblack@google.com    }
39313865Sgabeblack@google.com    virtual void
39413865Sgabeblack@google.com    setVecLane(const RegId &reg,
39513865Sgabeblack@google.com               const LaneData<LaneSize::FourByte> &val) override
39613865Sgabeblack@google.com    {
39713865Sgabeblack@google.com        return setVecLaneT(reg, val);
39813865Sgabeblack@google.com    }
39913865Sgabeblack@google.com    virtual void
40013865Sgabeblack@google.com    setVecLane(const RegId &reg,
40113865Sgabeblack@google.com               const LaneData<LaneSize::EightByte> &val) override
40213865Sgabeblack@google.com    {
40313865Sgabeblack@google.com        return setVecLaneT(reg, val);
40413865Sgabeblack@google.com    }
40512109SRekai.GonzalezAlberquilla@arm.com    /** @} */
40612109SRekai.GonzalezAlberquilla@arm.com
40713865Sgabeblack@google.com    const VecElem &
40813865Sgabeblack@google.com    readVecElem(const RegId &reg) const override
40912109SRekai.GonzalezAlberquilla@arm.com    {
41012109SRekai.GonzalezAlberquilla@arm.com        int flatIndex = isa->flattenVecElemIndex(reg.index());
41112109SRekai.GonzalezAlberquilla@arm.com        assert(flatIndex < TheISA::NumVecRegs);
41212109SRekai.GonzalezAlberquilla@arm.com        const VecElem& regVal = readVecElemFlat(flatIndex, reg.elemIndex());
41312109SRekai.GonzalezAlberquilla@arm.com        DPRINTF(VecRegs, "Reading element %d of vector reg %d (%d) as"
41412109SRekai.GonzalezAlberquilla@arm.com                " %#x.\n", reg.elemIndex(), reg.index(), flatIndex, regVal);
41512109SRekai.GonzalezAlberquilla@arm.com        return regVal;
41612109SRekai.GonzalezAlberquilla@arm.com    }
41712109SRekai.GonzalezAlberquilla@arm.com
41813865Sgabeblack@google.com    const VecPredRegContainer &
41913865Sgabeblack@google.com    readVecPredReg(const RegId &reg) const override
42013610Sgiacomo.gabrielli@arm.com    {
42113610Sgiacomo.gabrielli@arm.com        int flatIndex = isa->flattenVecPredIndex(reg.index());
42213610Sgiacomo.gabrielli@arm.com        assert(flatIndex < TheISA::NumVecPredRegs);
42313610Sgiacomo.gabrielli@arm.com        const VecPredRegContainer& regVal = readVecPredRegFlat(flatIndex);
42413610Sgiacomo.gabrielli@arm.com        DPRINTF(VecPredRegs, "Reading predicate reg %d (%d) as %s.\n",
42513610Sgiacomo.gabrielli@arm.com                reg.index(), flatIndex, regVal.print());
42613610Sgiacomo.gabrielli@arm.com        return regVal;
42713610Sgiacomo.gabrielli@arm.com    }
42813610Sgiacomo.gabrielli@arm.com
42913865Sgabeblack@google.com    VecPredRegContainer &
43013865Sgabeblack@google.com    getWritableVecPredReg(const RegId &reg) override
43113610Sgiacomo.gabrielli@arm.com    {
43213610Sgiacomo.gabrielli@arm.com        int flatIndex = isa->flattenVecPredIndex(reg.index());
43313610Sgiacomo.gabrielli@arm.com        assert(flatIndex < TheISA::NumVecPredRegs);
43413610Sgiacomo.gabrielli@arm.com        VecPredRegContainer& regVal = getWritableVecPredRegFlat(flatIndex);
43513610Sgiacomo.gabrielli@arm.com        DPRINTF(VecPredRegs,
43613610Sgiacomo.gabrielli@arm.com                "Reading predicate reg %d (%d) as %s for modify.\n",
43713610Sgiacomo.gabrielli@arm.com                reg.index(), flatIndex, regVal.print());
43813610Sgiacomo.gabrielli@arm.com        return regVal;
43913610Sgiacomo.gabrielli@arm.com    }
44012109SRekai.GonzalezAlberquilla@arm.com
44113622Sgabeblack@google.com    RegVal
44213865Sgabeblack@google.com    readCCReg(RegIndex reg_idx) const override
4439920Syasuko.eckert@amd.com    {
4449920Syasuko.eckert@amd.com#ifdef ISA_HAS_CC_REGS
4459920Syasuko.eckert@amd.com        int flatIndex = isa->flattenCCIndex(reg_idx);
44610338SCurtis.Dunham@arm.com        assert(0 <= flatIndex);
4479920Syasuko.eckert@amd.com        assert(flatIndex < TheISA::NumCCRegs);
4489920Syasuko.eckert@amd.com        uint64_t regVal(readCCRegFlat(flatIndex));
4499920Syasuko.eckert@amd.com        DPRINTF(CCRegs, "Reading CC reg %d (%d) as %#x.\n",
4509920Syasuko.eckert@amd.com                reg_idx, flatIndex, regVal);
4519920Syasuko.eckert@amd.com        return regVal;
4529920Syasuko.eckert@amd.com#else
4539920Syasuko.eckert@amd.com        panic("Tried to read a CC register.");
4549920Syasuko.eckert@amd.com        return 0;
4559920Syasuko.eckert@amd.com#endif
4569920Syasuko.eckert@amd.com    }
4579920Syasuko.eckert@amd.com
45813557Sgabeblack@google.com    void
45913865Sgabeblack@google.com    setIntReg(RegIndex reg_idx, RegVal val) override
4602SN/A    {
4619384SAndreas.Sandberg@arm.com        int flatIndex = isa->flattenIntIndex(reg_idx);
4626323Sgblack@eecs.umich.edu        assert(flatIndex < TheISA::NumIntRegs);
4637601Sminkyu.jeong@arm.com        DPRINTF(IntRegs, "Setting int reg %d (%d) to %#x.\n",
4647601Sminkyu.jeong@arm.com                reg_idx, flatIndex, val);
4659426SAndreas.Sandberg@ARM.com        setIntRegFlat(flatIndex, val);
4662SN/A    }
4672SN/A
46813557Sgabeblack@google.com    void
46913865Sgabeblack@google.com    setFloatReg(RegIndex reg_idx, RegVal val) override
4702455SN/A    {
4719384SAndreas.Sandberg@arm.com        int flatIndex = isa->flattenFloatIndex(reg_idx);
4726323Sgblack@eecs.umich.edu        assert(flatIndex < TheISA::NumFloatRegs);
4738733Sgeoffrey.blake@arm.com        // XXX: Fix array out of bounds compiler error for gem5.fast
4748733Sgeoffrey.blake@arm.com        // when checkercpu enabled
4758733Sgeoffrey.blake@arm.com        if (flatIndex < TheISA::NumFloatRegs)
47613611Sgabeblack@google.com            setFloatRegFlat(flatIndex, val);
47713501Sgabeblack@google.com        DPRINTF(FloatRegs, "Setting float reg %d (%d) bits to %#x.\n",
47813501Sgabeblack@google.com                reg_idx, flatIndex, val);
4792SN/A    }
4802SN/A
48113557Sgabeblack@google.com    void
48213865Sgabeblack@google.com    setVecReg(const RegId &reg, const VecRegContainer &val) override
48312109SRekai.GonzalezAlberquilla@arm.com    {
48412109SRekai.GonzalezAlberquilla@arm.com        int flatIndex = isa->flattenVecIndex(reg.index());
48512109SRekai.GonzalezAlberquilla@arm.com        assert(flatIndex < TheISA::NumVecRegs);
48612109SRekai.GonzalezAlberquilla@arm.com        setVecRegFlat(flatIndex, val);
48712109SRekai.GonzalezAlberquilla@arm.com        DPRINTF(VecRegs, "Setting vector reg %d (%d) to %s.\n",
48812109SRekai.GonzalezAlberquilla@arm.com                reg.index(), flatIndex, val.print());
48912109SRekai.GonzalezAlberquilla@arm.com    }
49012109SRekai.GonzalezAlberquilla@arm.com
49113557Sgabeblack@google.com    void
49213865Sgabeblack@google.com    setVecElem(const RegId &reg, const VecElem &val) override
49312109SRekai.GonzalezAlberquilla@arm.com    {
49412109SRekai.GonzalezAlberquilla@arm.com        int flatIndex = isa->flattenVecElemIndex(reg.index());
49512109SRekai.GonzalezAlberquilla@arm.com        assert(flatIndex < TheISA::NumVecRegs);
49612109SRekai.GonzalezAlberquilla@arm.com        setVecElemFlat(flatIndex, reg.elemIndex(), val);
49712109SRekai.GonzalezAlberquilla@arm.com        DPRINTF(VecRegs, "Setting element %d of vector reg %d (%d) to"
49812109SRekai.GonzalezAlberquilla@arm.com                " %#x.\n", reg.elemIndex(), reg.index(), flatIndex, val);
49912109SRekai.GonzalezAlberquilla@arm.com    }
50012109SRekai.GonzalezAlberquilla@arm.com
50113557Sgabeblack@google.com    void
50213865Sgabeblack@google.com    setVecPredReg(const RegId &reg, const VecPredRegContainer &val) override
50313610Sgiacomo.gabrielli@arm.com    {
50413610Sgiacomo.gabrielli@arm.com        int flatIndex = isa->flattenVecPredIndex(reg.index());
50513610Sgiacomo.gabrielli@arm.com        assert(flatIndex < TheISA::NumVecPredRegs);
50613610Sgiacomo.gabrielli@arm.com        setVecPredRegFlat(flatIndex, val);
50713610Sgiacomo.gabrielli@arm.com        DPRINTF(VecPredRegs, "Setting predicate reg %d (%d) to %s.\n",
50813610Sgiacomo.gabrielli@arm.com                reg.index(), flatIndex, val.print());
50913610Sgiacomo.gabrielli@arm.com    }
51013610Sgiacomo.gabrielli@arm.com
51113610Sgiacomo.gabrielli@arm.com    void
51213865Sgabeblack@google.com    setCCReg(RegIndex reg_idx, RegVal val) override
5139920Syasuko.eckert@amd.com    {
5149920Syasuko.eckert@amd.com#ifdef ISA_HAS_CC_REGS
5159920Syasuko.eckert@amd.com        int flatIndex = isa->flattenCCIndex(reg_idx);
5169920Syasuko.eckert@amd.com        assert(flatIndex < TheISA::NumCCRegs);
5179920Syasuko.eckert@amd.com        DPRINTF(CCRegs, "Setting CC reg %d (%d) to %#x.\n",
5189920Syasuko.eckert@amd.com                reg_idx, flatIndex, val);
5199920Syasuko.eckert@amd.com        setCCRegFlat(flatIndex, val);
5209920Syasuko.eckert@amd.com#else
5219920Syasuko.eckert@amd.com        panic("Tried to set a CC register.");
5229920Syasuko.eckert@amd.com#endif
5239920Syasuko.eckert@amd.com    }
5249920Syasuko.eckert@amd.com
52513865Sgabeblack@google.com    TheISA::PCState pcState() const override { return _pcState; }
52613865Sgabeblack@google.com    void pcState(const TheISA::PCState &val) override { _pcState = val; }
5272SN/A
5287720Sgblack@eecs.umich.edu    void
52913865Sgabeblack@google.com    pcStateNoRecord(const TheISA::PCState &val) override
5302190SN/A    {
5317720Sgblack@eecs.umich.edu        _pcState = val;
5322190SN/A    }
5332190SN/A
53413865Sgabeblack@google.com    Addr instAddr() const override  { return _pcState.instAddr(); }
53513865Sgabeblack@google.com    Addr nextInstAddr() const override { return _pcState.nextInstAddr(); }
53613865Sgabeblack@google.com    MicroPC microPC() const override { return _pcState.microPC(); }
53713865Sgabeblack@google.com    bool readPredicate() const { return predicate; }
53813865Sgabeblack@google.com    void setPredicate(bool val) { predicate = val; }
5397597Sminkyu.jeong@arm.com
54013557Sgabeblack@google.com    RegVal
54113865Sgabeblack@google.com    readMiscRegNoEffect(RegIndex misc_reg) const override
5424172Ssaidi@eecs.umich.edu    {
5439384SAndreas.Sandberg@arm.com        return isa->readMiscRegNoEffect(misc_reg);
5444172Ssaidi@eecs.umich.edu    }
5454172Ssaidi@eecs.umich.edu
54613557Sgabeblack@google.com    RegVal
54713865Sgabeblack@google.com    readMiscReg(RegIndex misc_reg) override
5482SN/A    {
54913865Sgabeblack@google.com        return isa->readMiscReg(misc_reg, this);
5502SN/A    }
5512SN/A
5526221Snate@binkert.org    void
55313865Sgabeblack@google.com    setMiscRegNoEffect(RegIndex misc_reg, RegVal val) override
5542SN/A    {
5559384SAndreas.Sandberg@arm.com        return isa->setMiscRegNoEffect(misc_reg, val);
5562SN/A    }
5572SN/A
5586221Snate@binkert.org    void
55913865Sgabeblack@google.com    setMiscReg(RegIndex misc_reg, RegVal val) override
5602SN/A    {
56113865Sgabeblack@google.com        return isa->setMiscReg(misc_reg, val, this);
5626313Sgblack@eecs.umich.edu    }
5636313Sgblack@eecs.umich.edu
56412106SRekai.GonzalezAlberquilla@arm.com    RegId
56513865Sgabeblack@google.com    flattenRegId(const RegId& regId) const override
5666313Sgblack@eecs.umich.edu    {
56712106SRekai.GonzalezAlberquilla@arm.com        return isa->flattenRegId(regId);
56810033SAli.Saidi@ARM.com    }
56910033SAli.Saidi@ARM.com
57013865Sgabeblack@google.com    unsigned readStCondFailures() const override { return storeCondFailures; }
5712190SN/A
57213953Sgiacomo.gabrielli@arm.com    bool
57313953Sgiacomo.gabrielli@arm.com    readMemAccPredicate()
57413953Sgiacomo.gabrielli@arm.com    {
57513953Sgiacomo.gabrielli@arm.com        return memAccPredicate;
57613953Sgiacomo.gabrielli@arm.com    }
57713953Sgiacomo.gabrielli@arm.com
57813953Sgiacomo.gabrielli@arm.com    void
57913953Sgiacomo.gabrielli@arm.com    setMemAccPredicate(bool val)
58013953Sgiacomo.gabrielli@arm.com    {
58113953Sgiacomo.gabrielli@arm.com        memAccPredicate = val;
58213953Sgiacomo.gabrielli@arm.com    }
58313953Sgiacomo.gabrielli@arm.com
58413557Sgabeblack@google.com    void
58513865Sgabeblack@google.com    setStCondFailures(unsigned sc_failures) override
5862SN/A    {
58713865Sgabeblack@google.com        storeCondFailures = sc_failures;
5882SN/A    }
5899426SAndreas.Sandberg@ARM.com
59013865Sgabeblack@google.com    Counter
59113865Sgabeblack@google.com    readFuncExeInst() const override
59213865Sgabeblack@google.com    {
59313865Sgabeblack@google.com        return ThreadState::readFuncExeInst();
59413865Sgabeblack@google.com    }
5959426SAndreas.Sandberg@ARM.com
59613865Sgabeblack@google.com    void
59713865Sgabeblack@google.com    syscall(int64_t callnum, Fault *fault) override
59813865Sgabeblack@google.com    {
59913865Sgabeblack@google.com        process->syscall(callnum, this, fault);
60013865Sgabeblack@google.com    }
60113865Sgabeblack@google.com
60213865Sgabeblack@google.com    RegVal readIntRegFlat(RegIndex idx) const override { return intRegs[idx]; }
60313865Sgabeblack@google.com    void
60413865Sgabeblack@google.com    setIntRegFlat(RegIndex idx, RegVal val) override
60513865Sgabeblack@google.com    {
60613865Sgabeblack@google.com        intRegs[idx] = val;
60713865Sgabeblack@google.com    }
60813865Sgabeblack@google.com
60913865Sgabeblack@google.com    RegVal
61013865Sgabeblack@google.com    readFloatRegFlat(RegIndex idx) const override
61113865Sgabeblack@google.com    {
61213865Sgabeblack@google.com        return floatRegs[idx];
61313865Sgabeblack@google.com    }
61413865Sgabeblack@google.com    void
61513865Sgabeblack@google.com    setFloatRegFlat(RegIndex idx, RegVal val) override
61613865Sgabeblack@google.com    {
61713865Sgabeblack@google.com        floatRegs[idx] = val;
61813865Sgabeblack@google.com    }
6199426SAndreas.Sandberg@ARM.com
62013557Sgabeblack@google.com    const VecRegContainer &
62113865Sgabeblack@google.com    readVecRegFlat(RegIndex reg) const override
62212109SRekai.GonzalezAlberquilla@arm.com    {
62312109SRekai.GonzalezAlberquilla@arm.com        return vecRegs[reg];
62412109SRekai.GonzalezAlberquilla@arm.com    }
62512109SRekai.GonzalezAlberquilla@arm.com
62613557Sgabeblack@google.com    VecRegContainer &
62713865Sgabeblack@google.com    getWritableVecRegFlat(RegIndex reg) override
62812109SRekai.GonzalezAlberquilla@arm.com    {
62912109SRekai.GonzalezAlberquilla@arm.com        return vecRegs[reg];
63012109SRekai.GonzalezAlberquilla@arm.com    }
63112109SRekai.GonzalezAlberquilla@arm.com
63213557Sgabeblack@google.com    void
63313865Sgabeblack@google.com    setVecRegFlat(RegIndex reg, const VecRegContainer &val) override
63412109SRekai.GonzalezAlberquilla@arm.com    {
63512109SRekai.GonzalezAlberquilla@arm.com        vecRegs[reg] = val;
63612109SRekai.GonzalezAlberquilla@arm.com    }
63712109SRekai.GonzalezAlberquilla@arm.com
63812109SRekai.GonzalezAlberquilla@arm.com    template <typename T>
63913557Sgabeblack@google.com    VecLaneT<T, true>
64013865Sgabeblack@google.com    readVecLaneFlat(RegIndex reg, int lId) const
64112109SRekai.GonzalezAlberquilla@arm.com    {
64212109SRekai.GonzalezAlberquilla@arm.com        return vecRegs[reg].laneView<T>(lId);
64312109SRekai.GonzalezAlberquilla@arm.com    }
64412109SRekai.GonzalezAlberquilla@arm.com
64512109SRekai.GonzalezAlberquilla@arm.com    template <typename LD>
64613557Sgabeblack@google.com    void
64713865Sgabeblack@google.com    setVecLaneFlat(RegIndex reg, int lId, const LD &val)
64812109SRekai.GonzalezAlberquilla@arm.com    {
64912109SRekai.GonzalezAlberquilla@arm.com        vecRegs[reg].laneView<typename LD::UnderlyingType>(lId) = val;
65012109SRekai.GonzalezAlberquilla@arm.com    }
65112109SRekai.GonzalezAlberquilla@arm.com
65213557Sgabeblack@google.com    const VecElem &
65313865Sgabeblack@google.com    readVecElemFlat(RegIndex reg, const ElemIndex &elemIndex) const override
65412109SRekai.GonzalezAlberquilla@arm.com    {
65512109SRekai.GonzalezAlberquilla@arm.com        return vecRegs[reg].as<TheISA::VecElem>()[elemIndex];
65612109SRekai.GonzalezAlberquilla@arm.com    }
65712109SRekai.GonzalezAlberquilla@arm.com
65813557Sgabeblack@google.com    void
65913865Sgabeblack@google.com    setVecElemFlat(RegIndex reg, const ElemIndex &elemIndex,
66013865Sgabeblack@google.com                   const VecElem &val) override
66112109SRekai.GonzalezAlberquilla@arm.com    {
66212109SRekai.GonzalezAlberquilla@arm.com        vecRegs[reg].as<TheISA::VecElem>()[elemIndex] = val;
66312109SRekai.GonzalezAlberquilla@arm.com    }
66412109SRekai.GonzalezAlberquilla@arm.com
66513865Sgabeblack@google.com    const VecPredRegContainer &
66613865Sgabeblack@google.com    readVecPredRegFlat(RegIndex reg) const override
66713610Sgiacomo.gabrielli@arm.com    {
66813610Sgiacomo.gabrielli@arm.com        return vecPredRegs[reg];
66913610Sgiacomo.gabrielli@arm.com    }
67013610Sgiacomo.gabrielli@arm.com
67113865Sgabeblack@google.com    VecPredRegContainer &
67213865Sgabeblack@google.com    getWritableVecPredRegFlat(RegIndex reg) override
67313610Sgiacomo.gabrielli@arm.com    {
67413610Sgiacomo.gabrielli@arm.com        return vecPredRegs[reg];
67513610Sgiacomo.gabrielli@arm.com    }
67613610Sgiacomo.gabrielli@arm.com
67713865Sgabeblack@google.com    void
67813865Sgabeblack@google.com    setVecPredRegFlat(RegIndex reg, const VecPredRegContainer &val) override
67913610Sgiacomo.gabrielli@arm.com    {
68013610Sgiacomo.gabrielli@arm.com        vecPredRegs[reg] = val;
68113610Sgiacomo.gabrielli@arm.com    }
68213610Sgiacomo.gabrielli@arm.com
6839920Syasuko.eckert@amd.com#ifdef ISA_HAS_CC_REGS
68413865Sgabeblack@google.com    RegVal readCCRegFlat(RegIndex idx) const override { return ccRegs[idx]; }
68513865Sgabeblack@google.com    void setCCRegFlat(RegIndex idx, RegVal val) override { ccRegs[idx] = val; }
6869920Syasuko.eckert@amd.com#else
68713865Sgabeblack@google.com    RegVal
68813865Sgabeblack@google.com    readCCRegFlat(RegIndex idx) const override
68913865Sgabeblack@google.com    {
69013865Sgabeblack@google.com        panic("readCCRegFlat w/no CC regs!\n");
69113865Sgabeblack@google.com    }
6929920Syasuko.eckert@amd.com
69313865Sgabeblack@google.com    void
69413865Sgabeblack@google.com    setCCRegFlat(RegIndex idx, RegVal val) override
69513865Sgabeblack@google.com    {
69613865Sgabeblack@google.com        panic("setCCRegFlat w/no CC regs!\n");
69713865Sgabeblack@google.com    }
6989920Syasuko.eckert@amd.com#endif
6992SN/A};
7002SN/A
7012SN/A
7022190SN/A#endif // __CPU_CPU_EXEC_CONTEXT_HH__
703