simple_thread.hh revision 14022
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
22614022Sgabeblack@google.com    PortProxy &
22713875SAndrea.Mondelli@ucf.edu    getMemProxy() override
22813865Sgabeblack@google.com    {
22913865Sgabeblack@google.com        return ThreadState::getMemProxy();
23013865Sgabeblack@google.com    }
23113865Sgabeblack@google.com
23213875SAndrea.Mondelli@ucf.edu    Process *getProcessPtr() override { return ThreadState::getProcessPtr(); }
23313865Sgabeblack@google.com    void setProcessPtr(Process *p) override { ThreadState::setProcessPtr(p); }
23413865Sgabeblack@google.com
23513865Sgabeblack@google.com    Status status() const override { return _status; }
23613865Sgabeblack@google.com
23713865Sgabeblack@google.com    void setStatus(Status newStatus) override { _status = newStatus; }
2382683Sktlim@umich.edu
23910407Smitch.hayenga@arm.com    /// Set the status to Active.
24013865Sgabeblack@google.com    void activate() override;
2412683Sktlim@umich.edu
2422683Sktlim@umich.edu    /// Set the status to Suspended.
24313865Sgabeblack@google.com    void suspend() override;
2442683Sktlim@umich.edu
2452683Sktlim@umich.edu    /// Set the status to Halted.
24613865Sgabeblack@google.com    void halt() override;
2472683Sktlim@umich.edu
24813865Sgabeblack@google.com    EndQuiesceEvent *
24913865Sgabeblack@google.com    getQuiesceEvent() override
25013865Sgabeblack@google.com    {
25113865Sgabeblack@google.com        return ThreadState::getQuiesceEvent();
25213865Sgabeblack@google.com    }
2532190SN/A
25413865Sgabeblack@google.com    Tick
25513865Sgabeblack@google.com    readLastActivate() override
25613865Sgabeblack@google.com    {
25713865Sgabeblack@google.com        return ThreadState::readLastActivate();
25813865Sgabeblack@google.com    }
25913865Sgabeblack@google.com    Tick
26013865Sgabeblack@google.com    readLastSuspend() override
26113865Sgabeblack@google.com    {
26213865Sgabeblack@google.com        return ThreadState::readLastSuspend();
26313865Sgabeblack@google.com    }
26413865Sgabeblack@google.com
26513865Sgabeblack@google.com    void profileClear() override { ThreadState::profileClear(); }
26613865Sgabeblack@google.com    void profileSample() override { ThreadState::profileSample(); }
26713865Sgabeblack@google.com
26813865Sgabeblack@google.com    void copyArchRegs(ThreadContext *tc) override;
26913865Sgabeblack@google.com
27013865Sgabeblack@google.com    void clearArchRegs() override
2716315Sgblack@eecs.umich.edu    {
2727720Sgblack@eecs.umich.edu        _pcState = 0;
2736316Sgblack@eecs.umich.edu        memset(intRegs, 0, sizeof(intRegs));
27413501Sgabeblack@google.com        memset(floatRegs, 0, sizeof(floatRegs));
27512109SRekai.GonzalezAlberquilla@arm.com        for (int i = 0; i < TheISA::NumVecRegs; i++) {
27612109SRekai.GonzalezAlberquilla@arm.com            vecRegs[i].zero();
27712109SRekai.GonzalezAlberquilla@arm.com        }
27813610Sgiacomo.gabrielli@arm.com        for (int i = 0; i < TheISA::NumVecPredRegs; i++) {
27913610Sgiacomo.gabrielli@arm.com            vecPredRegs[i].reset();
28013610Sgiacomo.gabrielli@arm.com        }
2819920Syasuko.eckert@amd.com#ifdef ISA_HAS_CC_REGS
2829920Syasuko.eckert@amd.com        memset(ccRegs, 0, sizeof(ccRegs));
2839920Syasuko.eckert@amd.com#endif
2849384SAndreas.Sandberg@arm.com        isa->clear();
2856315Sgblack@eecs.umich.edu    }
2862190SN/A
2872SN/A    //
2882SN/A    // New accessors for new decoder.
2892SN/A    //
29013557Sgabeblack@google.com    RegVal
29113865Sgabeblack@google.com    readIntReg(RegIndex reg_idx) const override
2922SN/A    {
2939384SAndreas.Sandberg@arm.com        int flatIndex = isa->flattenIntIndex(reg_idx);
2946323Sgblack@eecs.umich.edu        assert(flatIndex < TheISA::NumIntRegs);
2959426SAndreas.Sandberg@ARM.com        uint64_t regVal(readIntRegFlat(flatIndex));
2967601Sminkyu.jeong@arm.com        DPRINTF(IntRegs, "Reading int reg %d (%d) as %#x.\n",
2977601Sminkyu.jeong@arm.com                reg_idx, flatIndex, regVal);
2986418Sgblack@eecs.umich.edu        return regVal;
2992SN/A    }
3002SN/A
30113557Sgabeblack@google.com    RegVal
30213865Sgabeblack@google.com    readFloatReg(RegIndex reg_idx) const override
3032455SN/A    {
3049384SAndreas.Sandberg@arm.com        int flatIndex = isa->flattenFloatIndex(reg_idx);
3056323Sgblack@eecs.umich.edu        assert(flatIndex < TheISA::NumFloatRegs);
30613611Sgabeblack@google.com        RegVal regVal(readFloatRegFlat(flatIndex));
30713501Sgabeblack@google.com        DPRINTF(FloatRegs, "Reading float reg %d (%d) bits as %#x.\n",
30813501Sgabeblack@google.com                reg_idx, flatIndex, regVal);
3097341Sgblack@eecs.umich.edu        return regVal;
3102SN/A    }
3112SN/A
31212109SRekai.GonzalezAlberquilla@arm.com    const VecRegContainer&
31313865Sgabeblack@google.com    readVecReg(const RegId& reg) const override
31412109SRekai.GonzalezAlberquilla@arm.com    {
31512109SRekai.GonzalezAlberquilla@arm.com        int flatIndex = isa->flattenVecIndex(reg.index());
31612109SRekai.GonzalezAlberquilla@arm.com        assert(flatIndex < TheISA::NumVecRegs);
31712109SRekai.GonzalezAlberquilla@arm.com        const VecRegContainer& regVal = readVecRegFlat(flatIndex);
31812109SRekai.GonzalezAlberquilla@arm.com        DPRINTF(VecRegs, "Reading vector reg %d (%d) as %s.\n",
31913610Sgiacomo.gabrielli@arm.com                reg.index(), flatIndex, regVal.print());
32012109SRekai.GonzalezAlberquilla@arm.com        return regVal;
32112109SRekai.GonzalezAlberquilla@arm.com    }
32212109SRekai.GonzalezAlberquilla@arm.com
32312109SRekai.GonzalezAlberquilla@arm.com    VecRegContainer&
32413865Sgabeblack@google.com    getWritableVecReg(const RegId& reg) override
32512109SRekai.GonzalezAlberquilla@arm.com    {
32612109SRekai.GonzalezAlberquilla@arm.com        int flatIndex = isa->flattenVecIndex(reg.index());
32712109SRekai.GonzalezAlberquilla@arm.com        assert(flatIndex < TheISA::NumVecRegs);
32812109SRekai.GonzalezAlberquilla@arm.com        VecRegContainer& regVal = getWritableVecRegFlat(flatIndex);
32912109SRekai.GonzalezAlberquilla@arm.com        DPRINTF(VecRegs, "Reading vector reg %d (%d) as %s for modify.\n",
33013610Sgiacomo.gabrielli@arm.com                reg.index(), flatIndex, regVal.print());
33112109SRekai.GonzalezAlberquilla@arm.com        return regVal;
33212109SRekai.GonzalezAlberquilla@arm.com    }
33312109SRekai.GonzalezAlberquilla@arm.com
33412109SRekai.GonzalezAlberquilla@arm.com    /** Vector Register Lane Interfaces. */
33512109SRekai.GonzalezAlberquilla@arm.com    /** @{ */
33612109SRekai.GonzalezAlberquilla@arm.com    /** Reads source vector <T> operand. */
33712109SRekai.GonzalezAlberquilla@arm.com    template <typename T>
33812109SRekai.GonzalezAlberquilla@arm.com    VecLaneT<T, true>
33912109SRekai.GonzalezAlberquilla@arm.com    readVecLane(const RegId& reg) const
34012109SRekai.GonzalezAlberquilla@arm.com    {
34112109SRekai.GonzalezAlberquilla@arm.com        int flatIndex = isa->flattenVecIndex(reg.index());
34212109SRekai.GonzalezAlberquilla@arm.com        assert(flatIndex < TheISA::NumVecRegs);
34312109SRekai.GonzalezAlberquilla@arm.com        auto regVal = readVecLaneFlat<T>(flatIndex, reg.elemIndex());
34412109SRekai.GonzalezAlberquilla@arm.com        DPRINTF(VecRegs, "Reading vector lane %d (%d)[%d] as %lx.\n",
34512109SRekai.GonzalezAlberquilla@arm.com                reg.index(), flatIndex, reg.elemIndex(), regVal);
34612109SRekai.GonzalezAlberquilla@arm.com        return regVal;
34712109SRekai.GonzalezAlberquilla@arm.com    }
34812109SRekai.GonzalezAlberquilla@arm.com
34912109SRekai.GonzalezAlberquilla@arm.com    /** Reads source vector 8bit operand. */
35012109SRekai.GonzalezAlberquilla@arm.com    virtual ConstVecLane8
35113865Sgabeblack@google.com    readVec8BitLaneReg(const RegId &reg) const override
35213865Sgabeblack@google.com    {
35313865Sgabeblack@google.com        return readVecLane<uint8_t>(reg);
35413865Sgabeblack@google.com    }
35512109SRekai.GonzalezAlberquilla@arm.com
35612109SRekai.GonzalezAlberquilla@arm.com    /** Reads source vector 16bit operand. */
35712109SRekai.GonzalezAlberquilla@arm.com    virtual ConstVecLane16
35813865Sgabeblack@google.com    readVec16BitLaneReg(const RegId &reg) const override
35913865Sgabeblack@google.com    {
36013865Sgabeblack@google.com        return readVecLane<uint16_t>(reg);
36113865Sgabeblack@google.com    }
36212109SRekai.GonzalezAlberquilla@arm.com
36312109SRekai.GonzalezAlberquilla@arm.com    /** Reads source vector 32bit operand. */
36412109SRekai.GonzalezAlberquilla@arm.com    virtual ConstVecLane32
36513865Sgabeblack@google.com    readVec32BitLaneReg(const RegId &reg) const override
36613865Sgabeblack@google.com    {
36713865Sgabeblack@google.com        return readVecLane<uint32_t>(reg);
36813865Sgabeblack@google.com    }
36912109SRekai.GonzalezAlberquilla@arm.com
37012109SRekai.GonzalezAlberquilla@arm.com    /** Reads source vector 64bit operand. */
37112109SRekai.GonzalezAlberquilla@arm.com    virtual ConstVecLane64
37213865Sgabeblack@google.com    readVec64BitLaneReg(const RegId &reg) const override
37313865Sgabeblack@google.com    {
37413865Sgabeblack@google.com        return readVecLane<uint64_t>(reg);
37513865Sgabeblack@google.com    }
37612109SRekai.GonzalezAlberquilla@arm.com
37712109SRekai.GonzalezAlberquilla@arm.com    /** Write a lane of the destination vector register. */
37812109SRekai.GonzalezAlberquilla@arm.com    template <typename LD>
37913865Sgabeblack@google.com    void
38013865Sgabeblack@google.com    setVecLaneT(const RegId &reg, const LD &val)
38112109SRekai.GonzalezAlberquilla@arm.com    {
38212109SRekai.GonzalezAlberquilla@arm.com        int flatIndex = isa->flattenVecIndex(reg.index());
38312109SRekai.GonzalezAlberquilla@arm.com        assert(flatIndex < TheISA::NumVecRegs);
38412109SRekai.GonzalezAlberquilla@arm.com        setVecLaneFlat(flatIndex, reg.elemIndex(), val);
38512109SRekai.GonzalezAlberquilla@arm.com        DPRINTF(VecRegs, "Reading vector lane %d (%d)[%d] to %lx.\n",
38612109SRekai.GonzalezAlberquilla@arm.com                reg.index(), flatIndex, reg.elemIndex(), val);
38712109SRekai.GonzalezAlberquilla@arm.com    }
38813865Sgabeblack@google.com    virtual void
38913865Sgabeblack@google.com    setVecLane(const RegId &reg, const LaneData<LaneSize::Byte> &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::TwoByte> &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::FourByte> &val) override
40213865Sgabeblack@google.com    {
40313865Sgabeblack@google.com        return setVecLaneT(reg, val);
40413865Sgabeblack@google.com    }
40513865Sgabeblack@google.com    virtual void
40613865Sgabeblack@google.com    setVecLane(const RegId &reg,
40713865Sgabeblack@google.com               const LaneData<LaneSize::EightByte> &val) override
40813865Sgabeblack@google.com    {
40913865Sgabeblack@google.com        return setVecLaneT(reg, val);
41013865Sgabeblack@google.com    }
41112109SRekai.GonzalezAlberquilla@arm.com    /** @} */
41212109SRekai.GonzalezAlberquilla@arm.com
41313865Sgabeblack@google.com    const VecElem &
41413865Sgabeblack@google.com    readVecElem(const RegId &reg) const override
41512109SRekai.GonzalezAlberquilla@arm.com    {
41612109SRekai.GonzalezAlberquilla@arm.com        int flatIndex = isa->flattenVecElemIndex(reg.index());
41712109SRekai.GonzalezAlberquilla@arm.com        assert(flatIndex < TheISA::NumVecRegs);
41812109SRekai.GonzalezAlberquilla@arm.com        const VecElem& regVal = readVecElemFlat(flatIndex, reg.elemIndex());
41912109SRekai.GonzalezAlberquilla@arm.com        DPRINTF(VecRegs, "Reading element %d of vector reg %d (%d) as"
42012109SRekai.GonzalezAlberquilla@arm.com                " %#x.\n", reg.elemIndex(), reg.index(), flatIndex, regVal);
42112109SRekai.GonzalezAlberquilla@arm.com        return regVal;
42212109SRekai.GonzalezAlberquilla@arm.com    }
42312109SRekai.GonzalezAlberquilla@arm.com
42413865Sgabeblack@google.com    const VecPredRegContainer &
42513865Sgabeblack@google.com    readVecPredReg(const RegId &reg) const override
42613610Sgiacomo.gabrielli@arm.com    {
42713610Sgiacomo.gabrielli@arm.com        int flatIndex = isa->flattenVecPredIndex(reg.index());
42813610Sgiacomo.gabrielli@arm.com        assert(flatIndex < TheISA::NumVecPredRegs);
42913610Sgiacomo.gabrielli@arm.com        const VecPredRegContainer& regVal = readVecPredRegFlat(flatIndex);
43013610Sgiacomo.gabrielli@arm.com        DPRINTF(VecPredRegs, "Reading predicate reg %d (%d) as %s.\n",
43113610Sgiacomo.gabrielli@arm.com                reg.index(), flatIndex, regVal.print());
43213610Sgiacomo.gabrielli@arm.com        return regVal;
43313610Sgiacomo.gabrielli@arm.com    }
43413610Sgiacomo.gabrielli@arm.com
43513865Sgabeblack@google.com    VecPredRegContainer &
43613865Sgabeblack@google.com    getWritableVecPredReg(const RegId &reg) override
43713610Sgiacomo.gabrielli@arm.com    {
43813610Sgiacomo.gabrielli@arm.com        int flatIndex = isa->flattenVecPredIndex(reg.index());
43913610Sgiacomo.gabrielli@arm.com        assert(flatIndex < TheISA::NumVecPredRegs);
44013610Sgiacomo.gabrielli@arm.com        VecPredRegContainer& regVal = getWritableVecPredRegFlat(flatIndex);
44113610Sgiacomo.gabrielli@arm.com        DPRINTF(VecPredRegs,
44213610Sgiacomo.gabrielli@arm.com                "Reading predicate reg %d (%d) as %s for modify.\n",
44313610Sgiacomo.gabrielli@arm.com                reg.index(), flatIndex, regVal.print());
44413610Sgiacomo.gabrielli@arm.com        return regVal;
44513610Sgiacomo.gabrielli@arm.com    }
44612109SRekai.GonzalezAlberquilla@arm.com
44713622Sgabeblack@google.com    RegVal
44813865Sgabeblack@google.com    readCCReg(RegIndex reg_idx) const override
4499920Syasuko.eckert@amd.com    {
4509920Syasuko.eckert@amd.com#ifdef ISA_HAS_CC_REGS
4519920Syasuko.eckert@amd.com        int flatIndex = isa->flattenCCIndex(reg_idx);
45210338SCurtis.Dunham@arm.com        assert(0 <= flatIndex);
4539920Syasuko.eckert@amd.com        assert(flatIndex < TheISA::NumCCRegs);
4549920Syasuko.eckert@amd.com        uint64_t regVal(readCCRegFlat(flatIndex));
4559920Syasuko.eckert@amd.com        DPRINTF(CCRegs, "Reading CC reg %d (%d) as %#x.\n",
4569920Syasuko.eckert@amd.com                reg_idx, flatIndex, regVal);
4579920Syasuko.eckert@amd.com        return regVal;
4589920Syasuko.eckert@amd.com#else
4599920Syasuko.eckert@amd.com        panic("Tried to read a CC register.");
4609920Syasuko.eckert@amd.com        return 0;
4619920Syasuko.eckert@amd.com#endif
4629920Syasuko.eckert@amd.com    }
4639920Syasuko.eckert@amd.com
46413557Sgabeblack@google.com    void
46513865Sgabeblack@google.com    setIntReg(RegIndex reg_idx, RegVal val) override
4662SN/A    {
4679384SAndreas.Sandberg@arm.com        int flatIndex = isa->flattenIntIndex(reg_idx);
4686323Sgblack@eecs.umich.edu        assert(flatIndex < TheISA::NumIntRegs);
4697601Sminkyu.jeong@arm.com        DPRINTF(IntRegs, "Setting int reg %d (%d) to %#x.\n",
4707601Sminkyu.jeong@arm.com                reg_idx, flatIndex, val);
4719426SAndreas.Sandberg@ARM.com        setIntRegFlat(flatIndex, val);
4722SN/A    }
4732SN/A
47413557Sgabeblack@google.com    void
47513865Sgabeblack@google.com    setFloatReg(RegIndex reg_idx, RegVal val) override
4762455SN/A    {
4779384SAndreas.Sandberg@arm.com        int flatIndex = isa->flattenFloatIndex(reg_idx);
4786323Sgblack@eecs.umich.edu        assert(flatIndex < TheISA::NumFloatRegs);
4798733Sgeoffrey.blake@arm.com        // XXX: Fix array out of bounds compiler error for gem5.fast
4808733Sgeoffrey.blake@arm.com        // when checkercpu enabled
4818733Sgeoffrey.blake@arm.com        if (flatIndex < TheISA::NumFloatRegs)
48213611Sgabeblack@google.com            setFloatRegFlat(flatIndex, val);
48313501Sgabeblack@google.com        DPRINTF(FloatRegs, "Setting float reg %d (%d) bits to %#x.\n",
48413501Sgabeblack@google.com                reg_idx, flatIndex, val);
4852SN/A    }
4862SN/A
48713557Sgabeblack@google.com    void
48813865Sgabeblack@google.com    setVecReg(const RegId &reg, const VecRegContainer &val) override
48912109SRekai.GonzalezAlberquilla@arm.com    {
49012109SRekai.GonzalezAlberquilla@arm.com        int flatIndex = isa->flattenVecIndex(reg.index());
49112109SRekai.GonzalezAlberquilla@arm.com        assert(flatIndex < TheISA::NumVecRegs);
49212109SRekai.GonzalezAlberquilla@arm.com        setVecRegFlat(flatIndex, val);
49312109SRekai.GonzalezAlberquilla@arm.com        DPRINTF(VecRegs, "Setting vector reg %d (%d) to %s.\n",
49412109SRekai.GonzalezAlberquilla@arm.com                reg.index(), flatIndex, val.print());
49512109SRekai.GonzalezAlberquilla@arm.com    }
49612109SRekai.GonzalezAlberquilla@arm.com
49713557Sgabeblack@google.com    void
49813865Sgabeblack@google.com    setVecElem(const RegId &reg, const VecElem &val) override
49912109SRekai.GonzalezAlberquilla@arm.com    {
50012109SRekai.GonzalezAlberquilla@arm.com        int flatIndex = isa->flattenVecElemIndex(reg.index());
50112109SRekai.GonzalezAlberquilla@arm.com        assert(flatIndex < TheISA::NumVecRegs);
50212109SRekai.GonzalezAlberquilla@arm.com        setVecElemFlat(flatIndex, reg.elemIndex(), val);
50312109SRekai.GonzalezAlberquilla@arm.com        DPRINTF(VecRegs, "Setting element %d of vector reg %d (%d) to"
50412109SRekai.GonzalezAlberquilla@arm.com                " %#x.\n", reg.elemIndex(), reg.index(), flatIndex, val);
50512109SRekai.GonzalezAlberquilla@arm.com    }
50612109SRekai.GonzalezAlberquilla@arm.com
50713557Sgabeblack@google.com    void
50813865Sgabeblack@google.com    setVecPredReg(const RegId &reg, const VecPredRegContainer &val) override
50913610Sgiacomo.gabrielli@arm.com    {
51013610Sgiacomo.gabrielli@arm.com        int flatIndex = isa->flattenVecPredIndex(reg.index());
51113610Sgiacomo.gabrielli@arm.com        assert(flatIndex < TheISA::NumVecPredRegs);
51213610Sgiacomo.gabrielli@arm.com        setVecPredRegFlat(flatIndex, val);
51313610Sgiacomo.gabrielli@arm.com        DPRINTF(VecPredRegs, "Setting predicate reg %d (%d) to %s.\n",
51413610Sgiacomo.gabrielli@arm.com                reg.index(), flatIndex, val.print());
51513610Sgiacomo.gabrielli@arm.com    }
51613610Sgiacomo.gabrielli@arm.com
51713610Sgiacomo.gabrielli@arm.com    void
51813865Sgabeblack@google.com    setCCReg(RegIndex reg_idx, RegVal val) override
5199920Syasuko.eckert@amd.com    {
5209920Syasuko.eckert@amd.com#ifdef ISA_HAS_CC_REGS
5219920Syasuko.eckert@amd.com        int flatIndex = isa->flattenCCIndex(reg_idx);
5229920Syasuko.eckert@amd.com        assert(flatIndex < TheISA::NumCCRegs);
5239920Syasuko.eckert@amd.com        DPRINTF(CCRegs, "Setting CC reg %d (%d) to %#x.\n",
5249920Syasuko.eckert@amd.com                reg_idx, flatIndex, val);
5259920Syasuko.eckert@amd.com        setCCRegFlat(flatIndex, val);
5269920Syasuko.eckert@amd.com#else
5279920Syasuko.eckert@amd.com        panic("Tried to set a CC register.");
5289920Syasuko.eckert@amd.com#endif
5299920Syasuko.eckert@amd.com    }
5309920Syasuko.eckert@amd.com
53113865Sgabeblack@google.com    TheISA::PCState pcState() const override { return _pcState; }
53213865Sgabeblack@google.com    void pcState(const TheISA::PCState &val) override { _pcState = val; }
5332SN/A
5347720Sgblack@eecs.umich.edu    void
53513865Sgabeblack@google.com    pcStateNoRecord(const TheISA::PCState &val) override
5362190SN/A    {
5377720Sgblack@eecs.umich.edu        _pcState = val;
5382190SN/A    }
5392190SN/A
54013865Sgabeblack@google.com    Addr instAddr() const override  { return _pcState.instAddr(); }
54113865Sgabeblack@google.com    Addr nextInstAddr() const override { return _pcState.nextInstAddr(); }
54213865Sgabeblack@google.com    MicroPC microPC() const override { return _pcState.microPC(); }
54313865Sgabeblack@google.com    bool readPredicate() const { return predicate; }
54413865Sgabeblack@google.com    void setPredicate(bool val) { predicate = val; }
5457597Sminkyu.jeong@arm.com
54613557Sgabeblack@google.com    RegVal
54713865Sgabeblack@google.com    readMiscRegNoEffect(RegIndex misc_reg) const override
5484172Ssaidi@eecs.umich.edu    {
5499384SAndreas.Sandberg@arm.com        return isa->readMiscRegNoEffect(misc_reg);
5504172Ssaidi@eecs.umich.edu    }
5514172Ssaidi@eecs.umich.edu
55213557Sgabeblack@google.com    RegVal
55313865Sgabeblack@google.com    readMiscReg(RegIndex misc_reg) override
5542SN/A    {
55513865Sgabeblack@google.com        return isa->readMiscReg(misc_reg, this);
5562SN/A    }
5572SN/A
5586221Snate@binkert.org    void
55913865Sgabeblack@google.com    setMiscRegNoEffect(RegIndex misc_reg, RegVal val) override
5602SN/A    {
5619384SAndreas.Sandberg@arm.com        return isa->setMiscRegNoEffect(misc_reg, val);
5622SN/A    }
5632SN/A
5646221Snate@binkert.org    void
56513865Sgabeblack@google.com    setMiscReg(RegIndex misc_reg, RegVal val) override
5662SN/A    {
56713865Sgabeblack@google.com        return isa->setMiscReg(misc_reg, val, this);
5686313Sgblack@eecs.umich.edu    }
5696313Sgblack@eecs.umich.edu
57012106SRekai.GonzalezAlberquilla@arm.com    RegId
57113865Sgabeblack@google.com    flattenRegId(const RegId& regId) const override
5726313Sgblack@eecs.umich.edu    {
57312106SRekai.GonzalezAlberquilla@arm.com        return isa->flattenRegId(regId);
57410033SAli.Saidi@ARM.com    }
57510033SAli.Saidi@ARM.com
57613865Sgabeblack@google.com    unsigned readStCondFailures() const override { return storeCondFailures; }
5772190SN/A
57813953Sgiacomo.gabrielli@arm.com    bool
57913953Sgiacomo.gabrielli@arm.com    readMemAccPredicate()
58013953Sgiacomo.gabrielli@arm.com    {
58113953Sgiacomo.gabrielli@arm.com        return memAccPredicate;
58213953Sgiacomo.gabrielli@arm.com    }
58313953Sgiacomo.gabrielli@arm.com
58413953Sgiacomo.gabrielli@arm.com    void
58513953Sgiacomo.gabrielli@arm.com    setMemAccPredicate(bool val)
58613953Sgiacomo.gabrielli@arm.com    {
58713953Sgiacomo.gabrielli@arm.com        memAccPredicate = val;
58813953Sgiacomo.gabrielli@arm.com    }
58913953Sgiacomo.gabrielli@arm.com
59013557Sgabeblack@google.com    void
59113865Sgabeblack@google.com    setStCondFailures(unsigned sc_failures) override
5922SN/A    {
59313865Sgabeblack@google.com        storeCondFailures = sc_failures;
5942SN/A    }
5959426SAndreas.Sandberg@ARM.com
59613865Sgabeblack@google.com    Counter
59713865Sgabeblack@google.com    readFuncExeInst() const override
59813865Sgabeblack@google.com    {
59913865Sgabeblack@google.com        return ThreadState::readFuncExeInst();
60013865Sgabeblack@google.com    }
6019426SAndreas.Sandberg@ARM.com
60213865Sgabeblack@google.com    void
60313865Sgabeblack@google.com    syscall(int64_t callnum, Fault *fault) override
60413865Sgabeblack@google.com    {
60513865Sgabeblack@google.com        process->syscall(callnum, this, fault);
60613865Sgabeblack@google.com    }
60713865Sgabeblack@google.com
60813865Sgabeblack@google.com    RegVal readIntRegFlat(RegIndex idx) const override { return intRegs[idx]; }
60913865Sgabeblack@google.com    void
61013865Sgabeblack@google.com    setIntRegFlat(RegIndex idx, RegVal val) override
61113865Sgabeblack@google.com    {
61213865Sgabeblack@google.com        intRegs[idx] = val;
61313865Sgabeblack@google.com    }
61413865Sgabeblack@google.com
61513865Sgabeblack@google.com    RegVal
61613865Sgabeblack@google.com    readFloatRegFlat(RegIndex idx) const override
61713865Sgabeblack@google.com    {
61813865Sgabeblack@google.com        return floatRegs[idx];
61913865Sgabeblack@google.com    }
62013865Sgabeblack@google.com    void
62113865Sgabeblack@google.com    setFloatRegFlat(RegIndex idx, RegVal val) override
62213865Sgabeblack@google.com    {
62313865Sgabeblack@google.com        floatRegs[idx] = val;
62413865Sgabeblack@google.com    }
6259426SAndreas.Sandberg@ARM.com
62613557Sgabeblack@google.com    const VecRegContainer &
62713865Sgabeblack@google.com    readVecRegFlat(RegIndex reg) const override
62812109SRekai.GonzalezAlberquilla@arm.com    {
62912109SRekai.GonzalezAlberquilla@arm.com        return vecRegs[reg];
63012109SRekai.GonzalezAlberquilla@arm.com    }
63112109SRekai.GonzalezAlberquilla@arm.com
63213557Sgabeblack@google.com    VecRegContainer &
63313865Sgabeblack@google.com    getWritableVecRegFlat(RegIndex reg) override
63412109SRekai.GonzalezAlberquilla@arm.com    {
63512109SRekai.GonzalezAlberquilla@arm.com        return vecRegs[reg];
63612109SRekai.GonzalezAlberquilla@arm.com    }
63712109SRekai.GonzalezAlberquilla@arm.com
63813557Sgabeblack@google.com    void
63913865Sgabeblack@google.com    setVecRegFlat(RegIndex reg, const VecRegContainer &val) override
64012109SRekai.GonzalezAlberquilla@arm.com    {
64112109SRekai.GonzalezAlberquilla@arm.com        vecRegs[reg] = val;
64212109SRekai.GonzalezAlberquilla@arm.com    }
64312109SRekai.GonzalezAlberquilla@arm.com
64412109SRekai.GonzalezAlberquilla@arm.com    template <typename T>
64513557Sgabeblack@google.com    VecLaneT<T, true>
64613865Sgabeblack@google.com    readVecLaneFlat(RegIndex reg, int lId) const
64712109SRekai.GonzalezAlberquilla@arm.com    {
64812109SRekai.GonzalezAlberquilla@arm.com        return vecRegs[reg].laneView<T>(lId);
64912109SRekai.GonzalezAlberquilla@arm.com    }
65012109SRekai.GonzalezAlberquilla@arm.com
65112109SRekai.GonzalezAlberquilla@arm.com    template <typename LD>
65213557Sgabeblack@google.com    void
65313865Sgabeblack@google.com    setVecLaneFlat(RegIndex reg, int lId, const LD &val)
65412109SRekai.GonzalezAlberquilla@arm.com    {
65512109SRekai.GonzalezAlberquilla@arm.com        vecRegs[reg].laneView<typename LD::UnderlyingType>(lId) = val;
65612109SRekai.GonzalezAlberquilla@arm.com    }
65712109SRekai.GonzalezAlberquilla@arm.com
65813557Sgabeblack@google.com    const VecElem &
65913865Sgabeblack@google.com    readVecElemFlat(RegIndex reg, const ElemIndex &elemIndex) const override
66012109SRekai.GonzalezAlberquilla@arm.com    {
66112109SRekai.GonzalezAlberquilla@arm.com        return vecRegs[reg].as<TheISA::VecElem>()[elemIndex];
66212109SRekai.GonzalezAlberquilla@arm.com    }
66312109SRekai.GonzalezAlberquilla@arm.com
66413557Sgabeblack@google.com    void
66513865Sgabeblack@google.com    setVecElemFlat(RegIndex reg, const ElemIndex &elemIndex,
66613865Sgabeblack@google.com                   const VecElem &val) override
66712109SRekai.GonzalezAlberquilla@arm.com    {
66812109SRekai.GonzalezAlberquilla@arm.com        vecRegs[reg].as<TheISA::VecElem>()[elemIndex] = val;
66912109SRekai.GonzalezAlberquilla@arm.com    }
67012109SRekai.GonzalezAlberquilla@arm.com
67113865Sgabeblack@google.com    const VecPredRegContainer &
67213865Sgabeblack@google.com    readVecPredRegFlat(RegIndex reg) const override
67313610Sgiacomo.gabrielli@arm.com    {
67413610Sgiacomo.gabrielli@arm.com        return vecPredRegs[reg];
67513610Sgiacomo.gabrielli@arm.com    }
67613610Sgiacomo.gabrielli@arm.com
67713865Sgabeblack@google.com    VecPredRegContainer &
67813865Sgabeblack@google.com    getWritableVecPredRegFlat(RegIndex reg) override
67913610Sgiacomo.gabrielli@arm.com    {
68013610Sgiacomo.gabrielli@arm.com        return vecPredRegs[reg];
68113610Sgiacomo.gabrielli@arm.com    }
68213610Sgiacomo.gabrielli@arm.com
68313865Sgabeblack@google.com    void
68413865Sgabeblack@google.com    setVecPredRegFlat(RegIndex reg, const VecPredRegContainer &val) override
68513610Sgiacomo.gabrielli@arm.com    {
68613610Sgiacomo.gabrielli@arm.com        vecPredRegs[reg] = val;
68713610Sgiacomo.gabrielli@arm.com    }
68813610Sgiacomo.gabrielli@arm.com
6899920Syasuko.eckert@amd.com#ifdef ISA_HAS_CC_REGS
69013865Sgabeblack@google.com    RegVal readCCRegFlat(RegIndex idx) const override { return ccRegs[idx]; }
69113865Sgabeblack@google.com    void setCCRegFlat(RegIndex idx, RegVal val) override { ccRegs[idx] = val; }
6929920Syasuko.eckert@amd.com#else
69313865Sgabeblack@google.com    RegVal
69413865Sgabeblack@google.com    readCCRegFlat(RegIndex idx) const override
69513865Sgabeblack@google.com    {
69613865Sgabeblack@google.com        panic("readCCRegFlat w/no CC regs!\n");
69713865Sgabeblack@google.com    }
6989920Syasuko.eckert@amd.com
69913865Sgabeblack@google.com    void
70013865Sgabeblack@google.com    setCCRegFlat(RegIndex idx, RegVal val) override
70113865Sgabeblack@google.com    {
70213865Sgabeblack@google.com        panic("setCCRegFlat w/no CC regs!\n");
70313865Sgabeblack@google.com    }
7049920Syasuko.eckert@amd.com#endif
7052SN/A};
7062SN/A
7072SN/A
7082190SN/A#endif // __CPU_CPU_EXEC_CONTEXT_HH__
709