simple_thread.hh revision 13953
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(); }
21913865Sgabeblack@google.com    FSTranslatingPortProxy &
22013875SAndrea.Mondelli@ucf.edu    getVirtProxy() override
22113865Sgabeblack@google.com    {
22213865Sgabeblack@google.com        return ThreadState::getVirtProxy();
22313865Sgabeblack@google.com    }
22413865Sgabeblack@google.com
22513875SAndrea.Mondelli@ucf.edu    void initMemProxies(ThreadContext *tc) override
22613875SAndrea.Mondelli@ucf.edu    {
22713875SAndrea.Mondelli@ucf.edu        ThreadState::initMemProxies(tc);
22813875SAndrea.Mondelli@ucf.edu    }
22913875SAndrea.Mondelli@ucf.edu
23013865Sgabeblack@google.com    SETranslatingPortProxy &
23113875SAndrea.Mondelli@ucf.edu    getMemProxy() override
23213865Sgabeblack@google.com    {
23313865Sgabeblack@google.com        return ThreadState::getMemProxy();
23413865Sgabeblack@google.com    }
23513865Sgabeblack@google.com
23613875SAndrea.Mondelli@ucf.edu    Process *getProcessPtr() override { return ThreadState::getProcessPtr(); }
23713865Sgabeblack@google.com    void setProcessPtr(Process *p) override { ThreadState::setProcessPtr(p); }
23813865Sgabeblack@google.com
23913865Sgabeblack@google.com    Status status() const override { return _status; }
24013865Sgabeblack@google.com
24113865Sgabeblack@google.com    void setStatus(Status newStatus) override { _status = newStatus; }
2422683Sktlim@umich.edu
24310407Smitch.hayenga@arm.com    /// Set the status to Active.
24413865Sgabeblack@google.com    void activate() override;
2452683Sktlim@umich.edu
2462683Sktlim@umich.edu    /// Set the status to Suspended.
24713865Sgabeblack@google.com    void suspend() override;
2482683Sktlim@umich.edu
2492683Sktlim@umich.edu    /// Set the status to Halted.
25013865Sgabeblack@google.com    void halt() override;
2512683Sktlim@umich.edu
25213865Sgabeblack@google.com    EndQuiesceEvent *
25313865Sgabeblack@google.com    getQuiesceEvent() override
25413865Sgabeblack@google.com    {
25513865Sgabeblack@google.com        return ThreadState::getQuiesceEvent();
25613865Sgabeblack@google.com    }
2572190SN/A
25813865Sgabeblack@google.com    Tick
25913865Sgabeblack@google.com    readLastActivate() override
26013865Sgabeblack@google.com    {
26113865Sgabeblack@google.com        return ThreadState::readLastActivate();
26213865Sgabeblack@google.com    }
26313865Sgabeblack@google.com    Tick
26413865Sgabeblack@google.com    readLastSuspend() override
26513865Sgabeblack@google.com    {
26613865Sgabeblack@google.com        return ThreadState::readLastSuspend();
26713865Sgabeblack@google.com    }
26813865Sgabeblack@google.com
26913865Sgabeblack@google.com    void profileClear() override { ThreadState::profileClear(); }
27013865Sgabeblack@google.com    void profileSample() override { ThreadState::profileSample(); }
27113865Sgabeblack@google.com
27213865Sgabeblack@google.com    void copyArchRegs(ThreadContext *tc) override;
27313865Sgabeblack@google.com
27413865Sgabeblack@google.com    void clearArchRegs() override
2756315Sgblack@eecs.umich.edu    {
2767720Sgblack@eecs.umich.edu        _pcState = 0;
2776316Sgblack@eecs.umich.edu        memset(intRegs, 0, sizeof(intRegs));
27813501Sgabeblack@google.com        memset(floatRegs, 0, sizeof(floatRegs));
27912109SRekai.GonzalezAlberquilla@arm.com        for (int i = 0; i < TheISA::NumVecRegs; i++) {
28012109SRekai.GonzalezAlberquilla@arm.com            vecRegs[i].zero();
28112109SRekai.GonzalezAlberquilla@arm.com        }
28213610Sgiacomo.gabrielli@arm.com        for (int i = 0; i < TheISA::NumVecPredRegs; i++) {
28313610Sgiacomo.gabrielli@arm.com            vecPredRegs[i].reset();
28413610Sgiacomo.gabrielli@arm.com        }
2859920Syasuko.eckert@amd.com#ifdef ISA_HAS_CC_REGS
2869920Syasuko.eckert@amd.com        memset(ccRegs, 0, sizeof(ccRegs));
2879920Syasuko.eckert@amd.com#endif
2889384SAndreas.Sandberg@arm.com        isa->clear();
2896315Sgblack@eecs.umich.edu    }
2902190SN/A
2912SN/A    //
2922SN/A    // New accessors for new decoder.
2932SN/A    //
29413557Sgabeblack@google.com    RegVal
29513865Sgabeblack@google.com    readIntReg(RegIndex reg_idx) const override
2962SN/A    {
2979384SAndreas.Sandberg@arm.com        int flatIndex = isa->flattenIntIndex(reg_idx);
2986323Sgblack@eecs.umich.edu        assert(flatIndex < TheISA::NumIntRegs);
2999426SAndreas.Sandberg@ARM.com        uint64_t regVal(readIntRegFlat(flatIndex));
3007601Sminkyu.jeong@arm.com        DPRINTF(IntRegs, "Reading int reg %d (%d) as %#x.\n",
3017601Sminkyu.jeong@arm.com                reg_idx, flatIndex, regVal);
3026418Sgblack@eecs.umich.edu        return regVal;
3032SN/A    }
3042SN/A
30513557Sgabeblack@google.com    RegVal
30613865Sgabeblack@google.com    readFloatReg(RegIndex reg_idx) const override
3072455SN/A    {
3089384SAndreas.Sandberg@arm.com        int flatIndex = isa->flattenFloatIndex(reg_idx);
3096323Sgblack@eecs.umich.edu        assert(flatIndex < TheISA::NumFloatRegs);
31013611Sgabeblack@google.com        RegVal regVal(readFloatRegFlat(flatIndex));
31113501Sgabeblack@google.com        DPRINTF(FloatRegs, "Reading float reg %d (%d) bits as %#x.\n",
31213501Sgabeblack@google.com                reg_idx, flatIndex, regVal);
3137341Sgblack@eecs.umich.edu        return regVal;
3142SN/A    }
3152SN/A
31612109SRekai.GonzalezAlberquilla@arm.com    const VecRegContainer&
31713865Sgabeblack@google.com    readVecReg(const RegId& reg) const override
31812109SRekai.GonzalezAlberquilla@arm.com    {
31912109SRekai.GonzalezAlberquilla@arm.com        int flatIndex = isa->flattenVecIndex(reg.index());
32012109SRekai.GonzalezAlberquilla@arm.com        assert(flatIndex < TheISA::NumVecRegs);
32112109SRekai.GonzalezAlberquilla@arm.com        const VecRegContainer& regVal = readVecRegFlat(flatIndex);
32212109SRekai.GonzalezAlberquilla@arm.com        DPRINTF(VecRegs, "Reading vector reg %d (%d) as %s.\n",
32313610Sgiacomo.gabrielli@arm.com                reg.index(), flatIndex, regVal.print());
32412109SRekai.GonzalezAlberquilla@arm.com        return regVal;
32512109SRekai.GonzalezAlberquilla@arm.com    }
32612109SRekai.GonzalezAlberquilla@arm.com
32712109SRekai.GonzalezAlberquilla@arm.com    VecRegContainer&
32813865Sgabeblack@google.com    getWritableVecReg(const RegId& reg) override
32912109SRekai.GonzalezAlberquilla@arm.com    {
33012109SRekai.GonzalezAlberquilla@arm.com        int flatIndex = isa->flattenVecIndex(reg.index());
33112109SRekai.GonzalezAlberquilla@arm.com        assert(flatIndex < TheISA::NumVecRegs);
33212109SRekai.GonzalezAlberquilla@arm.com        VecRegContainer& regVal = getWritableVecRegFlat(flatIndex);
33312109SRekai.GonzalezAlberquilla@arm.com        DPRINTF(VecRegs, "Reading vector reg %d (%d) as %s for modify.\n",
33413610Sgiacomo.gabrielli@arm.com                reg.index(), flatIndex, regVal.print());
33512109SRekai.GonzalezAlberquilla@arm.com        return regVal;
33612109SRekai.GonzalezAlberquilla@arm.com    }
33712109SRekai.GonzalezAlberquilla@arm.com
33812109SRekai.GonzalezAlberquilla@arm.com    /** Vector Register Lane Interfaces. */
33912109SRekai.GonzalezAlberquilla@arm.com    /** @{ */
34012109SRekai.GonzalezAlberquilla@arm.com    /** Reads source vector <T> operand. */
34112109SRekai.GonzalezAlberquilla@arm.com    template <typename T>
34212109SRekai.GonzalezAlberquilla@arm.com    VecLaneT<T, true>
34312109SRekai.GonzalezAlberquilla@arm.com    readVecLane(const RegId& reg) const
34412109SRekai.GonzalezAlberquilla@arm.com    {
34512109SRekai.GonzalezAlberquilla@arm.com        int flatIndex = isa->flattenVecIndex(reg.index());
34612109SRekai.GonzalezAlberquilla@arm.com        assert(flatIndex < TheISA::NumVecRegs);
34712109SRekai.GonzalezAlberquilla@arm.com        auto regVal = readVecLaneFlat<T>(flatIndex, reg.elemIndex());
34812109SRekai.GonzalezAlberquilla@arm.com        DPRINTF(VecRegs, "Reading vector lane %d (%d)[%d] as %lx.\n",
34912109SRekai.GonzalezAlberquilla@arm.com                reg.index(), flatIndex, reg.elemIndex(), regVal);
35012109SRekai.GonzalezAlberquilla@arm.com        return regVal;
35112109SRekai.GonzalezAlberquilla@arm.com    }
35212109SRekai.GonzalezAlberquilla@arm.com
35312109SRekai.GonzalezAlberquilla@arm.com    /** Reads source vector 8bit operand. */
35412109SRekai.GonzalezAlberquilla@arm.com    virtual ConstVecLane8
35513865Sgabeblack@google.com    readVec8BitLaneReg(const RegId &reg) const override
35613865Sgabeblack@google.com    {
35713865Sgabeblack@google.com        return readVecLane<uint8_t>(reg);
35813865Sgabeblack@google.com    }
35912109SRekai.GonzalezAlberquilla@arm.com
36012109SRekai.GonzalezAlberquilla@arm.com    /** Reads source vector 16bit operand. */
36112109SRekai.GonzalezAlberquilla@arm.com    virtual ConstVecLane16
36213865Sgabeblack@google.com    readVec16BitLaneReg(const RegId &reg) const override
36313865Sgabeblack@google.com    {
36413865Sgabeblack@google.com        return readVecLane<uint16_t>(reg);
36513865Sgabeblack@google.com    }
36612109SRekai.GonzalezAlberquilla@arm.com
36712109SRekai.GonzalezAlberquilla@arm.com    /** Reads source vector 32bit operand. */
36812109SRekai.GonzalezAlberquilla@arm.com    virtual ConstVecLane32
36913865Sgabeblack@google.com    readVec32BitLaneReg(const RegId &reg) const override
37013865Sgabeblack@google.com    {
37113865Sgabeblack@google.com        return readVecLane<uint32_t>(reg);
37213865Sgabeblack@google.com    }
37312109SRekai.GonzalezAlberquilla@arm.com
37412109SRekai.GonzalezAlberquilla@arm.com    /** Reads source vector 64bit operand. */
37512109SRekai.GonzalezAlberquilla@arm.com    virtual ConstVecLane64
37613865Sgabeblack@google.com    readVec64BitLaneReg(const RegId &reg) const override
37713865Sgabeblack@google.com    {
37813865Sgabeblack@google.com        return readVecLane<uint64_t>(reg);
37913865Sgabeblack@google.com    }
38012109SRekai.GonzalezAlberquilla@arm.com
38112109SRekai.GonzalezAlberquilla@arm.com    /** Write a lane of the destination vector register. */
38212109SRekai.GonzalezAlberquilla@arm.com    template <typename LD>
38313865Sgabeblack@google.com    void
38413865Sgabeblack@google.com    setVecLaneT(const RegId &reg, const LD &val)
38512109SRekai.GonzalezAlberquilla@arm.com    {
38612109SRekai.GonzalezAlberquilla@arm.com        int flatIndex = isa->flattenVecIndex(reg.index());
38712109SRekai.GonzalezAlberquilla@arm.com        assert(flatIndex < TheISA::NumVecRegs);
38812109SRekai.GonzalezAlberquilla@arm.com        setVecLaneFlat(flatIndex, reg.elemIndex(), val);
38912109SRekai.GonzalezAlberquilla@arm.com        DPRINTF(VecRegs, "Reading vector lane %d (%d)[%d] to %lx.\n",
39012109SRekai.GonzalezAlberquilla@arm.com                reg.index(), flatIndex, reg.elemIndex(), val);
39112109SRekai.GonzalezAlberquilla@arm.com    }
39213865Sgabeblack@google.com    virtual void
39313865Sgabeblack@google.com    setVecLane(const RegId &reg, const LaneData<LaneSize::Byte> &val) override
39413865Sgabeblack@google.com    {
39513865Sgabeblack@google.com        return setVecLaneT(reg, val);
39613865Sgabeblack@google.com    }
39713865Sgabeblack@google.com    virtual void
39813865Sgabeblack@google.com    setVecLane(const RegId &reg,
39913865Sgabeblack@google.com               const LaneData<LaneSize::TwoByte> &val) override
40013865Sgabeblack@google.com    {
40113865Sgabeblack@google.com        return setVecLaneT(reg, val);
40213865Sgabeblack@google.com    }
40313865Sgabeblack@google.com    virtual void
40413865Sgabeblack@google.com    setVecLane(const RegId &reg,
40513865Sgabeblack@google.com               const LaneData<LaneSize::FourByte> &val) override
40613865Sgabeblack@google.com    {
40713865Sgabeblack@google.com        return setVecLaneT(reg, val);
40813865Sgabeblack@google.com    }
40913865Sgabeblack@google.com    virtual void
41013865Sgabeblack@google.com    setVecLane(const RegId &reg,
41113865Sgabeblack@google.com               const LaneData<LaneSize::EightByte> &val) override
41213865Sgabeblack@google.com    {
41313865Sgabeblack@google.com        return setVecLaneT(reg, val);
41413865Sgabeblack@google.com    }
41512109SRekai.GonzalezAlberquilla@arm.com    /** @} */
41612109SRekai.GonzalezAlberquilla@arm.com
41713865Sgabeblack@google.com    const VecElem &
41813865Sgabeblack@google.com    readVecElem(const RegId &reg) const override
41912109SRekai.GonzalezAlberquilla@arm.com    {
42012109SRekai.GonzalezAlberquilla@arm.com        int flatIndex = isa->flattenVecElemIndex(reg.index());
42112109SRekai.GonzalezAlberquilla@arm.com        assert(flatIndex < TheISA::NumVecRegs);
42212109SRekai.GonzalezAlberquilla@arm.com        const VecElem& regVal = readVecElemFlat(flatIndex, reg.elemIndex());
42312109SRekai.GonzalezAlberquilla@arm.com        DPRINTF(VecRegs, "Reading element %d of vector reg %d (%d) as"
42412109SRekai.GonzalezAlberquilla@arm.com                " %#x.\n", reg.elemIndex(), reg.index(), flatIndex, regVal);
42512109SRekai.GonzalezAlberquilla@arm.com        return regVal;
42612109SRekai.GonzalezAlberquilla@arm.com    }
42712109SRekai.GonzalezAlberquilla@arm.com
42813865Sgabeblack@google.com    const VecPredRegContainer &
42913865Sgabeblack@google.com    readVecPredReg(const RegId &reg) const override
43013610Sgiacomo.gabrielli@arm.com    {
43113610Sgiacomo.gabrielli@arm.com        int flatIndex = isa->flattenVecPredIndex(reg.index());
43213610Sgiacomo.gabrielli@arm.com        assert(flatIndex < TheISA::NumVecPredRegs);
43313610Sgiacomo.gabrielli@arm.com        const VecPredRegContainer& regVal = readVecPredRegFlat(flatIndex);
43413610Sgiacomo.gabrielli@arm.com        DPRINTF(VecPredRegs, "Reading predicate reg %d (%d) as %s.\n",
43513610Sgiacomo.gabrielli@arm.com                reg.index(), flatIndex, regVal.print());
43613610Sgiacomo.gabrielli@arm.com        return regVal;
43713610Sgiacomo.gabrielli@arm.com    }
43813610Sgiacomo.gabrielli@arm.com
43913865Sgabeblack@google.com    VecPredRegContainer &
44013865Sgabeblack@google.com    getWritableVecPredReg(const RegId &reg) override
44113610Sgiacomo.gabrielli@arm.com    {
44213610Sgiacomo.gabrielli@arm.com        int flatIndex = isa->flattenVecPredIndex(reg.index());
44313610Sgiacomo.gabrielli@arm.com        assert(flatIndex < TheISA::NumVecPredRegs);
44413610Sgiacomo.gabrielli@arm.com        VecPredRegContainer& regVal = getWritableVecPredRegFlat(flatIndex);
44513610Sgiacomo.gabrielli@arm.com        DPRINTF(VecPredRegs,
44613610Sgiacomo.gabrielli@arm.com                "Reading predicate reg %d (%d) as %s for modify.\n",
44713610Sgiacomo.gabrielli@arm.com                reg.index(), flatIndex, regVal.print());
44813610Sgiacomo.gabrielli@arm.com        return regVal;
44913610Sgiacomo.gabrielli@arm.com    }
45012109SRekai.GonzalezAlberquilla@arm.com
45113622Sgabeblack@google.com    RegVal
45213865Sgabeblack@google.com    readCCReg(RegIndex reg_idx) const override
4539920Syasuko.eckert@amd.com    {
4549920Syasuko.eckert@amd.com#ifdef ISA_HAS_CC_REGS
4559920Syasuko.eckert@amd.com        int flatIndex = isa->flattenCCIndex(reg_idx);
45610338SCurtis.Dunham@arm.com        assert(0 <= flatIndex);
4579920Syasuko.eckert@amd.com        assert(flatIndex < TheISA::NumCCRegs);
4589920Syasuko.eckert@amd.com        uint64_t regVal(readCCRegFlat(flatIndex));
4599920Syasuko.eckert@amd.com        DPRINTF(CCRegs, "Reading CC reg %d (%d) as %#x.\n",
4609920Syasuko.eckert@amd.com                reg_idx, flatIndex, regVal);
4619920Syasuko.eckert@amd.com        return regVal;
4629920Syasuko.eckert@amd.com#else
4639920Syasuko.eckert@amd.com        panic("Tried to read a CC register.");
4649920Syasuko.eckert@amd.com        return 0;
4659920Syasuko.eckert@amd.com#endif
4669920Syasuko.eckert@amd.com    }
4679920Syasuko.eckert@amd.com
46813557Sgabeblack@google.com    void
46913865Sgabeblack@google.com    setIntReg(RegIndex reg_idx, RegVal val) override
4702SN/A    {
4719384SAndreas.Sandberg@arm.com        int flatIndex = isa->flattenIntIndex(reg_idx);
4726323Sgblack@eecs.umich.edu        assert(flatIndex < TheISA::NumIntRegs);
4737601Sminkyu.jeong@arm.com        DPRINTF(IntRegs, "Setting int reg %d (%d) to %#x.\n",
4747601Sminkyu.jeong@arm.com                reg_idx, flatIndex, val);
4759426SAndreas.Sandberg@ARM.com        setIntRegFlat(flatIndex, val);
4762SN/A    }
4772SN/A
47813557Sgabeblack@google.com    void
47913865Sgabeblack@google.com    setFloatReg(RegIndex reg_idx, RegVal val) override
4802455SN/A    {
4819384SAndreas.Sandberg@arm.com        int flatIndex = isa->flattenFloatIndex(reg_idx);
4826323Sgblack@eecs.umich.edu        assert(flatIndex < TheISA::NumFloatRegs);
4838733Sgeoffrey.blake@arm.com        // XXX: Fix array out of bounds compiler error for gem5.fast
4848733Sgeoffrey.blake@arm.com        // when checkercpu enabled
4858733Sgeoffrey.blake@arm.com        if (flatIndex < TheISA::NumFloatRegs)
48613611Sgabeblack@google.com            setFloatRegFlat(flatIndex, val);
48713501Sgabeblack@google.com        DPRINTF(FloatRegs, "Setting float reg %d (%d) bits to %#x.\n",
48813501Sgabeblack@google.com                reg_idx, flatIndex, val);
4892SN/A    }
4902SN/A
49113557Sgabeblack@google.com    void
49213865Sgabeblack@google.com    setVecReg(const RegId &reg, const VecRegContainer &val) override
49312109SRekai.GonzalezAlberquilla@arm.com    {
49412109SRekai.GonzalezAlberquilla@arm.com        int flatIndex = isa->flattenVecIndex(reg.index());
49512109SRekai.GonzalezAlberquilla@arm.com        assert(flatIndex < TheISA::NumVecRegs);
49612109SRekai.GonzalezAlberquilla@arm.com        setVecRegFlat(flatIndex, val);
49712109SRekai.GonzalezAlberquilla@arm.com        DPRINTF(VecRegs, "Setting vector reg %d (%d) to %s.\n",
49812109SRekai.GonzalezAlberquilla@arm.com                reg.index(), flatIndex, val.print());
49912109SRekai.GonzalezAlberquilla@arm.com    }
50012109SRekai.GonzalezAlberquilla@arm.com
50113557Sgabeblack@google.com    void
50213865Sgabeblack@google.com    setVecElem(const RegId &reg, const VecElem &val) override
50312109SRekai.GonzalezAlberquilla@arm.com    {
50412109SRekai.GonzalezAlberquilla@arm.com        int flatIndex = isa->flattenVecElemIndex(reg.index());
50512109SRekai.GonzalezAlberquilla@arm.com        assert(flatIndex < TheISA::NumVecRegs);
50612109SRekai.GonzalezAlberquilla@arm.com        setVecElemFlat(flatIndex, reg.elemIndex(), val);
50712109SRekai.GonzalezAlberquilla@arm.com        DPRINTF(VecRegs, "Setting element %d of vector reg %d (%d) to"
50812109SRekai.GonzalezAlberquilla@arm.com                " %#x.\n", reg.elemIndex(), reg.index(), flatIndex, val);
50912109SRekai.GonzalezAlberquilla@arm.com    }
51012109SRekai.GonzalezAlberquilla@arm.com
51113557Sgabeblack@google.com    void
51213865Sgabeblack@google.com    setVecPredReg(const RegId &reg, const VecPredRegContainer &val) override
51313610Sgiacomo.gabrielli@arm.com    {
51413610Sgiacomo.gabrielli@arm.com        int flatIndex = isa->flattenVecPredIndex(reg.index());
51513610Sgiacomo.gabrielli@arm.com        assert(flatIndex < TheISA::NumVecPredRegs);
51613610Sgiacomo.gabrielli@arm.com        setVecPredRegFlat(flatIndex, val);
51713610Sgiacomo.gabrielli@arm.com        DPRINTF(VecPredRegs, "Setting predicate reg %d (%d) to %s.\n",
51813610Sgiacomo.gabrielli@arm.com                reg.index(), flatIndex, val.print());
51913610Sgiacomo.gabrielli@arm.com    }
52013610Sgiacomo.gabrielli@arm.com
52113610Sgiacomo.gabrielli@arm.com    void
52213865Sgabeblack@google.com    setCCReg(RegIndex reg_idx, RegVal val) override
5239920Syasuko.eckert@amd.com    {
5249920Syasuko.eckert@amd.com#ifdef ISA_HAS_CC_REGS
5259920Syasuko.eckert@amd.com        int flatIndex = isa->flattenCCIndex(reg_idx);
5269920Syasuko.eckert@amd.com        assert(flatIndex < TheISA::NumCCRegs);
5279920Syasuko.eckert@amd.com        DPRINTF(CCRegs, "Setting CC reg %d (%d) to %#x.\n",
5289920Syasuko.eckert@amd.com                reg_idx, flatIndex, val);
5299920Syasuko.eckert@amd.com        setCCRegFlat(flatIndex, val);
5309920Syasuko.eckert@amd.com#else
5319920Syasuko.eckert@amd.com        panic("Tried to set a CC register.");
5329920Syasuko.eckert@amd.com#endif
5339920Syasuko.eckert@amd.com    }
5349920Syasuko.eckert@amd.com
53513865Sgabeblack@google.com    TheISA::PCState pcState() const override { return _pcState; }
53613865Sgabeblack@google.com    void pcState(const TheISA::PCState &val) override { _pcState = val; }
5372SN/A
5387720Sgblack@eecs.umich.edu    void
53913865Sgabeblack@google.com    pcStateNoRecord(const TheISA::PCState &val) override
5402190SN/A    {
5417720Sgblack@eecs.umich.edu        _pcState = val;
5422190SN/A    }
5432190SN/A
54413865Sgabeblack@google.com    Addr instAddr() const override  { return _pcState.instAddr(); }
54513865Sgabeblack@google.com    Addr nextInstAddr() const override { return _pcState.nextInstAddr(); }
54613865Sgabeblack@google.com    MicroPC microPC() const override { return _pcState.microPC(); }
54713865Sgabeblack@google.com    bool readPredicate() const { return predicate; }
54813865Sgabeblack@google.com    void setPredicate(bool val) { predicate = val; }
5497597Sminkyu.jeong@arm.com
55013557Sgabeblack@google.com    RegVal
55113865Sgabeblack@google.com    readMiscRegNoEffect(RegIndex misc_reg) const override
5524172Ssaidi@eecs.umich.edu    {
5539384SAndreas.Sandberg@arm.com        return isa->readMiscRegNoEffect(misc_reg);
5544172Ssaidi@eecs.umich.edu    }
5554172Ssaidi@eecs.umich.edu
55613557Sgabeblack@google.com    RegVal
55713865Sgabeblack@google.com    readMiscReg(RegIndex misc_reg) override
5582SN/A    {
55913865Sgabeblack@google.com        return isa->readMiscReg(misc_reg, this);
5602SN/A    }
5612SN/A
5626221Snate@binkert.org    void
56313865Sgabeblack@google.com    setMiscRegNoEffect(RegIndex misc_reg, RegVal val) override
5642SN/A    {
5659384SAndreas.Sandberg@arm.com        return isa->setMiscRegNoEffect(misc_reg, val);
5662SN/A    }
5672SN/A
5686221Snate@binkert.org    void
56913865Sgabeblack@google.com    setMiscReg(RegIndex misc_reg, RegVal val) override
5702SN/A    {
57113865Sgabeblack@google.com        return isa->setMiscReg(misc_reg, val, this);
5726313Sgblack@eecs.umich.edu    }
5736313Sgblack@eecs.umich.edu
57412106SRekai.GonzalezAlberquilla@arm.com    RegId
57513865Sgabeblack@google.com    flattenRegId(const RegId& regId) const override
5766313Sgblack@eecs.umich.edu    {
57712106SRekai.GonzalezAlberquilla@arm.com        return isa->flattenRegId(regId);
57810033SAli.Saidi@ARM.com    }
57910033SAli.Saidi@ARM.com
58013865Sgabeblack@google.com    unsigned readStCondFailures() const override { return storeCondFailures; }
5812190SN/A
58213953Sgiacomo.gabrielli@arm.com    bool
58313953Sgiacomo.gabrielli@arm.com    readMemAccPredicate()
58413953Sgiacomo.gabrielli@arm.com    {
58513953Sgiacomo.gabrielli@arm.com        return memAccPredicate;
58613953Sgiacomo.gabrielli@arm.com    }
58713953Sgiacomo.gabrielli@arm.com
58813953Sgiacomo.gabrielli@arm.com    void
58913953Sgiacomo.gabrielli@arm.com    setMemAccPredicate(bool val)
59013953Sgiacomo.gabrielli@arm.com    {
59113953Sgiacomo.gabrielli@arm.com        memAccPredicate = val;
59213953Sgiacomo.gabrielli@arm.com    }
59313953Sgiacomo.gabrielli@arm.com
59413557Sgabeblack@google.com    void
59513865Sgabeblack@google.com    setStCondFailures(unsigned sc_failures) override
5962SN/A    {
59713865Sgabeblack@google.com        storeCondFailures = sc_failures;
5982SN/A    }
5999426SAndreas.Sandberg@ARM.com
60013865Sgabeblack@google.com    Counter
60113865Sgabeblack@google.com    readFuncExeInst() const override
60213865Sgabeblack@google.com    {
60313865Sgabeblack@google.com        return ThreadState::readFuncExeInst();
60413865Sgabeblack@google.com    }
6059426SAndreas.Sandberg@ARM.com
60613865Sgabeblack@google.com    void
60713865Sgabeblack@google.com    syscall(int64_t callnum, Fault *fault) override
60813865Sgabeblack@google.com    {
60913865Sgabeblack@google.com        process->syscall(callnum, this, fault);
61013865Sgabeblack@google.com    }
61113865Sgabeblack@google.com
61213865Sgabeblack@google.com    RegVal readIntRegFlat(RegIndex idx) const override { return intRegs[idx]; }
61313865Sgabeblack@google.com    void
61413865Sgabeblack@google.com    setIntRegFlat(RegIndex idx, RegVal val) override
61513865Sgabeblack@google.com    {
61613865Sgabeblack@google.com        intRegs[idx] = val;
61713865Sgabeblack@google.com    }
61813865Sgabeblack@google.com
61913865Sgabeblack@google.com    RegVal
62013865Sgabeblack@google.com    readFloatRegFlat(RegIndex idx) const override
62113865Sgabeblack@google.com    {
62213865Sgabeblack@google.com        return floatRegs[idx];
62313865Sgabeblack@google.com    }
62413865Sgabeblack@google.com    void
62513865Sgabeblack@google.com    setFloatRegFlat(RegIndex idx, RegVal val) override
62613865Sgabeblack@google.com    {
62713865Sgabeblack@google.com        floatRegs[idx] = val;
62813865Sgabeblack@google.com    }
6299426SAndreas.Sandberg@ARM.com
63013557Sgabeblack@google.com    const VecRegContainer &
63113865Sgabeblack@google.com    readVecRegFlat(RegIndex reg) const override
63212109SRekai.GonzalezAlberquilla@arm.com    {
63312109SRekai.GonzalezAlberquilla@arm.com        return vecRegs[reg];
63412109SRekai.GonzalezAlberquilla@arm.com    }
63512109SRekai.GonzalezAlberquilla@arm.com
63613557Sgabeblack@google.com    VecRegContainer &
63713865Sgabeblack@google.com    getWritableVecRegFlat(RegIndex reg) override
63812109SRekai.GonzalezAlberquilla@arm.com    {
63912109SRekai.GonzalezAlberquilla@arm.com        return vecRegs[reg];
64012109SRekai.GonzalezAlberquilla@arm.com    }
64112109SRekai.GonzalezAlberquilla@arm.com
64213557Sgabeblack@google.com    void
64313865Sgabeblack@google.com    setVecRegFlat(RegIndex reg, const VecRegContainer &val) override
64412109SRekai.GonzalezAlberquilla@arm.com    {
64512109SRekai.GonzalezAlberquilla@arm.com        vecRegs[reg] = val;
64612109SRekai.GonzalezAlberquilla@arm.com    }
64712109SRekai.GonzalezAlberquilla@arm.com
64812109SRekai.GonzalezAlberquilla@arm.com    template <typename T>
64913557Sgabeblack@google.com    VecLaneT<T, true>
65013865Sgabeblack@google.com    readVecLaneFlat(RegIndex reg, int lId) const
65112109SRekai.GonzalezAlberquilla@arm.com    {
65212109SRekai.GonzalezAlberquilla@arm.com        return vecRegs[reg].laneView<T>(lId);
65312109SRekai.GonzalezAlberquilla@arm.com    }
65412109SRekai.GonzalezAlberquilla@arm.com
65512109SRekai.GonzalezAlberquilla@arm.com    template <typename LD>
65613557Sgabeblack@google.com    void
65713865Sgabeblack@google.com    setVecLaneFlat(RegIndex reg, int lId, const LD &val)
65812109SRekai.GonzalezAlberquilla@arm.com    {
65912109SRekai.GonzalezAlberquilla@arm.com        vecRegs[reg].laneView<typename LD::UnderlyingType>(lId) = val;
66012109SRekai.GonzalezAlberquilla@arm.com    }
66112109SRekai.GonzalezAlberquilla@arm.com
66213557Sgabeblack@google.com    const VecElem &
66313865Sgabeblack@google.com    readVecElemFlat(RegIndex reg, const ElemIndex &elemIndex) const override
66412109SRekai.GonzalezAlberquilla@arm.com    {
66512109SRekai.GonzalezAlberquilla@arm.com        return vecRegs[reg].as<TheISA::VecElem>()[elemIndex];
66612109SRekai.GonzalezAlberquilla@arm.com    }
66712109SRekai.GonzalezAlberquilla@arm.com
66813557Sgabeblack@google.com    void
66913865Sgabeblack@google.com    setVecElemFlat(RegIndex reg, const ElemIndex &elemIndex,
67013865Sgabeblack@google.com                   const VecElem &val) override
67112109SRekai.GonzalezAlberquilla@arm.com    {
67212109SRekai.GonzalezAlberquilla@arm.com        vecRegs[reg].as<TheISA::VecElem>()[elemIndex] = val;
67312109SRekai.GonzalezAlberquilla@arm.com    }
67412109SRekai.GonzalezAlberquilla@arm.com
67513865Sgabeblack@google.com    const VecPredRegContainer &
67613865Sgabeblack@google.com    readVecPredRegFlat(RegIndex reg) const override
67713610Sgiacomo.gabrielli@arm.com    {
67813610Sgiacomo.gabrielli@arm.com        return vecPredRegs[reg];
67913610Sgiacomo.gabrielli@arm.com    }
68013610Sgiacomo.gabrielli@arm.com
68113865Sgabeblack@google.com    VecPredRegContainer &
68213865Sgabeblack@google.com    getWritableVecPredRegFlat(RegIndex reg) override
68313610Sgiacomo.gabrielli@arm.com    {
68413610Sgiacomo.gabrielli@arm.com        return vecPredRegs[reg];
68513610Sgiacomo.gabrielli@arm.com    }
68613610Sgiacomo.gabrielli@arm.com
68713865Sgabeblack@google.com    void
68813865Sgabeblack@google.com    setVecPredRegFlat(RegIndex reg, const VecPredRegContainer &val) override
68913610Sgiacomo.gabrielli@arm.com    {
69013610Sgiacomo.gabrielli@arm.com        vecPredRegs[reg] = val;
69113610Sgiacomo.gabrielli@arm.com    }
69213610Sgiacomo.gabrielli@arm.com
6939920Syasuko.eckert@amd.com#ifdef ISA_HAS_CC_REGS
69413865Sgabeblack@google.com    RegVal readCCRegFlat(RegIndex idx) const override { return ccRegs[idx]; }
69513865Sgabeblack@google.com    void setCCRegFlat(RegIndex idx, RegVal val) override { ccRegs[idx] = val; }
6969920Syasuko.eckert@amd.com#else
69713865Sgabeblack@google.com    RegVal
69813865Sgabeblack@google.com    readCCRegFlat(RegIndex idx) const override
69913865Sgabeblack@google.com    {
70013865Sgabeblack@google.com        panic("readCCRegFlat w/no CC regs!\n");
70113865Sgabeblack@google.com    }
7029920Syasuko.eckert@amd.com
70313865Sgabeblack@google.com    void
70413865Sgabeblack@google.com    setCCRegFlat(RegIndex idx, RegVal val) override
70513865Sgabeblack@google.com    {
70613865Sgabeblack@google.com        panic("setCCRegFlat w/no CC regs!\n");
70713865Sgabeblack@google.com    }
7089920Syasuko.eckert@amd.com#endif
7092SN/A};
7102SN/A
7112SN/A
7122190SN/A#endif // __CPU_CPU_EXEC_CONTEXT_HH__
713